FAQ_Oracle.pdf

Embed Size (px)

Citation preview

  • FAQ Oracle

    Date de publication : 18/09/2006

    Dernire mise jour : 04/01/2009

    Cette F.A.Q. a t ralise partir des questions frquemment poses sur le forumOracle de www.developpez.com et de l'exprience personnelle des auteurs. Elle pourratraiter de tout type de questions portant sur les technologies Oracle.Nous esprons que cette F.A.Q. saura rpondre un maximum de vos questions. Nousvous 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/) - LaurentDardenne (http://laurent-dardenne.developpez.com/) -Xavier Vlieghe (http://xo.developpez.com) - LaurentSchneider (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

    - 3 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    1. Forum Oracle (5) ....................................................................................................................................................................... 42. Gnral (4) ................................................................................................................................................................................. 63. Dveloppement (36) .................................................................................................................................................................. 8

    3.1. SQL (18) ........................................................................................................................................................................... 93.2. PL/SQL (18) ................................................................................................................................................................... 30

    4. Administration (67) ..................................................................................................................................................................464.1. Les Tables (6) .................................................................................................................................................................474.2. Les Utilisateurs (4) ......................................................................................................................................................... 524.3. Scurit (7) ......................................................................................................................................................................574.4. Les Tablespaces et autres fichiers (16) .......................................................................................................................... 624.5. Systme (14) ................................................................................................................................................................... 704.6. Objets (5) ........................................................................................................................................................................ 764.7. Archive Log (3) .............................................................................................................................................................. 804.8. ISqlPlus (10g) (3) ........................................................................................................................................................... 824.9. Autres (9) ........................................................................................................................................................................ 84

    5. Outils (10) ................................................................................................................................................................................925.1. Rman (0) ......................................................................................................................................................................... 935.2. Exp/Imp (1) .....................................................................................................................................................................945.3. Dba Studio & OEM (0) ..................................................................................................................................................955.4. SQL*Plus (3) .................................................................................................................................................................. 965.5. Network Manager (3) ..................................................................................................................................................... 985.6. Portal (3) ....................................................................................................................................................................... 100

    6. ERP (16) ................................................................................................................................................................................ 1026.1. Peoplesoft (16) ..............................................................................................................................................................103

    6.1.1. Administration (14) ..............................................................................................................................................1046.1.2. Scurit (1) ...........................................................................................................................................................109

  • FAQ Oracle

    - 4 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Sommaire > Forum Oracle

    Guide de bon usage de la FAQ et du ForumAuteurs : Helyos ,Lorsque vous vous trouvez devant un problme, 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 rponse votre question : vous pouvez, aprs avoir lu les Rgles du forum

    poster une question prcise avec un titre clair et vous enrichirez ainsi le forum Oracle.

    Comment mettre le tag [Rsolu] ?Auteurs : Helyos ,Il n'est plus ncessaire et mme deconseill d'diter son premier post pour mettre le tag [Rsolu]. En bas gauche vousavez un bouton qui se charge de mettre le tag. Par contre il est conseill d'diter et de mettre un titre clair quand cen'est pas le cas.

    Que signifie le tag [Dlestage] ?Auteurs : Helyos ,La base de donnes du forum n'est pas extensible indfiniment. Nous devons "nettoyer les forums" pour que la base nedevienne pas trop grosse, ceci entrainerait une chute des performances pour tous les utilisateurs. Pour faciliter ce travailun Tag [Dlestage] est mis sur les threads supprimer. Pour quelles raisons les messages sont marqus [Dlestage] : La rponse la question se trouve dans un tutoriel, dans la FAQ ou dans l'aide. La rponse a dj t donne sur le forum. Le titre n'est pas assez prcis. La question est mal pose.

    D'ailleurs vous pouvez, si vous tes l'auteur du message initial, marquer le fil de discussion pour [Dlestage]. Ce faisant,vous amliorerez la lisibilit du forum, vous faciliterez le travail des modrateurs (ils sont bnvoles et ils ont plein dechoses plus passionnantes faire, comme rpondre une question qui n'a pas dj t pose).

    Comment obtenir une bonne rponse ?Auteurs : Helyos ,En posant de meilleures questions !Votre question sera lue par un grand nombre de personnes, faites l'effort de rdiger une question claire et prcise,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 habitus du forum saurontvite si vous avez bien cherch ou pas. Ne soyez pas press, les personnes qui vous rpondent sont des bnvoles qui vousconsacrent du temps, soyez-en reconnaissant. Rappelez-vous toujours qu'elles ne vous doivent rien.

  • FAQ Oracle

    - 5 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Afin de les aider trouver une solution plus rapidement, pensez prciser la version de votre base de donnes, l'utilitaireutilis, le code utilis et les erreurs que vous avez obtenues.

    Que signifie le tag [FAQ] ?Auteurs : Helyos ,Afin de faciliter les recherches sur des thmes rcurrents, l'quipe Oracle mis en place cette FAQ. Les membres del'quipe passent donc rgulirement sur le forum afin d'identifier les questions qui reviennent de manire rpte sur leforum. Une fois la question identifie, on lui assigne le tag [FAQ] afin de l'ajouter le plus rapidement possible la FAQ.

  • FAQ Oracle

    - 6 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Sommaire > Gnral

    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 rpertoire :

    %ORACLE_HOME\admin\%ORACLE_SID%\pfile

    Il existe aussi un fichier init{SID}.ora dans le repertoire %ORACLE_HOME%\dbs mais en rgle gnrale ce fichiercontient juste un paramtre IFILE qui redirige vers le fichier donn au dbut.

    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 rpertoire d'installation de votreOracle. Par exemple si vous avez install par dfaut une Oracle 9i votre %ORACLE_HOME% correspondra c:\oracle\ora92.

    -- Sous WindowsSET ORACLE_HOME=c:\oracle\ora92

    --Sous Linux en BASHexport ORACLE_HOME=/home/oracle/OraHome1

    --Sous Linux en C Shellsetenv 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 voussouhaitez vous connecter. Par exemple si vous avez 2 instances actuellement en cours d'utilisation sur votre serveurTOTO et TATA, et que vous souhaitez vous connecter TATA, il vous faudra alors positionner cette variabled'environnement TATA.

    -- Sous WindowsSET ORACLE_SID=TATA

    --Sous Linux en BASHexport ORACLE_SID=TATA

    --Sous Linux en C Shellsetenv ORACLE_SID

  • FAQ Oracle

    - 7 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    TATA

    Combien cote la license Oracle ? Est-ce gratuit ?Auteurs : Fred_D ,

    Tous les produits dits par Oracle sont disponibles en version complte et gratuitement sur leur site detlchargement.Nanmoins, seul SQL Developper est gratuit quelles que soient les circonstances. En effet, les autres produits ne sontdisponibles gratuitement qu' des fins de tests du produit (hors de question de l'utiliser pour tester des dveloppements,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 dpend de trop nombreux paramtrespour pouvoir tre dtaille ici . Je vous invite donc aller directement sur le site de vente en ligne Oracle Store pourvous faire une ide. videmment, il est important de vrifier et/ou discuter des conditions tarifaires avec un commercialOracle.A noter galement qu'Oracle propose une distribution entirement gratuite et professionnelle sous l'appellationd'Oracle Database 10g Express Edition. Cette version limite intgre la base de donnes en version 10g, le dveloppementd'une application ainsi que du reporting.

  • FAQ Oracle

    - 8 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Sommaire > Dveloppement

  • FAQ Oracle

    - 9 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Sommaire > Dveloppement > SQLComment filtrer les n premires lignes d'une requte avec ROWNUM ?

    Auteurs : SheikYerbouti , Obtenir les 10 premires lignes d'une requte non trie :

    SELECT * FROM EMP WHERE ROWNUM

  • FAQ Oracle

    - 10 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 aprs que le ROWNUM ait t affect aux lignes retournes par la requte.Il faut donc trier les donnes avant qu'Oracle ne leur affecte un numro !Ceci est ralis par un tri inclus dans une sous-requte :

    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 rsultat attendu.

    Comment slectionner du m-ime au n-ime enregistrements ?Auteurs : Fred_D ,Voici une mthode pour filtrer la liste des enregistrements sur des intervalles conscutifs 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;

  • FAQ Oracle

    - 11 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    de la m-ime la n-ime 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 trs similaire au ROWNUM utilisdans le paragraphe prcdent mais est appliqu sur le rsultat de la requte et pas pendant l'excution de la requteelle-mme.Avec ROWNUM, la requte prcdente 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 requtes et ventuellement amliorer leurs performances.

    Comment dtecter et supprimer les doublons ?Auteurs : lalystar ,Supposons qu'on ait une table PERSONNE (nom, prenom, telephone) et qu'on souhaite avoir la liste des personnesayant le mme nom et le mme prnom. On peut l'obtenir avec la requte suivante :

    select nom, prenomfrom PERSONNEgroup by nom, prenomhaving count(*) > 1;

    Si on ne veut garder qu'une seule ligne pour chaque ensemble de personnes ayant le mme nom et le mme prnom, lechoix se faisant de manire arbitraire, on peut utiliser la requte suivante :

    delete PERSONNE awhere rowid > (select min(rowid)from PERSONNE bwhere b.nom = a.nom andb.prenom = a.prenom);

    Remarque :- cette requte doit tre adapte si l'une des colonnes nom ou prnom peut tre nulle.- cette requte garde la ligne de rowid minimum parmi l'ensemble des lignes ayant mme nom et mme prnom.

  • FAQ Oracle

    - 12 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    lien : Comment slectionner du m-ime au n-ime enregistrements ?

    Comment dtecter les enregistrements empchant la validation d'une contrainte ?Auteurs : Jaouad , l'aide de la table des exceptions : elle peut se crer 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 valeuresinsert 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 crer 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) - cls en double trouves

    La requte suivante nous permet d'identifier les lignes posant problme :

    Retrouver toutes les valeurs en doubles

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

    A B---------- ----------

    a 1b 2a 5b 8

  • FAQ Oracle

    - 13 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Retrouver toutes les valeurs en doublesa 9

    Comment supprimer/remplacer des caractres avec la fonction TRANSLATE ?Auteurs : SheikYerbouti ,Cette fonction permet d'effectuer plusieurs remplacements d'un coup ( l'inverse de REPLACE() qui ne permet leremplacement que d'un caractre ou une chane la fois) :TRANSLATE( chane en entre, chane de recherche, chane de substitution ) ; Exemple de suppression de caractres indsirables 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 chane en entre,Le deuxime indique la chane de recherche,Le troisime indique la substitution caractre par caractre,En clair, le premier caractre de la chane de recherche trouv dans la chane en entre sera remplac par le premiercaractre de la chane de substitution et ainsi de suite pour les autres caractres.La ruse dans l'exemple est le premier caractre '1' dans les deux derniers arguments. On dit qu'il s'agit d'un caractreleurre, pusiqu'il sert ignorer tous les caractres de la chane en entre qui ne sont pas dans la chane de recherche.La fonction remplace tous les '1' par '1' et tous les autres caractres de la chane de recherche trouvs dans la chaneen entre par rien !

    Exemple de remplacement de caractres indsirables 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 caractres de la chane de recherche par le caractre '_'. Autre exemple de remplacement de caractres indsirables :

    SQL> SELECT TRANSLATE ( '', '', 'aaaeeeeuuuo' ) "Chaine" 2 FROM DUAL ;

    Chaine -----------

    aaaeeeeuuuo

    SQL>

    La fonction remplace toutes les minuscules accentues par leurs quivalents non accentus.Bien videment, les arguments de la fonction peuvent tre des variables :

  • FAQ Oracle

    - 14 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 entire et dcimale d'un numrique avec la fonction TRUNC ?Auteurs : SheikYerbouti ,TRUNC( valeur, prcision ) ;Cette fonction permet d'effectuer deux types d'action (sur un numrique) : Conserver le nombre de dcimales souhaites (prcision >= 0) Cadrer la partie entire d'un nombre dans une tranche (prcision < 0)

    Exemple de conservation des dcimales 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 entire et dcimale d'un nombre :

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

  • FAQ Oracle

    - 15 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Procdure PL/SQL termine avec succs.

    Comment tronquer une date avec la fonction TRUNC ?Auteurs : SheikYerbouti ,La fonction TRUNC() applique une date ne permet pas seulement l'ablation de la partie horaire.Nous connaissons tous cette fonction qui, sans spcification de son deuxime argument, retire la partie horaire.Mais nous connaissons souvent moins l'autre particularit de cette fonction applique aux dates, par l'intermdiairedu 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 modifie.

    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 tronque au 1er jour de l'anne -- SQL> SELECT TRUNC(SYSDATE, 'YEAR') "'YEAR'" FROM DUAL;

    'YEAR' -------------------

    01/01/2004 00:00:00

    SQL> SQL> -- date tronque au 1er jour de l'anne ISO-- SQL> SELECT TRUNC(SYSDATE, 'IYYY') "'IYYY'" FROM DUAL;

    'IYYY' -------------------

    29/12/2003 00:00:00

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

    'Q' -------------------

    01/10/2004 00:00:00

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

    'MONTH' -------------------

    01/10/2004 00:00:00

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

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

  • FAQ Oracle

    - 16 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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'anne -- 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'anne ISO -- SQL> SELECT TRUNC(SYSDATE, 'IW') "'IW'" FROM DUAL;

    'IW' -------------------

    04/10/2004 00:00:00

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

    'DD' -------------------

    08/10/2004 00:00:00

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

    'HH' -------------------

    08/10/2004 14:00:00

    SQL> SQL> -- date tronque 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 diffrents formats de date disponible. - / , . ; : "text" : Ponctuation ou texte insrer dans la chane finale. AD A.D. : Pour ajouter les sigles aprs Jsus Christ AM A.M. : Symbole Am BC B.C. : Pour ajouter les sigles avant Jsus Christ CC SCC : Pour obtenir le n du sicle 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 paramtres NLS.

  • FAQ Oracle

    - 17 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    DAY : Nom du jour (compens avec des espaces jusqu' 9 caractres) DD : Le numro du jour dans le mois (de 1 31) DDD : Le numro du jour dans l'anne (de 1 366) DY: Abrviation du nom du jour E : Abrviation 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: Numro de la semaine dans l'anne (de 1 52 ou 53 en fonction de l'anne) IYY IY I : Les 3, 2 ou 1 derniers chiffres de l'anne IYYY : Les 4 chiffres de l'anne J: Nombre de jours depuis la date January 1, 4712 BC MI: Minutes (de 1 59) MM: Numro du mois dans l'anne MON : Abrviation du nom du mois MONTH : Nom du mois (compens avec des espaces jusqu' 9 caractres) PM P.M. : Symbole Pm Q: Numro du trimestre RM: Numro du mois au format romain RR: Les deux derniers chiffres de l'anne (avec prise en compte du sicle en cours) RRRR: Les 4 derniers chiffres de l'anne (avec prise en compte du sicle en cours) SS: Nombre de secondes (de 0 59) SSSSS: Nombre de secondes coules depuis minuit (de 0 86399) W: Numro de la semaine dans le mois (de 1 5) Y,YYY: Numro de l'anne avec une virgule pour dlimiter le millnaire (par exemple 2,004) YEAR : Epellation du numro de l'anne en cours YYYY: Numro de l'anne en cours (sans prise en compte du sicle en cours) YYY YY Y : Les 3, 2 ou 1 derniers chiffres de l'anne

    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 contrle statique de validit des donnes, maiselles sont trs limites. Il faudra alors recourir des dclencheurs pour des validations plus complexes.Une contrainte CHECK ne peut faire rfrence 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 personnalise.Les fonctions standard (comme LENGTH ou UPPER par exemple) sont autorises, condition qu'elles soientdterministes.

  • FAQ Oracle

    - 18 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 systme mal indique dans contrainte CHECK".Pour rsumer, une contrainte CHECK ne peut mettre en jeu que les colonnes de la ligne courante, des constantesventuellement sous forme de listes, et des fonctions standard dterministes.Exemples :

    CHECK (UPPER(titre) IN ('M.', 'MME', 'MLLE'))CHECK ((col1 < col2) OR (col1 = 10))

    Quelle est la diffrence entre les types CHAR et VARCHAR2 ?Auteurs : Jaouad ,Il existe essentiellement une diffrence de place entre ces types de donnes . En effet, VARCHAR2 a une longueurvariable qui dpend directement de la taille de la donne insree alors que CHAR une longueur fixe (dfini la crationde la table ).Prenons l'exemple d'un VARCHAR2 (20)) et CHAR(20), si on insre 'Oracle' dans les deux colonnes, Oracle seratcomplte 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 cre.

    SQL> drop table dvp ;

    Table supprime.

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

    ERREUR la ligne 1 :

  • FAQ Oracle

    - 19 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    ORA-00910: specified length too long for its datatype

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

    Table cre.

    Oracle recommande quand mme l'utilisation de VARCHAR2 au lieu de CHAR pour une raison de compatibilit dansles versions suprieures.Outre l'utilisation supplmentaire de place, l'utilisation de CHAR en lieu et place de VARCHAR2 augmenteragalement la taille de vos index et peut parfois diminuer les performances de recherches de ces derniers !

    Comment dtecter les verrous (locks) ?Auteurs : Jaouad ,Via la requte 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)',

  • FAQ Oracle

    - 20 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 dtecter si une table est verouille :

    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 dfaut ?Auteurs : lalystar , partir d'Oracle 9i, on peut utiliser le mot-cl default pour spcifier la valeur par dfaut 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;

  • FAQ Oracle

    - 21 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 diffrencier NULL et chane vide ?Auteurs : Jaouad , Laurent Schneider ,Comme le montre l'exemple suivant, lors de vos INSERT/UPDATE, Oracle retransforme les chanes vide en valeurnulles, ce qui peut tre gnant fonctionnellement, en particulier pour des applications multi-SGBD.

    jeu d'essaisCREATE 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 ;

  • FAQ Oracle

    - 22 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    '-'||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 caractre ou une chane de susbsitution, afin que votre applicatif puisse grer cesinformations de manire distincte. Le plus simple, si c'est possible, est d'utiliser le caractre espace, ce qui donne, sil'on continue sur l'exemple prcdent :

    SQL> insert into dvp values (' ') ;

    1 ligne cre.

    SQL> commit;

    Validation effectue.

    SQL> select count (*) from dvp ;

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

    4

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

    Attention tout de mme :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 continueto be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

  • FAQ Oracle

    - 23 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Comment insrer ou mettre jour des donnes sans savoirsi les enregistrements correspondants existent dj ?

    Auteurs : Xavier Vlieghe ,Grce 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 correspondanceWHEN MATCHED THEN -- Si Vraie UPDATE SET T1.Meschamps = T2.MeschampsWHEN 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 rfrence (UQ) un libell un prix

    La cl primaire est renseigne l'aide d'une squence.

    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 reoit 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'intgration des nouveaux articles en une seulecommande :

  • FAQ Oracle

    - 24 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 fusionnes.

    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. Youcan 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, andDELETE DML statements.MERGE is a deterministic statement. That is, you cannot update the same row of the target table multiple times in thesame MERGE statement.

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

    Comment empcher l'excution d'une requte non r crite ?Auteurs : Jaouad ,Grce au hint apparue avec la version 10g :

    /*+ REWRITE_OR_ERROR */

    Comment construire une requte rcursive ?Auteurs : Xavier Vlieghe ,Oracle permet de grer le concept de requtes rcursives, l'aide des clauses suivantes : START WITH Champ = {Valeur} : Cette clause permet de prciser le(s) noeud(s) de l'arborescence partir

    duquel ou desquels on souhaite lister les lments, 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 connatre le niveau de chaqueenregistrement.En voici un exemple, grce une table Catgorie comprenant les champs suivants : Une Cl (Id)

  • FAQ Oracle

    - 25 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Un Libell (Libe) La cl de la catgorie parent (Id_Parent)

    CREATE TABLE Categorie (Id NUMBER (4),Libe VARCHAR2 (16),Id_Parent NUMBER (4));

    -- Les cls sont attribues de manire hirarchique pour plus de clart, ce qui est bien entendu rarement le cas dans la ralit ...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 Dessine', 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, 'Bire' , 213);INSERT INTO Categorie VALUES (2133, 'Apritif' , 213);INSERT INTO Categorie VALUES ( 22, 'Conserve' , 2);INSERT INTO Categorie VALUES ( 23, 'Frais' , 2);

    COMMIT;

    Voici la liste des catgories dpendant de la catgorie 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 Dessine 2 1

    7 ligne(s) slectionne(s).

    A partir de la 9i, vous pouvez galement utilisez la fonction SYS_CONNECT_BY_PATH (Champ, sparateur), quipermet de concatner les diffrents valeurs du champ spcifi pour connatre le chemin entre l'lment concern et leneod 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

  • FAQ Oracle

    - 26 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    -Alimentaire-Boisson-Alimentaire-Boisson-Alcool-Alimentaire-Boisson-Jus de fruits-Alimentaire-Boisson-Alcool-Alimentaire-Boisson-Alcool-Vins-Alimentaire-Boisson-Alcool-Bire-Alimentaire-Boisson-Alcool-Apritif-Alimentaire-Conserve-Alimentaire-Frais

    10 ligne(s) slectionne(s).

    Quels sont les raccourcis sous SQL*PlusAuteurs : Pomalaix , Jaouad , Fred_D ,@ dsigne la variable ORACLE_SID courante. Est valable dans les scripts SQL, dans divers paramtres de l'INIT.ORA,dans des scripts RMAN notamment.? dsigne la variable ORACLE_HOME courante. Est valable dans les scripts SQL, dans divers paramtres del'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 dsigner une variable SQL*Plusstart et @ permet de lancer un scriptdefine permet de dfinir une variable sous Sql*Plus , sans argument elle donne toutes les variables dja dfini& permet de dfinir une variable, && permet de la dfinir une fois pour toute et pour toute la session.ed permet de lancer le bufferl permet de voir sans l'executer le dernier ordre SQLr permet de voir et executer le dernier ordre SQLc: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 : caractre utilis pour la substitution des variables (par dfaut "&")

    syntaxe :

    -- gre les caractres de substitutionSET define ON-- les caractres de substitutions ne sont pas grsSET define off-- le caractre de substition est @SET define @

    linesize : nombre de caractres par lignes

    NB : la ligne est complte par des espaces pour atteindre ce nombre de caractres.syntaxe :

    -- mets le nom de caractre par ligne 130

  • FAQ Oracle

    - 27 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    SET linesize 130

    numformat : format par dfaut des numriques l'affichage.

    syntaxe :

    SET numformat 999G999D99

    numwidth : largeur par dfaut des numriques

    syntaxe :

    SET numwidth 8

    pagesize : nombre de lignes de dtail (entte nom compris)

    syntaxe :

    SET pagesize 60

    scan : contrle la prsence de variables de substitution

    syntaxe :

    -- contrle la prsence de variables de substitionsSET scan ON-- ne contrle pas la prsence de variables de substitionsSET scan OFF

    tab : utilisation des tabulations

    syntaxe :

    -- utilisation des tabulationsSET tab ON-- non utilisation des tabulationsSET tab OFF

    trimspool : suppression des espaces en fin de lignes

    syntaxe :

    -- supprime les espaces en fin de lignesSET trimspool ON-- laisse les espaces en fin de lignesSET trimspool OFF

    verify : liste la commande avant son excution

  • FAQ Oracle

    - 28 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    syntaxe :

    -- liste la commande avant son excutionSET verify ON-- la commande n'est pas affichee avant son excutionSET verify OFF

    feed : affiche le nombre de lignes affectes par l'ordre SQL

    syntaxe :

    -- affichage du nombre de lignes affectesSET feed ON-- le nombre de lignes affectes n'est pas affichSET feed OFF

    term : affiche le rsultat des commandes d'un script

    syntaxe :

    -- affichage du rsultatSET term ON -- non affichage du rsultatSET term OFF

    heading : affichage de l'entte du rsultat

    syntaxe :

    -- affichage de l'enteteSET heading ON -- non affichage de l'enteteSET 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'excution

    syntaxe :

    -- affichage de la commandeSET echo ON -- non affichage de la commandeSET echo OFF

  • FAQ Oracle

    - 29 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

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

  • FAQ Oracle

    - 30 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Sommaire > Dveloppement > PL/SQLComment obtenir le nombre de lignes impactes par le dernier ordre SQL (DML) ?

    Auteurs : SheikYerbouti ,La variable SQL%ROWCOUNT contient le nombre de lignes impactes par le dernier ordre DML excut.Vous pouvez interroger cette variable aprs 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

  • FAQ Oracle

    - 31 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    Avertissement : Fonction cre 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 dclar

    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 dclar

    DEBUT FUNCTION 2 4 3 PL/SQL: Statement ignored

    Comment compter le nombre d'occurrences dans une chane ?Auteurs : SheikYerbouti ,Comment compter le nombre d'occurrences dans une chane sans l'aide d'une boucle itrative ?En utilisant les fonctions LENGTH() et REPLACE() de la faon suivante :

    CREATE OR REPLACE FUNCTION CPT_OCCURRENCES ( PC$Entree IN VARCHAR2, -- Chane en entre PC$Recherche IN VARCHAR2 -- Chane 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'excution instruction par instruction de vos codes PL/SQL ?Auteurs : SheikYerbouti ,En installant l'outil Oracle : ProfilerVous devez tre connect avec le privilge SYSDBA

  • FAQ Oracle

    - 32 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

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

    -- Installation de l'outil profiler -- --------------------------------------

    connect / as sysdba

    @/rdbms/admin/proftab.sql @/rdbms/admin/profload.sql @/plsql/demo/profrep.sql

    Et en l'excutant sur n'importe quelle fonction ou procdure PL/SQL :

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

    -- Test de la procdure stocke : 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: . - 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 ;

  • FAQ Oracle

    - 33 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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;

    Procdure PL/SQL termine avec succs.

    Comment faire un REPLACE sur un CLOB ?Auteurs : Helyos ,Le package DBMS_LOB ne fournit pas de procdure 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);

  • FAQ Oracle

    - 34 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    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 caractres correspond un nombre ?Auteurs : lalystar ,Plutt que de coder une fonction qui traite tous les cas de figure correspondant aux diffrents formats que peut prendreun nombre (entier, nombre virgule, nombre avec exposant...), il vaut mieux laisser Oracle grer la conversion et noussignaler 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 paramtre 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

  • FAQ Oracle

    - 35 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    1 toto 0

    Comment vrifier si une chaine vrifie un certain format ?Auteurs : lalystar ,Pour vrifier qu'une chaine de caractre vrifie un format donn, on peut utiliser, partir d'Oracle 10g, la fonctionMATCH du OWA_PATTERN qui permet de manipuler des expressions rgulires. Cette fonction retourne un boolenindiquant si le format est vrifi ou pas; elle ne peut donc tre appele qu'en PL/SQL.Par exemple, pour vrifier que les numros de tlphones en base suivent le format franais sur 10 chiffres avec commesparateur des tirets, on peut faire :

    SQL> select * 2 from TELEPHONE;

    TELEPHONE#--------------------------------------------------------------------------------

    07.08.09.02.0207-08-09-02-0201 02 02 02 02TOTO07/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 rgulires peuvent utiliser les symboles suivants : ^ : dbut de la ligne $ : saut de ligne ou fin de ligne \n : saut de ligne . : tout caractres sauf le saut de ligne \t : tabulation \d : chiffre (quivalent [0-9]) \D : tout caractre sauf un chiffre (quivalent [not 0-9]) \w : tout caractre alphanumrique (chiffres, lettres, _) \W : tout caractre sauf un caractre alphanumrique \s : tout espace (espace, tabulation, saut de ligne) \S : tout caractre sauf un espace \b : dlimiteur de mots (entre un caractre qui vrifie \w et un autre qui vrifie \W) \xnn : caractre dont le code ascii est en hexadcimal nn \nnn : caractre dont le code ascii est en octal nnn

    Les lments ci-dessus peuvent tre suivi par les indicateurs de cardinalit suivants : ? : 0 ou 1 occurrence * : 0 ou plus occurrences + : 1 ou plus occurrences

  • FAQ Oracle

    - 36 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

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

    L'expression rgulire qu'on a utilis pour dcrire notre format de numro de tlphone ^ \d{2}-\d{2}-\d{2}-\d{2}-\d{2}$se dcrypte donc de la manire 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 rgulire commence par ^, elle dcrit le dbut de la chaine; comme elle se termine par $,elle dcrit aussi sa fin.

    Ma requte fonctionne sous SQL*Plus mais lorsque j'essaie del'utiliser dans une procdure PL/SQL, celle-ci ne compile pas !

    Auteurs : lalystar ,Sous Oracle 8i, le moteur SQL utilis dans les procdures PL/SQL est diffrent et est en retard sur le moteur SQL utilispour les requtes. Certaines fonctionnalits 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 requte au moteur PL/SQL en utilisant par exempleEXECUTE 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 gnrer un fichier de trace pour une session en cours ?Auteurs : lalystar ,Quand une procdure est en cours d'excution, il est possible de gnrer un fichier de trace (pour exploitation parTkProf par exemple) en utilisant la routine set_sql_trace_in_session du package DBMS_SYSTEM. Les paramtres decette 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

  • FAQ Oracle

    - 37 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

    TRACE: boolen; il faut entrer TRUE pour demander Oracle de gnrer le fichier de trace, et FALSE pourarrter sa gnration

    Vous trouverez plus de dtails dans cet article : Diffrentes faon de tracer l'activit de sessions

    Je n'ai pas de documentation Oracle, ni d'accs Internet,comment puis-je trouver la documentation d'un package Oracle ?

    Auteurs : lalystar ,Pour avoir immdiatement la documentation minimale d'un package Oracle install, on peut utiliser la requte suivantesous 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_outputold 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 bytes.

  • FAQ Oracle

    - 38 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://oracle.developpez.com/faq/

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

    Comment convertir une valeur hexadcimale en valeur dcimale ?Auteurs : SheikYerbouti ,Simplement grce 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 diffrence de temps entre 2 datesen nombre de jours, heures, minutes et secondes ?

    Auteurs : SheikYerbouti ,Grce 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 NUMBERIS 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

  • FAQ Oracle

    - 39 -Les sources prsentes sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sourcesconstitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2007 Developpez LLC. Tout droits rservs Developpez LLC. Aucunereproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de DeveloppezLLC. Sinon vous encourez selon la loi jusqu' 3 ans