pl sql muy bueno

Upload: oscar-rodriguez

Post on 12-Oct-2015

108 views

Category:

Documents


1 download

TRANSCRIPT

  • Oracle PL/SQL

    Par SheikYerbouti

    Date de publication : 1 avril 2004

    Dernire mise jour : 1 juillet 2004

    Dcouvrez le langage procdural d'Oracle

  • Oracle PL/SQL par SheikYerbouti

    - 2 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Introduction...................................................................................................................................................................51 - Le bloc PL/SQL......................................................................................................................................................6

    1.1 - La section dclarative..................................................................................................................................101.2 - La section excution....................................................................................................................................11

    1.2.1 - Assignation.......................................................................................................................................... 111.2.2 - OPEN...................................................................................................................................................121.2.3 - OPEN FOR..........................................................................................................................................121.2.4 - CLOSE.................................................................................................................................................131.2.5 - COMMIT.............................................................................................................................................. 131.2.6 - EXECUTE IMMEDIATE.......................................................................................................................131.2.7 - EXIT.....................................................................................................................................................131.2.8 - FETCH.................................................................................................................................................141.2.9 - FORALL...............................................................................................................................................151.2.10 - GOTO................................................................................................................................................ 151.2.11 - IF........................................................................................................................................................161.2.12 - CASE................................................................................................................................................. 171.2.13 - FOR (curseur)................................................................................................................................... 191.2.14 - FOR, LOOP, WHILE..........................................................................................................................201.2.15 - NULL..................................................................................................................................................221.2.16 - RAISE................................................................................................................................................ 221.2.17 - RETURN............................................................................................................................................221.2.18 - SAVEPOINT...................................................................................................................................... 231.2.19 - ROLLBACK........................................................................................................................................231.2.20 - SELECT INTO...................................................................................................................................241.2.21 - Instruction SQL..................................................................................................................................261.2.22 - Les curseurs explicites......................................................................................................................271.2.23 - Porte des variables......................................................................................................................... 30

    1.3 - La section de gestion des erreurs...............................................................................................................302 - Les variables, types et littraux........................................................................................................................... 36

    2.1 - Les variables................................................................................................................................................362.2 - Types prdfinis...........................................................................................................................................37

    2.2.1 - Types caractres................................................................................................................................. 372.2.2 - Types numriques............................................................................................................................... 382.2.3 - Types pour les grands objets..............................................................................................................382.2.4 - Types supplmentaires....................................................................................................................... 38

    2.3 - Les Types et Sous-types dfinis par l'utilisateur......................................................................................... 402.4 - Les littraux................................................................................................................................................. 41

    2.4.1 - Littral de type caractre.................................................................................................................... 412.4.2 - Littral de type entier.......................................................................................................................... 422.4.3 - Littral de type dcimal.......................................................................................................................422.4.4 - Littral de type intervalle (9i).............................................................................................................. 42

    3 - Les fonctions natives........................................................................................................................................... 443.1 - Les fonctions chanes de caractres...........................................................................................................443.2 - Les fonctions arithmtiques.........................................................................................................................473.3 - Les fonctions de conversion et de transformation...................................................................................... 503.4 - Les fonctions sur les dates......................................................................................................................... 54

    4 - Procdures, Fonctions et paquetages................................................................................................................. 594.1 - Les Procdures............................................................................................................................................594.2 - Les Fonctions.............................................................................................................................................. 634.3 - Les Paquetages...........................................................................................................................................654.4 - Fonctions sur des ensembles de lignes (PIPELINED) (9i)......................................................................... 694.5 - Maintenance des objets procduraux......................................................................................................... 71

    5 - Collections et enregistrements.............................................................................................................................735.1 - Dclarations et initialisation......................................................................................................................... 735.2 - Accs aux lments d'une collection.......................................................................................................... 765.3 - Mthodes associes aux collections........................................................................................................... 785.4 - Utilisation des collections avec les donnes issues de la base..................................................................865.5 - Traitements en masse des collections........................................................................................................ 88

  • Oracle PL/SQL par SheikYerbouti

    - 3 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    5.6 - Les collections et enregistrements en paramtres des procdures et fonctions.........................................946 - Les dclencheurs............................................................................................................................................... 100

    6.1 - Les dclencheurs sur TABLE.................................................................................................................... 1016.2 - Les dclencheurs sur VUE........................................................................................................................1036.3 - Les dclencheurs sur vnements systme ou utilisateur........................................................................104

    6.3.1 - Les attributs.......................................................................................................................................1046.3.2 - Les vnements systme................................................................................................................. 1056.3.3 - Les vnements utilisateur............................................................................................................... 105

    6.4 - Maintenance des dclencheurs.................................................................................................................1057 - Le paquetage DBMS_OUTPUT.........................................................................................................................1078 - Le paquetage UTL_FILE....................................................................................................................................109

    8.1 - Procdures et fonctions du paquetage..................................................................................................... 1098.1.1 - Liste des procdures et fonctions version 8i..........................................................................................1098.1.2 - Liste des procdures et fonctions version 9i..........................................................................................1108.2 - Syntaxe des procdures et fonctions........................................................................................................ 110

    8.2.1 - IS_OPEN........................................................................................................................................... 1108.2.2 - FCLOSE............................................................................................................................................ 1108.2.3 - FCLOSE_ALL.................................................................................................................................... 1108.2.4 - FCOPY.............................................................................................................................................. 1118.2.5 - FOPEN.............................................................................................................................................. 1118.2.6 - FOPEN_NCHAR................................................................................................................................1118.2.7 - FFLUSH.............................................................................................................................................1128.2.8 - FGETATTR........................................................................................................................................ 1128.2.9 - FGETPOS..........................................................................................................................................1128.2.10 - FREMOVE....................................................................................................................................... 1128.2.11 - FRENAME....................................................................................................................................... 1138.2.12 - FSEEK............................................................................................................................................. 1138.2.13 - GET_LINE....................................................................................................................................... 1138.2.14 - GET_LINE_NCHAR.........................................................................................................................1148.2.15 - GET_RAW....................................................................................................................................... 1148.2.16 - NEW_LINE...................................................................................................................................... 1148.2.17 - PUT..................................................................................................................................................1158.2.18 - PUT_NCHAR...................................................................................................................................1158.2.19 - PUT_RAW....................................................................................................................................... 1158.2.20 - PUT_LINE........................................................................................................................................1168.2.21 - PUT_LINE_NCHAR.........................................................................................................................1168.2.22 - PUTF............................................................................................................................................... 1168.2.23 - PUTF_NCHAR.................................................................................................................................116

    8.3 - Exceptions gnres par le paquetage.....................................................................................................1178.3.1 - Exceptions de la version 8i...............................................................................................................1178.3.2 - Exceptions de la version 9i...............................................................................................................117

    8.4 - Exemples concrets.................................................................................................................................... 1179 - Le paquetage DBMS_LOB................................................................................................................................ 124

    9.1 - Procdures et fonctions du paquetage..................................................................................................... 1259.1.1 - Procdures et fonctions des versions 8i et 9i...................................................................................1259.1.2 - Procdures de la version 9i.............................................................................................................. 1259.1.3 - Procdures de la version 10g...........................................................................................................125

    9.2 - Syntaxe des procdures et fonctions........................................................................................................ 1259.2.1 - APPEND............................................................................................................................................ 1259.2.2 - CLOSE...............................................................................................................................................1269.2.3 - COMPARE.........................................................................................................................................1269.2.4 - CONVERTTOBLOB...........................................................................................................................1279.2.5 - CONVERTTOCLOB...........................................................................................................................1289.2.6 - COPY.................................................................................................................................................1289.2.7 - CREATETEMPORARY......................................................................................................................1299.2.8 - ERASE...............................................................................................................................................1299.2.9 - FILECLOSE....................................................................................................................................... 1309.2.10 - FILECLOSEALL...............................................................................................................................130

  • Oracle PL/SQL par SheikYerbouti

    - 4 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    9.2.11 - FILEEXISTS.....................................................................................................................................1309.2.12 - FILEGETNAME............................................................................................................................... 1319.2.13 - FILEISOPEN....................................................................................................................................1319.2.14 - FILEOPEN....................................................................................................................................... 1329.2.15 - FREETEMPORARY.........................................................................................................................1329.2.16 - GETCHUNKSIZE.............................................................................................................................1329.2.17 - GETLENGTH...................................................................................................................................1329.2.18 - INSTR.............................................................................................................................................. 1339.2.19 - ISOPEN........................................................................................................................................... 1349.2.20 - ISTEMPORARY...............................................................................................................................1349.2.21 - LOADFROMFILE.............................................................................................................................1349.2.22 - LOADBLOBFROMFILE................................................................................................................... 1359.2.23 - LOADCLOBFROMFILE................................................................................................................... 1359.2.24 - OPEN...............................................................................................................................................1369.2.25 - READ...............................................................................................................................................1369.2.26 - SUBSTR.......................................................................................................................................... 1379.2.27 - TRIM................................................................................................................................................ 1389.2.28 - WRITE............................................................................................................................................. 1389.2.29 - WRITEAPPEND.............................................................................................................................. 139

    9.3 - Exceptions gnres par le paquetage.....................................................................................................1409.4 - Exemples................................................................................................................................................... 1409.5 - Manipulations courantes des LOB de type caractres (CLOB)................................................................ 144

    Index de recherche.................................................................................................................................................. 146Remerciements........................................................................................................................................................ 152

  • Oracle PL/SQL par SheikYerbouti

    - 5 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Introduction

    Tutoriel au format PDFTlchargez le tutoriel au format PDFPL/SQL est le langage procdural d'Oracle. Il est une extension du SQL qui est un langage ensembliste.PL/SQL permet de grer des traitements qui utilisent les instructions SQL dans un langage procdural.Les instructions de manipulation des donnes, de description des donnes, de contrle des transactions,les fonctions SQL peuvent tre utilises avec la mme syntaxe.La gestion des variables et des structures de contrle (tests, boucles) augmente la capacitde traitement des donnesLa gestion des curseurs et du traitement des erreurs accrot les possibilits de traitementLes instructions sont regroupes dans une unit appele bloc qui ne gnre qu'un accs la baseLes blocs ou procdures PL/SQL sont compils et excuts par le moteur PL/SQL.Ce moteur est intgr au moteur de la base de donnes et dans un certain nombre d'outils (Forms, Report).En rsum, PL/SQL permet de construire des applicationsIndication au lecteurCet ouvrage se situe entre le tutorial et le guide de rfrenceIl n'a pas pour vocation de se substituer un ouvrage de formation l'usage du dbutantLa comprhension de cet article sous-entend des connaissances pralables en dveloppement(en gnral)et en SQL(en particulier)Versions des logiciels utilissL'intgralit des exemples prsents dans l'article a t effectue avec la configuration suivanteOS : Windows 2000 5.00.2195 service pack 3Noyau Oracle : Oracle9i Enterprise Edition Release 9.2.0.1.0 - ProductionSql*Plus : SQL*Plus: Release 9.2.0.1.0 - ProductionCe document traite des fonctionnalits PL/SQL actuellement en cours.Dans la mesure du possible les nouveauts apparues avec la version 9i et 10g sont indiques (9i) ou (10g)En aucun cas, ce travail n'a t effectu entre les versions 7 et 8.Il est donc tout fait possible que certains exemples tirs de cet article provoquent des erreurs de compilation oud'excution s'ils sont tests sur une version infrieure 9.2

  • Oracle PL/SQL par SheikYerbouti

    - 6 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    1 - Le bloc PL/SQL

    PL/SQL est un langage structur en blocs, constitus d'un ensemble d'instructions.Un bloc PL/SQL peut tre "externe", on dit alors qu'il est anonyme, ou alors stock dans la base de donnes sousforme de procdure, fonction ou trigger.un bloc PL/SQL est intgralement envoy au moteur PL/SQL, qui traite chaque instruction PL/SQL et sous-traite lesinstructions purement SQL au moteur SQL, afin de rduire le trafic rseau.

    Syntaxe d'un bloc PL/SQL

  • Oracle PL/SQL par SheikYerbouti

    - 7 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

  • Oracle PL/SQL par SheikYerbouti

    - 8 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

  • Oracle PL/SQL par SheikYerbouti

    - 9 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Chaque bloc PL/SQL peut tre constitu de 3 sections :

    Une section facultative de dclaration et initialisation de types, variables et constantes Une section obligatoire contenant les instructions d'excution Une section facultative de gestion des erreurs

    [DECLARE dclarations et initialisation]BEGIN instructions excutables[EXCEPTION interception des erreurs]END;Un bloc PL/SQL minimum peut tre reprsent de la faon suivante :

    BEGIN Null ;END ;

  • Oracle PL/SQL par SheikYerbouti

    - 10 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Le mot cl BEGIN dtermine le dbut de la section des instructions excutablesLe mot cl END; indique la fin de la section des instructions excutablesUne seule instruction figure dans ce bloc : Null; qui ne gnre aucune actionCe bloc PL/SQL ne fait donc absolument rien !La section dclarative (facultative) d'un bloc dbute par le mot cl DECLAREElle contient toutes les dclarations des variables qui seront utilises localement par la section excutable, ainsi queleur ventuelle initialisation.

    DECLARE LC$Chaine VARCHAR2(15) := 'Salut Monde' ;BEGIN DBMS_OUTPUT.PUT_LINE( LC$Chaine ) ;END ;

    Une variable LC$Chaine est dclare de type VARCHAR2(15) et initialise avec la valeur 'Salut Monde' ;Dans la section excutable, cette variable est transmise la fonction DBMS_OUTPUT() pour tre affiche l'cranCette section ne peut pas contenir d'instructions excutables. Toutefois, il est possible de dfinir dans cette sectiondes procdures ou des fonctions contenant une section excutable.Toute variable doit avoir t dclare avant de pouvoir tre utilise dans la section excutable.La section de gestion des erreurs (facultative) dbute par le mot cl EXCEPTIONElle contient le code excutable mis en place pour la gestion des erreursLorsqu'une erreur intervient dans l'excution, le programme est stopp et le code erreur est transmis cette section

    DECLARE LC$Chaine VARCHAR2(15) := 'Hello World' ;BEGIN DBMS_OUTPUT.PUT_LINE( LC$Chaine ) ;EXCEPTION When OTHERS then Null ;END ;

    Les erreurs doivent tre interceptes avec le mot cl WHEN suivi du code erreur cibl. Ici, le code OTHERS quidfinit toutes les erreurs non interceptes individuellement par les clauses WHEN prcdentes.Cette section peut elle-mme contenir d'autres blocs PL/SQLLes blocs PL/SQL peuvent tre imbriqus les uns dans les autres

    DECLARE BEGIN DECLARE .. BEGIN BEGIN END ; END ;

    ..END ;

    1.1 - La section dclarative

    Vous pouvez dclarer dans cette section tous les types, variables et constantes ncessaires l'excution du bloc.Ces variables peuvent tre de n'importe quel type SQL ou PL/SQL (voir le chapitre Variables, types et littraux).Leur initialisation, facultative, s'effectue avec l'oprateur :=

  • Oracle PL/SQL par SheikYerbouti

    - 11 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    DECLARE LN$Nbre NUMBER(3) := 0 ; LD$Date DATE := SYSDATE ; LC$Nom VARCHAR2(10) := 'PL/SQL' ;

    Une constante est une variable dont l'initialisation est obligatoire et dont la valeur ne pourra pas tre modifie encours d'excutionElle est dclare avec le mot cl : CONSTANT qui doit prcder le type

    DECLARE LN$Pi CONSTANT NUMBER := 3. 1415926535 ;

    PL/SQL n'est pas sensible la casse. Pour lui les expressions suivantes sont quivalentes :NOM_VARIABLE NUMBER ;Nom_Variable Number ;nom_variable number ;

    1.2 - La section excution

    Dlimite par les mots cl BEGIN et END; elle contient les instructions d'excution du bloc PL/SQL, les instructionsde contrle et d'itration,l'appel des procdures et fonctions, l'utilisation des fonctions natives, les ordres SQL, etc.Chaque instruction doit tre suivi du terminateur d'instruction ;Voici la liste des instructions que cette section peut contenir

    1.2.1 - Assignation

    L'assignation d'une valeur une variable peut tre faite de 2 faons diffrentes

    En utilisant l'oprateur :=

    Ma_variable := 10 ;Ma_chaine := 'Chane de caractres' ;

    Par l'intermdiaire d'un ordre SELECT INTO ou FETCH INTO

    Declare LC$Nom_emp EMP.ENAME%Type ;

    Cursor C_EMP Is Select ename From EMP Where Empno = 1014 ;

    Begin Select ename Into LC$Nom_emp From EMP Where Empno = 1014

  • Oracle PL/SQL par SheikYerbouti

    - 12 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    ;

    Open C_EMP ; Fetch C_EMP Into LC$Nom_emp ; Close C_EMP ;End ;

    1.2.2 - OPEN

    Ouverture d'un curseur SQL

    nom curseur reprsente le nom donn au curseur qui permettra de le rfrencer dans les instructions suivantesparamtres du curseur reprsente la liste des paramtres transmis au curseurle curseur doit avoir t pralablement dfini dans la section dclarative

    Declare LC$Nom_emp EMP.ENAME%Type ;

    Cursor C_EMP ( LN$Numemp IN EMP.EMPNO%Type ) Is Select ename From EMP Where Empno = LN$Numemp ;

    Begin Open C_EMP ( 1024 ); Fetch C_EMP Into LC$Nom_emp ; Close C_EMP ;End ;

    1.2.3 - OPEN FOR

    Ouverture d'un curseur SQL incluant l'ordre select correspondant.La dclaration pralable du curseur dans la section dclarative n'est pas ncessaire

    Declare LC$Nom_emp EMP.ENAME%Type ;Begin Open C_EMP For 'Select ename From EMP Where empno = 1024' ; Fetch C_EMP Into LC$Nom_emp ; Close C_EMP ;End ;

  • Oracle PL/SQL par SheikYerbouti

    - 13 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    1.2.4 - CLOSE

    Cette instruction est utilise pour fermer un curseur pralablement ouvert avec l'instruction OPENCLOSE(nom_curseur)Aprs cette instruction, le curseur n'est plus valide et toute instruction s'y reportant gnrera une erreur(voir exemple prcdent)

    1.2.5 - COMMIT

    Cette instruction permet d'enregistrer en base toutes les modifications effectues au cours de la transaction

    Le mot cl WORK est facultatif et n'a aucun effet particulierUn commentaire d'un maximum de 50 caractres peut apparatre entre apostrophes derrire le mot cl COMMENT

    1.2.6 - EXECUTE IMMEDIATE

    Cette instruction permet d'excuter du SQL dynamique

    -> Pour une explication dtaille de cette instruction, reportez-vous l'article sur le sql dynamique natif

    1.2.7 - EXIT

    Cette instruction permet de quitter une structure itrative

  • Oracle PL/SQL par SheikYerbouti

    - 14 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    label facultatif permet de nommer prcisment la structure dont on veut sortir.expression boolenne permet de spcifier une condition de sortieExit saute l'instruction suivant le mot cl END LOOP;Dans le cas de boucles imbriques, l'indication d'un label permet de quitter tout ou partie des boucles imbriques

    SQL> Declare 2 LN$Num pls_integer := 0 ; 3 Begin 4 Loop 5 LN$Num := LN$Num + 1 ; 6 dbms_output.put_line( to_char( LN$Num ) ) ; 7 EXIT WHEN LN$Num > 3 ; -- sortie de la boucle lorsque LN$Num est suptieur 3 8 End loop ; 9 End ; 10 /1234

    Procdure PL/SQL termine avec succs.

    Lorsque le test effectu (LN$Num > 3) est vrifi (TRUE), la boucle Loop End loop est quitte

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 LN$J pls_integer := 0 ; 4 Begin 5 6 Loop 7 LN$I := LN$I + 1 ; 8 Loop 9 LN$J := LN$J + 1 ; 10 dbms_output.put_line( to_char( LN$I ) || ',' || to_char( LN$J ) ) ; 11 EXIT boucle1 WHEN LN$J > 3 ; 12 End loop ; 13 End loop ; 14 End ; 15 /1,11,21,31,4

    Procdure PL/SQL termine avec succs.

    Dans cet exemple, l'instruction EXIT suivie du label boucle1 permet de quitter les deux boucles imbriques

    1.2.8 - FETCH

    Cette instruction permet de ramener une ligne d'un curseur pralablement ouvert avec l'instruction OPENou OPEN FOR

  • Oracle PL/SQL par SheikYerbouti

    - 15 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    nom curseur reprsente le nom d'un curseur pralablement ouvert avec l'instruction OPEN ou OPEN FORnom variable curseur reprsente le nom d'une variable curseurnom variable curseur hte reprsente le nom d'une variable curseur transmise par un programme tiers (ex : Pro*C,Pro*Cobol, etc.)variable reprsente le nom d'une variable pralablement dfinie dans la section dclarative, qui doit tre du mmetype que la colonne ramene par l'instruction Selectenregistrement reprsente le nom d'un enregistrement pralablement dfini dans la section dclarative qui doit tredu mme type que la ligne ramene par l'instruction Selectnom collection reprsente le nom d'une collection pralablement dfinie dans la section dclarativenom tableau hte reprsente le nom du tableau transmis par un programme tiersSi l'instruction FETCH ne ramne plus de ligne (fin du curseur) l'attribut %NOTFOUND prend la valeur TRUE etl'attribut %FOUND prend la valeur FALSE-> Pour voir des exemples, reportez-vous la section Les curseurs explicites (1.2.22)

    1.2.9 - FORALL

    Cette instruction permet de gnrer des ordres SQL de masse bass sur le contenu d'une collection

    variable index reprsente l'indice de la collection sur laquelle porte l'instruction FORALLborne dbut reprsente la valeur d'indice de dpartborne fin reprsente la valeur d'indice de fininstruction sql doit tre un ordre SQL de type INSERT, UPDATE ou DELETE(10g)FORALL i IN INDICES OF nom_collectionpermet de ne traiter que les indices valoriss de la collection (non forcment conscutifs comme il taitimpratif dans les versions prcdentes)Pour voir des exemples, reportez-vous au chapitre 5 Collections et enregistrements

    1.2.10 - GOTO

    Cette instruction permet d'excuter un saut dans le code vers le label precis

  • Oracle PL/SQL par SheikYerbouti

    - 16 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Une instruction valide doit suivre la dclaration du label

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 LN$J pls_integer := 0 ; 4 Begin 5 Loop 6 LN$I := LN$I + 1 ; 7 Loop 8 LN$J := LN$J + 1 ; 9 dbms_output.put_line( to_char( LN$I ) || ',' || to_char( LN$J ) ) ; 10 If LN$J > 3 Then GOTO sortie ; End if ; 11 End loop ; 12 End loop ; 13 14 null ; 15 End ; 16 /1,11,21,31,4

    Procdure PL/SQL termine avec succs.

    1.2.11 - IF

    Cette instruction permet de faire des tests conditionnels

    expression boolenne reprsente un test gnrant un boolen TRUE ou FALSESeuls les mots cl IF et END IF; sont obligatoires. Les clauses ELSIF et ELSE sont facultatives

    SQL> Declare

  • Oracle PL/SQL par SheikYerbouti

    - 17 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    2 LN$I pls_integer := 0 ; 3 LN$J pls_integer := 0 ; 4 Begin 5 Loop 6 LN$I := LN$I + 1 ; 7 Loop 8 LN$J := LN$J + 1 ; 9 If LN$J = 1 Then 10 dbms_output.put_line( '1' ) ; 11 Elsif LN$J = 2 Then 12 dbms_output.put_line( '2' ) ; 13 Else 14 dbms_output.put_line( '3' ) ; 15 goto sortie ; 16 End if ; 17 End loop ; 18 End loop ; 19 20 null ; 21 End ; 22 /123

    Procdure PL/SQL termine avec succs.

    1.2.12 - CASE

    Cette instruction permet de mettre en place des structures de test conditionnel de type IF .. ELSE .. END IF, la grande diffrence qu'elle est utilisable dans les requtes SQL2 syntaxes sont possibles

    CASE simple

    [] CASE oprateur { WHEN contenu_oprateur THEN { instruction;} ... }... [ELSE { instruction;}...]END CASE [label];

    CASE de recherche

    []CASE { WHEN expression_boolenne THEN { instruction;} ... }...[ELSE { instruction;}...]END CASE[label];oprateur peut tre n'importe quel type PL/SQL l'exception des objets suivants :

    BLOB BFILE Type objet Enregistrement Collection (NESTED TABLE, INDEX-BY TABLE, VARRAY)

    Pour le CASE simple, chaque mot cl WHEN vrifie l'galit entre oprateur et contenu_oprateur. Dans l'affirmative,l'instruction suivant le mot cl THEN est excute, puis la structure CASE est quitte et l'excution du programmeest reprise aprs le mot cl END CASE;

    SQL> Declare 2 LN$Num pls_integer := 0 ; 3 Begin 4 Loop 5 LN$Num := LN$Num + 1 ; 6 CASE LN$Num 7 WHEN 1 Then dbms_output.put_line( '1' ) ;

  • Oracle PL/SQL par SheikYerbouti

    - 18 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    8 WHEN 2 Then dbms_output.put_line( '2' ) ; 9 WHEN 3 Then dbms_output.put_line( '3' ) ; 10 ELSE 11 EXIT ; 12 END CASE ; 13 End loop ; 14 End ; 15 /123

    Procdure PL/SQL termine avec succs.

    Exemple de CASE de recherche

    SQL> Declare 2 LN$Num pls_integer := 0 ; 3 Begin 4 Loop 5 LN$Num := LN$Num + 1 ; 6 CASE 7 WHEN LN$Num between 1 and 3 Then dbms_output.put_line( To_char( LN$Num ) || ' -> 1-3' ) ; 8 WHEN LN$Num < 5 Then dbms_output.put_line( To_char( LN$Num ) || ' < 5' ) ; 9 ELSE dbms_output.put_line( To_char( LN$Num ) || ' >= 5' ) ; 10 END CASE ; 11 exit when LN$Num = 5 ; 12 End loop ; 13 End ; 14 /1 -> 1-32 -> 1-33 -> 1-34 < 55 >= 5

    Procdure PL/SQL termine avec succs.

    Cette fois l'oprateur est prcis sur chaque ligne WHENIl ne s'agit alors plus d'un simple test d'galit, mais de n'importe quelle expression boolenne restituant un rsultatTRUE ou FALSE.On observe galement que le dbranchement dans une clause WHEN est exclusif. En effet, dans chaque itrationde boucle, la variable LN$Num est infrieure 5, mais n'est prise en compte dans la deuxime clause WHEN quelorsque la premire n'est plus vrifiePour le CASE de recherche, l'omission de la clause ELSE provoque une erreur

    SQL> Declare 2 LN$Num pls_integer := 0 ; 3 Begin 4 Loop 5 LN$Num := LN$Num + 1 ; 6 CASE 7 WHEN LN$Num between 1 and 3 Then dbms_output.put_line( To_char( LN$Num ) || ' -> 1-3' ) ; 8 WHEN LN$Num < 5 Then dbms_output.put_line( To_char( LN$Num ) || ' -> < 5' ) ; 9 END CASE ; 10 exit when LN$Num = 5 ; 11 End loop ; 12 End ; 13 /1 -> 1-32 -> 1-33 -> 1-34 -> < 5Declare*

  • Oracle PL/SQL par SheikYerbouti

    - 19 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    ERREUR la ligne 1 :ORA-06592: CASE not found while executing CASE statementORA-06512: at line 6

    1.2.13 - FOR (curseur)

    Cette instruction permet de grer un curseur sans utiliser les ordres OPEN, FETCH et CLOSE

    enregistrement reprsente un nom de variable de type curseur implicite.nom curseur reprsente le nom d'un curseur pralablement dfini dans la section dclarative

    SQL> Declare 2 -- Dclaration du curseur 3 CURSOR C_EMP IS 4 Select 5 * 6 From 7 EMP 8 Where 9 job = 'CLERK' 10 ; 11 12 Begin 13 For Cur IN C_EMP Loop 14 dbms_output.put_line( To_char( Cur.empno ) || ' - ' || Cur.ename ) ; 15 End loop ; 16 End ; 17 /7369 - SMITH7876 - ADAMS7900 - JAMES7934 - MILLER

    Procdure PL/SQL termine avec succs.

    La variable de curseur implicite Cur, non dfinie dans la section dclarative, doit tre utilise pour manipuler dansla boucle,les objets du curseur (To_char( Cur.empno ),Cur.ename)Aprs l'instruction END LOOP; l'utilisation de cette variable gnre une erreurAvec cette syntaxe, l'utilisation des instructions OPEN, FETCH et CLOSE est inutileInstruction FOR et curseur paramtr

  • Oracle PL/SQL par SheikYerbouti

    - 20 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    SQL> Declare 2 -- Dclaration du curseur 3 CURSOR C_EMP ( PC$Job IN EMP.job%Type ) IS 4 Select 5 * 6 From 7 EMP 8 Where 9 job = PC$Job 10 ; 11 12 Begin 13 For Cur IN C_EMP( 'SALESMAN' ) Loop 14 dbms_output.put_line( To_char( Cur.empno ) || ' - ' || Cur.ename ) ; 15 End loop ; 16 End ; 17 /7499 - ALLEN7521 - WARD7654 - MARTIN7844 - TURNER

    Procdure PL/SQL termine avec succs.

    Le passage des paramtres s'effectue sur le curseur dclar (C_EMP) et non sur la variable curseur (Cur)

    1.2.14 - FOR, LOOP, WHILE

    Ces instructions dclarent une structure de type itrative (boucle)

    Trois syntaxes sont possibles

    LOOP instruction;[instruction;[...]] END LOOP;

  • Oracle PL/SQL par SheikYerbouti

    - 21 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Cette syntaxe met en place une boucle simple ou aucune condition de sortie n'est indiqueIl faut donc une instruction EXIT pour sortir de ce type de boucle

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 Begin 4 Loop 5 LN$I := LN$I + 1 ; 6 dbms_output.put_line( to_char( LN$I) ) ; 7 exit when LN$I > 2 ; 8 End loop ; 9 End ; 10 /123

    WHILE expression boolenne LOOP instruction;[instruction;[...]] END LOOP;

    Cette syntaxe permet de mettre en place une boucle dont la condition de test est value au dbut.Si expression boolenne donne le rsultat FALSE, les instructions suivantes jusqu'au mot cl END LOOP; ne serontpas excutes

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 Begin 4 While LN$I < 3 5 Loop 6 LN$I := LN$I + 1 ; 7 dbms_output.put_line( to_char( LN$I) ) ; 8 End loop ; 9 End ; 10 /123

    FOR variable index IN [REVERSE] borne_dbut..borne_fin LOOP instruction;[instruction;[...]] ENDLOOP;

    Cette syntaxe permet de mettre en place une boucle dont le nombre d'itrations est fix ds l'entreVariable index reprsente le nom de la variable qui servira d'indice. Cette variable ne ncessite pas de dfinitionpralable dans la section dclarativeReverse permet de faire varier l'indice dans le sens contraire (dcrmentation)borne dbut reprsente l'indice de dpartborne fin reprsente l'indice de fin

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 Begin 4 For i in 1..3 5 Loop 6 dbms_output.put_line( to_char( i ) ) ; 7 End loop ; 8 End ; 9 /123

  • Oracle PL/SQL par SheikYerbouti

    - 22 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 Begin 4 For i in reverse 1..3 5 Loop 6 dbms_output.put_line( to_char( i ) ) ; 7 End loop ; 8 End ; 9 /321

    1.2.15 - NULL

    Cette instruction n'excute rien et n'a aucun effet

    1.2.16 - RAISE

    Cette instruction permet de gnrer une exception

    nom exception reprsente soit le nom d'une exception prdfinie, soit une exception utilisateur dfinie dans lasection dclarative

    SQL> Declare 2 LN$I pls_integer := 0 ; 3 LE$Fin exception ; 4 Begin 5 Loop 6 LN$I := LN$I + 1 ; 7 dbms_output.put_line( to_char( LN$I) ) ; 8 If LN$I > 2 Then 9 RAISE LE$Fin ; 10 End if ; 11 End loop ; 12 Exception 13 When LE$Fin Then 14 Null ; 15 End ; 16 /123

    Si la variable LN$I est > 2, alors on provoque le saut dans la section EXCEPTION avec l'erreur utilisateur LE$Fin

    1.2.17 - RETURN

    Cette instruction permet de sortir d'une procdure ou d'une fonction

  • Oracle PL/SQL par SheikYerbouti

    - 23 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    expression reprsente la valeur de retour d'une fonction. Cette valeur doit tre compatible avec le type dfini dansla clause RETURN de la dclaration de fonction

    1.2.18 - SAVEPOINT

    Cette instruction permet de placer une tiquette savepoint dans le corps du code.Elle permet au traitement d'annuler, avec l'instruction ROLLBACK, les modifications effectues partir de cettetiquette

    1.2.19 - ROLLBACK

    Cette instruction permet d'annuler en base toutes les modifications effectues au cours de la transaction

    nom savepoint reprsente le nom d'une tiquette savepoint pralablement dfinie dans le corps du code avecl'instruction SAVEPOINTAvec TO SAVEPOINT nom savepoint, l'annulation porte sur toutes les modifications effectues partir de l'tiquettenom savepoint

    SQL> Begin 2 Insert Into EMP( empno, ename, job ) 3 values( 9991, 'Dupontont', 'CLERK' ) ; 4 Insert Into EMP( empno, ename, job ) 5 values( 9992, 'Duboudin', 'CLERK' ) ; 6 7 SAVEPOINT mise_a_jour ; 8 9 Update EMP Set sal = 2500 Where empno > 9990 ; 10 ROLLBACK TO SAVEPOINT mise_a_jour ; 11 12 Commit ; 13 End ; 14 /

    Procdure PL/SQL termine avec succs.

    SQL> Select * From EMP Where empno > 9990 ;

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 9991 Dupontont CLERK 9992 Duboudin CLERK

    Dans cet exemple, une tiquette SAVEPOINT est place aprs les instructions d'insertionUn ROLLBACK TO SAVEPOINT est ajout aprs l'instruction de mise jourpuis un COMMIT est effectu

  • Oracle PL/SQL par SheikYerbouti

    - 24 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Les insertions sont bien enregistres en base mais pas la mise jour

    1.2.20 - SELECT INTO

    Slction d'une ou de plusieurs lignes

    Cette instruction permet d'excuter un ordre Select implicite.Cet ordre ne doit ramener qu'une ligne sous peine de gnrer l'exception NO_DATA_FOUND si aucune ligne n'estrameneou TOO_MANY_ROWS si plus d'une ligne sont ramenesUtilise avec la clause BULK COLLECT, elle permet de charger une collection avec les lignes ramenesitem reprsente un littrale ou un nom de colonnenom variable reprsente le nom d'une variable d'accueil. Son type doit tre identique celui de itemnom record reprsente le nom d'un enregistrement compos de champs de mme type que les items ramensnom collection reprsente le nom d'une collection d'accueilnom tableau hte reprsente le nom de la variable tableau passe par un programme tiersrfrence table reprsente la liste des tables et/ou vues de l'ordre SQLsous-requte reprsente le texte d'une sous-requte SQL conformesuite instruction reprsente la suite de l'ordre Select (clauses Where, Group by, Order by, etc.)

    SQL> Declare 2 LN$Num EMP.empno%Type ; 3 LC$Nom EMP.ename%Type ; 4 LC$Job EMP.job%Type ; 5 Begin 6 Select 7 empno 8 ,ename

  • Oracle PL/SQL par SheikYerbouti

    - 25 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    9 ,job 10 Into 11 LN$Num 12 ,LC$Nom 13 ,LC$Job 14 From 15 EMP 16 Where 17 empno = 7369 18 ; 19 End ; 20 /

    Procdure PL/SQL termine avec succs.

    Dans l'exemple suivant, aucun employ ne porte le numro 1la requte ne ramne donc aucune ligne et gnre l'exception NO_DATA_FOUND

    SQL> Declare 2 LN$Num EMP.empno%Type ; 3 LC$Nom EMP.ename%Type ; 4 LC$Job EMP.job%Type ; 5 Begin 6 Select 7 empno 8 ,ename 9 ,job 10 Into 11 LN$Num 12 ,LC$Nom 13 ,LC$Job 14 From 15 EMP 16 Where 17 empno = 1 18 ; 19 End ; 20 /Declare*ERREUR la ligne 1 :ORA-01403: Aucune donne trouveORA-06512: ligne 7

    Dans l'exemple suivant, la clause WHERE a t retirela requte ramne donc plusieurs lignes et gnre l'exception TOO_MANY_ROWS

    SQL> Declare 2 LN$Num EMP.empno%Type ; 3 LC$Nom EMP.ename%Type ; 4 LC$Job EMP.job%Type ; 5 Begin 6 Select 7 empno 8 ,ename 9 ,job 10 Into 11 LN$Num 12 ,LC$Nom 13 ,LC$Job 14 From 15 EMP 16 ; 17 End ; 18 /Declare

  • Oracle PL/SQL par SheikYerbouti

    - 26 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    *ERREUR la ligne 1 :ORA-01422: l'extraction exacte ramne plus que le nombre de lignes demandORA-06512: ligne 7

    Dans l'exemple suivant toute une ligne de la table EMP est charge dans un enregistrement

    SQL> Declare 2 LR$Emp EMP%Rowtype ; 3 Begin 4 Select 5 * 6 Into 7 LR$Emp 8 From 9 EMP 10 Where 11 empno = 7369 12 ; 13 End ; 14 /

    Procdure PL/SQL termine avec succs.

    Dans l'exemple suivant toutes les lignes de la table EMP sont charges dans une collection

    SQL> Declare 2 TYPE TYP_TAB_EMP IS TABLE OF EMP%Rowtype ; 3 Tabemp TYP_TAB_EMP ; 4 Begin 5 Select 6 * 7 BULK COLLECT 8 Into 9 Tabemp 10 From 11 EMP 12 ; 13 For i IN Tabemp.first..Tabemp.last Loop 14 dbms_output.put_line( To_char( Tabemp(i).empno ) || ' - ' || Tabemp(i).ename ) ; 15 End loop ; 16 End ; 17 /7369 - SMITH7499 - ALLEN7521 - WARD7566 - JONES7654 - MARTIN7698 - BLAKE7782 - CLARK7788 - SCOTT7839 - KING7844 - TURNER7876 - ADAMS7900 - JAMES7902 - FORD7934 - MILLER

    Procdure PL/SQL termine avec succs.

    1.2.21 - Instruction SQL

    Reprsente toute instruction SQL valide

  • Oracle PL/SQL par SheikYerbouti

    - 27 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    INSERT UPDATE DELETE

    1.2.22 - Les curseurs explicites

    Un curseur est une zone mmoire de taille fixe, utilise par le moteur SQL pour analyser et interprter un ordre SQLUn curseur explicite, contrairement au curseur implicite (SELECT INTO) est gr par l'utilisateurpour traiter un ordre Select qui ramne plusieurs lignesTout curseur explicite gr dans la section excution doit avoir t dclar dans la section dclarative

    Dclaration

    nom curseur reprsente le nom du curseur que l'on dclaredclaration des paramtres(facultatif) reprsente la liste des paramtres transmis au curseurinstruction select reprsente l'ordre SQL Select d'alimentation du curseur

    SQL> Declare 2 -- dclaration du curseur 3 CURSOR C_EMP IS 4 Select 5 empno 6 ,ename 7 ,job 8 From 9 EMP 10 ; 11 -- variables d'accueil 12 LN$Num EMP.empno%Type ; 13 LC$Nom EMP.ename%Type ; 14 LC$Job EMP.job%Type ; 15 Begin 16 Open C_EMP ; -- ouverture du curseur 17 Loop -- boucle sur les lignes 18 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne 19 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne 20 End loop ; 21 Close C_EMP ; -- fermeture du curseur 22 End ; 23 /

    Procdure PL/SQL termine avec succs.

    Un curseur nomm C_EMP est dclar avec l'ordre Select correspondant (CURSOR C_EMP IS...)Il est ouvert avec l'instruction OPENlu avec l'instruction FETCHet ferm avec l'instruction CLOSE

  • Oracle PL/SQL par SheikYerbouti

    - 28 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Paramtres du curseur

    Un curseur est paramtrable. On peut donc utiliser le mme curseur pour obtenir diffrents rsultats

    nom paramtre reprsente le nom de la variable paramtredatatype reprsente le type SQL de la variable paramtre (doit correspondre en type avec la colonne vise)expression reprsente la valeur par dfaut du paramtre (doit correspondre en type avec celui du paramtre)

    SQL> Declare 2 -- dclaration du curseur 3 CURSOR C_EMP ( PN$Num IN EMP.empno%Type )IS 4 Select 5 empno 6 ,ename 7 ,job 8 From 9 EMP 10 Where 11 empno = PN$Num 12 ; 13 -- variables d'accueil 14 LN$Num EMP.empno%Type ; 15 LC$Nom EMP.ename%Type ; 16 LC$Job EMP.job%Type ; 17 Begin 18 Open C_EMP( 7369 ) ; -- ouverture du curseur avec passage du paramtre 7369 19 Loop 20 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne 21 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne 22 dbms_output.put_line( 'Employ ' || To_char(LN$Num) || ' ' || LC$Nom ) ; 23 End loop ; 24 Close C_EMP ; -- fermeture du curseur 25 Open C_EMP( 7521 ) ; -- ouverture du curseur avec passage du paramtre 7521 26 Loop 27 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne 28 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne 29 dbms_output.put_line( 'Employ ' || To_char(LN$Num) || ' ' || LC$Nom ) ; 30 End loop ; 31 Close C_EMP ; -- fermeture du curseur 32 End ; 33 /Employ 7369 SMITHEmploy 7521 WARD

    Procdure PL/SQL termine avec succs.

    Dclaration d'une variable curseur

    nom variable curseur reprsente le nom de la variable curseur dclarenom type reprsente le nom d'un type curseur

  • Oracle PL/SQL par SheikYerbouti

    - 29 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    SQL> Declare 2 TYPE TYP_REF_CUR IS REF CURSOR ; 3 -- variable curseur 4 CEMP TYP_REF_CUR ; 5 -- variables d'accueil 6 LN$Num EMP.empno%Type ; 7 LC$Nom EMP.ename%Type ; 8 LC$Job EMP.job%Type ; 9 Begin 10 Open CEMP For 'Select empno, ename, job From EMP'; -- ouverture du curseur 11 Loop 12 Fetch CEMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne 13 Exit When CEMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne 14 End loop ; 15 Close CEMP ; -- fermeture du curseur 16 End ; 17 /

    Procdure PL/SQL termine avec succs.

    Spcification d'un curseur

    Les attributs de curseur

    Chaque curseur dispose de 4 attributs

    %FOUND

    Cet attribut prend la valeur TRUE lorsque une ligne est ramene, sinon il prend la valeur FALSE

    %NOTFOUND

    Cet attribut prend la valeur FALSE lorsque une ligne est ramene, sinon il prend la valeur TRUE

    %ISOPEN

    Cet attribut prend la valeur TRUE lorsque le curseur indiqu est ouvert, sinon il prend la valeur FALSE

    %ROWCOUNT

  • Oracle PL/SQL par SheikYerbouti

    - 30 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Cet attribut retourne le nombre de lignes impactes par la dernire instruction SQL

    1.2.23 - Porte des variables

    La porte ou visibilit d'une variable est limite au bloc PL/SQL dans laquelle elle est dclare. Elle est donclocale au bloc PL/SQL

    SQL> Begin 2 3 Declare 4 LC$Ch1 varchar2(10) := 'Phrase 2'; 5 Begin 6 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ; 7 End ; 8 9 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ; 10 11 End ; 12 / dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ; *ERREUR la ligne 9 :ORA-06550: line 9, column 41:PLS-00201: identifier 'LC$CH1' must be declaredORA-06550: line 9, column 4:PL/SQL: Statement ignored

    Dans cet exemple, la variable LC$Ch1 dclare dans le sous-bloc, n'existe plus dans le bloc principalDans le cas de blocs imbriqus ou une mme variable est dclare dans chaque bloc, la visibilit d'une variable serapporte toujours la plus proche dclaration

    SQL> Declare 2 LC$Ch1 varchar2(10) := 'Phrase 1'; 3 Begin 4 5 Declare 6 LC$Ch1 varchar2(10) := 'Phrase 2'; 7 Begin 8 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ; 9 End ; 10 11 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ; 12 13 End ; 14 /LC$Ch1 = Phrase 2LC$Ch1 = Phrase 1

    Procdure PL/SQL termine avec succs.

    1.3 - La section de gestion des erreurs

    Dbute par le mot cl EXCEPTION, elle contient le code mis en oeuvre pour la gestion des erreurs gnres parla section d'excutionUne erreur survenue lors de l'excution du code dclenche ce que l'on nomme une exception. Le code erreur associest transmis la section EXCEPTION, pour vous laisser la possibilit de la grer et donc de ne pas mettre finprmaturment l'application.Prenons l'exemple suivant :Nous souhaitons retrouver la liste des employs dont la date d'entre est infrieure au premier janvier 1970

  • Oracle PL/SQL par SheikYerbouti

    - 31 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    SQL> Declare 2 LC$Nom EMP.ename%Type ; 3 Begin 4 Select empno 5 Into LC$Nom 6 From EMP 7 Where hiredate < to_date('01/01/1970','DD/MM/YYYY') ; 8 End ; 9 /Declare*ERREUR la ligne 1 :ORA-01403: Aucune donne trouveORA-06512: ligne 4

    Comme la requte ne ramne aucune ligne, l'exception prdfinie NO_DATA_FOUND est gnre et transmise lasection EXCEPTION qui peut traiter le cas et poursuivre l'excution de l'application.L'exception NO_DATA_FOUND (ORA_01403) correspond au code erreur numrique +100.Il existe des milliers de code erreur Oracle et il serait vain de tous leur donner un libell.Voici la liste des exceptions prdfinies qui bnficient de ce traitement de faveur :

    Exception prdfinie Erreur Oracle Valeur de SQLCODEACCESS_INTO_NULLORA-06530 -6530CASE_NOT_FOUND ORA-06592 -6592COLLECTION_IS_NULLORA-06531 -6531CURSOR_ALREADY_OPENORA-06511 -6511DUP_VAL_ON_INDEXORA-00001 -1INVALID_CURSOR ORA-01001 -1001INVALID_NUMBER ORA-01722 -1722LOGIN_DENIED ORA-01017 -1017NO_DATA_FOUND ORA-01403 +100NOT_LOGGED_ON ORA-01012 -1012PROGRAM_ERROR ORA-06501 -6501ROWTYPE_MISMATCHORA-06504 -6504SELF_IS_NULL ORA-30625 -30625STORAGE_ERROR ORA-06500 -6500SUBSCRIPT_BEYOND_COUNTORA-06533 -6533SUBSCRIPT_OUTSIDE_LIMITORA-06532 -6532SYS_INVALID_ROWIDORA-01410 -1410TIMEOUT_ON_RESOURCEORA-00051 -51TOO_MANY_ROWS ORA-01422 -1422VALUE_ERROR ORA-06502 -6502ZERO_DIVIDE ORA-01476 -1476

    Toutes les autres exceptions doivent tre interceptes via leur code erreur numrique.En plus des erreurs Oracle, vous pouvez intercepter vos propres erreurs en dclarant des variables dont le type estexception et en provoquant vous-mme le saut dans la section de gestion des erreurs l'aide de l'instruction RAISE

    DECLARE LE$Fin Exception ; Begin .. Raise LE$Fin ; EXCEPTION WHEN LE$Fin Then .END ;

  • Oracle PL/SQL par SheikYerbouti

    - 32 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Il n'est pas possible de dclarer la mme exception deux fois dans le mme bloc. Toutefois, dans le cas de blocsimbriqus, vous pouvez dclarer la mme exception dans la section EXCEPTION de chaque bloc

    DECLARE LE$Fin Exception ;BEGIN DECLARE LE$Fin Exception ; BEGIN ... EXCEPTION WHEN LE$Fin Then ... END ;EXCEPTION WHEN LE$Fin Then ...END ;

    Le peu d'exceptions prdfinies vous oblige traiter tous les autres cas dans la clause WHEN OTHERS entestant le code erreur SQL

    EXCEPTION WHEN NO_DATA_FOUND Then ... WHEN OTHERS THEN If SQLCODE = Then Elsif SQLCODE = Then ... End if ;END;

    Vous pouvez associer un code erreur Oracle vos propres variables exception l'aide du mot cl PRAGMAEXCEPTION_INIT, dans le cadre de la section dclarative de la faon suivante :Nom_exception EXCEPTION ;PRAGMA EXCEPTION_INIT(nom_exception, -code_error_oracle);Exemple :Lorsque l'on tente d'insrer plus de caractres dans une variable que sa dclaration ne le permet, Oracle dclencheune erreur -6502. Nous allons "nommer" cette erreur en LE$trop_long et l'intercepter dans la section exception

    SQL> Declare 2 LC$Chaine varchar2(10) ; 3 LE$trop_long exception ; 4 pragma exception_init( LE$trop_long, -6502 ) ; 5 Begin 6 LC$Chaine := rpad( ' ', 30) ; 7 Exception 8 when LE$trop_long then 9 dbms_output.put_line( 'Chane de caractres trop longue') ; 10 End ; 11 /Chane de caractres trop longue

    Procdure PL/SQL termine avec succs.

    SQL>

    Le code erreur numrique Oracle ayant gnr la plus rcente erreur est rcuprable en interrogeant la fonctionSQLCODE.Le libell erreur associ est rcuprable en interrogeant la fonction SQLERRM

  • Oracle PL/SQL par SheikYerbouti

    - 33 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    SQL> Declare 2 LC$Chaine varchar2(10) ; 3 Begin 4 LC$Chaine := rpad( ' ', 30) ; 5 Exception 6 when others then 7 dbms_output.put_line( 'Code erreur : ' || to_char( SQLCODE )) ; 8 dbms_output.put_line( 'libell erreur : ' || to_char( SQLERRM )) ; 9 End ; 10 /Code erreur : -6502libell erreur : ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    Procdure PL/SQL termine avec succs.

    Poursuite de l'excution aprs l'interception d'une exceptionUne fois dans la section EXCEPTION, il n'est pas possible de retourner dans la section excution juste aprsl'instruction qui a gnr l'erreur.Par contre il est tout fait possible d'encadrer chaque groupe d'instructions voire mme chaque instruction avecles mots clBEGIN EXCEPTION END;Cela permet de traiter l'erreur et de continuer l'excution

    1 Declare 2 LC$Ch1 varchar2(20) := 'Phrase longue'; 3 LC$Chaine varchar2(10) ; 4 LE$trop_long exception ; 5 pragma exception_init( LE$trop_long, -6502 ) ; 6 Begin 7 Begin 8 LC$Chaine := LC$Ch1; 9 Exception 10 when LE$trop_long then 11 LC$Chaine := Substr( LC$Ch1, 1, 10 ) ; 12 End ; 13 -- poursuite du traitement -- 14 dbms_output.put_line(LC$Chaine ) ; 15* End ; 16 /Phrase lon

    Procdure PL/SQL termine avec succs.

    Vous pouvez galement dfinir vos propres messages d'erreur avec la procdureRAISE_APPLICATION_ERRORDBMS_STANDARD.raise_application_error(numero_erreur, message[, {TRUE | FALSE}])numero_erreur reprsente un entier ngatif compris entre -20000 et -20999message reprsente le texte du message d'une longueur maximum de 2048 octetsTRUE indique que l'erreur est ajoute la pile des erreurs prcedentesFALSE indique que l'erreur remplace toutes les erreurs prcdentesDu fait que cette procdure appartienne a un paquetage standard, il n'est pas ncessaire de prfixer cette procdureL'appel de la procdure raise_application_error ne peut tre excut que depuis une procdure stocke, et dclencheun retour immdiat au programme appelant en lui transmettant le code et le libell de l'erreurPropagation des exceptionsSi une exception n'est pas traite au sein du bloc BEGIN END; dans lequel elle est gnre,elle remonte de bloc en bloc jusqu' ce qu'elle soit traite ou rende la main au programme appelant.

  • Oracle PL/SQL par SheikYerbouti

    - 34 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Dans cet exemple, l'exception A est traite dans le bloc local.Le traitement se poursuit dans le bloc parent

    Dans cet exemple, l'exception B n'est pas traite dans le bloc local.Elle se propage dans le bloc parent dans lequel elle est traitePuis la main est rendue au programme appelant

  • Oracle PL/SQL par SheikYerbouti

    - 35 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    Dans cet exemple, l'exception C n'est traite ni dans le bloc local ni dans les blocs parentsla main est rendue au programme appelant avec le code erreurCommentaires dans les blocs PL/SQLPour mettre une ligne unique en commentaire, il faut la faire prcder d'un double tiret ---- cette ligne seule est un commentairePour mettre plusieurs lignes en commentaire, il faut les encadrer avec les symboles /* et *//* toutes les lignes suivantessont en commentaireelles ne seront ni compilesni excutes*/

  • Oracle PL/SQL par SheikYerbouti

    - 36 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    2 - Les variables, types et littraux

    2.1 - Les variables

    nom variable [CONSTANT] type [ [NOT NULL] := expression ] ;nom variable reprsente le nom de la variable compos de lettres, chiffres, $, _ ou #Le nom de la variable ne peut pas excder 30 caractres

    CONSTANT indique que la valeur ne pourra pas tre modifie dans le code du bloc PL/SQL

    NOT NULL indique que la variable ne peut pas tre NULL, et dans ce cas expression doit tre indiqu.

    type reprsente de type de la variable correspondant l'un des types suivants :(dans le premier tableau, les types Oracle sont en gras, les sous-types compatible ANSI/ISO en normal)

    Types scalairesBINARY_INTEGERDEC DECIMAL DOUBLE

    PRECISIONFLOAT

    INT INTEGER NATURAL NATURALN NUMBERNUMERIC PLS_INTEGER POSITIVE POSITIVEN REALSIGNTYPE SMALLINT CHAR CHARACTER LONGLONG RAW NCHAR NVARCHAR2 RAW ROWIDSTRING UROWID VARCHAR VARCHAR2BOOLEAN DATEINTERVAL DAYTO SECOND (9i)

    INTERVALYEAR TOMONTH (9i)

    TIMESTAMP (9i) TIMESTAMPWITH LOCALTIME ZONE (9i)

    TIMESTAMPWITH TIMEZONE (9i)

    Types compossRECORD TABLE VARRAY

    Types rfrencesREF CURSOR REF type_objet

    Types grands objetsBFILE BLOB CLOB NCLOB

    TypessuplmentairesSYS.ANYDATA SYS.ANYTYPE SYS.ANYDATASETXMLTYPE URITYPEMDSYS.SDO_GEOMETRYORDSYS.ORDAUDIOORDSYS.ORDIMAGEORDSYS.ORDVIDEOORDSYS.ORDDOCORDSYS.ORDIMAGESIGNATURE

    Vous pouvez galement crer des sous-types :

    SUBTYPE nom_sous-type IS type ;SUBTYPE entier_court IS SMALLINT ;i entier_court ;Et utiliser les types drivs

    %TYPErfrence un type existant qui est soit une colonne d'une table soit un type dfini prcdemment

  • Oracle PL/SQL par SheikYerbouti

    - 37 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    nom_variable nom_table.nom_colonne%TYPE ;nom_variable nom_variable_ref%TYPE ;

    %ROWTYPErfrence une ligne d'une table ou d'un curseurnom_variable nom_table%ROWTYPE ;nom_variable nom_curseur%ROWTYPE ;

    Declare -- variable de mme type que le colonne ENAME de la table EMP LC$Nom EMP.ENAME%TYPE ; -- variable de mme type qu'une ligne de la table EMP LR$EMP EMP%ROWTYPE ; LC$Dat1 DATE ; -- variable de mme type que LC$Dat1 (DATE) LC$Dat2 LC$Dat1%TYPE ; -- Curseur -- Cursor C_EMP is Select empno, ename, job From EMP ; -- variable de type ligne du curseur C_EMP LR$C_emp C_EMP%ROWTYPE ;

    2.2 - Types prdfinis

    2.2.1 - Types caractres

    CHAR[(n)]Chane de caractres de longueur fixe avec n compris entre 1 et 32767 (par dfaut 1)

    VARCHAR2(n)Chane de caractres de longueur variable avec n compris entre 1 et 32767Ces types PL/SQL ont une capacit suprieure celle des colonnes de tables de mme type.(une colonne CHAR ne peut excder 2000 caractres et une colonne de type VARCHAR2 4000 caractres)

    LONGChane de caractres de longueur variable avec au maximum 32760 octets

    RAW[(n)]Chane de caractres ou donnes binaires de longueur variable avec n compris entre 1 et 32767. Le contenu d'unevariable de ce type n'est pas interprt par PL/SQL (pas de gestion des caractres nationaux)

    LONG RAWIdentique au type LONG qui peut contenir des donnes binairesJeux de caractres multi-octets

    NCHAR[(n)]Chane de caractres de longueur fixe avec n compris entre 1 et 32767 (par dfaut 1)

    NVARCHAR2[(n)]Chane de caractres de longueur variable avec n compris entre 1 et 32767Le nombre de caractres rellement stocks dpend du nombre d'octets utiliss pour coder chaque caractre

    UROWID, ROWIDPermet de stocker l'adresse absolue d'une ligne dans une table sous la forme d'une chane de caractresLe format d'une telle variable est le suivant :000000FFFBBBBBBRRR

  • Oracle PL/SQL par SheikYerbouti

    - 38 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    000000 reprsente le numro de l'objet qui possde cette ligne (dans le cas de cluster, plusieurs objets peuventpartager le mme segment)FFF reprsente le numro du fichier qui contient la ligneBBBBBB reprsente le numro du bloc dans le fichierRRR reprsente le numro de ligne dans le bloc

    2.2.2 - Types numriques

    NUMBER[(e,d)]Nombre rel avec e chiffres significatifs stocks et d dcimales

    BINARY_INTEGERNombre entier compris entre -2 147 483 647 et +2 147 483 647(Utilise les fonctions de la librairie arithmtique)(10g)BINARY_FLOATNombre virgule flottante simple prcision au format IEEE 754un littral de ce type est crit avec un f terminateur (ex. 3.125f)(10g)BINARY_DOUBLENombre virgule flottante double prcision au format IEEE 754un littral de ce type est crit avec un d terminateur (ex. 3.12548d)

    PLS_INTEGERNombre entier compris entre -2 147 483 647 et +2 147 483 647(Plus rapide que BINARY_INTEGER car il utilise les registres du processeur)

    2.2.3 - Types pour les grands objets

    BFILEStocke la rfrence vers un fichier du systme d'exploitation

    BLOBPermet de stocker un objet binaire jusqu' 4 Go

    CLOBPermet de stocker un ensemble de caractres, jusqu' 4 Go

    NCLOBPermet de stocker un ensemble de caractres, cods sur un ou plusieurs octets, jusqu' 4 Go

    2.2.4 - Types supplmentaires

    SYS.ANYTYPE, SYS.ANYDATAUne variable de ce type peut contenir un objet de n'importe quel type scalaire ou objetDfinie comme colonne d'une table, elle pourrait contenir une variable de type NUMBER dans une ligne, une variablede type VARCHAR2 dans une autre, une variable de type objet dans une troisime, etc.Il faut utiliser les mthodes associes pour insrer la valeur correspondant au type dsir sur chaque ligneSYS.ANYDATA.CONVERT...SYS.ANYDATA.ConvertNumber(1500) pour insrer une variable numriqueSYS.ANYDATA.ConvertVarchar2('Hello') pour insrer une variable caractreListe des fonctions de conversion

    ConvertNumber(num IN NUMBER) RETURN AnyData ConvertDate(dat IN DATE) RETURN AnyData ConvertChar(c IN CHAR) RETURN AnyData

  • Oracle PL/SQL par SheikYerbouti

    - 39 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    ConvertVarchar(c IN VARCHAR) RETURN AnyData ConvertVarchar2(c IN VARCHAR2) RETURN AnyData ConvertRaw(r IN RAW) RETURN AnyData ConvertBlob(b IN BLOB) RETURN AnyData ConvertClob(c IN CLOB) RETURN AnyData ConvertBfile(b IN BFILE) RETURN AnyData ConvertObject(obj IN "(object_type)") RETURN AnyData ConvertRef(rf IN REF "(object_type)") RETURN AnyData ConvertCollection(col IN "(COLLECTION_1)") RETURN AnyData

    Et les mthodes suivantes pour retrouver les valeurs insresnom_variable.GET...

    GetNumber(self IN AnyData, num OUT NOCOPY NUMBER) RETURN PLS_INTEGER GetDate(self IN AnyData, dat OUT NOCOPY DATE) RETURN PLS_INTEGER GetChar(self IN AnyData, c OUT NOCOPY CHAR) RETURN PLS_INTEGER GetVarchar(self IN AnyData, c OUT NOCOPY VARCHAR) RETURN PLS_INTEGER GetVarchar2(self IN AnyData, c OUT NOCOPY VARCHAR2) RETURN PLS_INTEGER GetRaw(self IN AnyData, r OUT NOCOPY RAW) RETURN PLS_INTEGER GetBlob(self IN AnyData, b OUT NOCOPY BLOB) RETURN PLS_INTEGER GetClob(self IN AnyData, c OUT NOCOPY CLOB) RETURN PLS_INTEGER GetBfile(self IN AnyData, b OUT NOCOPY BFILE) RETURN PLS_INTEGER GetObject(self IN AnyData, obj OUT NOCOPY "(object_type)") RETURN PLS_INTEGER GetRef(self IN AnyData, rf OUT NOCOPY REF "(object_type)") RETURN PLS_INTEGER GetCollection(self IN AnyData, col OUT NOCOPY "(collection_type)") RETURN PLS_INTEGER

    Le type ANYDATA supporte galement les mthodes suivantes:

    Procdure BEGINCREATE pour la cration d'un nouveau type Procdure membre PIECEWISE pour dfinir le mode d'accs la valeur courante Procdure membre SET... Pour positionner les valeurs Procdure membre ENDCREATE Pour terminer la cration d'un nouveau type Fonction membre GETTYPENAME Pour retrouver la dfinition complte du type Fonction membre GETTYPE Pour retrouver le type de l'objet

    SYS.ANYDATASETCe type contient la fois la description et un ensemble de donnes de mme type.Liste des fonctions attaches ce type

    Procdure membre ADDINSTANCE Pour l'ajout d'une nouvelle instance de donnes Procdure BEGINCREATE pour la cration d'un nouveau type Procdure membre PIECEWISE pour dfinir le mode d'accs la valeur courante Procdure membre SET... Pour positionner les valeurs Procdure membre ENDCREATE Pour terminer la cration d'un nouveau type Fonction membre GETTYPENAME Pour retrouver la dfinition complte du type Fonction membre GETTYPE Pour retrouver le type de l'objet Fonction membre GETINSTANCE Pour retrouver l'instance suivante Fonctions membre GET... Pour retrouver les valeurs Fonction membre GETCOUNT Pour retrouver le nombre d'instances du type

    Types XMLCes types sont utiliss pour stocker des objets XMLLe type XMLTYPE possde des fonctions membres pour insrer, extraire et interroger les donnes XML via lesexpressions de type XPATHPour manipuler les donnes XML, Oracle met disposition les fonctions

  • Oracle PL/SQL par SheikYerbouti

    - 40 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    XMLAGG XMLCOLATTVAL XMLCONCAT XMLDATA XMLELEMENT XMLFOREST XMLSEQUENCE XMLTRANSFORM

    Ainsi que les paquetages

    DBMS_XMLDOM DBMS_XMLGEN DBMS_XMLPARSER DBMS_XMLQUERY DBMS_XMLSAVE DBMS_XMLSCHEMA

    Les types URI (URITYPE, DBURITYPE, XDBURITYPE et HTTPURITYPE) permettent de grer les donnes sousforme d'URL.Pour manipuler les donnes XML, Oracle met disposition le paquetage URIFACTORYType SpatialMDSYS.SDO_GEOMETRYPour la manipulation d'objets Oracle SpatialTypes MEDIACes types sont utiliss pour stocker des objets multi-mdia avec Oracle interMediaORDSYS.ORDAUDIOPour le stockage de donnes audioORDSYS.ORDIMAGEPour le stockage des imagesORDSYS.ORDIMAGESIGNATUREPour le stockage des proprits des imagesORDSYS.ORDVIDEOPour le stockage des donnes vidoORDSYS.ORDDOCPour le stockage de tout type de donnes multi-mdia

    2.3 - Les Types et Sous-types dfinis par l'utilisateur

    En plus des types prdfinis, l'utilisateur peut dfinir ses propres types avec le mot cl TYPE ou SUBTYPE

    SUBTYPE nom_sous-type IS type_base[(prcision)] [NOT NULL]

    nom_sous-type reprsente le nom du sous-type dclartype_base reprsente le nom du type prdfiniprcision reprsente une longueur pour les caractres et longueur + dcimales pour les numriquesSUBTYPE chaine_courte IS VARCHAR2(10);le sous-type utilisateur chaine_courte dfinit un VARCHAR2(10) la suite de cette dfinition, toute dclaration de variable de type chaine_courte sera gale VARCHAR2(10)SUBTYPE chaine IS VARCHAR2(100);le sous-type utilisateur chaine dfinit un VARCHAR2(100)SUBTYPE chaine_longue IS VARCHAR2(1000);le sous-type utilisateur chaine_longue dfinit un VARCHAR2(1000)SUBTYPE NOM_EMP IS EMP.ename%Type;le sous-type NOM_EMP dfinit un type identique la colonne ename de la table EMPSUBTYPE REC_EMP IS EMP%ROWTYPE;

  • Oracle PL/SQL par SheikYerbouti

    - 41 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents,

    images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.http://sheikyerbouti.developpez.com/pl_sql/

    le sous-type REC_EMP dfinit un type identique une ligne de la table EMPTYPE tableau_numerique IS TABLE OF NUMBER;le type tableau_numerique dfinit un tableau de NUMBERTYPE TAB_REC_EMP IS TABLE OF REC_EMP;le type TAB_REC_EMP dfinit un tableau d'lments de type REC_EMPLorsque vos nouveaux types et sous-types sont dclars, vous pouvez les utiliser pour typer de nouvelles variables

    SQL> Declare 2 -- dfinition des types et sous-types 3 SUBTYPE chaine_courte IS VARCHAR2(10); 4 SUBTYPE chaine IS VARCHAR2(100); 5 SUBTYPE chaine_longue IS VARCHAR2(1000); 6 TYPE tableau_numerique IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; 7 SUBTYPE NOM_EMP IS EMP.ename%Type; 8 SUBTYPE REC_EMP IS EMP%ROWTYPE; 9 TYPE TAB_REC_EMP IS TABLE OF REC_EMP; 10 -- dfinition des variables 11 LC$cc chaine_courte; 12 LC$cl chaine_longue; 13 Tab tableau_numerique; 14 Begin 15 LC$cc := 'Court' ; 16 LC$cl := 'Chane beaucoup plus longue' ; 17 dbms_output.put_line( 'Chane longue = ' || LC$cl ) ; 18 For i in 1..5 Loop 19 Tab(i) := i + (.1 * i ) ; 20 dbms_output.put_line( 'Tab(' || Ltrim( To_char( i ) ) || ') = ' || To_char( Tab(i) ) ) ; 21 End loop ; 22 End ; 23 /Chane longue = Chane beaucoup plus longueTab(1) = 1,1Tab(2) = 2,2Tab(3) = 3,3Tab(4) = 4,4Tab(5) = 5,5

    Procdure PL/SQL termine avec succs.

    2.4 - Les littraux

    Un littral ou valeur constante dsigne une valeur fixe.Par exemple 'LUNDI', 'Montpellier', '2012' reprsentent des valeurs littrales de type caractre.12.3, 25 reprsentent des valeurs littrales de type numriqueCes valeurs peuvent apparatre dans des initialisations de variables, des calculs ou transmises des procduresou fonctions.

    2.4.1 - Littral de type caractre

    Dsigne une valeur fixe comme tant de type caractreLa valeur peut contenir n'importe quel caractre l'exception d'une simple apostrophe(pour saisir une apostrophe dans un littral, il faut la doubler (''))Il doit tre encadr d'une paire d'apostrophesIl peut tre prcd du caractre N pour indiquer qu'il doit tre transform dans le jeu de caractres nationalIl a les mmes proprits que les types CHAR et VARCHAR2Sa longueur ne peut pas dpasser 4000 octets'J''aime le PL/SQL''Cordialement''Select * From EMP'

  • Oracle PL/SQL par SheikYerbouti

    - 42 -Copyright 2004 SheikYerbouti. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents