Il est possible de définir des index basés sur des fonctions (based-function index). Par exemple lorsqu’il est nécessaire de faire un index sur ce genre de requête SQL :
SELECT * FROM
MA_TABLE
WHERE
SUBSTR(MA_COLONNE, 1, 3) = 'ABC';
Il est possible de définir un index spécialement sur la fonction recherchée de la façon suivante :
CREATE INDEX IDX ON MA_TABLE (SUBSTR(MA_COLONNE, 1, 3));
Par défaut Oracle enregistre tous les noms des objets en majuscule sauf s’ils ont été créés avec des guillemets. Dans ce cas le nom de l’objet est sensible à la casse. Par exemple :
SQL> create table "bob" (a number);
Table created.
SQL> select * from bob;
select * from bob
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from "bob";
no rows selected
Attention ! Certains logiciels SQL (SQLDevlopper par exemple) créent toutes leurs requêtes avec des guillemets lorsque l’on demande des actions (insertions, modifications, créations, etc.) sur les bases de données via les menus contextuels.
Sources :
Voici un petit script PLSQL pour supprimer toutes les tables d’un schéma d’une base de données Oracle. Il s’agit de créer un curseur implicite sur la liste des tables de l’utilisateur sans prendre en compte les tables de la corbeille. Puis de boucler sur cette liste afin d’exécuter la commande de suppression de chaque table sans oublier toutes ses contraintes :
BEGIN
FOR c IN (SELECT object_name,
object_type
FROM user_objects
WHERE object_type IN ('TABLE') AND object_name NOT LIKE '%$%') LOOP
EXECUTE IMMEDIATE 'DROP '
|| c.object_type || ' "'
|| c.object_name || '" CASCADE CONSTRAINTS';
END LOOP;
END;
Ce script peut être adapté pour supprimer d’autres types d’objet comme des vues. Pour cela, modifier TABLE en VIEW.
Pour connaître la taille utile d’une table d’une base de données oracle il faut se baser sur le nombre de blocs de la table et le multiplier par la taille d’un bloc. La taille utile est la taille exacte de la table. Cela ne prendre pas en compte les blocs vides occupés par la table qui proviendraient d’une fragmentation de la base de données.
select
user_tables.table_name,
user_tablespaces.tablespace_name,
user_tablespaces.block_size,
user_tables.blocks,
user_tablespaces.block_size * user_tables.blocks / 1024 / 1024
as "Taille Mb"
from user_tables, user_tablespaces
where
user_tables.tablespace_name = user_tablespaces.tablespace_name
order by "Taille Mb" desc
Comment est-il possible de générer une séquence de date à partir d’une simple requête SQL sur un base de données Oracle ?
Pour comprendre le principe, il faut savoir que ce type de résultat est obtenu en deux étapes. La première est la génération d’un nombre défini de données à partir d’une requête SQL. La seconde est la transformation des données générées pour obtenir des dates.
Génération d’une série de données
Il existe plusieurs façons de générer un nombre défini de données qui peuvent être exploitées par la suite. Voici un exemple simple :
SELECT 1
FROM DUAL
CONNECT BY LEVEL <= < n >
Avec n le nombre de données que vous souhaitez obtenir. Voici le résultat pour n = 3 :
1
———————-
1
1
1
Transformation de la série en séquence de dates
A partir des données générées précédemment, il est possible de créer une séquence de date avec ce type de requête SQL :
SELECT TRUNC(TO_DATE('20080415','yyyymmdd'),'MM')+ROWNUM -1 DATES FROM (
SELECT 1
FROM DUAL
CONNECT BY LEVEL <= <n>
)
Voici le résultat pour n = 3 :
DATES
————————-
01/04/08
02/04/08
03/04/08
Sources : Pour plus d’explications, vous pouvez vous référer au site internet qui m’a servi de référence : http://www.dba-oracle.com/t_test_data_date_generation_sql.htm. Vous y retrouverez entre autre deux façons différentes de générer une série de données.