Sunteți pe pagina 1din 109

FAQ Oracle

Date de publication : 18/09/2006

Dernière mise à jour : 04/01/2009

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum
Oracle de www.developpez.com et de l'expérience personnelle des auteurs. Elle pourra
traiter de tout type de questions portant sur les technologies Oracle.
Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous
vous souhaitons une bonne lecture.
L'équipe Oracle de Developpez.
Ont contribué à cette FAQ :

Aline - rouardg - PlaineR - Pierre Forstmann - bouyao


(http://mbouayoun.developpez.com/) - LeoAnderson
(http://leoanderson.developpez.com/) - Laurent
Dardenne (http://laurent-dardenne.developpez.com/) -
Xavier Vlieghe (http://xo.developpez.com) - Laurent
Schneider (http://360.yahoo.com/laurentschneider) -
Lafouine - Jaouad (http://jaouad.developpez.com/) -
lalystar (http://lalystar.developpez.com/) - Pomalaix
- Fred_D (http://orafrance.developpez.com/) -
SheikYerbouti (http://sheikyerbouti.developpez.com/)
- Helyos (http://helyos.developpez.com/) -
FAQ Oracle

1. Forum Oracle (5) ....................................................................................................................................................................... 4


2. Général (4) ................................................................................................................................................................................. 6
3. Développement (36) .................................................................................................................................................................. 8
3.1. SQL (18) ........................................................................................................................................................................... 9
3.2. PL/SQL (18) ................................................................................................................................................................... 30
4. Administration (67) ..................................................................................................................................................................46
4.1. Les Tables (6) .................................................................................................................................................................47
4.2. Les Utilisateurs (4) ......................................................................................................................................................... 52
4.3. Sécurité (7) ......................................................................................................................................................................57
4.4. Les Tablespaces et autres fichiers (16) .......................................................................................................................... 62
4.5. Système (14) ................................................................................................................................................................... 70
4.6. Objets (5) ........................................................................................................................................................................ 76
4.7. Archive Log (3) .............................................................................................................................................................. 80
4.8. ISqlPlus (10g) (3) ........................................................................................................................................................... 82
4.9. Autres (9) ........................................................................................................................................................................ 84
5. Outils (10) ................................................................................................................................................................................92
5.1. Rman (0) ......................................................................................................................................................................... 93
5.2. Exp/Imp (1) .....................................................................................................................................................................94
5.3. Dba Studio & OEM (0) ..................................................................................................................................................95
5.4. SQL*Plus (3) .................................................................................................................................................................. 96
5.5. Network Manager (3) ..................................................................................................................................................... 98
5.6. Portal (3) ....................................................................................................................................................................... 100
6. ERP (16) ................................................................................................................................................................................ 102
6.1. Peoplesoft (16) ..............................................................................................................................................................103
6.1.1. Administration (14) ..............................................................................................................................................104
6.1.2. Sécurité (1) ...........................................................................................................................................................109

-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Forum Oracle


Guide de bon usage de la FAQ et du Forum
Auteurs : Helyos ,
Lorsque vous vous trouvez devant un problème, voilà la marche à suivre :
• Chercher dans la FAQ
• Chercher sur Google
• Faire une recherche sur le forum concerné.
• Si vous n'avez toujours pas trouvé de réponse à votre question : vous pouvez, après avoir lu les Règles du forum
poster une question précise avec un titre clair et vous enrichirez ainsi le forum Oracle.

Comment mettre le tag [Résolu] ?


Auteurs : Helyos ,
Il n'est plus nécessaire et même deconseillé d'éditer son premier post pour mettre le tag [Résolu]. En bas à gauche vous
avez un bouton qui se charge de mettre le tag. Par contre il est conseillé d'éditer et de mettre un titre clair quand ce
n'est pas le cas.

Que signifie le tag [Délestage] ?


Auteurs : Helyos ,
La base de données du forum n'est pas extensible indéfiniment. Nous devons "nettoyer les forums" pour que la base ne
devienne pas trop grosse, ceci entrainerait une chute des performances pour tous les utilisateurs. Pour faciliter ce travail
un Tag [Délestage] est mis sur les threads à supprimer. Pour quelles raisons les messages sont marqués [Délestage] :
• La réponse à la question se trouve dans un tutoriel, dans la FAQ ou dans l'aide.
• La réponse a déjà été donnée sur le forum.
• Le titre n'est pas assez précis.
• La question est mal posée.

D'ailleurs vous pouvez, si vous êtes l'auteur du message initial, marquer le fil de discussion pour [Délestage]. Ce faisant,
vous améliorerez la lisibilité du forum, vous faciliterez le travail des modérateurs (ils sont bénévoles et ils ont plein de
choses plus passionnantes à faire, comme répondre à une question qui n'a pas déjà été posée).

Comment obtenir une bonne réponse ?


Auteurs : Helyos ,
En posant de meilleures questions !
Votre question sera lue par un grand nombre de personnes, faites l'effort de rédiger une question claire et précise,
donnez les informations indispensables. Montrez que vous avez fait des recherches en expliquant votre raisonnement,
et le but à atteindre. Par contre, il est inutile de dire "J'ai cherché et je n'ai pas trouvé". Les habitués du forum sauront
vite si vous avez bien cherché ou pas. Ne soyez pas pressé, les personnes qui vous répondent sont des bénévoles qui vous
consacrent du temps, soyez-en reconnaissant. Rappelez-vous toujours qu'elles ne vous doivent rien.

-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Afin de les aider à trouver une solution plus rapidement, pensez à préciser la version de votre base de données, l'utilitaire
utilisé, le code utilisé et les erreurs que vous avez obtenues.

Que signifie le tag [FAQ] ?


Auteurs : Helyos ,
Afin de faciliter les recherches sur des thèmes récurrents, l'équipe Oracle à mis en place cette FAQ. Les membres de
l'équipe passent donc régulièrement sur le forum afin d'identifier les questions qui reviennent de manière répétée sur le
forum. Une fois la question identifiée, on lui assigne le tag [FAQ] afin de l'ajouter le plus rapidement possible à la FAQ.

-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Général


Où se trouve le fichier INIT.ora de ma base?
Auteurs : Helyos ,
Si votre installation est une installation standard, ce fichier se trouve dans le répertoire :

%ORACLE_HOME\admin\%ORACLE_SID%\pfile

Il existe aussi un fichier init{SID}.ora dans le repertoire %ORACLE_HOME%\dbs mais en règle générale ce fichier
contient juste un paramètre IFILE qui redirige vers le fichier donné au début.

lien : Que signifie %ORACLE_HOME% ?


lien : Que signifie %ORACLE_SID% ?

Que signifie %ORACLE_HOME% ?


Auteurs : Helyos ,
%ORACLE_HOME% est une variable d'environnement qui correspond en fait au répertoire d'installation de votre
Oracle. Par exemple si vous avez installé par défaut une Oracle 9i votre %ORACLE_HOME% correspondra à c:\oracle
\ora92.

-- Sous Windows
SET ORACLE_HOME=c:\oracle\ora92

--Sous Linux en BASH


export ORACLE_HOME=/home/oracle/OraHome1

--Sous Linux en C Shell


setenv ORACLE_SID
/home/oracle/OraHome1

Que signifie %ORACLE_SID% ?


Auteurs : Helyos ,
%ORACLE_SID% est une variable d'environnement qui correspond en fait au nom de l'instance sur laquelle vous
souhaitez vous connecter. Par exemple si vous avez 2 instances actuellement en cours d'utilisation sur votre serveur
TOTO et TATA, et que vous souhaitez vous connecter à TATA, il vous faudra alors positionner cette variable
d'environnement à TATA.

-- Sous Windows
SET ORACLE_SID=TATA

--Sous Linux en BASH


export ORACLE_SID=TATA

--Sous Linux en C Shell


setenv ORACLE_SID

-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

TATA

Combien coûte la license Oracle ? Est-ce gratuit ?


Auteurs : Fred_D ,

Tous les produits édités par Oracle sont disponibles en version complète et gratuitement sur leur site de
téléchargement.
Néanmoins, seul SQL Developper est gratuit quelles que soient les circonstances. En effet, les autres produits ne sont
disponibles gratuitement qu'à des fins de tests du produit (hors de question de l'utiliser pour tester des développements,
seul le prototypage est autorisé) et d'auto-formation seulement ! Vous pouvez lire la license sur cette page : http://
www.oracle.com/technology/software/htdocs/devlic.html .
Pour tout autre usage professionnel, il faudra vous acquitter d'une license qui dépend de trop nombreux paramètres
pour pouvoir être détaillée ici . Je vous invite donc à aller directement sur le site de vente en ligne Oracle Store pour
vous faire une idée. Évidemment, il est important de vérifier et/ou discuter des conditions tarifaires avec un commercial
Oracle.
A noter également qu'Oracle propose une distribution entièrement gratuite et professionnelle sous l'appellation
d'Oracle Database 10g Express Edition. Cette version limitée intégre la base de données en version 10g, le développement
d'une application ainsi que du reporting.

-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Développement

-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Développement > SQL


Comment filtrer les n premières lignes d'une requête avec ROWNUM ?
Auteurs : SheikYerbouti ,
• Obtenir les 10 premières lignes d'une requête non triée :

SELECT *
FROM EMP
WHERE ROWNUM <= 10 ;

• Obtenir les 10 premières lignes d'une requête triée :

SELECT *
FROM (SELECT *
FROM EMP
ORDER BY ename)
WHERE ROWNUM <= 10 ;

Explication de la seconde requête :


Chaque ligne retournée par une requête se voit attribuer un numéro, commençant par 1.
Cela est parfait tant que les données ne sont pas triées avec le mot-clé ORDER BY !
Par contre, si vous souhaitez trier les données, le numéro (ROWNUM) est attribué pour chaque ligne AVANT le tri
final !
Prenons un exemple en affichant le contenu de la table EMP trié par salaires :

1 SELECT ROWNUM, a.*


2 FROM emp a
3 WHERE sal > 1000
4* ORDER BY sal
SQL>
SQL> /

ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
11 7900 JAMES CLERK 7698 04/12/81 1045 30
10 7876 ADAMS CLERK 7788 24/05/87 1210 20
14 9991 Dupontont CLERK 7698 24/01/82 1210 10
15 9992 Duboudin CLERK 7698 24/01/82 1215 1250 10
2 7521 WARD SALESMAN 7698 23/02/81 1375 500 30
4 7654 MARTIN SALESMAN 7698 29/09/81 1375 1400 30
13 7934 MILLER CLERK 7782 24/01/82 1430 10
9 7844 TURNER SALESMAN 7698 09/09/81 1650 0 30
1 7499 ALLEN SALESMAN 7698 21/02/81 1936 300 30
16 9994 Schmoll CLERK 7698 24/05/87 2500 20
6 7782 CLARK MANAGER 7839 10/06/81 2695 2000 10

ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
5 7698 BLAKE MANAGER 7839 02/05/81 3135 30
3 7566 JONES MANAGER 7839 03/04/81 3273 20
7 7788 SCOTT ANALYST 7566 20/04/87 3300 20
12 7902 FORD ANALYST 7566 04/12/81 3300 20
8 7839 KING PRESIDENT 18/11/81 5500 10

16 ligne(s) sélectionnée(s).

Nous ne voulons maintenant afficher que les 4 premières lignes :

-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> SELECT ROWNUM, a.*


2 FROM emp a
3 WHERE sal > 1000
4 AND ROWNUM < 5
5 ORDER BY sal ;

ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
2 7521 WARD SALESMAN 7698 23/02/81 1375 500 30
4 7654 MARTIN SALESMAN 7698 29/09/81 1375 1400 30
1 7499 ALLEN SALESMAN 7698 21/02/81 1936 300 30
3 7566 JONES MANAGER 7839 03/04/81 3273 20

les CLERK ont disparu !


Simplement parce que le tri a été effectué après que le ROWNUM ait été affecté aux lignes retournées par la requête.
Il faut donc trier les données avant qu'Oracle ne leur affecte un numéro !
Ceci est réalisé par un tri inclus dans une sous-requête :

SQL> SELECT ROWNUM, a.*


2 FROM (
3 SELECT *
4 FROM emp
5 ORDER BY sal
6 ) a
7 WHERE ROWNUM < 5 ;

ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


---------- ---------- ---------- --------- ---------- -------- ---------- ---------- ----------
1 7369 SMITH CLERK 7902 18/12/80 880 20
2 7900 JAMES CLERK 7698 04/12/81 1045 30
3 7876 ADAMS CLERK 7788 24/05/87 1210 20
4 9991 Dupontont CLERK 7698 24/01/82 1210 10

Voici enfin le résultat attendu.

Comment sélectionner du m-iéme au n-iéme enregistrements ?


Auteurs : Fred_D ,
Voici une méthode pour filtrer la liste des enregistrements sur des intervalles consécutifs depuis la version 8i :
• les 5 premiers :

SELECT ename, job


FROM (SELECT ename, job, ROW_NUMBER() OVER (ORDER BY sal) num
FROM emp
)
WHERE num BETWEEN 1 AND 5;

• les 5 suivants :

SELECT ename, job


FROM (SELECT ename, job, ROW_NUMBER() OVER (ORDER BY sal) num
FROM emp
)
WHERE num BETWEEN 6 AND 10;

- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• de la m-iéme à la n-iéme ligne :

SELECT ename, job


FROM (SELECT ename, job, ROW_NUMBER() OVER (ORDER BY sal) num
FROM emp
)
WHERE num BETWEEN &m AND &n;

Ces exemples utilisent la fonction analytique ROW_NUMBER. Cette fonction est très similaire au ROWNUM utilisé
dans le paragraphe précédent mais est appliqué sur le résultat de la requête et pas pendant l'exécution de la requête
elle-même.
Avec ROWNUM, la requête précédente aurait pu s'écrire :

SELECT ename, job


FROM ( SELECT ename, job, ROWNUM num
FROM (
SELECT ename, job
FROM emp ORDER BY sal
)
)
WHERE num BETWEEN &m AND &n;

Les fonctions analytiques peuvent sensiblement simplifier les requêtes et éventuellement améliorer leurs performances.

Comment détecter et supprimer les doublons ?


Auteurs : lalystar ,
Supposons qu'on ait une table PERSONNE (nom, prenom, telephone) et qu'on souhaite avoir la liste des personnes
ayant le même nom et le même prénom. On peut l'obtenir avec la requête suivante :

select nom, prenom


from PERSONNE
group by nom, prenom
having count(*) > 1;

Si on ne veut garder qu'une seule ligne pour chaque ensemble de personnes ayant le même nom et le même prénom, le
choix se faisant de manière arbitraire, on peut utiliser la requête suivante :

delete PERSONNE a
where rowid > (
select min(rowid)
from PERSONNE b
where b.nom = a.nom and
b.prenom = a.prenom
);

Remarque :
- cette requête doit être adaptée si l'une des colonnes nom ou prénom peut être nulle.
- cette requête garde la ligne de rowid minimum parmi l'ensemble des lignes ayant même nom et même prénom.

- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

lien : Comment sélectionner du m-iéme au n-iéme enregistrements ?

Comment détecter les enregistrements empêchant la validation d'une contrainte ?


Auteurs : Jaouad ,
À l'aide de la table des exceptions : elle peut se créer via ce script :

create table exceptions(


row_id rowid,
owner varchar2(30),
table_name varchar2(30),
constraint varchar2(30));

Ou en utilisant le script fournit dans $ORACLE_HOME/RDBMS/admin/UTLEXCPT.SQL.


Voyons son utilisation au travers de ce jeu d'essais :

create table test (


a varchar2(10),
b number );

-- Insertion des valeures


insert into test values ('a',1);
insert into test values ('b',2);
insert into test values ('c',3);
insert into test values ('d',4);
insert into test values ('a',5);
insert into test values ('e',6);
insert into test values ('f',7);
insert into test values ('b',8);
insert into test values ('a',9);
insert into test values ('z',10);
commit;

Essayons maintenant de créer une contrainte d'unicité : nous allons obtenir une erreur :

SQL> alter table test add constraint TEST_PK unique (a)


2 exceptions into exceptions ;
alter table test add constraint TEST_PK unique (a)
*
ERREUR à la ligne 1 :
ORA-02299: impossible de valider (SCOTT.TEST_PK) - clés en double trouvées

La requête suivante nous permet d'identifier les lignes posant problème :

Retrouver toutes les valeurs en doubles


SQL> select * from test where rowid in ( select row_id from exceptions where table_name='TEST' and o
wner ='SCOTT' ) ;

A B
---------- ----------
a 1
b 2
a 5
b 8

- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Retrouver toutes les valeurs en doubles


a 9

Comment supprimer/remplacer des caractères avec la fonction TRANSLATE ?


Auteurs : SheikYerbouti ,
Cette fonction permet d'effectuer plusieurs remplacements d'un coup (à l'inverse de REPLACE() qui ne permet le
remplacement que d'un caractère ou une chaîne à la fois) :
TRANSLATE( chaîne en entrée, chaîne de recherche, chaîne de substitution ) ;
• Exemple de suppression de caractères indésirables pour la constitution d'un nom de fichier :

SQL> SELECT TRANSLATE ( 'Nom/de~fichier;non.conforme', '1/\^~.,;', '1' ) "Fichier"


2 FROM DUAL ;

Fichier
-----------------------
Nomdefichiernonconforme

Le premier argument de la fonction est la chaîne en entrée,


Le deuxième indique la chaîne de recherche,
Le troisième indique la substitution caractère par caractère,
En clair, le premier caractère de la chaîne de recherche trouvé dans la chaîne en entrée sera remplacé par le premier
caractère de la chaîne de substitution et ainsi de suite pour les autres caractères.
La ruse dans l'exemple est le premier caractère '1' dans les deux derniers arguments. On dit qu'il s'agit d'un caractère
leurre, pusiqu'il sert à ignorer tous les caractères de la chaîne en entrée qui ne sont pas dans la chaîne de recherche.
La fonction remplace tous les '1' par '1' et tous les autres caractères de la chaîne de recherche trouvés dans la chaîne
en entrée par rien !

• Exemple de remplacement de caractères indésirables pour la constitution d'un nom de fichier :

SQL> SELECT TRANSLATE ( 'Nom/de~fichier;non.conforme', '1/\^~.,;', '1_______' ) "Fichier"


2 FROM DUAL ;

Fichier
---------------------------
Nom_de_fichier_non_conforme

La fonction remplace tous les '1' par '1' et tous les autres caractères de la chaîne de recherche par le caractère '_'.
• Autre exemple de remplacement de caractères indésirables :

SQL> SELECT TRANSLATE ( 'àâäéèëêùûüô', 'àâäéèëêùûüô', 'aaaeeeeuuuo' ) "Chaine"


2 FROM DUAL ;

Chaine
-----------
aaaeeeeuuuo

SQL>

La fonction remplace toutes les minuscules accentuées par leurs équivalents non accentués.
Bien évidement, les arguments de la fonction peuvent être des variables :

- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

FUNCTION Remplace ( PC$Chaine IN VARCHAR2, PC$Rech IN VARCHAR2 , PC$Subst IN VARCHAR2


) RETURN VARCHAR2 IS
BEGIN
RETURN TRANSLATE( PC$Chaine, PC$Rech, PC$Subst ) ;
END ;

Comment manipuler la partie entière et décimale d'un numérique avec la fonction TRUNC ?
Auteurs : SheikYerbouti ,
TRUNC( valeur, précision ) ;
Cette fonction permet d'effectuer deux types d'action (sur un numérique) :
• Conserver le nombre de décimales souhaitées (précision >= 0)
• Cadrer la partie entière d'un nombre dans une tranche (précision < 0)

• Exemple de conservation des décimales voulues :

SQL> select
2 trunc(12.98764, 5) "+5 dec."
3 ,trunc(12.98764, 4) "+4 dec."
4 ,trunc(12.98764, 3) "+3 dec."
5 ,trunc(12.98764, 2) "+2 dec."
6 ,trunc(12.98764, 1) "+1 dec."
7 ,trunc(12.98764, 0) "+0 dec."
8 from dual ;

+5 dec. +4 dec. +3 dec. +2 dec. +1 dec. +0 dec.


---------- ---------- ---------- ---------- ---------- ----------
12,98764 12,9876 12,987 12,98 12,9 12

• Exemple de cadrage par tranches :

SQL> select
2 trunc(1234567,-6) "million"
3 ,trunc(1234567,-5) "cent-mille"
4 ,trunc(1234567,-4) "dix-mille"
5 ,trunc(1234567,-3) "mille"
6 ,trunc(1234567,-2) "cent"
7 ,trunc(1234567,-1) "dix"
8 from dual ;

million cent-mille dix-mille mille cent dix


---------- ---------- ---------- ---------- ---------- ----------
1000000 1200000 1230000 1234000 1234500 1234560

• Extraction des parties entière et décimale d'un nombre :

SQL> DECLARE
2 LN$Num number := 100.95 ;
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE( 'Partie entière : ' || To_char( TRUNC ( LN$Num ) )) ;
5 DBMS_OUTPUT.PUT_LINE( 'Partie décimale : ' || To_char( LN$Num - TRUNC (LN$Num ) ) ) ;
6 END ;
7 /
Partie entière : 100
Partie décimale : ,95

- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Procédure PL/SQL terminée avec succès.

Comment tronquer une date avec la fonction TRUNC ?


Auteurs : SheikYerbouti ,
La fonction TRUNC() appliquée à une date ne permet pas seulement l'ablation de la partie horaire.
Nous connaissons tous cette fonction qui, sans spécification de son deuxième argument, retire la partie horaire.
Mais nous connaissons souvent moins l'autre particularité de cette fonction appliquée aux dates, par l'intermédiaire
du second argument (format).
TRUNC( date [,'format'] )

SQL> -- Format étendu d'affichage des dates --


SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS' ;

Session modifiée.

SQL>
SQL> -- Affichage de la date du jour --
SQL> SELECT SYSDATE "Date du jour" FROM DUAL ;

Date du jour
-------------------
08/10/2004 14:08:48

SQL>
SQL> -- date tronquée au 1er jour de l'année --
SQL> SELECT TRUNC(SYSDATE, 'YEAR') "'YEAR'" FROM DUAL;

'YEAR'
-------------------
01/01/2004 00:00:00

SQL>
SQL> -- date tronquée au 1er jour de l'année ISO--
SQL> SELECT TRUNC(SYSDATE, 'IYYY') "'IYYY'" FROM DUAL;

'IYYY'
-------------------
29/12/2003 00:00:00

SQL>
SQL> -- date tronquée au 1er jour du trimestre --
SQL> SELECT TRUNC(SYSDATE, 'Q') "'Q'" FROM DUAL;

'Q'
-------------------
01/10/2004 00:00:00

SQL>
SQL> -- date tronquée au 1er jour du mois --
SQL> SELECT TRUNC(SYSDATE, 'MONTH') "'MONTH'" FROM DUAL;

'MONTH'
-------------------
01/10/2004 00:00:00

SQL>
SQL> -- date tronquée au 1er jour de la semaine --
SQL> SELECT TRUNC(SYSDATE, 'DAY') "'DAY'" FROM DUAL;

'DAY'
-------------------

- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

04/10/2004 00:00:00

SQL>
SQL> -- jour de la semaine correspondant au jour du 1er jour du mois --
SQL> SELECT TRUNC(SYSDATE, 'W') "'W'" FROM DUAL;

'W'
-------------------
08/10/2004 00:00:00

SQL>
SQL> -- jour de la semaine correspondant au jour du 1er jour de l'année --
SQL> SELECT TRUNC(SYSDATE, 'WW') "'WW'" FROM DUAL;

'WW'
-------------------
07/10/2004 00:00:00

SQL>
SQL> -- jour de la semaine correspondant au jour du 1er jour de l'année ISO --
SQL> SELECT TRUNC(SYSDATE, 'IW') "'IW'" FROM DUAL;

'IW'
-------------------
04/10/2004 00:00:00

SQL>
SQL> -- date tronquée au jour (retire les heures) --
SQL> SELECT TRUNC(SYSDATE, 'DD') "'DD'" FROM DUAL;

'DD'
-------------------
08/10/2004 00:00:00

SQL>
SQL> -- date tronquée à l'heure (retire les minutes) --
SQL> SELECT TRUNC(SYSDATE, 'HH') "'HH'" FROM DUAL;

'HH'
-------------------
08/10/2004 14:00:00

SQL>
SQL> -- date tronquée à la minute (retire les secondes) --
SQL> SELECT TRUNC(SYSDATE, 'MI') "'MI'" FROM DUAL;

'MI'
-------------------
08/10/2004 14:08:00

Comment formater les dates ?


Auteurs : Helyos ,
Il existe beaucoup de formats de date disponibles avec Oracle.
Voici une liste non exhaustive des différents formats de date disponible.
• - / , . ; : "text" : Ponctuation ou texte à insérer dans la chaîne finale.
• AD A.D. : Pour ajouter les sigles aprés Jésus Christ
• AM A.M. : Symbole Am
• BC B.C. : Pour ajouter les sigles avant Jésus Christ
• CC SCC : Pour obtenir le n° du siècle en cours
• D : N° du jour dans la semaine (par exemple Lundi =1, Mardi =2, etc...) Attention la notation peut changer en
fonction de vos paramètres NLS.

- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• DAY : Nom du jour (compensé avec des espaces jusqu'à 9 caractères)


• DD : Le numéro du jour dans le mois (de 1 à 31)
• DDD : Le numéro du jour dans l'année (de 1 à 366)
• DY: Abréviation du nom du jour
• E : Abréviation du nom de l'ère en cours (pour les calendriers Japonais, ROC et Thai).
• EE : Nom complet de l'ère en cours
• FM : Permet de supprimer les espaces inutiles
• HH: Heure (de 1 à 12)
• HH12: Heure (de 1 à 12)
• HH24: Heure (de 1 à 23)
• IW: Numéro de la semaine dans l'année (de 1 à 52 ou 53 en fonction de l'année)
• IYY IY I : Les 3, 2 ou 1 derniers chiffres de l'année
• IYYY : Les 4 chiffres de l'année
• J: Nombre de jours depuis la date January 1, 4712 BC
• MI: Minutes (de 1 à 59)
• MM: Numéro du mois dans l'année
• MON : Abréviation du nom du mois
• MONTH : Nom du mois (compensé avec des espaces jusqu'à 9 caractères)
• PM P.M. : Symbole Pm
• Q: Numéro du trimestre
• RM: Numéro du mois au format romain
• RR: Les deux derniers chiffres de l'année (avec prise en compte du siècle en cours)
• RRRR: Les 4 derniers chiffres de l'année (avec prise en compte du siècle en cours)
• SS: Nombre de secondes (de 0 à 59)
• SSSSS: Nombre de secondes écoulées depuis minuit (de 0 à 86399)
• W: Numéro de la semaine dans le mois (de 1 à 5)
• Y,YYY: Numéro de l'année avec une virgule pour délimiter le millénaire (par exemple 2,004)
• YEAR : Epellation du numéro de l'année en cours
• YYYY: Numéro de l'année en cours (sans prise en compte du siècle en cours)
• YYY YY Y : Les 3, 2 ou 1 derniers chiffres de l'année

Exemple :

SELECT to_char(sysdate,'DD/MM/RRRR Day D Month Year')


FROM dual;

TO_CHAR(SYSDATE,'DD/MM/RRRRDAYDMONTHYEAR')
------------------------------------------------------------------------------------
15/10/2004 Vendredi 5 Octobre Two Thousand Four

Quelles sont les limitations d'une contrainte CHECK ?


Auteurs : Pomalaix ,
Les contraintes CHECK sont pratiques pour mettre en place un simple contrôle statique de validité des données, mais
elles sont très limitées. Il faudra alors recourir à des déclencheurs pour des validations plus complexes.
Une contrainte CHECK ne peut faire référence qu'aux colonnes de la ligne courante.
Elle ne peut donc pas impliquer d'autres lignes de la table, ni impliquer d'autres tables.
En particulier, on ne peut pas y utiliser un SELECT.
Dans une contrainte CHECK, on ne peut pas faire appel à une fonction personnalisée.
Les fonctions standard (comme LENGTH ou UPPER par exemple) sont autorisées, à condition qu'elles soient
déterministes.

- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

C'est pourquoi on ne peut pas utiliser les fonctions SYSDATE ou USER, qui provoquent l'une comme l'autre l'erreur
"ORA-02436: variable de date ou système mal indiquée dans contrainte CHECK".
Pour résumer, une contrainte CHECK ne peut mettre en jeu que les colonnes de la ligne courante, des constantes
éventuellement sous forme de listes, et des fonctions standard déterministes.
Exemples :

CHECK (UPPER(titre) IN ('M.', 'MME', 'MLLE'))


CHECK ((col1 < col2) OR (col1 = 10))

Quelle est la différence entre les types CHAR et VARCHAR2 ?


Auteurs : Jaouad ,
Il existe essentiellement une différence de place entre ces types de données . En effet, VARCHAR2 a une longueur
variable qui dépend directement de la taille de la donnée inséree alors que CHAR à une longueur fixe (défini à la création
de la table ).
Prenons l'exemple d'un VARCHAR2 (20)) et CHAR(20), si on insère 'Oracle' dans les deux colonnes, Oracle serat
compléte par des espaces dans la colonne CHAR(20) :

create table dvp ( a char(20), b varchar2(20)) ;


insert into dvp values ('oracle','oracle') ;
commit ;

SQL> select '-'||a||'-', '-'||b||'-' from dvp ;

'-'||A||'-' '-'||B||'-'
---------------------- ----------------------
-oracle - -oracle-

SQL> select length(a) , length(b) from dvp ;

LENGTH(A) LENGTH(B)
---------- ----------
20 6

La Longueur maximale de Char (2000) et Varchar2 (4000) sur une 8i :

SQL> create table dvp ( a varchar2(4001) ;


create table dvp ( a varchar2(4001)
*
ERREUR à la ligne 1 :
ORA-00910: specified length too long for its datatype

SQL> create table dvp ( a varchar2(4000)) ;

Table créée.

SQL> drop table dvp ;

Table supprimée.

SQL> create table dvp ( a char(2001)) ;


create table dvp ( a char(2001))
*
ERREUR à la ligne 1 :

- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

ORA-00910: specified length too long for its datatype

SQL> create table dvp ( a char(2000)) ;

Table créée.

Oracle recommande quand même l'utilisation de VARCHAR2 au lieu de CHAR pour une raison de compatibilité dans
les versions supérieures.
Outre l'utilisation supplémentaire de place, l'utilisation de CHAR en lieu et place de VARCHAR2 augmentera
également la taille de vos index et peut parfois diminuer les performances de recherches de ces derniers !

Comment détecter les verrous (locks) ?


Auteurs : Jaouad ,
Via la requête suivante :

SELECT /*+ choose */


bs.username "Blocking User",
bs.username "DB User",
ws.username "Waiting User",
bs.sid "SID",
ws.sid "WSID",
bs.sql_address "address",
bs.sql_hash_value "Sql hash",
bs.program "Blocking App",
ws.program "Waiting App",
bs.machine "Blocking Machine",
ws.machine "Waiting Machine",
bs.osuser "Blocking OS User",
ws.osuser "Waiting OS User",
bs.serial# "Serial#",
DECODE (
wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE
) lock_type,
DECODE (
hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',

- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (hk.lmode)
) mode_held,
DECODE (
wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (wk.request)
) mode_requested,
object_name ,
TO_CHAR (hk.id1) lock_id1,
TO_CHAR (hk.id2) lock_id2
FROM v$lock hk, v$session bs, v$lock wk, v$session ws , V$LOCKED_OBJECT a ,
dba_objects b
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.sid = bs.sid(+)
AND wk.sid = ws.sid(+)
AND a.object_id=b.object_id
AND hk.sid=a.session_id
ORDER BY 1;

Plus simplement, comment détecter si une table est verouillée :

SELECT session_id , oracle_username , os_user_name


FROM V$LOCKED_OBJECT VLO INNER JOIN dba_objects DO ON VLO.object_id = DO.object_id
WHERE object_name = 'object_name'
AND owner = 'owner';

Comment positionner la valeur d'une colonne à sa valeur par défaut ?


Auteurs : lalystar ,
À partir d'Oracle 9i, on peut utiliser le mot-clé default pour spécifier la valeur par défaut d'une colonne :

SQL> create table TEST (


2 x number default 5,
3 y number default -3
4 );

Table created.

SQL> insert into TEST


2 values (default, default);

1 row created.

SQL> select * from TEST;

- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

X Y
---------- ----------
5 -3

SQL> update TEST


2 set x = -5,
3 y = 0;

1 row updated.

SQL> select * from TEST;

X Y
---------- ----------
-5 0

SQL> update TEST


2 set x = default,
3 y = default;

1 row updated.

SQL> select * from TEST;

X Y
---------- ----------
5 -3

SQL> alter table TEST modify (


2 x default 0,
3 y default null
4 );

Table altered.

SQL> update TEST


2 set x = default,
3 y = default;

1 row updated.

SQL> select * from TEST;

X Y
---------- ----------
0

Comment différencier NULL et chaîne vide ?


Auteurs : Jaouad , Laurent Schneider ,
Comme le montre l'exemple suivant, lors de vos INSERT/UPDATE, Oracle retransforme les chaînes vide en valeur
nulles, ce qui peut être gênant fonctionnellement, en particulier pour des applications multi-SGBD.

jeu d'essais
CREATE TABLE dvp ( a VARCHAR2( 10 ) ) ;
INSERT INTO dvp VALUES (NULL) ;
INSERT INTO dvp VALUES ('DVP') ;
INSERT INTO dvp VALUES ('') ;
COMMIT;

SQL> SELECT '-' ||a FROM dvp ;

- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

'-'||A
-----------
-
-DVP
-

SQL> SELECT COUNT(*) FROM dvp ;

COUNT(*)
----------
3

SQL> SELECT COUNT(*) FROM dvp WHERE a IS NULL;

COUNT(*)
----------
2

SQL> SELECT COUNT(*) FROM dvp WHERE a = '' ;

COUNT(*)
----------
0

SQL> SELECT COUNT(*) FROM dvp WHERE a IS NOT NULL ;

COUNT(*)
----------
1

SQL> SELECT COUNT(*) FROM dvp WHERE a != '' ;

COUNT(*)
----------
0

Une solution consiste à utiliser un caractère ou une chaîne de susbsitution, afin que votre applicatif puisse gérer ces
informations de manière distincte. Le plus simple, si c'est possible, est d'utiliser le caractère espace, ce qui donne, si
l'on continue sur l'exemple précédent :

SQL> insert into dvp values (' ') ;

1 ligne créée.

SQL> commit;

Validation effectuée.

SQL> select count (*) from dvp ;

COUNT(*)
----------
4

SQL> select count(*) from dvp where a is null ;

Attention tout de même :


Oracle® Database SQL Reference 10g Release 2 (10.2) :
Note: Oracle Database currently treats a character value with a length of zero as null. However, this may not continue
to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Comment insérer ou mettre à jour des données sans savoir


si les enregistrements correspondants existent déjà ?
Auteurs : Xavier Vlieghe ,
Grâce à l'instruction MERGE, à partir de la 9i. Voici sa syntaxe :

MERGE INTO Table1 T1


USING (SELECT Id, Meschamps FROM Table2) T2
ON ( T1.Id = T2.Id ) -- Condition de correspondance
WHEN MATCHED THEN -- Si Vraie
UPDATE SET T1.Meschamps = T2.Meschamps
WHEN NOT MATCHED THEN -- Si faux
INSERT (T1.ID, T1.MesChamps) VALUES ( T2.ID, T2.MesChamps);

Prenons l'exemple d'une table "Article" tout ce qu'il y a de plus classique :


• Une clé (PK)
• une référence (UQ)
• un libellé
• un prix

La clé primaire est renseignée à l'aide d'une séquence.

CREATE Table Article (


Id Number (10),
Refe VARCHAR2 (16),
Libe VARCHAR2 (64),
Prix NUMBER (12,2));

CREATE SEQUENCE Seq_Id_Article START WITH 1 INCREMENT BY 1;

INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '001', 'Marteau', 7.46);


INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '002', 'Tournevis', 3.83);
INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '004', 'Lime', 5.09);

COMMIT;

Sa soeur Temp_Article reçoit un fichier de MAJ à jour des prix, sans clé et pouvant contenir de nouveaux articles :

CREATE Table Temp_Article (


Refe VARCHAR2 (16),
Libe VARCHAR2 (64),
Prix NUMBER (12,2));

INSERT INTO Temp_Article VALUES ('001', 'Marteau', 7.27);


INSERT INTO Temp_Article VALUES ('002', 'Tournevis', 3.81);
INSERT INTO Temp_Article VALUES ('003', 'Pince', 2.67);
INSERT INTO Temp_Article VALUES ('004', 'Lime', 5.35);
INSERT INTO Temp_Article VALUES ('005', 'Clé', 4.91);
COMMIT;

La commande MERGE va nous servir à faire la MAJ des prix et l'intégration des nouveaux articles en une seule
commande :

- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> MERGE INTO Article A


2 USING (SELECT Refe, Libe, prix FROM Temp_Article) T
3 ON (A.Refe = T.Refe)
4 WHEN MATCHED THEN
5 UPDATE SET A.Prix = T.Prix, A.Libe = T.Libe
6 WHEN NOT MATCHED THEN
7 INSERT (A.Id, A.Refe, A.Libe, A.Prix) VALUES (Seq_Id_Article.NextVal, T.Refe, T.Libe,
T.Prix);

5 lignes fusionnées.

SQL> SELECT * FROM Article;

ID REFE LIBE PRIX


---------- ---------------- ---------------- -------
1 001 Marteau 7,27
2 002 Tournevis 3,81
3 004 Lime 5,35
7 003 Pince 2,67
8 005 Clé 4,91

Voici la page Oracle sur laquelle vous trouverez toutes les informations utiles à propos de cette commande :
http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_9016.htm#SQLRF01606
Use the MERGE statement to select rows from one or more sources for update or insertion into one or more tables. You
can specify conditions to determine whether to update or insert into the target tables.
This statement is a convenient way to combine multiple operations. It lets you avoid multiple INSERT, UPDATE, and
DELETE DML statements.
MERGE is a deterministic statement. That is, you cannot update the same row of the target table multiple times in the
same MERGE statement.

lien : http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_9016.htm#SQLRF01606

Comment empêcher l'exécution d'une requête non ré écrite ?


Auteurs : Jaouad ,
Grâce au hint apparue avec la version 10g :

/*+ REWRITE_OR_ERROR */

Comment construire une requête récursive ?


Auteurs : Xavier Vlieghe ,
Oracle permet de gérer le concept de requêtes récursives, à l'aide des clauses suivantes :
• START WITH Champ = {Valeur} : Cette clause permet de préciser le(s) noeud(s) de l'arborescence à partir
duquel ou desquels on souhaite lister les éléments,
• CONNECT BY PRIOR Id = Id_Parent : Cette clause indique sur quels champs se baser pour parcourir
l'arborescence,

Depuis la version 9i, vous pouvez utiliser un pseudo champ LEVEL afin de connaître le niveau de chaque
enregistrement.
En voici un exemple, grâce à une table Catégorie comprenant les champs suivants :
• Une Clé (Id)

- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• Un Libellé (Libe)
• La clé de la catégorie parent (Id_Parent)

CREATE TABLE Categorie (


Id NUMBER (4),
Libe VARCHAR2 (16),
Id_Parent NUMBER (4));

-- Les clés sont attribuées de manière hiérarchique pour plus de clarté, ce qui est bien entendu rarement le cas
INSERT INTO Categorie VALUES ( 1, 'Librairie' , NULL);
INSERT INTO Categorie VALUES ( 11, 'Revue' , 1);
INSERT INTO Categorie VALUES ( 111, 'Quotidien' , 11);
INSERT INTO Categorie VALUES ( 112, 'Hebdomadaire' , 11);
INSERT INTO Categorie VALUES ( 111, 'Mensuel' , 11);
INSERT INTO Categorie VALUES ( 12, 'Roman' , 1);
INSERT INTO Categorie VALUES ( 13, 'Bande Dessinée', 1);

INSERT INTO Categorie VALUES ( 2, 'Alimentaire' , NULL);


INSERT INTO Categorie VALUES ( 21, 'Boisson' , 2);
INSERT INTO Categorie VALUES ( 211, 'Alcool' , 21);
INSERT INTO Categorie VALUES ( 212, 'Jus de fruits' , 21);
INSERT INTO Categorie VALUES ( 213, 'Alcool' , 21);
INSERT INTO Categorie VALUES (2131, 'Vins' , 213);
INSERT INTO Categorie VALUES (2132, 'Bière' , 213);
INSERT INTO Categorie VALUES (2133, 'Apéritif' , 213);
INSERT INTO Categorie VALUES ( 22, 'Conserve' , 2);
INSERT INTO Categorie VALUES ( 23, 'Frais' , 2);

COMMIT;

Voici la liste des catégories dépendant de la catégorie 1 : Librairie :

SQL> SELECT Id, Libe, LEVEL, Id_Parent


2 FROM Categorie
3 START WITH Id = 1
4 CONNECT BY PRIOR Id = Id_Parent;

ID LIBE LEVEL ID_PARENT


---------- ---------------- ---------- ----------
1 Librairie 1
11 Revue 2 1
111 Quotidien 3 11
112 Hebdomadaire 3 11
111 Mensuel 3 11
12 Roman 2 1
13 Bande Dessinée 2 1

7 ligne(s) sélectionnée(s).

A partir de la 9i, vous pouvez également utilisez la fonction SYS_CONNECT_BY_PATH (Champ, séparateur), qui
permet de concaténer les différents valeurs du champ spécifié pour connaître le chemin entre l'élément concerné et le
neod racine :

SQL> SELECT SYS_CONNECT_BY_PATH(Libe, '-')


2 FROM Categorie
3 START WITH Id = 2
4 CONNECT BY PRIOR Id = Id_Parent;

SYS_CONNECT_BY_PATH(LIBE,'-')
------------------------------------------
-Alimentaire

- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

-Alimentaire-Boisson
-Alimentaire-Boisson-Alcool
-Alimentaire-Boisson-Jus de fruits
-Alimentaire-Boisson-Alcool
-Alimentaire-Boisson-Alcool-Vins
-Alimentaire-Boisson-Alcool-Bière
-Alimentaire-Boisson-Alcool-Apéritif
-Alimentaire-Conserve
-Alimentaire-Frais

10 ligne(s) sélectionnée(s).

Quels sont les raccourcis sous SQL*Plus


Auteurs : Pomalaix , Jaouad , Fred_D ,
@ désigne la variable ORACLE_SID courante. Est valable dans les scripts SQL, dans divers paramètres de l'INIT.ORA,
dans des scripts RMAN notamment.
? désigne la variable ORACLE_HOME courante. Est valable dans les scripts SQL, dans divers paramètres de
l'INIT.ORA, dans des scripts RMAN notamment.
! équivalent de la commande HOST de SQL*Plus, permet d'appeler le shell, sous Unix uniquement
$ équivalent de la commande HOST de SQL*Plus, permet d'appeler le shell, sous Windows uniquement
& permet de désigner une variable SQL*Plus
start et @ permet de lancer un script
define permet de définir une variable sous Sql*Plus , sans argument elle donne toutes les variables déja défini
& permet de définir une variable, && permet de la définir une fois pour toute et pour toute la session.
ed permet de lancer le buffer
l permet de voir sans l'executer le dernier ordre SQL
r permet de voir et executer le dernier ordre SQL
c:mot1:mot2 permet de changer toutes les occurences du mot1 par mot2 dans le dernier ordre SQL

Quelles sont les principales variables d'environnement de SQL Plus ?


Auteurs : PlaineR ,
Voici les variables d'environnement les plus communes :
• define : caractère utilisé pour la substitution des variables (par défaut "&")

syntaxe :

-- gère les caractères de substitution


SET define ON
-- les caractères de substitutions ne sont pas gérés
SET define off
-- le caractère de substition est @
SET define @

• linesize : nombre de caractères par lignes

NB : la ligne est complétée par des espaces pour atteindre ce nombre de caractères.
syntaxe :

-- mets le nom de caractère par ligne à 130

- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SET linesize 130

• numformat : format par défaut des numériques à l'affichage.

syntaxe :

SET numformat 999G999D99

• numwidth : largeur par défaut des numériques

syntaxe :

SET numwidth 8

• pagesize : nombre de lignes de détail (entête nom compris)

syntaxe :

SET pagesize 60

• scan : contrôle la présence de variables de substitution

syntaxe :

-- contrôle la présence de variables de substitions


SET scan ON
-- ne contrôle pas la présence de variables de substitions
SET scan OFF

• tab : utilisation des tabulations

syntaxe :

-- utilisation des tabulations


SET tab ON
-- non utilisation des tabulations
SET tab OFF

• trimspool : suppression des espaces en fin de lignes

syntaxe :

-- supprime les espaces en fin de lignes


SET trimspool ON
-- laisse les espaces en fin de lignes
SET trimspool OFF

• verify : liste la commande avant son exécution

- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

syntaxe :

-- liste la commande avant son exécution


SET verify ON
-- la commande n'est pas affichee avant son exécution
SET verify OFF

• feed : affiche le nombre de lignes affectées par l'ordre SQL

syntaxe :

-- affichage du nombre de lignes affectées


SET feed ON
-- le nombre de lignes affectées n'est pas affiché
SET feed OFF

• term : affiche le résultat des commandes d'un script

syntaxe :

-- affichage du résultat
SET term ON
-- non affichage du résultat
SET term OFF

• heading : affichage de l'entête du résultat

syntaxe :

-- affichage de l'entete
SET heading ON
-- non affichage de l'entete
SET head OFF

• space : nombre d'espaces entre deux colonnes

syntaxe :

-- 2 espaces entre 2 colonnes


SET space 2

• echo : affichade des commandes d'un script à l'exécution

syntaxe :

-- affichage de la commande
SET echo ON
-- non affichage de la commande
SET echo OFF

- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

NB : Ce sont les principales, il en existe d'autres (SQL*Plus : Menu Option-> Environment) dont vous trouverez
l'explication dans la documentation Oracle.

- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Développement > PL/SQL


Comment obtenir le nombre de lignes impactées par le dernier ordre SQL (DML) ?
Auteurs : SheikYerbouti ,
La variable SQL%ROWCOUNT contient le nombre de lignes impactées par le dernier ordre DML exécuté.
Vous pouvez interroger cette variable après tout ordre INSERT, UPDATE ou DELETE

SQL> SET SERVEROUTPUT ON


SQL> DECLARE
2 LN$Cpt PLS_INTEGER ;
3 BEGIN
4 SELECT COUNT(*) INTO LN$Cpt FROM test ;
5 DBMS_OUTPUT.PUT_LINE( To_char( LN$Cpt ) || ' enregistrements') ;

6 -- Mise à jour --
7 UPDATE test
8 SET nom = nom
9 WHERE ROWNUM <= 3 ;
10 DBMS_OUTPUT.PUT_LINE( To_char( SQL%ROWCOUNT ) || ' enregistrements mis à jour') ;

11 -- Insertion --
12 INSERT INTO test
13 SELECT * FROM test ;
14 DBMS_OUTPUT.PUT_LINE( To_char( SQL%ROWCOUNT ) || ' enregistrements insérés') ;

15 -- Suppression --
16 DELETE FROM test
17 WHERE ROWNUM < 3 ;
18 DBMS_OUTPUT.PUT_LINE( To_char( SQL%ROWCOUNT ) || ' enregistrements supprimés') ;

19 ROLLBACK ;
20 END ;
21 /
6 enregistrements
3 enregistrements mis à jour
6 enregistrements insérés
2 enregistrements supprimés

Procédure PL/SQL terminée avec succès.

Comment afficher les erreurs de compilation ?


Auteurs : SheikYerbouti ,
Les erreurs de compilation sont stockées dans la vue USER_ERRORS
Vous pouvez, après compilation d'un objet, afficher les éventuelles erreurs de compilation de deux façons :
• SHOW ERROR
• SELECT ... FROM USER_ERRORS

Exemple (SUBTR au lieu de SUBSTR) :

SQL> CREATE OR REPLACE FUNCTION debut


2 ( PC$Chaine IN VARCHAR2) RETURN VARCHAR2 IS
3 BEGIN
4 RETURN SUBTR( PC$Chaine, 1, 5 ) ;
5 END;
6 /

- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Avertissement : Fonction créée avec erreurs de compilation.

SQL> SHOW ERRORS


Erreurs pour FUNCTION DEBUT :

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3 PL/SQL: Statement ignored
4/10 PLS-00201: l'identificateur 'SUBTR' doit être déclaré

SQL>
SQL> SELECT *
2 FROM user_errors
3 WHERE name = 'DEBUT'
4 AND type = 'FUNCTION'
5 ORDER BY SEQUENCE
6 /

NAME TYPE SEQUENCE LINE POSITION


------------------------------ ------------ ---------- ---------- ----------
TEXT
--------------------------------------------------------------------------------
DEBUT FUNCTION 1 4 10
PLS-00201: l'identificateur 'SUBTR' doit être déclaré

DEBUT FUNCTION 2 4 3
PL/SQL: Statement ignored

Comment compter le nombre d'occurrences dans une chaîne ?


Auteurs : SheikYerbouti ,
Comment compter le nombre d'occurrences dans une chaîne sans l'aide d'une boucle itérative ?
En utilisant les fonctions LENGTH() et REPLACE() de la façon suivante :

CREATE OR REPLACE FUNCTION CPT_OCCURRENCES


(
PC$Entree IN VARCHAR2, -- Chaîne en entrée
PC$Recherche IN VARCHAR2 -- Chaîne à rechercher
) RETURN PLS_INTEGER IS
BEGIN
RETURN ( (LENGTH(PC$Entree) - LENGTH(REPLACE(PC$Entree,PC$Recherche,NULL)) ) / NVL(LENGTH(PC
$Recherche),1) ) ;
END;

SQL> SELECT CPT_OCCURRENCES( 'le et le et le', 'le' ) "Nombre d'occurrences" FROM DUAL ;

Nombre d'occurrences
--------------------
3

Comment obtenir le temps d'exécution instruction par instruction de vos codes PL/SQL ?
Auteurs : SheikYerbouti ,
En installant l'outil Oracle : Profiler
Vous devez être connecté avec le privilège SYSDBA

- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

--------------------------------------
-- Installation de l'outil profiler --
--------------------------------------
connect / as sysdba

@<ORACLE_HOME>/rdbms/admin/proftab.sql
@<ORACLE_HOME>/rdbms/admin/profload.sql
@<ORACLE_HOME>/plsql/demo/profrep.sql

Et en l'exécutant sur n'importe quelle fonction ou procédure PL/SQL :

----------------------------------------------
-- Test de la procédure stockée : F_TRACE() --
----------------------------------------------

SQL>
1 DECLARE
2 Pgm NUMBER;
3 BEGIN
4 DBMS_PROFILER.START_PROFILER('test','test1',Pgm);
5 FD.F_TRACE('Hello Oracle world','T');
6 DBMS_PROFILER.STOP_PROFILER;
7 DBMS_PROFILER.ROLLUP_RUN(Pgm);
8 PROF_REPORT_UTILITIES.PRINT_RUN(Pgm);
9* END;
SQL> /
===========================Results for run #1 made on 23-OCT-04 14:20:55 =========================
(test) Run total time: .16 seconds
Unit #1: SYS.DBMS_PROFILER - Total time: .00 seconds
Unit #2: <anonymous>.<anonymous> - Total time: .00 seconds
Unit #3: FD.F_TRACE - Total time: .02 seconds
1 procedure F_TRACE ( PC$Message in VARCHAR2, PC
$Output in VARCHAR2 DEFAULT 'S' )
2 Is
3 PRAGMA AUTONOMOUS_TRANSACTION ;
4 LC$String Varchar2(4000) ;
5 LN$Slices PLS_INTEGER ;
6 LN$Rest PLS_INTEGER ;
7 1 ,00001660 ,00001660 LN$Pos PLS_INTEGER := 1 ;
8 LN$Inc PLS_INTEGER ;
9 Begin
10
11 1 ,00009573 ,00009573 If Upper( PC$Output ) = 'S' Then
12 -- Screen output (DBMS_OUTPUT) --
13 0 0 LN$Inc := 255 ;
14 0 0 LN$Slices := Length( PC
$Message ) / LN$Inc ;
15 0 0 LN$Rest := MOD( Length( PC
$Message ), LN$Inc ) ;
16 0 0
If LN$Rest > 0 Then LN$Slices := LN$Slices + 1 ; End if ;
17
18 -- output --
19 0 0 For i in 1..LN$Slices Loop
20 0 0 LC$String := Substr( PC
$Message, LN$Pos, LN$Inc ) ;
21 0 0 DBMS_OUTPUT.PUT_LINE( LC$String ) ;
22 0 0 LN$Pos := LN$Pos + LN$Inc ;
23 End loop ;
24
25 Else
26 -- Table output (INSERT) --
27 1 ,00000095 ,00000095 LN$Inc := 4000 ;
28 1 ,00003589 ,00003589 LN$Slices := Length( PC
$Message ) / LN$Inc ;

- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

29 1 ,00001622 ,00001622 LN$Rest := MOD( Length( PC


$Message ), LN$Inc ) ;
30 1 ,00000411 ,00000411
If LN$Rest > 0 Then LN$Slices := LN$Slices + 1 ; End if ;
31
32 -- output --
33 2 ,00004027 ,00002013 For i in 1..LN$Slices Loop
34 1 ,00001587 ,00001587 LC$String := Substr( PC
$Message, LN$Pos, LN$Inc ) ;
35 1 ,01580613 ,01580613 Insert into TRACE (LIGNE) Values
( LC$String ) ;
36 1 ,00094689 ,00094689 Commit ;
37 1 ,00000270 ,00000270 LN$Pos := LN$Pos + LN$Inc ;
38 End loop ;
39 End if ;
40
41 End;

Procédure PL/SQL terminée avec succès.

Comment faire un REPLACE sur un CLOB ?


Auteurs : Helyos ,
Le package DBMS_LOB ne fournit pas de procédure ou fonction REPLACE pour les CLOBs. En voici une :

CREATE OR REPLACE PROCEDURE lob_replace(p_dest_clob IN OUT CLOB,


p_search VARCHAR2,
p_replace VARCHAR2) AS
v_clob_temp CLOB;
v_end_offset INTEGER := 1;
v_start_offset INTEGER := 1;
v_occurence NUMBER := 1;
v_replace_len NUMBER := length(p_replace);
v_clob_temp_len NUMBER := 0;
v_dest_clob_len NUMBER := 0;
BEGIN
IF dbms_lob.ISOPEN(p_dest_clob) = 0 THEN
NULL;
END IF;
dbms_lob.createtemporary(v_clob_temp, TRUE, dbms_lob.session);
LOOP
v_end_offset := dbms_lob.instr(p_dest_clob, p_search, 1, v_occurence);
IF v_end_offset = 0 THEN
v_clob_temp_len := dbms_lob.getlength(v_clob_temp);
v_dest_clob_len := dbms_lob.getlength(p_dest_clob) - v_start_offset + 1;
IF v_dest_clob_len > 0 THEN
dbms_lob.copy(v_clob_temp,
p_dest_clob,
v_dest_clob_len,
v_clob_temp_len + 1,
v_start_offset);
END IF;
EXIT;
END IF;
v_clob_temp_len := dbms_lob.getlength(v_clob_temp);
IF (v_end_offset - v_start_offset) > 0 THEN
dbms_lob.copy(v_clob_temp,
p_dest_clob,
(v_end_offset - v_start_offset),
v_clob_temp_len + 1,
v_start_offset);
END IF;
v_start_offset := v_end_offset + length(p_search);

- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

v_occurence := v_occurence + 1;
IF p_replace IS NOT NULL THEN
dbms_lob.writeappend(v_clob_temp, v_replace_len, p_replace);
END IF;
END LOOP;
IF length(p_search) > length(p_replace) THEN
dbms_lob.TRIM(p_dest_clob, dbms_lob.getlength(v_clob_temp));
END IF;
dbms_lob.copy(p_dest_clob, v_clob_temp, dbms_lob.getlength(v_clob_temp), 1, 1);
EXCEPTION
WHEN OTHERS THEN
htp.prn('[Error in lob_replace : ' || SQLCODE || ' ' ||
SQLERRM || ']');
END;

Comment savoir si une chaine de caractères correspond à un nombre ?


Auteurs : lalystar ,
Plutôt que de coder une fonction qui traite tous les cas de figure correspondant aux différents formats que peut prendre
un nombre (entier, nombre à virgule, nombre avec exposant...), il vaut mieux laisser Oracle gérer la conversion et nous
signaler s'il a rencontré une erreur comme dans la fonction suivante :

create or replace function isNumeric(x in varchar2) return number as


-- renvoie 1 si le paramètre correspond à un nombre
-- 0 sinon
nb number;
begin
nb := to_number(x);
return 1;
exception
when others then
return 0;
end;
/

Exemple d'utilisation : si la colonne X correspond à un nombre, on veut avoir ce nombre multiplié par 1000 :

SQL> SELECT x,
2 isNumeric(x),
3 CASE
4 WHEN isNumeric(x) = 1 THEN 1000 * TO_NUMBER(x)
5 END x_fois_1000
6 FROM TEST;

X ISNUMERIC(X) X_FOIS_1000
---------- ------------ -----------
1 1 1000
1,10 1 1100
1,234E3 1 1234000
-1,23E-3 1 -1,23

- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

1 toto 0

Comment vérifier si une chaine vérifie un certain format ?


Auteurs : lalystar ,
Pour vérifier qu'une chaine de caractère vérifie un format donné, on peut utiliser, à partir d'Oracle 10g, la fonction
MATCH du OWA_PATTERN qui permet de manipuler des expressions régulières. Cette fonction retourne un booléen
indiquant si le format est vérifié ou pas; elle ne peut donc être appelée qu'en PL/SQL.
Par exemple, pour vérifier que les numéros de téléphones en base suivent le format français sur 10 chiffres avec comme
séparateur des tirets, on peut faire :

SQL> select *
2 from TELEPHONE;

TELEPHONE#
--------------------------------------------------------------------------------
07.08.09.02.02
07-08-09-02-02
01 02 02 02 02
TOTO
07/07/07/07/07

SQL>
1 begin
2 for tel in (select * from TELEPHONE)
3 loop
4 if owa_pattern.match(tel.telephone#, '^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$') then
5 dbms_output.put_line(tel.telephone#);
6 end if;
7 end loop;
8* end;
SQL> /
07-08-09-02-02

PL/SQL procedure successfully completed.

Les expressions régulières peuvent utiliser les symboles suivants :


• ^ : début de la ligne
• $ : saut de ligne ou fin de ligne
• \n : saut de ligne
• . : tout caractères sauf le saut de ligne
• \t : tabulation
• \d : chiffre (équivalent à [0-9])
• \D : tout caractère sauf un chiffre (équivalent à [not 0-9])
• \w : tout caractère alphanumérique (chiffres, lettres, _)
• \W : tout caractère sauf un caractère alphanumérique
• \s : tout espace (espace, tabulation, saut de ligne)
• \S : tout caractère sauf un espace
• \b : délimiteur de mots (entre un caractère qui vérifie \w et un autre qui vérifie \W)
• \xnn : caractère dont le code ascii est en hexadécimal nn
• \nnn : caractère dont le code ascii est en octal nnn

Les éléments ci-dessus peuvent être suivi par les indicateurs de cardinalité suivants :
• ? : 0 ou 1 occurrence
• * : 0 ou plus occurrences
• + : 1 ou plus occurrences

- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• {n} : exactement n occurences


• (n,} : au moins n occurences
• {n,m} : entre n et m occurences

L'expression régulière qu'on a utilisé pour décrire notre format de numéro de téléphone ^\d{2}-\d{2}-\d{2}-\d{2}-\d{2}$
se décrypte donc de la manière suivante :
• \d{2} : on cherche deux chiffres
• - : suivis d'un tiret
• \d{2}- : suivi de deux chiffres et d'un tiret
• \d{2}- : suivi de deux chiffres et d'un tiret
• \d{2}- : suivi de deux chiffres et d'un tiret
• \d{2} : suivi de deux chiffres

Comme notre expression régulière commence par ^, elle décrit le début de la chaine; comme elle se termine par $,
elle décrit aussi sa fin.

Ma requête fonctionne sous SQL*Plus mais lorsque j'essaie de


l'utiliser dans une procédure PL/SQL, celle-ci ne compile pas !
Auteurs : lalystar ,
Sous Oracle 8i, le moteur SQL utilisé dans les procédures PL/SQL est différent et est en retard sur le moteur SQL utilisé
pour les requêtes. Certaines fonctionnalités disponibles en SQL ne le sont donc pas en PL/SQL comme :
• les structures CASE ... WHEN
• les fonctions analytiques

La solution est d'utiliser du SQL dynamique pour masquer la requête au moteur PL/SQL en utilisant par exemple
EXECUTE IMMEDIATE :

begin
execute immediate '
insert into TEST
select
case
when deptno = 10 then ''Dept 10''
when deptno = 20 then ''Dept 20''
else
''Departement inconnu''
end
from
TEST1';
end;

Comment générer un fichier de trace pour une session en cours ?


Auteurs : lalystar ,
Quand une procédure est en cours d'exécution, il est possible de générer un fichier de trace (pour exploitation par
TkProf par exemple) en utilisant la routine set_sql_trace_in_session du package DBMS_SYSTEM. Les paramètres de
cette routine sont les suivants :
• SID : identifiant de la session en provenance de V$SESSION
• SERIAL# : second identifiant de la session en provenance de V$SESSION

- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• TRACE: booléen; il faut entrer TRUE pour demander à Oracle de générer le fichier de trace, et FALSE pour
arrêter sa génération

Vous trouverez plus de détails dans cet article : Différentes façon de tracer l'activité de sessions

Je n'ai pas de documentation Oracle, ni d'accès Internet,


comment puis-je trouver la documentation d'un package Oracle ?
Auteurs : lalystar ,
Pour avoir immédiatement la documentation minimale d'un package Oracle installé, on peut utiliser la requête suivante
sous SQL*Plus :

SELECT text
FROM DBA_SOURCE
WHERE type = 'PACKAGE'
AND name like UPPER('%&package%')
ORDER BY line;

Par exemple, pour DBMS_OUTPUT :

SQL> SELECT text


2 FROM dba_source
3 WHERE type = 'PACKAGE'
4 AND name like UPPER('%&package%');
Enter value for package: dbms_output
old 4: name like UPPER('%&package%')
new 4: name like UPPER('%dbms_output%')

------------
-- OVERVIEW
--
-- These procedures accumulate information in a buffer (via "put" and
-- "put_line") so that it can be retrieved out later (via "get_line" or
-- "get_lines"). If this package is disabled then all
-- calls to this package are simply ignored. This way, these routines
-- are only active when the client is one that is able to deal with the
-- information. This is good for debugging, or SP's that want to want
-- to display messages or reports to sql*dba or plus (like 'describing
-- procedures', etc.). The default buffer size is 20000 bytes. The
-- minimum is 2000 and the maximum is 1,000,000.
...
procedure put_line(a varchar2);
pragma restrict_references(put_line,WNDS,RNDS);
procedure put_line(a number);
pragma restrict_references(put_line,WNDS,RNDS);
-- Put a piece of information in the buffer followed by an end-of-line
-- marker. When retrieved by get_line(s), the number and date items
-- will be formated with to_char using the default formats. If you
-- want another format then format it explicitly. get_line(s) return
-- "lines" as delimited by "newlines". So every call to put_line or
-- new_line will generate a line that will be returned by get_line(s).
-- Input parameters:
-- a
-- Item to buffer
-- Errors raised:
-- -20000, ORU-10027: buffer overflow, limit of <buf_limit> bytes.

- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

-- -20000, ORU-10028: line length overflow, limit of 255 bytes per line

Comment convertir une valeur hexadécimale en valeur décimale ?


Auteurs : SheikYerbouti ,
Simplement grâce la fonction TO_NUMBER :
En voici un exemple d'utilisation :

SQL> SELECT TO_NUMBER('ff','XXXXXXXX'),TO_NUMBER('fff','XXXXXXXX'),TO_NUMBER('ffff','XXXXXXXX') from


dual;

TO_NUMBER('FF','XXXXXXXX') TO_NUMBER('FFF','XXXXXXXX') TO_NUMBER('FFFF','XXXXXXXX')


-------------------------- --------------------------- ----------------------------
255 4095 65535

Comment afficher la différence de temps entre 2 dates


en nombre de jours, heures, minutes et secondes ?
Auteurs : SheikYerbouti ,
Grâce la fonction suivante :

CREATE OR REPLACE FUNCTION Diff_Temps


(
LD$Date_Deb IN DATE DEFAULT SYSDATE
,LD$Date_Fin IN DATE DEFAULT SYSDATE
,LN$JJ OUT PLS_INTEGER
,LN$HH OUT PLS_INTEGER
,LN$MI OUT PLS_INTEGER
,LN$SS OUT PLS_INTEGER
) Return NUMBER
IS
dif NUMBER ;
Begin

If LD$Date_Fin < LD$Date_Deb Then


Return ( -1 ) ;
End if ;

Select LD$Date_Fin - LD$Date_Deb Into dif From DUAL ;


Select trunc ( LD$Date_Fin - LD$Date_Deb) Into LN$JJ From DUAL ;
Select trunc ( (LD$Date_Fin - LD$Date_Deb) * 24) - ( LN$JJ * 24 ) Into LN$HH From DUAL ;
Select trunc ( (LD$Date_Fin - LD$Date_Deb) * 1440) - ( (LN$HH * 60) +
( LN$JJ * 1440) ) Into LN$MI From DUAL ;
Select trunc ( (LD$Date_Fin - LD$Date_Deb) * 86400) - ( (LN$MI * 60) + (LN$HH * 3600) +
( LN$JJ * 3600 * 24 ) ) Into LN$SS From DUAL ;

Return( dif ) ;

End ;
/

En voici un exemple d'utilisation :

SQL> set serveroutput on

- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> declare
2 dd pls_integer;
3 hh pls_integer;
4 mi pls_integer;
5 ss pls_integer;
6 dif number ;
7 Begin
8 dif := diff_temps ( sysdate, sysdate + 10.523, dd,hh,mi,ss ) ;
9 dbms_output.put_line(
10 '(' || ltrim(to_char(dif,'99999.99999')) || ')' || ' '
11 || to_char(dd,'99999') || 'j '
12 || to_char(hh,'00') ||':'
13 || to_char(mi,'00') ||':'
14 || to_char(ss,'00')
15 ) ;
16 End;
17 /
(10.52300) 10j 12: 33: 07

Procédure PL/SQL terminée avec succès.

Comment exporter le résultat d'une requête au format XML ?


Auteurs : Xavier Vlieghe ,
À partir d'Oracle 9i, vous pouvez utiliser le package DBMS_XMLQuery. En voici 2 exemples d'utilisation :
• Avec Utl_File :

SET SERVEROUTPUT ON
DECLARE
XmlFic Utl_File.File_Type;
XmlData CLOB;
Fin BOOLEAN := TRUE;
BEGIN
-- Créer des données au format XML à partir d'une requête :
XmlData := DBMS_XMLQuery.GetXML ('SELECT * FROM EMP');

-- Copie les données au format XML dans un fichier :


XmlFic := Utl_File.FOpen ('C:\TMP\XML', 'TEST.xml', 'W');

WHILE FIN LOOP


Utl_File.Put (XmlFic, SUBSTR (XmlData, 1, 32767));

IF LENGTH (XmlData) > 32767 THEN


XmlData := SUBSTR (XmlData, 32768);
ELSE
FIN := FALSE;
END IF;

END LOOP;

Utl_File.FClose (XmlFic);

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (SUBSTR (SQLERRM,1,255));
Utl_File.FClose (XmlFic);
END;
/

• Sans Utl_File : compilez d'abord la procédure suivante :

- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

CREATE OR REPLACE PROCEDURE OutPut_Fichier (fichier IN OUT NOCOPY CLOB) IS


ContenuXML VARCHAR2 (32767);
Ligne VARCHAR2 (2000);
BEGIN

ContenuXML := dbms_lob.SUBSTR(fichier, 32767);

LOOP
EXIT WHEN ContenuXML IS NULL;
-- découpe en lignes :
Ligne := SUBSTR(ContenuXML, 1, INSTR(ContenuXML, CHR(10)) - 1);
dbms_output.put_line (Ligne);
ContenuXML := SUBSTR(ContenuXML, INSTR(ContenuXML, CHR(10)) + 1);
END LOOP;
END;
/

Et le tour est joué :

SET SERVEROUTPUT ON SIZE 1000000

DECLARE
fichier CLOB;
BEGIN
fichier := dbms_XMLQuery.getXML ('SELECT * FROM EMP');
OutPut_Fichier (fichier);

END;
/

Comment exécuter une instruction du DDL dans un block PL/SQL ?


Auteurs : SheikYerbouti ,
Si vous souhaitez exécuter un ordre du DDL (Data Description Language) pour créer une table, un index, altérer un
objet existant, utilisez l'instruction EXECUTE IMMEDIATE.
Par exemple, pour forcer la recréation d'un index:

Declare
LC$OrdreSql Varchar2(2000) ;
Begin
LC$OrdreSql := 'ALTER INDEX my_index REBUILD' ;
EXECUTE IMMEDIATE LC$OrdreSql ;
End;

N'oubliez-pas que tout ordre du DDL génère un COMMIT implicite et que les droits nécessaires à l'exécution de
l'instruction contenue dans la fonction EXECUTE IMMEDIATE doivent avoir été donné directement à l'utilisateur,
et non pas via un rôle.

lien : Voir le tutoriel sur le SQL Dynamique Natif

Comment implémenter une colonne à valeur auto-incrémentée ?


Auteurs : Fred_D ,
Les champs de type "Auto-Increment" n'existe pas en Oracle. Pour émuler ce comportement, vous avez besoin

- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• d'une séquence pour incrémenter la valeur de 1 à chaque insertion


• d'un trigger pour renseigner automatiquement le champ auto-incrémenté de votre table.

Voici comment procéder :

CREATE SEQUENCE MaSequence


START WITH 1
MAXVALUE 999999999999999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER;

CREATE TRIGGER MonTrigger


BEFORE INSERT
ON MaTable
FOR EACH ROW
BEGIN
SELECT MaSequence.NEXTVAL
INTO :NEW.macolonne_PK
FROM DUAL;
END;
/

Lorqu'une ligne sera insérée dans la table MaTable, la colonne macolonne_PK sera alors renseignée avec la valeur
suivante de la séquence MaSequence.
Il est également possible de se passer du trigger, et d'opter pour la syntaxe suivante :

INSERT INTO MaTable (MaColonne_PK, ...)


VALUES (maSequence.NextVal, ...);

Il est utile de noter que la séquence n'est donc pas liée à un champ ou une table, et que vous pouvez utiliser la même
séquence pour plusieurs champs.

lien : Plus d'infos sur les triggers (ou déclencheurs)

Comment créer une vue paramétrée ?


Auteurs : Fred_D ,
Il peut être utile de rendre certains objets dynamiques, pour plus de souplesse dans vos applications. Or, les vues sont
souvent "créées en dur" dans la base, ce qui peut se réveler ennuyeux.
Voici donc une méthode pour les rendre dynamiques :
Créez d'abord un package, avec un paramètre global param1 :

CREATE OR REPLACE PACKAGE orafrance


AS
param1 VARCHAR2 (30);

FUNCTION get_param1
RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY orafrance


AS
FUNCTION get_param1

- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

RETURN VARCHAR2
AS
BEGIN
RETURN param1;
END;
END;
/

Créez ensuite votre vue, en faisant appel à ce paramètre :

CREATE OR REPLACE VIEW v_orafrance


AS
SELECT *
FROM all_tables
WHERE table_name = UPPER (orafrance.get_param1);

Pour utiliser votre vue, il faut d'abord initialiser le paramétre :

SQL> execute orafrance.param1 := 't_orafrance';

Et vous pouvez désormais faire appel à votre vue :

SQL> select table_name from v_orafrance;

TABLE_NAME
------------------------------
T_ORAFRANCE

Comment exécuter un shell depuis le PL/SQL ?


Auteurs : Helyos ,
Cette méthode est valable jusqu'en version 9 :
Pour exécuter une commande système depuis du PL/SQL nous allons utiliser une classe Java. La création d'un classe
java exécutable en PL/SQL passe par trois étapes :
• tout d'abord on créé la Java Source
• ensuite on publie la spécification d'appel de cette source
• et enfin on accorde les privilèges nécessaires à l'exécution de cette classe Java

Donc on va tout d'abord créer la classe Java permettant d'exécuter une commande système :

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS


import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows()) {
finalCommand = new String[4];
finalCommand[0] = "C:\\windows\\system32\\cmd.exe";
finalCommand[1] = "/y";
finalCommand[2] = "/c";
finalCommand[3] = command;
}
else {

- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

finalCommand = new String[3];


finalCommand[0] = "/bin/sh";
finalCommand[1] = "-c";
finalCommand[2] = command;
}

final Process pr = Runtime.getRuntime().exec(finalCommand);


new Thread(new Runnable() {
public void run() {
try {
BufferedReader br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println("Process out :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process output.");
ioe.printStackTrace();
}
}
}).start();

new Thread(new Runnable() {


public void run() {
try {
BufferedReader br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println("Process err :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process error.");
ioe.printStackTrace();
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}

public static boolean isWindows() {


if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
return true;
else
return false;
}

};
/
show errors java source "Host"

Ensuite on publie la spécification d'appel de cette classe en utilisant une procédure PL/SQL pour la "wrapper" :

CREATE OR REPLACE PROCEDURE Host_Command (p_command IN VARCHAR2)


AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/

- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Enfin, les permissions nécessaire doivent être données par l'utilisateur SYS pour que le JServer puisse accèder aux
fichiers su système :

EXEC Dbms_Java.Grant_Permission('SCHEMA-
NAME', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');

EXEC Dbms_Java.Grant_Permission('SCHEMA-
NAME', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');

EXEC Dbms_Java.Grant_Permission('SCHEMA-
NAME', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');

On doit se reconnecter pour activer les privilèges.


Ensuite on lance notre commande

SET SERVEROUTPUT ON SIZE 1000000


CALL DBMS_JAVA.SET_OUTPUT(1000000);
BEGIN
Host_Command (p_command => 'move C:\test1.txt C:\test2.txt');
END;
/

PS : ne pas oublier de lancer le script :


$ORACLE_HOME\javavm\install\initjvm.sql
En version 10g, vous pouvez utiliser le scheduler Oracle.

Comment crypter mon code ?


Auteurs : Xavier Vlieghe , LeoAnderson ,
Il est parfois nécessaire, lors du déploiement de vos applicatifs, de crypter votre code afin de le protéger : il suffit
pour cela de sauvegarder votre code sous forme de fichiers sql et d'utiliser le programme wrap.exe, se trouvant dans
le répertoire {Oracle_Home}\Bin\.
Le programme wrap accepte les 2 arguments suivants :
• iname : nom du fichier en entrée
• oname : nom du fichier de sortie

Voici un exemple avec le fichier suivant :

debut.pls
CREATE OR REPLACE FUNCTION debut
(PC$Chaine IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN SUBSTR( PC$Chaine, 1, 5 ) ;
END;

Encryptons-le :

...\BIN> wrap iname=c:\temp\debut.pls oname=c:\temp\debut.plb

PL/SQL Wrapper: Release 10.2.0.1.0- Production on Dim. Oct. 15 23:52:50 2006

Copyright (c) 1993, 2004, Oracle. All rights reserved.

- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Processing c:\temp\debut.pls to c:\temp\debut.plb

Vous pouvez ouvrir le nouveau fichier pour vérifier son contenu.


Attention, prenez évidemment soin de sauvegarder vos sources, cette procédure est bien entendu irréversible !
Vous pouvez (devez) également vérifier que la compilation s'effectue correctement :

SQL> @c:\temp\debut.plb

Fonction créée.

Attention, ceci ne fonctionne pas sur les triggers ou les blocs PL/SQL anonymes, cf la documentation Oracle

The following CREATE statements are obfuscated: CREATE [OR REPLACE]


FUNCTION function_name CREATE [OR REPLACE] PROCEDURE procedure_name
CREATE [OR REPLACE] PACKAGE package_name CREATE [OR REPLACE]
PACKAGE BODY package_name CREATE [OR REPLACE] TYPE type_name AS
OBJECT CREATE [OR REPLACE] TYPE type_name UNDER type_name CREATE
[OR REPLACE] TYPE BODY type_name The CREATE [OR REPLACE] TRIGGER
statement, and [DECLARE] BEGIN..END anonymous blocks, are not obfuscated. All other
SQL statements are passed unchanged to the output file. All comment lines in the unit
being wrapped are deleted, except for those in a CREATE OR REPLACE header and C-
style comments (delimited by /* */).

- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration

- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Les Tables


Comment retrouver la liste des tables d'une base ?
Auteurs : SheikYerbouti ,
Trois vues permettent d'obtenir des informations sur les tables de votre base :
• DBA_TABLES
• ALL_TABLES
• USER_TABLES

DBA_TABLES liste toutes les tables de tous les schémas


ALL_TABLES liste toutes les tables que l'utilisateur peut voir (les tables de son schéma plus celles des autres schémas
dans lesquels il possède des droits)
USER_TABLES liste les tables du schéma de l'utilisateur connecté
Les colonnes de la vue DBA_TABLES sont les suivantes :
OWNER Schéma propriétaire de la table
TABLE_NAME Nom de la table
TABLESPACE_NAME Nom du tablespace de stockage de la table
CLUSTER_NAME Nom du cluster qui contient la table
IOT_NAME Nom de l'IOT à laquele se réfère la zone de débordement ou la table de correspondances
PCT_FREE Pourcentage minimum d'espace libre pour un bloc
PCT_USED Pourcentage minimum d'espace utilisé pour un bloc
INI_TRANS Nombre initial de transactions
MAX_TRANS Nombre maximum de transactions autorisées
INITIAL_EXTENT Taille du segment initial en octets
NEXT_EXTENT Taille du deuxième extent en octets
MIN_EXTENTS Nombre minimum d'extents alloués dans le segment
MAX_EXTENTS Nombre maximum d'extents alloués dans le segment
PCT_INCREASE Pourcentage d'augmentation des nouveaux extents créés
FREELISTS Nombre de freelists allouées pour le segment
FREELIST_GROUPS Nombre de groupes de freelists allouées pour le segment
LOGGING Attribut de logging
BACKED_UP Indique si la table a été sauvegardée depuis la dernière modification
NUM_ROWS Nombre de lignes de la table (*)
BLOCKS Nombre de blocs utilisés pour la table
EMPTY_BLOCKS Nombre de blocs vide (jamais utilisés) pour la table
AVG_SPACE Valeur moyenne de l'espace libre pour la table (en nombre de lignes) (*)
CHAIN_CNT Nombre de lignes chaînées pour la table (*)
AVG_ROW_LEN Longueur moyenne d'une ligne (incluant l'entête) (*)
AVG_SPACE_FREELIST_BLOCKS Valeur moyenne de l'espace libre de tous les blocs dans une freelist (*)
NUM_FREELIST_BLOCKS Nombre de blocs dans la freelist
DEGREE Nombre de processus par instance
INSTANCES Nombre d'instances à travers lesquelles la table est scannée
CACHE Indique si la table est chargée en cache
TABLE_LOCK Indique si le verouillage de table est activé ou désactivé
SAMPLE_SIZE Valeur de l'échantillon utilisé pour analyser la table
LAST_ANALYZED Date de la dernière analyse de la table
PARTITIONED Indique si la table est partitionnée
IOT_TYPE Indique le type d'objet d'une table organisée en index (Préfixe, zone de débordement ou table de
correspondance (MAPPING TABLE)
TEMPORARY Indique si la session courante peut voir les données insérées
SECONDARY Indique si la table fait partie de la création d'un index de domaine
NESTED Indique s'il s'agit d'une table imbriquée
BUFFER_POOL Buffer pool par défaut de chargement des blocs

- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

ROW_MOVEMENT Indique si le déplacement des lignes partitionnées est activé ou désactivé


GLOBAL_STATS Indique si les statistiques ont été calculées sans fusion des partitions sous-jacentes
USER_STATS Indique si les statistiques ont été saisies directement par l'utilisateur
DURATION Persistance des données d'une table temporaire (sys$session oo sys$transaction)
SKIP_CORRUPT Indique si le contournement des blocs endommagés est activé ou désactivé
MONITORING Indique si le traçage est activé
CLUSTER_OWNER Propriétaire du cluster
DEPENDENCIES Indique si le traçage des dépendances de niveau ligne est activé
COMPRESSION Indique si la compression de données est activée ou désactivée
(*) ne prenez par comme argent comptant la valeur de ces colonnes, particulièrement NUM_ROWS.
En effet ces colonnes ne sont (re)valorisées qu'après analyse de la table.
Utilisez donc ces valeurs à bon escient.
Si votre système analyse vos tables chaque nuit, par exemple, ces valeurs peuvent sans crainte vous donner une bonne
indication de la volumétrie de vos tables, sans exécuter la gourmande instruction : SELECT COUNT(*).

SQL> SELECT
2 OWNER,
3 TABLE_NAME,
4 TABLESPACE_NAME,
5 NUM_ROWS,
6 BLOCKS,
7 EMPTY_BLOCKS,
8 LAST_ANALYZED
9 FROM DBA_TABLES
10 WHERE OWNER = 'FD' ;

OWNER TABLE_NAME TABLESPACE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANA


---------- -------------------- --------------- ---------- ---------- ------------ --------
FD CONTACT USERS 2 5 0 03/12/02
FD DEPT USERS
FD EMP USERS
FD EMPLOYE USERS
FD FACTURE USERS
FD LOV_BLOCK USERS
FD LOV_COLONNE USERS
FD LOV_ELEMENT_COLONNE USERS
FD LOV_ITEM USERS
FD LOV_LOV USERS
FD LOV_MODULE USERS
FD NOMBRES USERS
FD TEST USERS 0 1 0 03/12/02
FD TESTX USERS
FD TEST_LOV USERS 52000 432 80 08/07/04
FD TEST_TYPES USERS
FD UTIL_PREFS USERS
FD UTIL_PREFS_ORDER USERS
FD UTIL_PREFS_RECORD_OR USERS
DER

19 ligne(s) sélectionnée(s).

Après analyse de la table DEPT

SQL> /

OWNER TABLE_NAME TABLESPACE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS LAST_ANA


---------- -------------------- --------------- ---------- ---------- ------------ --------
FD CONTACT USERS 2 5 3 14/10/04

- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

FD DEPT USERS 4 4 4 14/10/04

Comment passer une table en lecture seule ?


Auteurs : Pomalaix ,
Certaines tables doivent absolument être mises à l'abri des modifications, par exemple une table de paramétrage ou
un historique en ligne. Même si le seul privilège donné sur ces tables est le SELECT, il y a toujours un risque que le
propriétaire de la table, ou un utilisateur disposant d'un privilège global de type ANY TABLE, modifie par erreur ces
tables.
Comment se prémunir contre de telles erreurs ?
Il suffit de mettre à profit un mode quelque peu méconnu des contraintes : DISABLE VALIDATE.
En effet, ce mode interdit sur la table concernée l'exécution de toute instruction INSERT, UPDATE, DELETE ou même
TRUNCATE, quels que soient les privilèges dont on dispose.
La nature et la pertinence de la contrainte importent peu, seuls comptent les mots magiques DISABLE VALIDATE.
Cependant, une contrainte neutre est préférable, pour le cas où elle serait activée, c'est pourquoi je propose un
CHECK(1=1).

ALTER TABLE emp ADD CONSTRAINT lect_seule CHECK (1=1) DISABLE VALIDATE;
UPDATE emp SET ename=ename;

--> ORA-25128: Aucune insertion/mise à jour/suppression possible sur une table avec contrainte
(SCOTT.LECT_SEULE) désactivée et validée
Notre table est donc protégée contre toute modification accidentelle de son contenu.

Comment voir les lignes chaînées sur les tables ?


Auteurs : Jaouad ,
Tout d'abord, il faut au préalable :
• exécuter le script $ORACLE_HOME/rdbms/admin/utlchain,
• analyser la table en question avec la commande suivante :

Analyze Table MaTable;

La requête suivante vous permet maintenant de lister les lignes chaînées :

SELECT table_name,
owner,
num_rows,
chain_cnt,
(chain_cnt * 100) / num_rows AS ratio,
pct_used,
pct_free
FROM Dba_Tables
WHERE Owner NOT IN ('SYS','SYSTEM')
AND table_name = 'MaTable'
AND Chain_Cnt !=0
ORDER BY 5 desc;

- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Attention, cela ne fonctionne pas avec le package DBMS_STATS.

Quelle est la différence entre une table et une vue ?


Auteurs : LeoAnderson ,
Une table est un ensemble "physique" de données qui occupe un espace disque.
Une vue est une interrogation logique (SELECT) basée sur des tables ou d'autres vues qui n'occupent pas de place sur
le disque. Une vue n'est en fait qu'un "SELECT" mémorisé en base (l'instruction est mémorisée, pas les résultats).
C'est la raison qui justifie l'impossibilité de créer un index, de n'importe quel type, sur ce type de segment. Afin
d'optimiser le temps de réponse d'une requête se basant sur un select, l'index est donc à créer sur la table sur laquelle
porte la requête.
Concernant l'écriture des requêtes, les vues et les tables s'utilisent de la même manière
Les vues sont toutes stockées dans le tablespace SYSTEM, alors que les tables sont stockés dans les tablespaces dédiés.
Les tables sont visibles via les tables systèmes : DBA_TABLES, ALL_TABLES et USER_TABLES alors que les vues
sont visibles via les DBA_VIEWS, ALL_VIEWS et USER_VIEWS.

lien : View and Base table

Comment connaître, pour une table, le nombre de


colonnes, d'index et le pourcentage de colonnes indexées ?
Auteurs : PlaineR ,
Grâce à la requête suivante :

SELECT utc.table_name,
count (distinct utc.column_name) nb_col,
count (distinct index_name) nb_index,
count (distinct uic.column_name) / count (distinct utc.column_name) prct_index
FROM user_tab_columns utc, user_ind_columns uic
WHERE utc.table_name = uic.table_name
AND utc.table_name= 'PS_JOB'
GROUP BY utc.table_name;

Comment lister toutes les contraintes se rapportant à une table ?


Auteurs : rouardg , Jaouad ,
il suffit de regarder la table USER_CONSTRAINTS, en particulier la colonne CONSTRAINT_TYPE de cette table,
qui est codée de la manière suivante :
• C : contrainte de type CHECK (genre champ NOT NULL ou avec une condition de vérification genre BETWEEN)
• P : contrainte de clé primaire (PK)
• U : contrainte d'unicité (Unique)
• R : contrainte référentielle (FK)

SQL> SELECT constraint_name,


1
decode(constraint_type, 'C', 'check', 'P', 'clé primaire ', 'U', 'Contrainte d''unicité', 'R', 'Contrainte Réf
constraint_name
2 table_name, search_condition, status
3 FROM USER_CONSTRAINTS;

- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

CONSTRAINT_NAME CONSTRAINT_NAME TABLE_NAME


SEARCH_CONDITION
------------------------------ ------------------------- ------------------------------ ------------
PK_LIST clé primaire USERS_ERP

PK_SEQUENCE clé primaire DD_JOURNAL

PK_PS_PROJECT_LIST clé primaire PS_PROJECT_LIST

SYS_C00774 check PSACCESSPRFL


"ACCESSID" IS NOT NULL

- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Les Utilisateurs


Comment afficher la liste des utilisateurs ?
Auteurs : Laurent Schneider ,
La requête suivante permet de lister les utilisateurs avec les propriétés suivantes :
• ID
• Tablespace par défaut
• Tablespace temporaire
• Mot de passe (crypté)
• État
• Profil
• Date de création

select USERNAME,
USER_ID,
DEFAULT_TABLESPACE,
TEMPORARY_TABLESPACE,
PASSWORD,
ACCOUNT_STATUS,
PROFILE,
CREATED
from DBA_USERS
order by USERNAME;

USERNAME USER DEFAULT TEMPORARY PASSWORD ACCOUNT_STATUS PROFILE CREATED


---------- ---- ------- --------- ---------------- ---------------- ------- ----------
ANONYMOUS 38 SYSAUX TEMP anonymous EXPIRED & LOCKED DEFAULT 2006-04-18
CTXSYS 35 SYSAUX TEMP 24ABAB8B06281B4C EXPIRED & LOCKED DEFAULT 2006-04-18
DBSNMP 24 SYSAUX TEMP E066D214D5421CCC OPEN DEFAULT 2006-04-18
DIP 19 USERS TEMP CE4A36B8E06CA59C EXPIRED & LOCKED DEFAULT 2006-04-18
EXFSYS 34 SYSAUX TEMP 66F4EF5650C20355 EXPIRED & LOCKED DEFAULT 2006-04-18

Comment migrer vers un utilisateur identifié par le système d'exploitation ?


Auteurs : Fred_D ,
L'objectif est de créer un utilisateur identifié par le système d'exploitation pour éviter la saisie des mots de passe "en
dur" dans les batchs. La difficulté réside dans l'attibution des droits à donner à cette utilisateur.
Le script suivant permet de créer l'utilisateur de type OPS$ (cf. Création d'un utilisateur authentifié par le système
d'exploitation).
Le script Migrate2OPS$.sql génére 4 scripts SQL qui seront lancés automatiquement si vous le souhaitez. C'est un
script interactif qui demande de saisir le nom de l'utilisateur à créer et le nom de l'utilisateur source (i.e. l'utilisateur
de référence).

set verify on
set feedback on
set termout on
set linesize 200
ACCEPT to_user PROMPT 'Saisir le user cible (OPS$) : '
ACCEPT from_user PROMPT 'Saisir le user source : '
DEFINE filename = &to_user._&from_user
set verify off
set feedback off
set pagesize 0

COL dbname NOPRINT NEW_VALUE dbname

- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SELECT HOST_NAME||'-'||INSTANCE_NAME||'.UX' DBNAME FROM v$instance;

set termout on
SELECT 'Creating user build script...' FROM dual;
set termout off
spool c:\alter_user_&filename..sql
SELECT 'CREATE USER &to_user IDENTIFIED EXTERNALLY PROFILE ' || profile ||
' DEFAULT TABLESPACE '|| default_tablespace ||
' TEMPORARY TABLESPACE ' || temporary_tablespace
FROM sys.dba_users
WHERE username = UPPER('&from_user')
AND NOT EXISTS (SELECT 1 FROM dba_users WHERE username = UPPER('&to_user'))
/

SELECT 'ALTER USER &to_user QUOTA '


|| DECODE (max_bytes, -1, 'Unlimited', max_bytes)
|| ' ON '
|| tablespace_name
|| ';'
FROM sys.dba_ts_quotas
WHERE username = UPPER('&from_user')
/
spool off

set termout on
SELECT 'Creating grant build script...' FROM dual;
set termout off
spool c:\grant_prvs_&filename..sql
SELECT 'GRANT ' || privilege || ' TO &to_user' || admin_option
FROM (
SELECT LOWER(grantee) grantee, LOWER(granted_role) privilege,
DECODE(admin_option,'YES',' WITH ADMIN OPTION;',';') admin_option
FROM sys.dba_role_privs
WHERE grantee != 'SYS'
union
SELECT LOWER(grantee) grantee, LOWER(granted_role) privilege,
DECODE(admin_option,'YES',' WITH ADMIN OPTION;',';') admin_option
FROM sys.dba_role_privs
WHERE grantee != 'SYS'
union
SELECT LOWER(grantee) grantee, LOWER(privilege) privilege,
DECODE(admin_option,'YES',' WITH ADMIN OPTION;',';') admin_option
FROM dba_sys_privs s
WHERE grantee != 'SYS'
union
SELECT LOWER(grantee) grantee, LOWER(privilege) || ' ON ' ||
LOWER(table_name) privilege, DECODE(grantable,'YES',
' WITH ADMIN OPTION;',';') admin_option
FROM dba_tab_privs t
WHERE grantee != 'SYS'
and t.privilege !='EXECUTE'
union
SELECT LOWER(grantee) grantee, LOWER(privilege) || ' ON ' ||
LOWER(table_name) privilege, DECODE(grantable,'YES',
' WITH ADMIN OPTION;',';') admin_option
FROM dba_tab_privs t
WHERE grantee != 'SYS'
and t.privilege ='EXECUTE'
union
SELECT LOWER(owner) grantee, 'ALL ON ' || LOWER(owner) ||'.'||
LOWER(table_name) privilege, ';' admin_option
FROM all_tables
WHERE owner = upper('&from_user')
ORDER BY 1
)
WHERE grantee = LOWER('&from_user');
spool off

- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

set termout on
SELECT 'Creating synonym build script...' FROM dual;
set termout off
spool c:\create_synonyms_&filename..sql

SELECT DISTINCT 'CREATE SYNONYM '|| LOWER('&to_user') || '.' || LOWER(object_name) ||


' FOR ' || LOWER('&from_user') || '.' || LOWER(object_name) || ';'
FROM sys.dba_objects
WHERE owner = UPPER('&from_user')
AND object_type IN ('CLUSTER','FUNCTION','LIBRARY','MATERIALIZED VIEW','PACKAGE','PACKAGE BODY',
'PROCEDURE','SEQUENCE','TABLE','TABLE PARTITION','TYPE','TYPE BODY','VIEW')
ORDER BY 1
/
spool off

set termout on
SELECT 'Creating database link build script...' FROM dual;
set termout off
spool c:\create_dblinks_&filename..sql

SELECT 'ALTER USER &to_user IDENTIFIED BY dummypwd;' FROM dual;

SELECT 'CONNECT &to_user/dummypwd@&dbname' FROM dual;

SELECT 'CREATE DATABASE LINK ' || l.name ||


' CONNECT TO ' || LOWER(l.userid) || ' IDENTIFIED BY ' || LOWER(l.password) ||
DECODE(l.host,NULL, NULL, ' USING '''||l.host) || ''';'
FROM sys.link$ l, sys.user$ u
WHERE l.owner# = u.user#
AND u.name = UPPER('&from_user')
ORDER BY l.name
/

SELECT 'ALTER USER &to_user IDENTIFIED EXTERNALLY;' FROM dual;

spool off

set termout on

PROMPT
PROMPT Tapez [Ctrl+C] pour interrompre le process ou [Enter] pour continuer après avoir vérifier les
scripts générés...
PAUSE

spool c:\copy_user_&filename..sql

SELECT 'set feed on' FROM dual;

SELECT 'spool c:\alter_user_&filename..log' FROM dual;


SELECT '@alter_user_&filename..sql' FROM dual;
SELECT 'spool off' FROM dual;

SELECT 'spool c:\grant_prvs_&filename..log' FROM dual;


SELECT '@grant_prvs_&filename..sql' FROM dual;
SELECT 'spool off' FROM dual;

SELECT 'spool c:\create_synonyms_&filename..log' FROM dual;


SELECT '@create_synonyms_&filename..sql' FROM dual;
SELECT 'spool off' FROM dual;

SELECT 'spool c:\create_dblinks_&filename..log' FROM dual;


SELECT '@create_dblinks_&filename..sql' FROM dual;
SELECT 'spool off' FROM dual;

- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

spool off

Comment mettre en place l'authentification OS sous Windows ?


Auteurs : Pomalaix ,
Par défaut, les mots de passe des utilisateurs sont stockés dans la base Oracle, sous forme cryptée. On peut cependant
souhaiter que le compte Oracle d'un utilisateur soit synchronisé avec son compte Windows.
Ceci procure deux avantages :
• éviter de devoir gérer deux systèmes distincts de mots de passe, l'un dans la base Oracle, et l'autre dans un serveur
de domaine.
• permettre de se connecter à la base de données sans fournir de mot de passe, puisqu'il a déjà été validé par l'OS.
C'est un premier pas vers l'authentification unique, connue sous le sigle SSO.

Nous décrivons ici le paramétrage nécessaire pour mettre en place cette authentification OS dans un environnement
Windows.
Précisons qu'il ne suffit pas que le client soit sous Windows; le serveur Oracle doit l'être aussi.
Le principe est que chaque compte NT doit être mis en correspondance avec un compte Oracle. Le compte Oracle est
identique au compte NT, sauf que le compte Oracle possède en plus un préfixe qui est identique pour tous les comptes
authentifiés par l'OS. Par défaut, ce préfixe est OPS$. Ainsi, si le compte NT est TOTO, le compte Oracle correspondant
doit être OPS$TOTO.
Le choix de l'authentification OS reste souple : il s'applique uniquement aux comptes choisis, si bien qu'on peut tout
à fait gérer certains comptes de manière traditionnelle, avec le mot de passe dans la base, et gérer les autres grâce à
l'authentification OS.
Voici la procédure :
1) Dans le SQLNET.ORA côté client et côté serveur, insérer :

SQLNET.AUTHENTICATION_SERVICES=(NTS)

2) Dans le fichier d'initialisation INITxxx.ORA, insérer :

REMOTE_OS_AUTHENT=TRUE

3) Dans l'INITxxx.ORA, noter la valeur du paramètre OS_AUTHENT_PREFIX (OPS$ par défaut), ou lui donner la
valeur désirée. Le plus commode est "" (deux guillemets consécutifs, sans espace) ce qui correspond à une valeur nulle,
et permet d'avoir des comptes NT et des comptes Oracle identiques.
Redémarrer l'instance si une modification a été faite au point 2 ou 3.
4) La clé de registre OSAUTH_PREFIX_DOMAIN, située côté serveur dans la branche HKLM\Software\Oracle
\HomeN, permet de spécifier si l'authentification doit tenir compte ou non du nom de domaine NT.
Avec OSAUTH_PREFIX_DOMAIN à FALSE, seul le nom du compte est vérifié, indépendamment de son domaine NT.
Cela signifie que 2 comptes Toto, situés dans des domaines différents, pourraient accéder à la base de données.
Avec OSAUTH_PREFIX_DOMAIN à TRUE, le domaine NT est également vérifié, ce qui améliore la sécurité.
5) Création du compte Oracle en majuscules et entre guillemets.
(Si OS_AUTHENT_PREFIX est nul, il suffit de supprimer la mention OPS$)
5.1) Dans le cas où OSAUTH_PREFIX_DOMAIN est à FALSE pour un compte NT nommé Stagiaire

CREATE USER "OPS$STAGIAIRE" IDENTIFIED EXTERNALLY;


GRANT CREATE SESSION TO "OPS$STAGIAIRE";

- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

OU 5.2) Dans le cas où OSAUTH_PREFIX_DOMAIN est à TRUE pour un compte NT nommé Stagiaire dans le domaine
Paris

CREATE USER "OPS$PARIS\STAGIAIRE" IDENTIFIED EXTERNALLY;


GRANT CREATE SESSION TO "OPS$PARIS\STAGIAIRE";

6) Connexion à SQL*Plus depuis l'OS :

sqlplusw /@labase

Il ne doit pas y avoir d'espace entre le / et le @. En effet, s'il y a un espace "labase" est considéré comme le nom d'un
script à exécuter, et non comme un alias Oracle Net.
Ou si on est déjà dans SQL*Plus :

CONNECT /@labase

Comment créer un utilisateur via un script SQL


Auteurs : Xavier Vlieghe ,
Via la commande CREATE USER, donc voici un exemple :

CREATE USER TEST /* on le baptise */


IDENTIFIED BY mypassword /* Attention, le password est en clair ! */
DEFAULT TABLESPACE TBSTEST /* Le tablespace associé */
TEMPORARY TABLESPACE TEMP; /* Le temporary associé */

Il est ensuite possible de lui assigner des droits via la commande GRANT :

GRANT CONNECT TO TEST;

- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Sécurité


Comment empecher un utilisateur de se connecter avec un outil spécifique ?
Auteurs : SheikYerbouti ,
Via un trigger de type AFTER LOGON :
L'exemple suivant concerne l'outil Toad :

create or replace trigger interdire_toad after logon on database


declare
v_sid sys.v_$session.sid%TYPE;
v_isdba sys.v_$session.username%TYPE;
v_program sys.v_$session.program%TYPE;
begin
execute immediate
'select distinct sid from sys.v_$mystat' into v_sid;
execute immediate
'select program from sys.v_$session where sid = :b1' into v_program using v_sid;
execute immediate
'select username from sys.v_$session where sid = :b1' into v_isdba using v_sid;
if upper(v_program) like 'TOAD%' and v_isdba = 'USERNAME'
then
RAISE_APPLICATION_ERROR
(-20001,'Connexion avec '||v_isdba||' sous TOAD interdite,contactez le DBA ',TRUE);
end if;
end;
/

Ce trigger a deux limitations qu'il est important de connaître :


• il n'a pas d'effet si l'utilisateur posséde le privilége ADMINISTER DATABASE TRIGGER.
• il n'a pas d'effet si on renomme l'utilitaire, le contrôle se faisant via une comparaison entre le champ v_program
et le nom du programme.

Comment désactiver - activer la sécurité :

alter trigger interdire_toad disable ;

alter trigger interdire_toad enable ;

Comment empêcher un utilisateur d'effectuer certaines opérations sous Sql*Plus ?


Auteurs : Jaouad ,
Il suffit d'effectuer une insertion dans la table product_user_profile :

INSERT INTO product_user_profile (product, userid, attribute, char_value)


VALUES ('SQL*Plus', 'SCOTT', 'CREATE', 'DISABLED');
COMMIT ;

Comment voir les interdictions :

set linesize 250


col CHAR_VALUE format a15
col ATTRIBUTE format a15

- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

select product, userid, attribute, char_value from product_user_profile ;

Voici un exemple de mise en oeuvre, où l'attribut CREATE est désactivé pour l'utilisateur FORMATION :

SQL> conn system


Entrez le mot de passe : ********
Connecté.
SQL> INSERT INTO product_user_profile (product, userid, attribute, char_value) VALUES
2 ('SQL*Plus', 'FORMATION', 'CREATE', 'DISABLED');

1 ligne créée.

SQL> commit ;

Validation effectuée.

SQL> conn formation/formation


Connecté.
SQL> create table dvp ( a varchar2(10)) ;
SP2-0544: commande non valide : create
SQL> conn system
Entrez le mot de passe : ********
Connecté.
SQL> delete from product_user_profile where userid='FORMATION' ;

1 ligne supprimée.

SQL> commit ;

Validation effectuée.

SQL> conn formation/formation


Connecté.

SQL> create table dvp ( a varchar2(10)) ;

Table créée.

Comment autoriser/interdire une connexion Net*8 ?


Auteurs : Jaouad ,
A placer dans le fichier Sqlnet.ora ( sur le serveur hébergeant le SGBDR ) Autoriser les personnes suivantes :

TCP.VALIDNODE_CHECKING=yes
TCP.INVITED_NODES=(xxx.x.x.xxx,xxx.x.x.xxx)

Interdire les personnes suivantes :

TCP.VALIDNODE_CHECKING=yes
TCP.EXCLUDED_NODES=(xxx.x.x.xxx,xxx.x.x.xxx)

- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Vous trouverez plus de détails dans cet article : Filtrage global au niveau du serveur

Comment interdire le changement de mot de passe à un utilisateur ?


Auteurs : Jaouad ,
À l'aide de la fonction suivante :

REATE OR REPLACE FUNCTION restrict_pwd_change (username VARCHAR2,


password VARCHAR2,
old_password VARCHAR2)
RETURN boolean IS
BEGIN
raise_application_error(-20009, 'ERROR: Modification du mot de passe impossible');
END;
/

et de la commande suivante :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION restrict_pwd_change;

Pour désactiver cette restriction, utilisez cette commande :

ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION null;

Je suis administrateur et pourtant j'ai une erreur de privilèges insuffisants ?


Auteurs : Fred_D ,
Vérifiez que l'utilisateur avec lequel vous vous connectez à les droits nécessaires pour faire l'action que vous souhaitez
en vous aidant de ce tutoriel : http://oracle.developpez.com/guide/administration/adminrole/#L8
Par exemple, pour voir toutes les tables de la base, il vous faudra avoir le privilège SELECT ANY TABLE.

Comment me connecter en tant que SYS, cela me retourne une erreur ?


Auteurs : LeoAnderson ,
Depuis la 9i, il est impossible de se connecter avec l'utilisateur SYS si on ne précise pas AS SYSDBA ou AS SYSOPER

SQLPLUS /NOLOG
CONNECT SYS/pwd@db AS SYSDBA

Comment sécuriser la gestion des mots de passe ?


Auteurs : Xavier Vlieghe ,
Via la gestion de profils dédiés, qui peuvent gérer les paramètres suivants :

- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

• FAILED_LOGIN_ATTEMPTS : Nombre d'erreurs permises à la saisie du mot de passe avant que le compte soit
verrouillé,
• PASSWORD_GRACE_TIME : En cas de péremption d'un mot de passe dû à un délai fixé par l'administrateur,
cette option permet de paramétrer une durée (en jours) pendant laquelle l'utilisateur pourra tout de même se
connceter, mais recevra un avertissement,
• PASSWORD_LIFE_TIME : Durée (en jours) de vie maximum d'un mot de passe,
• PASSWORD_LOCK_TIME : Durée (en jours) pendant laquelle un compte sera verrouillé après qu'il ait atteint
le nombre d'erreurs permises à la saisie de son mot de passe (FAILED_LOGIN_ATTEMPTS),
• PASSWORD_REUSE_MAX : Nombre de changement de mots de passe requis avant de pouvoir ré-utiliser un
mot de passe déjà utilisé,
• PASSWORD_REUSE_TIME : Durée (en jours) minimum pendant laquellel'utilisateur ne peut pas ré-utiliser un
mot de passe déjà utilisé, à partir du moment où celui-ci a été changé,
• PASSWORD_VERIFY_FUNCTION : permet de préciser une fonction (PL/SQL) vérifiant la compexité du mot
de passe.

Voici un exemple de mise en application :


1. Créons un utilisateur TEST :

CREATE USER TEST


IDENTIFIED BY TEST
DEFAULT TABLESPACE TBSTEST;

2. Créons un profil :

SQL> CREATE PROFILE Profil_Test LIMIT PASSWORD_LIFE_TIME 60;


Profil créé.

SQL> ALTER PROFILE Profil_Test LIMIT FAILED_LOGIN_ATTEMPTS 2;


Profil modifié.

3. Attribuons ce profil à notre utilisateur :

SQL> ALTER USER TEST PROFILE Profil_Test;


Utilisateur modifié.

4. Vérifions que le paramètre FAILED_LOGIN_ATTEMPTS est bien actif :

SQL> connect test/test2@db


ERROR:
ORA-01017: invalid username/password; logon denied

Avertissement : vous n'êtes plus connecté à ORACLE.

SQL> connect test/test3@db


ERROR:
ORA-01017: invalid username/password; logon denied

SQL> connect test/test@db


ERROR:
ORA-28000: the account is locked

Il est possible de consulter les profils existants à l'aide de la requête suivante :

- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> SELECT profile, resource_name, limit


2 FROM Dba_Profiles
3 WHERE resource_type = 'PASSWORD'
4 ORDER BY profile;

PROFILE RESOURCE_NAME LIMIT


--------------- ------------------------- ---------------
DEFAULT FAILED_LOGIN_ATTEMPTS UNLIMITED
DEFAULT PASSWORD_LIFE_TIME UNLIMITED
DEFAULT PASSWORD_REUSE_MAX UNLIMITED
DEFAULT PASSWORD_LOCK_TIME UNLIMITED
DEFAULT PASSWORD_GRACE_TIME UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION NULL
DEFAULT PASSWORD_REUSE_TIME UNLIMITED
PROFIL_TEST FAILED_LOGIN_ATTEMPTS 2
PROFIL_TEST PASSWORD_LIFE_TIME 60
PROFIL_TEST PASSWORD_REUSE_MAX DEFAULT
PROFIL_TEST PASSWORD_LOCK_TIME DEFAULT
PROFIL_TEST PASSWORD_GRACE_TIME DEFAULT
PROFIL_TEST PASSWORD_VERIFY_FUNCTION DEFAULT
PROFIL_TEST PASSWORD_REUSE_TIME DEFAULT

14 ligne(s) sélectionnée(s).

lien : Gestion des Profils


lien : Sécurisation d'une base Oracle

- 61 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Les Tablespaces et autres fichiers


Comment lister les tablespaces et leurs fichiers associés ?
Auteurs : Laurent Schneider ,
La requête suivante permet d'afficher l'identifiant, le nom, le status et le tablespace des fichiers de données :

select
FILE_ID,
FILE_NAME,
STATUS,
TABLESPACE_NAME
from
DBA_DATA_FILES
order by FILE_ID;

FILE_ID FILE_NAME STATUS TABLESPACE_NAME


---------- ---------------------------------- --------- ---------------
1 /u01/LSC63/data/system01LSC63.dbf AVAILABLE SYSTEM
2 /u01/LSC63/data/undo01LSC63.dbf AVAILABLE UNDOTBS1
3 /u01/LSC63/data/sysaux01LSC63.dbf AVAILABLE SYSAUX
4 /u01/LSC63/data/sysaux02LSC63.dbf AVAILABLE SYSAUX
5 /u01/LSC63/data/sysaux03LSC63.dbf AVAILABLE SYSAUX
6 /u01/LSC63/data/users01LSC63.dbf AVAILABLE USERS

Comment obtenir la liste des tablespaces avec leurs caractéristiques principales ?


Auteurs : Laurent Schneider ,
La requête suivante permet d'afficher les tablespaces, avec les propriétés suivantes :
• Type
• Mode de management d'extent
• Type d'allocation
• Mode de management de l'espace segment (9i)
• Option bigfile (10g)
• État
• Nombre de fichiers
• Taille
• Taille maximale (avec autoextend)
• Espace utilisé

select
a.TABLESPACE_NAME,
a.CONTENTS,
a.EXTENT_MANAGEMENT,
a.ALLOCATION_TYPE,
a.SEGMENT_SPACE_MANAGEMENT,
a.BIGFILE,
a.STATUS,
nvl(sum(b.count_files),0) FILES,
nvl(sum(b.bytes),0) "SIZE",
nvl(sum(b.maxbytes),0) MAX_SIZE,
nvl(sum(b.bytes),0)-nvl(sum(c.free_bytes),0) "USED"
from DBA_TABLESPACES a,
(
select TABLESPACE_NAME,
sum(BYTES) bytes,
count(*) count_files,

- 62 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

sum(greatest(MAXBYTES,BYTES)) maxbytes
from DBA_DATA_FILES
group by TABLESPACE_NAME
union all
select TABLESPACE_NAME,
sum(BYTES),
count(*),
sum(greatest(MAXBYTES,BYTES)) maxbytes
from DBA_TEMP_FILES
group by TABLESPACE_NAME
) b,
(
select TABLESPACE_NAME,
sum(BYTES) free_bytes
from DBA_FREE_SPACE
group by TABLESPACE_NAME
union all
select TABLESPACE_NAME,
sum(BYTES_FREE) free_bytes
from V$TEMP_SPACE_HEADER
group by TABLESPACE_NAME
) c
where a.TABLESPACE_NAME = b.TABLESPACE_NAME (+)
and a.TABLESPACE_NAME = c.TABLESPACE_NAME (+)
group by
a.TABLESPACE_NAME,
a.CONTENTS,
a.EXTENT_MANAGEMENT,
a.ALLOCATION_TYPE,
a.SEGMENT_SPACE_MANAGEMENT,
a.BIGFILE,
a.STATUS
order by a.TABLESPACE_NAME;

TABLESPA CONTENTS EXTENT_MAN ALLOCATIO SEGMEN BIG STATUS FILES SIZE MAX_SIZE USED
-------- --------- ---------- --------- ------ --- ------ ----- --------- ---------- ---------
SYSAUX PERMANENT LOCAL SYSTEM AUTO NO ONLINE 3 397410304 6442450944 395771904
SYSTEM PERMANENT LOCAL SYSTEM MANUAL NO ONLINE 1 471859200 2147483648 470548480
TEMP TEMPORARY LOCAL UNIFORM MANUAL NO ONLINE 1 20971520 2147483648 17039360
UNDOTBS1 UNDO LOCAL SYSTEM MANUAL NO ONLINE 1 182452224 2147483648 13041664
USERS PERMANENT LOCAL SYSTEM MANUAL NO ONLINE 1 26214400 2147483648 524288

Concernant les fichiers d'archives, la requête suivante permet de connaître les informations suivantes :
• Chemin et nom de fichier
• Numéro de thread
• Numéro de séquence
• Taille
• Identifiant resetlogs (10g)
• Date
• État (9i)

select NAME,
THREAD#,
SEQUENCE#,
BLOCKS*BLOCK_SIZE "SIZE",
RESETLOGS_ID,
COMPLETION_TIME,
STATUS
from V$ARCHIVED_LOG
order by SEQUENCE#;

NAME THR SEQ SIZE RESETLOGS COMPLETION S


----------------------------------------- --- ---- ------- --------- ---------- -

- 63 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

/u01/LSC63/arch/arch_588083500_1_2472.dbf 2472 2081280 588083500 2006-06-30 A

Comment lister les tablespaces temporaires (locally managed) ?


Auteurs : Laurent Schneider ,
La requête suivante nous permet d'afficher leurs identifiants, noms et status :

select
FILE_ID,
FILE_NAME,
STATUS,
TABLESPACE_NAME
from
DBA_TEMP_FILES
order by FILE_ID;

FILE_ID FILE_NAME STATUS TABLESPACE_NAME


---------- -------------------------------- --------- ---------------
1 /u01/LSC63/data/temp01LSC63.dbf AVAILABLE TEMP

Cela ne liste que les tablespaces temporaires à allocation d'extent locale (locally managed). En effet, les tablespace
temporaires dictionary managed (qui datent d'Oracle 7) ne seront pas listées, car ils ne contiennent pas de "tempfile"
mais des datafiles.

Comment vider un tablespace temporaire ?


Auteurs : Helyos ,
Il ne sert à rien de vider un tablespace temporaire, car celui-ci est automatiquement vidé par le processus SMON.
De plus il est important de savoir que les tablespaces temporaires peuvent apparaître pleins lors d'une utilisation
normale de la base. En effet les extents sont alloués une fois puis gérés par le système. Une fois l'utilisation de l'extent
terminée il est alors marqué comme libre mais n'est pas libéré pour des raisons de tuning. Il n'est donc pas rare de
ne pas avoir d'espace temporaire libre lors de l'utilisation d'une base. Les extents seront libérés par SMON lors du
redémarrage de la base.

Comment afficher le nom et l'état des fichiers de contrôle ?


Auteurs : Laurent Schneider ,
Via la requête suivante :

select NAME,
STATUS
from V$CONTROLFILE
order by NAME;

NAME STATUS
------------------------------------------------- -------
/u01/LSC63/ctrl/ctrl01aLSC63.dbf

- 64 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

/u01/LSC63/ctrl/ctrl01bLSC63.dbf

Comment lister les fichiers Redo Log ainsi que leurs caractéristiques principales ?
Auteurs : Laurent Schneider ,
La requête suivante permet d'afficher les fichiers redo Log, avec les propriétés suivantes :
• Groupe
• Thread
• Séquence
• Taille
• Nombre de log dans le groupe
• Type (9i)
• État
• Nom des fichiers
• Groupe

select l.GROUP#,
l.THREAD#,
l.SEQUENCE#,
l.BYTES,
l.MEMBERS,
l.STATUS,
f.TYPE,
f.MEMBER
from V$LOGFILE f, V$LOG l
where l.GROUP# = f.GROUP#
order by GROUP#,MEMBER;

GROUP# THR SEQ BYTES MEMBERS STATUS TYPE MEMBER


------ --- ---- ------- ------- ---------- ------ --------------------------------
1 1 2473 4194304 2 INACTIVE ONLINE /u01/LSC63/redo/redo01aLSC63.dbf
1 1 2473 4194304 2 INACTIVE ONLINE /u01/LSC63/redo/redo01bLSC63.dbf
2 1 2474 4194304 2 ACTIVE ONLINE /u01/LSC63/redo/redo02aLSC63.dbf
2 1 2474 4194304 2 ACTIVE ONLINE /u01/LSC63/redo/redo02bLSC63.dbf
3 1 2475 4194304 2 CURRENT ONLINE /u01/LSC63/redo/redo03aLSC63.dbf
3 1 2475 4194304 2 CURRENT ONLINE /u01/LSC63/redo/redo03bLSC63.dbf

Comment afficher les caractéristiques de la base de données ?


Auteurs : Laurent Schneider ,
La requête suivante nous permet d'obtenir les caractéristiques suivantes :
• Nom
• Identifiant DBID
• Mode d'archivage
• Mode flashback (10g)
• Mode d'ouverture (RW/RO)
• Date de création de la base de données

SELECT NAME,
DBID,
LOG_MODE,
FLASHBACK_ON,
OPEN_MODE,
CREATED

- 65 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

FROM v$database;

NAME DBID LOG_MODE FLASHBACK OPEN_MODE CREATED


--------- ------------- ------------ --------- ---------- ----------
LSC63 1119326572 ARCHIVELOG NO READ WRITE 2006-04-18

À partir d'Oracle 9i, la requête suivante permet d'afficher le nom et la valeur des propriétés de la base de données (ex:
tablespace properties) :

SELECT PROPERTY_NAME,
PROPERTY_VALUE,
DESCRIPTION
FROM DATABASE_PROPERTIES
ORDER BY PROPERTY_NAME;

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION


------------------------------ --------------- -------------------------------------
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace

Comment afficher le nom et la version de l'instance ?


Auteurs : Laurent Schneider ,
Via la requête suivante :

SELECT INSTANCE_NAME,
VERSION
FROM V$INSTANCE;

INSTANCE_NAME VERSION
---------------- -----------------
LSC63 10.2.0.2.0

Comment afficher le nom global de la base ?


Auteurs : Laurent Schneider ,
Via la requête suivante :

SQL> SELECT GLOBAL_NAME


2 FROM GLOBAL_NAME;

GLOBAL_NAME
------------------------------
LSC63.DOMAIN.CH

Comment afficher la fonction et le nombre d'utilisations détectées (ex: Partitioning) ?


Auteurs : Laurent Schneider ,
À partir d'Oracle 10g, via la requête suivante :

- 66 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SELECT NAME,
DETECTED_USAGES
FROM DBA_FEATURE_USAGE_STATISTICS
ORDER BY NAME;

NAME DETECTED
--------------------- --------
Partitioning (system) 11
Partitioning (user) 0

Comment supprimer une base de données sous SQL*Plus ?


Auteurs : Jaouad ,
A partir de la 10g il est possible de supprimer une base de données Oracle via une commande sous Sql*Plus : Il faut
être connecté en sysdba avec une base de données en mode open.
Nous vous recommandons bien entendu la plus grande vigilance quant à l'utilisation de cette commande, dont la syntaxe
est la suivante :

SQL> drop database;

Comment migrer un tablespace de DICTIONNARY en LOCALLY MANAGED ?


Auteurs : Fred_D ,
Depuis la version 9.2, il est possible d'utiliser la procédure
sys.DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL ('NOM_DU_TABLESPACE')
SYSTEM ne peut être migré que si tous les autres tablespaces ont été migré et si la base de données n'est pas configurée
avec SYSTEM comme tablespace temporaire par défaut.
Attention, la migration inverse est impossible ! Néanmoins, je vous rappelle qu'Oracle préconise l'utilisation de
LMT.
Note : la note Metalink 175434.1 décrit en détail cette migration.

Comment renommer un Tablespace ?


Auteurs : Jaouad ,
Depuis la version 10g, Il est possible de renommer un Tablespace grâce à la commande suivante :

SQL> alter tablespace Tbs1 rename to Tbs2 ;

Il n'est pas possible de renommer les tablespaces System et Sysaux. On peut renommer les tablespaces permanents et
temporaires : pour ce faire, le tablespace ou l'un de ses fichiers de données ne doit pas être hors ligne, sinon l'opération
de renomage ne peut avoir lieu !
Lorsque l'on modifie le nom d'un tablespace, Oracle met à jour les références de ce tablespace : à savoir les fichiers de
contrôle, le dictionnaire de données et les en-têtes de fichiers.
Si ce Tablespace est en mode Read Only les entêtes de fichiers ne sont pas modifiés (ils ont besoin pour ce faire d'être
en mode Read Write) : Un message est consigné dans le fichier alerte de l'instance.

- 67 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Si la modification de nom concerne le tablespace d'annulation UNDO et qu'il s'agit du tablespace désigné par le
paramètre d'initialisation, la modification affecte le Spfile. Si c'est le Pfile qui est utilisé, alors un message d'alerte est
consigné dans le fichier d'alerte de l'instance
Le paramètre compatible doit au moins être a 10.0.0.

Comment supprimer un datafile ?


Auteurs : Fred_D , Laurent Schneider ,
C'est normallement impossible :
Au mieux un datafile peut être renommé, retaillé ou déplacé. Pour le supprimer d'un tablespace il faut recréer le
tablespace sans ce datafile.
C'est maintenant possible en 10gR2 :

SQL> create tablespace x datafile '/tmp/x1.dbf' size 4m, '/tmp/x2.dbf' size 4m;

Tablespace created.

SQL> alter tablespace x drop datafile '/tmp/x2.dbf';

Tablespace altered.

Comment connaître la taille d'un tablespace et de son espace libre ?


Auteurs : LeoAnderson , rouardg ,
La vue DBA_DATA_FILES va nous permettre de déterminer la taile d'un tablespace,
La vue DBA_EXTENTS permet de connaitre la taille de tous les segments dans les différents datafiles,
La vue DBA_FREE_SPACE qui indique les espaces libres dans les database files.
La requête suivante vous permet de récupérer toutes ces informations :

SQL> SELECT A.tablespace_Name, A.Alloue, B.Occupe, C.Libre


2 FROM (select tablespace_name, sum(bytes)/1024/1024 AS ALLOUE from dba_data_files group by
tablespace_name) a,
3 (select tablespace_name, Sum(bytes)/1024/1024 AS OCCUPE from dba_segments group by
tablespace_name) b,
4 (select tablespace_name, Sum(bytes)/1024/1024 AS LIBRE from dba_free_space group by
tablespace_name) c
5 WHERE B.tablespace_Name = A.tablespace_Name
6 AND C.Tablespace_Name = B.Tablespace_Name;

Attention : En 10g, le "LIBRE" peut être différent de ("ALLOUE"- "OCCUPE") à cause de la recyclebin !

Comment connaître l'occupation du tablespace SYSAUX (10g) ?


Auteurs : Jaouad ,
Le tablespace SYSAUX est apparue avec la version 10g, et a pour but de décharger le tablespace SYSTEM de certains
segments.

SQL> select occupant_name, space_usage_kbytes from v$sysaux_occupants ;

- 68 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

OCCUPANT_NAME SPACE_USAGE_KBYTES
---------------------------------------------------------------- ------------------
LOGMNR 6080
LOGSTDBY 896
STREAMS 512
XDB 49600
AO 21248
XSOQHIST 21248
...

- 69 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Système


Comment afficher l'encombrement disque/mémoire des unités de traitement ?
Auteurs : SheikYerbouti ,
La place occupée par les unités de traitement est interrogeable depuis la vue : USER_OBJECT_SIZE
• NAME Contient le nom de l'objet
• TYPE Contient le type de l'objet (TYPE, TYPE BODY, TABLE, VIEW, SYNONYM,SEQUENCE,
PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY, JAVA SOURCE, JAVA CLASS, JAVA
RESOURCE ou JAVA DATA)
• SOURCE_SIZE Contient la taille en octets du code source
• PARSED_SIZE Contient la taille en octets du code DIANA (incluant les références aux objets sous-jacents)
• CODE_SIZE Contient la taille du code chargé en mémoire à l'exécution
• ERROR_SIZE Contient la taille des messages d'erreur

taille des unités de traitement


SQL> SELECT *
2 FROM USER_OBJECT_SIZE
3 WHERE TYPE IN ('PACKAGE BODY','PACKAGE','FUNCTION','PROCEDURE')
4 ORDER BY TYPE,NAME ;

NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE


------------------------------ ------------- ----------- ----------- ---------- ----------
LIGNESALAIRE FUNCTION 280 261 563 0
PWD_DECODE FUNCTION 459 234 702 0
RETOURNE_PARAM FUNCTION 885 239 990 0
SRV_LECTURE_PARAMETRE FUNCTION 458 342 697 0
TEST_XX FUNCTION 869 269 1119 0
PKG_CORRECTION PACKAGE 414 1493 362 0
TEST_RECORD PACKAGE 233 761 875 0
PKG_CORRECTION PACKAGE BODY 11408 0 12467 0
TEST_RECORD PACKAGE BODY 403 0 1376 0
DEBUG PROCEDURE 1153 475 1343 0
DISPLAY_IMAGE PROCEDURE 894 509 1277 0
ECRITURE_ERREUR PROCEDURE 755 1517 673 0

La première ligne indique que la fonction LIGNESALAIRE occupe 280 octets de code source et nécessite 563 octets
en mémoire à l'exécution.

Comment connaître les bases en cours d'utilisation ?


Auteurs : Helyos ,
Pour connaître les bases de données actuellement en cours d'utilisation sur votre poste il vous suffit :
Sous Windows d'aller dans le gestionnaire des services : Click droit sur le poste de travail => gérer => services et
applications => services puis de regarder tous les services commençant par OracleService et qui sont formatés de la
sorte OracleService<SID> (où SID correspond au nom de l'instance associée)
Sous Linux Vous pouvez lancer la commande suivante : ps -ef | egrep pmon_ | grep -v grep

Comment afficher l'encombrement mémoire des pools partagés ?


Auteurs : SheikYerbouti ,
Voici un script permettant d'afficher la taille allouée, utilisée et libre de chaque pool :

- 70 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

COL "Total octets alloués" FORMAT A20


COL "octets utilisés" FORMAT A20
COL "octets libres" FORMAT A20
SELECT
a.POOL "Pool"
, b.Octets || ' (' || ROUND(b.Octets/1024/1024) || ' Mo)' "Total octets alloués"
, (b.Octets-a.BYTES) || ' (' || ROUND((b.Octets-a.BYTES)/1024/1024) || ' Mo)' "octets utilisés"
, a.BYTES || ' (' || ROUND(a.BYTES/1024/1024) || 'Mo)' "octets libres"
FROM V$SGASTAT a,
( SELECT POOL, SUM(BYTES) Octets, SUM(BYTES/1024/1024) Mo
FROM V$SGASTAT
WHERE POOL IS NOT NULL
GROUP BY POOL
ORDER BY POOL) b
WHERE NAME = 'free memory'
AND a.POOL = b.POOL
ORDER BY a.POOL ;

Ainsi que le résultat de l'exécution

SQL> COL "Total octets alloués" FORMAT A20


SQL> COL "octets utilisés" FORMAT A20
SQL> COL "octets libres" FORMAT A20
SQL> SELECT
2 a.POOL "Pool"
3 , b.Octets || ' (' || ROUND(b.Octets/1024/1024) || ' Mo)' "Total octets alloués"
4 ,
(b.Octets-a.BYTES) || ' (' || ROUND((b.Octets-a.BYTES)/1024/1024) || ' Mo)' "octets utilisés"
5 , a.BYTES || ' (' || ROUND(a.BYTES/1024/1024) || 'Mo)' "octets libres"
6 FROM V$SGASTAT a,
7 ( SELECT POOL, SUM(BYTES) Octets, SUM(BYTES/1024/1024) Mo
8 FROM V$SGASTAT
9 WHERE POOL IS NOT NULL
10 GROUP BY POOL
11 ORDER BY POOL) b
12 WHERE NAME = 'free memory'
13 AND a.POOL = b.POOL
14 ORDER BY a.POOL
15 /

Pool Total octets alloués octets utilisés octets libres


----------- -------------------- -------------------- --------------------
java pool 29360128 (28 Mo) 0 (0 Mo) 29360128 (28Mo)
large pool 8404644 (8 Mo) 304668 (0 Mo) 8099976 (8Mo)
shared pool 41943040 (40 Mo) 22455544 (21 Mo) 19487496 (19Mo)

Comment mesurer les I/O sur les fichiers ?


Auteurs : Jaouad ,
Via le script suivant :

set linesize 250


col file_name format a40

select b.file_name, a.file#, a.cnt


from (select file#, count(1) cnt
from v$bh
group by file#) a,
dba_data_files b

- 71 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

where a.file# = b.file_id;

Comment afficher le nom du composant, l'état et la version des éléments du registre ?


Auteurs : Laurent Schneider ,
Via la requête suivante, à partir de la 9i :

SELECT COMP_NAME,
STATUS,
VERSION
FROM DBA_REGISTRY
ORDER BY COMP_NAME;

COMP_NAME STATUS VERSION


---------------------------------- ------ -----------
JServer JAVA Virtual Machine VALID 10.2.0.2.0
Oracle Database Catalog Views VALID 10.2.0.2.0
Oracle Database Java Packages VALID 10.2.0.2.0
Oracle Database Packages and Types VALID 10.2.0.2.0
Oracle Expression Filter VALID 10.2.0.2.0
Oracle Text VALID 10.2.0.2.0
Oracle Workspace Manager VALID 10.2.0.3.0
Oracle XDK VALID 10.2.0.2.0
Oracle XML Database VALID 10.2.0.2.0
Oracle interMedia VALID 10.2.0.2.0

Comment afficher la date, l'action et la version des patches/upgrades ?


Auteurs : Laurent Schneider ,
À partir de la version 10.1.0.5 cpu2006jan, via le requête suivante :

SELECT ACTION_TIME,
ACTION,
VERSION,
ID
FROM DBA_REGISTRY_HISTORY
ORDER BY to_timestamp(ACTION_TIME,'DD.MM.YYYY HH24:MI:SSXFF');

ACTION_TIME ACTION VERSION ID


---------------- -------- ------------ ----------
14.02.2006 10:28 CPU 4751932
07.03.2006 11:30 UPGRADE 10.2.0.2.0

Quelle est la procédure pour déplacer des objets de SYSAUX (10g) ?


Auteurs : Jaouad ,
Lors d'une réorganisation de base de données, si l'on souhaite déplacer certains objets du tablespace SYSAUX vers
d'autres tablespaces, comment procéder ?
Cette requête va nous donner la procédure à utiliser pour le déplacement en fonction des objets

SQL> SELECT occupant_name, schema_name, move_procedure


2 FROM v$sysaux_occupants ;

- 72 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

OCCUPANT_NAME SCHEMA_NAME MOVE_PROCEDURE


---------------- --------------- ---------------------------------------------------------------
LOGMNR SYSTEM SYS.DBMS_LOGMNR_D.SET_TABLESPACE
LOGSTDBY SYSTEM SYS.DBMS_LOGSTDBY.SET_TABLESPACE
STREAMS SYS
XDB XDB XDB.DBMS_XDB.MOVEXDB_TABLESPACE
AO SYS DBMS_AW.MOVE_AWMETA
XSOQHIST SYS DBMS_XSOQ.OlapiMoveProc
...

Comment connaître le systéme d'exploitation qui héberge le SGBDR ?


Auteurs : Jaouad ,
Via cette requête :

SQL> SELECT dbms_utility.port_string FROM dual;

PORT_STRING
-----------------------------------------------
IBMPC/WIN_NT-8.1.0

Comment savoir si une base source est valide pour une migration en 10g ?
Auteurs : Jaouad ,
Lors d'une migration vers une base 10g, comment savoir si les pré requis ont été vérifiés avant d'effectuer la migration ?
Via un nouvel outil d'upgrade ( Upgrade information Tool ) :
Prendre le fichier utlu101i.sql ( migration vers une 10gR1 ) présent dans le dossier $ORACLE_HOME\rdbms\admin
\ et le faire tourner sur la base source. Il est possible de faire une migration vers la 10g ( quelque que soit la release )
sans passer par d'autres versions si la base source est 806, 817, 927

Comment détecter/supprimer les sessions qui sont marqués Killed ?


Auteurs : Jaouad ,
Voici comment déterminer les sessions qui sont killed for ever :
• sous Unix :

SELECT spid
FROM v$process
WHERE NOT EXISTS ( SELECT 1
FROM v$session
WHERE paddr = addr);

• sous Windows :

SVRMGRL> SELECT spid, osuser, s.program


FROM v$process p, v$session s
WHERE p.addr=s.paddr;

- 73 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Pour les tuer :

c:>orakill sid thread

Comment modifier l'emplacement de la région de restauration flash (10g) ?


Auteurs : bouyao ,
Il suffit de modifier le parametre DB_RECOVERY_FILE_DEST.
Avec ce paramètre, il faut toujours spécifier le paramètre d'initialisation DB_RECOVERY_FILE_DEST_SIZE.
Par exemple :

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/disk1' SCOPE=BOTH SID='*' ;

Quelles sont les fonction de SMon (System Monitor) ? (en 9i)


Auteurs : bouyao ,
• Fusion des extents libre toutes les 5 mn
• Nettoyage des segments temporaires toutes les 2 h
• Mise à jours de SMON_SCN_TIME toutes les 5 mn
• Nettoyage des objects inexistants dans OBJ$, toutes les 12 h
• Nettoyage de IND$ toutes les heure
• Compactage (shrink) des segments undo toutes les 12 h
• Restauration des transactions uniquement au démarrage de la base
• Il annule les transactions non validées quand c'est posté par PMON

Comment reveiller le SMON pour nettoyer les segements temporaires ?


Auteurs : LeoAnderson ,
En réalité, SMon (System MONitor) ne s'endort pas réellement, puisqu'il n'est sollicité que de temps à autres lorsque
la base est en activité.
La doc (cf lien au bas de la QR) précise simplement que :

SMON checks regularly to see whether it is needed

Mais il peut être utile parfois de le solliciter manuellement, ce qu'on appelle un wakeup :
1. Exécutez d'abord la requête suivante :

SQL> SELECT pid FROM v$process


2 WHERE addr =
3 (
4 SELECT paddr FROM v$bgprocess
5 WHERE name = 'SMON'
6 );

PID
----------
8

- 74 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

2. Puis récupérez le PID pour exécuter la commande suivante (connecté en tant que SYSDBA) :
En général : 6 => 8i, 7 => 9i et 8 => 10g

SQL> ORADEBUG WAKEUP 8


Instruction traitée.

lien : System Monitor Process (SMON)

Comment trouver les sessions qui utilisent la tablespace temporaire ?


Auteurs : Aline ,
Grâce à la requête suivante :

SQL> SELECT se.osuser, se.username, se.sid,


2 su.extents, su.blocks * to_number(rtrim(p.value)) AS Space,
3 tablespace
4 FROM v$sort_usage su, v$parameter p, v$session se
5 WHERE p.name = 'db_block_size'
6 AND su.session_addr = se.saddr
7 ORDER BY se.username, se.sid;

- 75 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Objets


Comment lister les objets invalides ?
Auteurs : Laurent Schneider ,
La requête suivante nous permet de lister les objets invalides, avec les informations suivantes :
• Schéma
• Type d'objet
• Date de création
• Date de dernière modification/compilation

SELECT OWNER,
OBJECT_TYPE,
OBJECT_NAME,
CREATED,
LAST_DDL_TIME
FROM DBA_OBJECTS
WHERE STATUS='INVALID'
ORDER BY OWNER, OBJECT_NAME;

OWNER OBJECT_TYPE OBJECT_NAME CREATED LAST_DDL_T


------ ----------- -------------------- ---------- ----------
PUBLIC SYNONYM DBA_HIST_FILESTATXS 2006-04-18 2006-06-13
PUBLIC SYNONYM DBA_HIST_SQLBIND 2006-04-18 2006-06-13
PUBLIC SYNONYM DBA_HIST_SQLSTAT 2006-04-18 2006-06-13

Comment lister les objets supprimés (10g) ?


Auteurs : Laurent Schneider ,
À partir de la version 10g, la requête suivante permet de lister les objets dans la poubelle, avec les propriétés suivantes :
• Nom du tablespace
• Type d'objet
• Propriétaire
• Nom original
• Nom BIN$
• SCN
• Date de création
• Date d'effacement des objets dans la poubelle (Recycle bin)

SELECT
TS_NAME,
TYPE,
OWNER,
ORIGINAL_NAME,
OBJECT_NAME,
DROPSCN,
CREATETIME,
DROPTIME
FROM dba_recyclebin
ORDER BY owner, type, original_name, dropSCN;

TS_NAME TYPE OWNER ORIG OBJECT_NAME DROPSCN CREATETIME DROPTIME


------- ----- ----- ---- ------------------------------ ---------- ---------- ----------

- 76 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

USERS TABLE SCOTT T BIN$F22M89kvcArgQwow5W1wCg==$0 3537036 2006-06-30 2006-06-30

Comment lister les jobs ?


Auteurs : Laurent Schneider ,
La requête suivante nous permet de lister les jobs, avec les caractéristiques suivantes :
• Schéma
• Numéro du job
• Date de prochaine éxecution
• Code des jobs

SELECT SCHEMA_USER,
JOB,
NEXT_DATE,
WHAT
FROM DBA_JOBS;

SCHEMA JOB NEXT_DATE WHAT


------ --- ---------- --------
SYS 1 2006-07-01 scott.p;

Comment lister les sessions ?


Auteurs : Laurent Schneider ,
La requête suivante permet de lister les sessions, avec les propriétés suivantes :
• Utilisateur DB
• Utilisateur SE
• SID
• SERIAL#
• Processus OS
• Type de serveur
• Status
• Machine cliente
• Programme
• Heure du login
• Nom du dispatcher
• Nom du shared server

SELECT s.USERNAME,
s.OSUSER,
s.SID,
s.SERIAL#,
p.SPID,
s.SERVER,
s.STATUS,
s.MACHINE,
s.PROGRAM,
TO_CHAR(s.LOGON_TIME, 'hh24:mi:ss') LOGON_TIME,
d.name DISP,
ss.name SERV
FROM V$PROCESS p,
V$SESSION s,
V$DISPATCHER d,

- 77 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

V$CIRCUIT c,
V$SHARED_SERVER ss
WHERE p.ADDR = s.PADDR
AND s.SADDR=c.SADDR (+)
AND c.DISPATCHER=d.PADDR (+)
AND c.SERVER=ss.PADDR (+)
AND s.USERNAME IS NOT NULL
ORDER BY s.USERNAME, p.SPID;

USERNAME OSUSER SID SERIAL# SPID SERVER STATUS MACHINE PROGRAM LOGON DISP SERV
-------- ------ ---- ------- ------------ --------- -------- --------- ------- ----- ---- ----
DBSNMP oracle 129 31 2465846 SHARED ACTIVE pclsc01 emagent 06:17 D000 S003
DBSNMP oracle 122 6 2728088 NONE INACTIVE pclsc01 emagent 06:17 D000
SYS oracle 113 2669 2920628 DEDICATED ACTIVE pclsc01 sqlplus 10:38

Concernant les "longues opérations", la requête suivante vous permettra d'obtenir :


• Numéros de sessions
• Opération
• Travail effectué
• Travail total
• Temps restant

SELECT SID,
SERIAL#,
OPNAME,
SOFAR,
TOTALWORK,
TIME_REMAINING
FROM V$SESSION_LONGOPS
WHERE TIME_REMAINING != 0;

SID SERIAL# OPNAME SOFAR TOTAL TIME_REM


----- ------- --------------------------- ------ ------ --------
120 4001 RMAN: full datafile backup 33692 66496 76

Comment voir toutes les tables qui sont dans le buffer KEEP ?
Auteurs : LeoAnderson , Jaouad ,
Depuis la version 8, le BUFFER CACHE est divisé en plusieurs segments : DEFAULT, KEEP et RECYCLE.
Contrairement à ce que leurs noms peuvent laisser penser, ils sont gérés tous les 3 exactement de la même façon, par
les même règles LRU (Last Recently Used).
En général, on utilise le buffer KEEP pour y stocker les blocks des tables que l'on interroge souvent; et le buffer
RECYCLE pour des données plus volatiles.
Par exemple, si on a une table de REFERENCE, une table de COMMANDES et une table IMAGE_PRODUIT, on aura
intérêt à répartir les tables de la façon suivante :
• COMMANDES sur le buffer pool DEFAULT
• REFERENCE dans le buffer pool KEEP
• IMAGE_PRODUIT dans le buffer pool RECYCLE

En effet, si l'on interroge l'image (volume important), cela va nécessiter de sortir du pool de nombreux blocs de
REFERENCE qu'il faudra recharger ultérieurement alors que les blocs de l'image auront très peu de chance de
resservir...
Les noms des buffers pools ne sont qu'une astuce mnémotechnique, car ils pourraient très bien s'appeller A, B et C,
cela ne changerait rien !
Remarque : depuis la 9i, il est possible de définir des buffer pools de taille de block différente ( db_nk_cache_size) mais
les buffer KEEP et RECYCLE auront forcément comme taille de bloc la taille DEFAULT.

- 78 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Donc, on a 3 pools de taille par défault et jusqu'à 4 buffers de taille différente, ce qui fait 7 zones buffers indépendantes
au maximum ! (mais je vous déconseille vivement d'implémenter un tel système, ça deviendra impossible à administrer/
tuner !)
La requête est la suivante :

col object_type format a10


col object_name format a20

SELECT dba_objects.owner,object_name,object_type,object_type
FROM dba_objects, dba_indexes,dba_tables
WHERE dba_objects.object_name = dba_indexes.index_name
AND dba_objects.object_name = dba_tables.table_name
AND dba_tables.buffer_pool = 'KEEP'
AND dba_indexes.buffer_pool = 'KEEP' ;

Comment "Keeper" une table en mémoire :

ALTER TABLE TABLE_NAME STORAGE (BUFFER_POOL KEEP) ;

Attention : avec les multiples buffers pools, il n'est plus possible de monitorer les ratios par la vue habituellement utilisée
(v$SysStat) mais Oracle a implémenté la vue v$Buffer_Pool_Statistics :

SQL> SELECT Name,


Block_size, Round(100*(CONSISTENT_GETS+DB_BLOCK_GETS-PHYSICAL_READS)/(CONSISTENT_GETS+DB_BLOCK_GETS) ,2)
2 AS HitRatio
3 FROM v$buffer_pool_statistics;
NAME BLOCK_SIZE HITRATIO
-------------------- ---------- ----------
DEFAULT 8192 97.77

SQL> ALTER system SET db_keep_cache_size=50M scope=SPFILE;

/* ARRET / RELANCE DE LA BASE */

SQL> CREATE TABLE toto (col1 varchar2(30) ) storage (buffer_pool keep);

TABLE created.

SQL> SELECT Name,


Block_size, Round(100*(CONSISTENT_GETS+DB_BLOCK_GETS-PHYSICAL_READS)/(CONSISTENT_GETS+DB_BLOCK_GETS) ,2)
2 AS HitRatio
3 FROM v$buffer_pool_statistics;

NAME BLOCK_SIZE HITRATIO


-------------------- ---------- ----------
KEEP 8192 100
DEFAULT 8192 89.57

- 79 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Archive Log


Comment savoir si une base est en mode archivelog ?
Auteurs : bouyao ,
Grâce à la commande suivante :

SQL> ARCHIVE LOG LIST


mode Database log mode No Archive
Archivage automatique Désactivé
Destination de l'archive USE_DB_RECOVERY_FILE_DEST
Séquence de journal en ligne la plus ancienne 82
Séquence de journal courante 84

Il faut être connecté en tant que SYSDBA, sous peine d'obtenir l'erreur suivante :

ORA-01031: insufficient privileges

On peut également utiliser le vue V$DATABASE :

SELECT LOG_MODE FROM SYS.V$DATABASE;


LOG_MODE
------------
NOARCHIVELOG

Comment savoir le volume d'archive log généré par une instance ?


Auteurs : Jaouad ,
Il est important de monitorer le suivi des archiveLog, afin de détecter des archives trop importantes par rapport à
l'activité.
Cette requête fontionne sur toutes les versions :

SQL> SELECT TO_DATE(TO_CHAR(next_time, 'dd/mm/yyyy'), 'dd/mm/yyyy') Jour, ROUND(SUM(blocks*block_siz


e/1024/1024)) Mo
2 FROM v$archived_log
3 GROUP BY TO_DATE(TO_CHAR(next_time, 'dd/mm/yyyy'), 'dd/mm/yyyy')
4 ORDER BY 1 DESC ;

JOUR MO
--------- ----------
26-SEP-06 48226
25-SEP-06 25258
24-SEP-06 20438
23-SEP-06 31261
22-SEP-06 17450
21-SEP-06 18811
20-SEP-06 30778
19-SEP-06 36108
18-SEP-06 90508
17-SEP-06 31568

- 80 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

16-SEP-06 50283

Comment activer l'archivage dans Oracle ?


Auteurs : bouyao ,
1. Il faut tout d'abord arrêter la base :

Sql> SHUTDOWN

On ne peut pas modifier le mode ARCHIVELOG en NOARCHIVELOG si la base à besoin d'une restauration media.
2. Il faut ensuite sauvegarder la base :
En effet, avant de faire des modifications majeures dans la base, il faut toujours la sauvegarder pour se protéger pour
des raisons de sécurité.
3. Editer le fichier d'initialisation pour ajouter les paramètres qui spécifient la destination des archives.
4. Démarrer la base en mode mount sans l'ouvrir :

sql> STARTUP MOUNT

5. Modifier le mode d'archivage et ouvrir la base.

sql> ALTER DATABASE ARCHIVELOG;


sql> ALTER DATABASE OPEN;

Le changement du mode d'archivage mettra à jours le fichier de contrôle et rendra les anciennes sauvegardes
inutilisables.
6. Arrêter la base :

sql> SHUTDOWN IMMEDIATE

7. Sauvegarde la base :
En version 10g, il n'est pas nécessaire de renseigner le paramètre d'initialisation :

LOG_ARCHIVE_START = TRUE

- 81 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > ISqlPlus (10g)


Comment démarrer et arrêter Isqlplus ?
Auteurs : Jaouad ,
Isqlplus est installé automatiquement à partir de la version 10g. Pour le démarrer et l'arrêter, Oracle a prévu un binaire
Isqlpluscl ( présent dans le répertoire $ORACLE_HOME/bin) :
• démarrage :

sproerp17-oracle: /oracle/product/102>isqlplusctl start


iSQL*Plus 10.2.0.1.0
Copyright (c) 2003, 2005, Oracle. ALL rights reserved.
Starting iSQL*Plus ...
iSQL*Plus started.

• Arrêt :

sproerp17-oracle: /oracle/product/102>isqlplusctl stop


iSQL*Plus 10.2.0.1.0
Copyright (c) 2003, 2005, Oracle. ALL rights reserved.
Stopping iSQL*Plus ...
iSQL*Plus stopped.

Comment retrouver les informations de connexions Isqlplus


Auteurs : Jaouad ,
Le fichier contenant les URL de connexions Isqlplus (informations qui sont données à la fin de l'installation) peut être
retrouvé à cet emplacement : $ORACLE_HOME/install/readme.txt

sproerp17-oracle: /oracle/product/102>more $ORACLE_HOME/install/readme.txt

The following J2EE Applications have been deployed AND are accessible at the URLs listed below.

iSQL*Plus URL:
http://sproerp17:5560/isqlplus

iSQL*Plus DBA URL:


http://sproerp17:5560/isqlplus/dba

Comment changer le port d'Isqlplus ?


Auteurs : Jaouad ,
Voici comment changer le port d'écoute d'Isqlplus, en passant par exemple de 5560 à 80 :
• arrêter Isqlplus avec la commande :

isqlplusctl stop

• Editer le script /$ORACLE_HOME/oc4j/j2ee/isqlplus/config/http-web-site.xml et remplacer 5560 par 80 :

- 82 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

<web-site port="80" display-name="OC4J Java HTTP Web Site">

• Démarrer Isqlplus avec la commande :

isqlplusctl start

- 83 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Administration > Autres


Comment afficher l'espace disque occupé par les objets Oracle ?
Auteurs : SheikYerbouti ,
Comment calculer l'espace disque occupé par les objets Oracle
En interrogeant la vue DBA_SEGMENTS :

SQL> COLUMN TABLE FORMAT A30


SQL> COLUMN Taille FORMAT A15
SQL> COLUMN TABLESPACE FORMAT A20
SQL>
SQL> SELECT segment_name "TABLE"
2 , SUM(BYTES) /1024 || 'Ko' "Taille"
3 , blocks "Blocs"
4 , tablespace_name "TABLESPACE"
5 FROM dba_segments
6 WHERE segment_type = 'TABLE'
7 AND OWNER = 'FD'
8 GROUP BY segment_name, tablespace_name, blocks
9 ORDER BY segment_name ;

TABLE Taille Blocs TABLESPACE


------------------------------ --------------- ---------- --------------------
ADRESSE 64Ko 8 USERS
CONTACT 64Ko 8 USERS
DEPT 64Ko 8 USERS
EMP 128Ko 16 USERS
EMPLOYE 64Ko 8 USERS
FACTURE 64Ko 8 USERS
LOV_BLOCK 64Ko 8 USERS
LOV_COLONNE 64Ko 8 USERS
LOV_ELEMENT_COLONNE 64Ko 8 USERS
LOV_ITEM 64Ko 8 USERS
LOV_LOV 64Ko 8 USERS
LOV_MODULE 64Ko 8 USERS
NOMBRES 64Ko 8 USERS
TELEPHONE 64Ko 8 USERS
TEST 2048Ko 256 USERS
TEST_LOV 4096Ko 512 USERS
TEST_TYPES 64Ko 8 USERS
TRACE 64Ko 8 SYSTEM
UTIL_PREFS 64Ko 8 USERS
UTIL_PREFS_ORDER 64Ko 8 USERS
UTIL_PREFS_RECORD_ORDER 64Ko 8 USERS

21 ligne(s) sélectionnée(s).

Afficher la place occupée par toutes les tables d'un schéma particulier :

SQL> SELECT SUM(BYTES) /1024 /1024 || 'Mo' "Taille"


2 , SUM(blocks) "Blocs"
3 FROM dba_segments
4 WHERE segment_type = 'TABLE'
5 AND OWNER = 'FD'
6 GROUP BY OWNER ;

Taille Blocs
--------------- ----------
7,25Mo 928

Afficher le cumul de volumétrie de tous les objets d'un schéma particulier :

- 84 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> SELECT SUM(BYTES) /1024 /1024 || 'Mo' "Taille"


2 , SUM(blocks) "Blocs"
3 FROM dba_segments
4 WHERE OWNER = 'FD' ;

Taille Blocs
--------------- ----------
12,625Mo 1616

Afficher l'espace occupé par l'ensemble des schémas :

SQL> SELECT SUM(BYTES) /1024 /1024 || 'Mo' "Taille"


2 , SUM(blocks) "Blocs"
3 FROM dba_segments ;

Taille Blocs
--------------- ----------
647,484375Mo 82878

Comment positionner la valeur de certains paramètres à la connection?


Auteurs : lalystar ,
Pour fixer la valeur de certains paramètres de sessions automatiquement à chaque connection d'un utilisateur donné,
le plus simple est d'utiliser un trigger au niveau de la base.
Le trigger doit être créé en tant que SYS ou bien par un utilisateur ayant le privilège ADMINISTER DATABASE
TRIGGER.

create or replace trigger TG_DB_AFTER_LOGON after logon on database


begin
if user = 'SCOTT' then
execute immediate 'alter session set sort_area_size=100000';
end if;
end;

Exemple d'utilisation :

SQL> connect sys/... as sysdba


Connected.
SQL> create or replace trigger TG_DB_AFTER_LOGON after logon on database
2 begin
3 if user = 'SCOTT' then
4 execute immediate 'alter session set sort_area_size=100000';
5 end if;
6 end;
7
8 /

Trigger created.

SQL> show parameter sort_area_size

NAME TYPE VALUE


------------------------------------ ----------- -----------------------------
sort_area_size integer 65536
SQL> connect scott/...
Connected.

- 85 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> show parameter sort_area_size;

NAME TYPE VALUE


------------------------------------ ----------- -----------------------------
sort_area_size integer 100000

Ce genre de trigger est utile en particulier pour fixer les paramètres régionaux (séparateur décimal, séparateur de
milliers...) indépendamment de la plateforme (Windows, Unix...) et de l'outil utilisé pour la connection (SQL*Plus,
SQL*Loader, ...).

Comment créer un DBLink sans Tnsnames.ora ?


Auteurs : Jaouad ,

Create database link dblink_name


connect to user identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SID)
)
)'

Comment lire le fichier d'alert de Sql*Plus ?


Auteurs : Jaouad ,
Ici il s'agit d'utiliser les tables externes, fonctionnalité disponible à partir de la 9i :

create directory BDUMP as 'background_dump_dest'


create table alert_log(text varchar2(80))
organization external
(
type oracle_loader
default directory BDUMP
access parameters (records delimited by newline)
location ('alert_SID.log')
)
reject limit 1000;

SQL> select * from alert_log ;

Comment lister les Directory ainsi que leurs caractéristiques principales ?


Auteurs : Laurent Schneider ,
La requête suivante permet d'afficher les directory, avec les propriétés suivantes :
• Schéma
• Nom
• Chemin

- 86 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

select OWNER,
DIRECTORY_NAME,
DIRECTORY_PATH
from DBA_DIRECTORIES
order by OWNER,
DIRECTORY_NAME;

OWNER DIRECTORY_NAME DIRECTORY_PATH


----- --------------- ----------------------------------------
SYS WORK_DIR /app/oracle/product/10.2.0.2/work
SYS TMP /tmp
SYS DATA_PUMP_DIR /app/oracle/product/10.2.0.2/rdbms/log/
SYS ADMIN_DIR /app/oracle/product/10.2.0.2/md/admin

Comment recompiler des objets en fonction de leurs dépendances ?


Auteurs : Pierre Forstmann ,
Grâce au mécanisme de compilation automatique à l'exécution d'un objet invalide, Oracle va compiler toutes les vues
dépendantes pour les exécuter lors de l'exécution d'une vue.
La procédure suivante qui exécute "à vide" toutes les vues du schéma courant qui ne sont pas référencées dans d'autres
vues va donc compiler toutes les vues du schéma courant:

create or replace procedure ev


is
comm varchar2(100);
res int;
begin
for lv in (select view_name from user_views where not exists
(select referenced_name from user_dependencies where referenced_name = view_name))
loop
comm := 'SELECT COUNT(*) FROM ' || lv.view_name || ' WHERE 1=0';
dbms_output.put_line(comm || ' ...');
execute immediate comm into res;
dbms_output.put_line('... OK.');
end loop;
end;
/

Voici un exemple :

SQL> create table t(x int, y int);

Table created.

SQL> create view v1 as select x,y from t;

View created.

SQL> create view v2 as select x,y from v1 where x >= 0;

View created.

SQL> create view v3 as select x,y from v2 where y >= 0;

View created.

SQL>
SQL> create view v4 as select x from t;

View created.

- 87 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL>
SQL> --
SQL> -- compiler toutes les vues
SQL> --
SQL> create or replace procedure ctv
2 is
3 comm varchar2(100);
4 begin
5 for lv in (select view_name from user_views)
6 loop
7 comm := 'ALTER VIEW ' || lv.view_name || ' COMPILE';
8 dbms_output.put_line(comm || ' ...');
9 execute immediate comm;
10 dbms_output.put_line('... OK.');
11 end loop;
12 end;
13 /

Procedure created.

SQL> show errors


No errors.
SQL>
SQL> --
SQL> -- lister status des vues
SQL> --
SQL>
SQL> create or replace procedure lsv(cv out sys_refcursor)
2 is
3 begin
4 open cv for
5 'select object_name, status from user_objects where object_type = ''VIEW'' ';
6 end;
7 /

Procedure created.

SQL> show errors


No errors.
SQL>
SQL>
SQL> --
SQL> -- executer les vues dont aucune autre vue ne dépend
SQL> --
SQL>
SQL> create or replace procedure ev
2 is
3 comm varchar2(100);
4 res int;
5 begin
6 for lv in (select view_name from user_views where not exists
7 (select referenced_name from user_dependencies where referenced_name = view_name))
8 loop
9 comm := 'SELECT COUNT(*) FROM ' || lv.view_name || ' WHERE 1=0';
10 dbms_output.put_line(comm || ' ...');
11 execute immediate comm into res;
12 dbms_output.put_line('... OK.');
13 end loop;
14 end;
15 /

Procedure created.

SQL> show errors


No errors.
SQL>
SQL>

- 88 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL> var rc refcursor;


SQL> column object_name format a15
SQL>
SQL> --
SQL> -- execute v1, v4
SQL> --
SQL> set serveroutput on;
SQL> alter table t add (z char(3));

Table altered.

SQL> exec lsv(:rc);

PL/SQL procedure successfully completed.

SQL> print :rc

OBJECT_NAME STATUS
--------------- -------
V1 INVALID
V2 INVALID
V3 INVALID
V4 INVALID

SQL> exec ev;


SELECT COUNT(*) FROM V4 WHERE 1=0 ...
... OK.
SELECT COUNT(*) FROM V3 WHERE 1=0 ...
... OK.

PL/SQL procedure successfully completed.

SQL> exec lsv(:rc);

PL/SQL procedure successfully completed.

SQL> print :rc

OBJECT_NAME STATUS
--------------- -------
V1 VALID
V2 VALID
V3 VALID
V4 VALID

SQL>

Comment vider les caches Oracle ?


Auteurs : Jaouad ,
Voici la commande pour la Shared Pool :

SQL> alter system flush shared_pool


2 ;

Système modifié.

Et celle pour vider le cache de données (10g) :

SQL> alter system flush buffer_cache ;

- 89 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Système modifié.

elle peut également recevoir les paramétres suivant : GLOBAL et CONTEXT

Comment modifier le mot de passe de l'utilisateur sysman dans Enterprise Manager Grid Control ?
Auteurs : bouyao ,
1. Il faut tout d'abord arrêter OMS :
• sous Unix :

$ emctl stop oms

• sous Windows :

Arrêter le service windows Oracle{oracle_home_name}ProcessManger


ou, sous la ligne de commande Dos :

C> emctl stop oms

2. Vérifier que OMS est arrêté :

• sous Unix :

$ emctl status oms

• sous Windows :

Vérifier la status du service Windows Oracle{oracle_home_name}ProcessManager


ou, sous la ligne de commande Dos :

C> emctl status oms

3. Se connecter à la base avec un privilège DBA, puis tapez la commande suivante :

SQL> ALTER USER sysman IDENTIFIED BY 'new_password';

4. Vérifier le nouveau mot de passe :

SQL> CONNECT sysman/nouveau_passe[@database_alias]

5. Dans $ORACLE_HOME/sysman/config
5.1. Sauvegarder le fichier emoms.properties dans emoms.properties.orig
5.2. Editer le fichier emoms.properties
a. Rechercher la ligne commencant par: oracle.sysman.eml.mntr.emdRepPwd=
Remplacer la valeur encrypté par le nouveau mot de passe

- 90 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

b. Rechercher la ligne : oracle.sysman.eml.mntr.emdRepPwdEncrypted=TRUE


Remplacer TRUE par FALSE
6. Redémarrer OMS
• sous Unix :

$ emctl start oms

• sous Windows :

Démarrer le service Oracle{oracle_home_name}ProcessManager


ou, sous la ligne de commande Dos :

C> emctl start oms

7. Vérifier que oracle.sysman.eml.mntr.emdRepPwd est encrypté.

Comment afficher les paramètres cachés d'Oracle ?


Auteurs : bouyao , Fred_D ,
Pour exécuter cette requête, il faut avoir le privilège DBA :

SELECT a.ksppinm Parametre,


c.ksppstvl Valeur
FROM x$ksppi a,
x$ksppcv b,
x$ksppsv c
WHERE a.indx = b.indx
AND a.indx = c.indx
AND a.ksppinm LIKE '/_%' escape '/' ;

Normalement, les paramètres cachés commencent par un underscore ('_'), et dans la 10g, on a en plus les paramètres
cachés qui commencent par deux underscore ('__').
Attention :
la modification de certains paramètres cachés peuvent corrompre votre base. Il faut les utiliser avec précautions !

- 91 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils

- 92 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > Rman

- 93 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > Exp/Imp


Comment faire un import/export entre deux bases dans des versions différentes ?
Auteurs : lalystar ,
Si vous souhaitez exporter le contenu d'une base 8i pour l'importer dans une base 9i par exemple, il s'agit d'utiliser les
versions adaptées des utilitaires import et export.
La règle est d'utiliser l'utilitaire import dans la version de la base de destination et l'utilitaire export dans la version
de la base la plus ancienne.
Avec notre exemple, l'export doit être fait avec l'utilitaire export dans sa version 8i et l'import doit être fait avec
l'utilitaire import dans sa version 9i.
Pour plus d'informations, voir le lien ci dessous :

lien : http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96652/ch01.htm#1012993

- 94 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > Dba Studio & OEM

- 95 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > SQL*Plus


Comment sauvegarder mon affichage SQL dans un fichier ?
Auteurs : Helyos ,
Il peut parfois être utile de sauvegarder le résultat de la requête dans un fichier texte sur le disque dur. Pour cela
SQL*Plus nous offre la possibilité d'utiliser la commande SPOOL qui fonctionne comme dans l'exemple suivant :

-- On demande à rediriger l'affichage vers le fichier c:\toto.txt


SPOOL c:\toto.txt
-- On execute notre requete
SELECT SYSDATE FROM DUAL;
-- On stoppe la redirection
SPOOL OFF

Voici le contenu de notre fichier :

SQL> SELECT sysdate


2 FROM dual;

SYSDATE
--------
28/06/04

SQL> SPOOL OFF

On pourra facilement supprimer les premières et dernières lignes grâce aux commandes de formatages de SQL*Plus.
On peut préciser que jusqu'à la version 9i incluse, le fichier est écrasé s'il existe déjà. En 10g, les options CREATE/
REPLACE/APPEND apportent un choix en la matière.

Comment insérer du texte contenant '&' ?


Auteurs : Fred_D ,
& est un caractère spécial qui permet de préfixer un nom de variable. Or, lorsque l'on veut insérer du texte contenant
ce caractère, SQL*Plus demande une valeur à insérer.
Par exemple :

SQL> select 'toi & moi' from dual;


Entrez une valeur pour moi :
ancien 1 : select 'toi & moi' from dual
nouveau 1 : select 'toi ' from dual

'TOI
----
toi

Pour éviter ce désagrément il suffit de taper :

SET DEFINE OFF

Ainsi on obtient :

- 96 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

SQL > set define off


SQL > select 'toi & moi' from dual;

'TOI&MOI'
---------
toi & moi

Comment éviter de voir les lignes de remplacement d'une variable ?


Auteurs : Fred_D ,
Lorsque l'on utilise des variables SQL*Plus de la forme &nom_variable et que l'on exécute la requête, Oracle rappelle
quelle valeur est remplacée de la manière suivante :

SQL > select '&texte_a_afficher' from dual;


Entrez une valeur pour texte_a_afficher : Bonjour Developpez.com
ancien 1 : select '&texte_a_afficher' from dual
nouveau 1 : select 'Bonjour Developpez.com' from dual

'BONJOURDEVELOPPEZ.COM
----------------------
Bonjour Developpez.com

Pour éviter ces lignes disgracieuses dans un log, il faut désactiver la vérification avec la commande suivante :

SET VERIFY OFF

Ainsi on obtient le résultat suivant :

SQL > set verify off


SQL > select '&texte_a_afficher' from dual;
Entrez une valeur pour texte_a_afficher : Bonjour Developpez.com

'BONJOURDEVELOPPEZ.COM
----------------------
Bonjour Developpez.com

- 97 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > Network Manager


Comment diagnostiquer les problèmes de connection NET*8 ?
Auteurs : Jaouad ,
Dans le fichier sqlnet.ora du client, ajouter les lignes suivantes :

#TRACE_LEVEL_CLIENT = SUPPORT
#TRACE_DIRECTORY_CLIENT = d:\oracle\ora92\network\trace
#TRACE_TIMESTAMP_CLIENT = TRUE
#TRACE_UNIQUE_CLIENT = TRUE

Suite à l'activation du mode trace à partir du sqlnet.ora, voici comment rendre plus lisible le fichier généré :

trcasst fichier >> fichier.txt

Comment configurer le mode trace d'un client Oracle à des fins de Debug ?
Auteurs : Laurent Dardenne ,
Certaines configurations du client Oracle peuvent être placées sur un lecteur réseaux, voici comment faire pour la
modifier provisoirement sous réserve de disposer des droits nécessaires.
Ouvrez la base de registre puis sélectionnez la clé :
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ALL_HOMES
La valeur de la sous-clé LASTHOME référence la clé HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
\HOMEnuméro
Par exemple si la sous-clé LASTHOME vaut 1 alors on utilisera la sous-clé HKEY_LOCAL_MACHINE\SOFTWARE
\ORACLE\HOME1
Sélectionnez la clé HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME1, la sous-clé TNS_ADMIN contient le
nom du répertoire hébergeant les fichiers sqlnet.ora et tnsnames.ora.
Mémorisez ce nom de répertoire.
Créez un répertoire (par exemple C:\config-oracle) et recopiez-y les 2 fichiers sqlnet.ora et tnsnames.ora hébergés dans
le répertoire pointé par la sous-clé TNS_ADMIN.
Placez-vous dans le répertoire nouvellement créé puis modifiez, à l'aide d'un éditeur, le fichier sqlnet.ora comme ci-
dessous :
Placez en commentaire l'ancienne configuration du mode Trace
#TRACE_LEVEL_CLIENT = OFF
Ajoutez ces 2 lignes :
TRACE_LEVEL_CLIENT=SUPPORT
TRACE_DIRECTORY_CLIENT=C:\config-oracle
La valeur de l'entrée TRACE_DIRECTORY_CLIENT contient le répertoire précédemment créé et indique où placer
les fichiers trace.
La valeur de l'entrée TRACE_LEVEL_CLIENT indique le niveau de trace souhaité, seul SUPPORT permet d'avoir
un compte rendu détaillé sur les requêtes SQL (en émission et en réception).
Enfin sélectionnez la clé HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME1 et modifiez le contenu de la
sous-clé TNS_ADMIN avec le nom du répertoire précédemment créé.
En fin de session de Debug replacez, dans la clé HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
\HOME1\TNS_ADMIN, la valeur d'origine.
Le mode trace n'est plus activé, sous réserve que le fichier sqlnet.ora d'origine contenait
TRACE_LEVEL_CLIENT=OFF

- 98 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Attention le fichier trace crée est très verbeux et impacte les performances, veillez donc à ne pas le laisser actif sur les
postes en production !

Comment paramétrer le TAF (Transparent Application Fail Over) ?


Auteurs : Jaouad ,
Regardez cet exemple :

DVP =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = HOST1)(PORT = 1521))
(CONNECT_DATA =
(SID = SID1)
)
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = HOST2)(PORT = 1521))
(CONNECT_DATA =
(SID = SID2)
)
)
)

Lorsque, via notre chaîne de connexion, nous souhaitons nous connecter à la base nommée DVP, Oracle va tout d'abord
essayer de se connecter au SID1 sur le HOST1. Si celui ci ne répond pas, avant de provoquer l'erreur, Oracle va essayer
de se connecter sur le SID2 du Host2.

- 99 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > Outils > Portal


Comment trouver des informations sur l'utilisateur courant ?
Auteurs : Helyos ,
Vous allez être sûrement amené, dans le cours de votre développement sur Portal, à trouver des informations sur
l'utilisateur couramment connecté. Les informations les plus utilisées sont surtout l'id de l'utilisateur connecté, ainsi
que son login, voire la langue qu'il utilise actuellement avec son browser sur le Portal.
Pour cela vous disposez d'un package Portal qui vous permet d'obtenir ces informations très facilement :
PORTAL.WWCTX_API
Ce package dispose d'un grand nombre de fonctions et procédures qui vous permettront de trouver des informations
sur l'utilisateur connecté.
Par exemple vous utiliserez :

-- Pour trouver l'id de l'utilisateur


declare
p_user_id number:=portal.wwctx_api.get_user_id;
begin
htp.prn('Votre id est '||p_user_id);
end;
/

-- Pour trouver le login de l'utilisateur


declare
p_user_name varchar2(30):=portal.wwctx_api.get_user;
begin
htp.prn('Votre login est '||p_user_name);
end;
/

-- Pour trouver la langue utilisée par le browser de l'utilisateur


declare
p_lang varchar2(10):=portal.wwctx_api.get_nls_language;
begin
htp.prn('La langue actuellement utilisée est '||p_user_id);
end;
/

Comment trouver des informations sur un utilisateur précis ?


Auteurs : Helyos ,
Vous allez être sûrement amené, dans le cours de votre développement sur Portal, à trouver des informations sur un
utilisateur lambda. En règle générale vous allez surtout chercher à connaître son id à partir de son login ou inversement.
Pour cela vous disposez d'un package Portal qui vous permet d'obtenir ces informations très facilement :
PORTAL.WWSEC_API
Ce package dispose d'un grand nombre de fonctions et procédures qui vous permettront de trouver des informations
sur les utilisateurs.
Par exemple vous utiliserez :

-- Pour trouver l'id de l'utilisateur


declare
p_user_name varchar2(30):='HELYOS';
p_user_id number:=portal.wwsec_api.id(upper(p_user_name));
begin
htp.prn('L''id de l''utilisateur '||p_user_name||' est '||p_user_id);
end;
/

- 100 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

-- Pour trouver le login de l'utilisateur


declare
p_user_id number:='2003';
p_user_name varchar2(30):=portal.wwsec_api.user_name(p_user_id);
begin
htp.prn('Le login correspondant à l''id '||p_user_id||' est ' || p_user_name );
end;
/

Comment afficher correctement un CLOB avec le package HTP ?


Auteurs : Helyos ,
Le package htp est soumis à certaines limitations induites par le mod_plsql. En effet les procédures d'affichage (htp.p,
htp.prn, htp.pint) ne supportent pas le fait d'afficher des chaines de caractères de taille supérieure à 32767 caractères).
Le résultat de cette limitation est l'affichage du CLOB en question sous forme de caractères incompréhensibles.
Voici une procédure vous permettant de contourner la limitation :

CREATE OR REPLACE PROCEDURE write_clob(p_clob CLOB) IS


v_buffer VARCHAR2(32000);
v_offset PLS_INTEGER DEFAULT 1;
v_taille PLS_INTEGER;
v_longueur PLS_INTEGER;
v_chunk PLS_INTEGER;
v_clob CLOB := p_clob;
BEGIN
v_chunk := dbms_lob.getchunksize(v_clob);
v_longueur := dbms_lob.getlength(v_clob);
WHILE v_offset < v_longueur LOOP
IF v_longueur - (v_offset - 1) > v_chunk THEN
v_taille := v_chunk;
ELSE
v_taille := v_longueur - (v_offset - 1);
END IF;
v_buffer := NULL;
dbms_lob.READ(v_clob, v_taille, v_offset, v_buffer);
htp.prn(v_buffer);
v_offset := v_offset + v_taille;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
htp.print(SQLERRM);
END;

- 101 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > ERP

- 102 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > ERP > Peoplesoft


Qu'est-ce que PeopleSoft ?
Auteurs : Jaouad ,
PeopleSoft est un éditeur d'ERP, il édite des solutions "prêtes à l'emploi" pour divers domaines : Ressources Humaines,
Finance, CRM , Paye ...
Découvrez PeopleSoft : PeopleSoft Overview
Découvrez les ERP : Administration des ERP

- 103 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > ERP > Peoplesoft > Administration


Comment déterminer les traitements, la description et leur statuts sous la console de traitement ?
Auteurs : Jaouad ,
Grâce à la requête suivante :

SQL> SELECT a.prcsinstance, a.servernamerqst, a.PRCSNAME, b.descr, begindttm, enddttm, XLATLONGNAME


2 FROM PSPRCSRQST a, PS_PRCSDEFNLANG b, PSXLATITEM c
3 WHERE a.PRCSNAME = b.prcsname
4 AND fieldvalue = runstatus
5 AND fieldname = 'RUNSTATUS'
6 ORDER BY 2 DESC ;

PRCSINSTANCE SERVERNA PRCSNAME DESCR BEGINDTTM ENDDTTM XLATLONGNAME


------------ -------- ------------ ------------------------------ --------- --------- --------------
223321 PSUNX BICURCNV Conversion Devise Facturation 25-SEP-06 25-SEP-06 Success

Dans les version inférieur (8.43) , il faut remplacer PS_XLATITEM par PS_XLATTABLE
Il est également impératif de tenir compte de la langue si il y a plusieurs langues d'installées

Comment voir les différents projets qui ont été installés et migrés sur une base ?
Auteurs : Jaouad ,
Grâce à la requête suivante :

SQL> select * from PSPROJECTDEFN ;

PROJECTNAME VERSION PROJECTDESCR TGTSERVERNAME TGTDBNAM TGTOPRID

--------------- ---------- ------------------------- ------------------- -------- --------


CFO_PORTAL 1 CFO Portal Pagelets

Comment savoir quels sont la release et les modules installés ?


Auteurs : Jaouad ,
Grâce à la requête suivante :

SQL> select * from psrelease ;

RELEASEDT RELEASELABEL
--------- --------------------------------------------------
01-JAN-00 Core 6.00.00.000
09-SEP-97 Core 7.00.00.000
10-SEP-97 Core 7.01.00.000
11-SEP-97 Core 7.02.00.000
09-MAY-98 Core 7.50.00.000
10-MAY-98 Core 7.51.00.000
11-MAY-98 Core 7.52.00.000
12-MAY-98 Core 7.53.00.000
17-AUG-00 Financials/SCM 8.00.00.000
30-NOV-00 Financials/SCM 8.00.01.000

- 104 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

07-JUN-01 Financials/SCM 8.00.02.000


07-MAR-02 Financials/SCM 8.40.00.000
15-FEB-04 Financials/SCM 8.40.00.000
15-FEB-04 Financials/SCM 8.40.01.000

14 ligne(s) sélectionnée(s).

Comment connaître les définitions des process Scheduler ?


Auteurs : Jaouad ,
Grâce à la requête suivante :

SQL> SELECT a.servername, SRVRHOSTNAME host_name, XLATLONGNAME statut,


2 PRCSDISKSPACE espace_disque, sleeptime temps_veille, heartbeat Rythme
3 FROM PSSERVERSTAT a, PSXLATITEM b , PS_SERVERDEFN c
4 WHERE fieldname = 'SERVERSTATUS'
5 AND serverstatus = fieldvalue
6 AND a.servername = c.servername;

SERVERNA HOST_NAME STATUT ESPACE_DISQUE TEMPS_VEILLE RYTHME


-------- -------------------- ---------- ------------- ------------ ----------
PSUNX sproerp21 Running 6426 15 60
PSNT SPROERP16 Running 3561 15 60

Comment voir la définition des traitements ?


Auteurs : Jaouad ,
Grâce à la requête suivante :

SQL> col descrlong format a50


SQL> set linesize 250
SQL> SELECT * FROM PS_PRCSDEFNLANG
2 WHERE language_cd ='FRA' ;

PRCSTYPE PRCSNAME LAN DESCR DESCRLONG


------------------------------ ------------ --- -------------------- ---------------------
Application Engine 1099_RPT_PST FRA 1099_RPT_PST Prépare les données 1099
Application Engine AEBDASSTITEM FRA AEBDASSTITEM Alimente le Catalogue Immos

Ici, on suppose que la langue installée est le francais.

Comment lister les run control des différents AE ?


Auteurs : Jaouad ,
La requête suivante permet de voir les contrôle d'éxcution en fonction des AE ( Application Engine ) :

SQL> SELECT process_instance, oprid, run_cntl_id, ae_applid


2 FROM PS_AERUNCONTROL;

PROCESS_INSTANCE OPRID RUN_CNTL_ID AE_APPLID


---------------- ------------------------------ ------------------------------ ------------

- 105 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

11178 JHY ARUPDATE_TT_ENTITES_ANT AR_UPDATE


25285 APE Psoft_Access B2_OMC140

Comment lister les run control par Oprid ?


Auteurs : Jaouad ,
Ceci permet de déterminer pour tout utilisateur ( Oprid ) les contrôle d'exécution (Run contrôle ). Les contrôle
d'exécution permettre de stocker les différents paramètres d'un traitement et de ne pas avoir à les re saisir si on relance
le traitement.

SQL> SELECT *
2 FROM PS_PRCSRUNCNTL
3 WHERE oprid = 'KBN' ;

OPRID RUN_CNTL_ID LAN L


------------------------------ ------------------------------ --- -
KBN KBN FRA O
KBN KBN_AM FRA O
KBN KBN_AP FRA O

Comment connaître le déroulement d'un traitement ?


Auteurs : Jaouad ,
La requête suivante permet de savoir à quelle étape se trouve le traitement, et si celui-ci est en echec ou en succès :

SQL> SELECT *
2 FROM PS_PMN_PRCSLIST ;

SEQUENCENO PRCSINSTANCE JOBINSTANCE PRCSJOBSEQ PRCSTYPE PRCSNAME RUNCNTLID R R SERVER


---------- ------------ ----------- ---------- ------------ -------------------- - - ------
227561 227561 0 0 COBOL SQL FSPGJGEN gen 2 0 PSUNX

Comment connaître la fréquence d'un traitement ?


Auteurs : Jaouad ,
Voici comment voir la fréquence des traitements qui sont schedulés, notamment pour la maintenance ou
l'administration : c'est le cas par exemple des traitements de purge : "Daily purge"

SQL> SELECT *
2 FROM ps_prcsrecur ;

RECURTYPE RECURNAME VERSION DAYOFMONTH RUN1STWEEK RUN2NDWEEK RUN3RDWEEK RUN4THWEEK RUN5THWEEK


---------- ---------- -------- ---------- ---------- ---------- ---------- ---------- ----------

- 106 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

2 Daily 1 0 1 2 3 4 5

Comment lister les séquence système PS ?


Auteurs : Jaouad ,
Utile notamment pour la séquence servant à affecter le PRCSINSTANCE (identificateur unique des traitements) :

SQL> SELECT *
2 FROM PS_PRCSSEQUENCE ;

PR SEQUENCENO MIN_SEQ_NBR MAX_SEQ_NBR


-- ---------- ----------- -----------
0 227564 1 9999999
1 121544 1 9999999
2 122265 1 9999999
3 43007 1 9999999
4 7 1 9999999

Comment lister les rapports générés ainsi que leurs types et leurs emplacements ?
Auteurs : Jaouad ,
Grâce à cette requête, nous allons pouvoir allez chercher directement les rapports lorsqu'il ne sont pas disponibles via
la consôle des traitements :

SQL> SELECT a.prcsinstance, a.prcsname, a.prcstype, a.PRCSOUTPUTDIR, b.xlatlongname


2 FROM PS_CDM_LIST a, PSXLATITEM b
3 WHERE a.outdestformat = b.fieldvalue
4 AND b.fieldname = 'OUTDESTFORMAT';

PRCSINSTANCE PRCSNAME PRCSTYPE PRCSOUTPUTDIR

------------ ------------ -------------------- ------------------------------------------


227399 BF_GL001 SQR Process
/psoftsp1/appserv/prcs/INT/log_output/SQR_BF_GL001_227399

Comment démarrer une session en 4/3 en mode trace ?


Auteurs : Jaouad ,
Il est parfois important de tracer une session en transactionel, pour connaitre notamment les ralentissements.
Dans l'url de connexion, il faut ajouter à la fin "&trace=y"
par exemple :

http://serveur/psp/DOMAINE/EMPLOYEE/ERP/?cmd=login&languageCd=FRA&trace=y

Le fichier trace est généré dans :

$PS_HOME/appserv/DOMAINE/LOGS/

- 107 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

et se décompose ainsi :

OPRID_NomPoste.tracesql

Comment déterminer la version des Tools ?


Auteurs : Jaouad ,
La version des tools peut être déterminée précisément grâce à la commande suivante :

sproerp17-psoft84: /psoftsp1/appserv>psadmin -v
Version 8.46.06

Cette commande doit être lancé avec l'utilisateur système PSOFT et dans le répertoire suivant :
$PS_HOME/appserv

Comment connaître toutes les installations sur PeopleSoft ?


Auteurs : Jaouad ,
La requête suivante permet de lister toutes les installations de Hotfix, Bundles, patch ...

SQL> SELECT * FROM PS_MAINTENANCE_LOG;

UPDATE_ID DESCR DTTM_IMPO FIXOPRID APPLYOPRID PRODUCT_LI RELEASEDT


RELEASELABEL MAIN DESCRLONG
----------- -------------------------- --------- ---------- ------------ ---------- --------- ------------------
500787001 PRJ102547 /7-22-02 /C305 21-JUL-03 PPLSOFT GLT 26-JUN-02
Financials/SCM 8.40.00.304 Financials Asset Management Bundle #1

- 108 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/
FAQ Oracle

Sommaire > ERP > Peoplesoft > Sécurité


Quels sont les différents utilisateurs ainsi que les rôles qui leur sont affectés ?
Auteurs : Jaouad ,
La requête suivante nous donne les rôles affectés à un USER ou OPRID

SQL> SELECT * FROM PSROLEUSER ;

ROLEUSER ROLENAME D
--------------- ------------------- -
AMA1 AM_SS_EMPLOYEE N
AMA1 ANALYST N
AMA1 PAPP_USER N
AMA1 PeopleSoft User N

Et celle ci les différents User ou OPRID :

SQL> SELECT * FROM PSOPRDEFN

OPRID VERSION OPRDEFNDESC EMPLID EMAILID

------------- ---------- --------------- ----------- ---------------


AMA1 2009 Toto,tata IXHEEE120 peoplesoft@peoplesoft.com

- 109 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://oracle.developpez.com/faq/

S-ar putea să vă placă și