Tutorial Pl SQL

Embed Size (px)

Citation preview

  • Oracle PL/SQL

    par SheikYerbouti

    Date de publication : Avril 2004

    Dernire mise jour : Juillet 2004

    Dcouvrez le langage procdural d'Oracle

  • Introduction1 - Le bloc PL/SQL

    1.1 - La section dclarative1.2 - La section excution

    1.2.1 - Assignation1.2.2 - OPEN1.2.3 - OPEN FOR1.2.4 - CLOSE1.2.5 - COMMIT1.2.6 - EXECUTE IMMEDIATE1.2.7 - EXIT1.2.8 - FETCH1.2.9 - FORALL1.2.10 - GOTO1.2.11 - IF1.2.12 - CASE1.2.13 - FOR (curseur)1.2.14 - FOR, LOOP, WHILE1.2.15 - NULL1.2.16 - RAISE1.2.17 - RETURN1.2.18 - SAVEPOINT1.2.19 - ROLLBACK1.2.20 - SELECT INTO1.2.21 - Instruction SQL1.2.22 - Les curseurs explicites1.2.23 - Porte des variables

    1.3 - La section de gestion des erreurs2 - Les variables, types et littraux

    2.1 - Les variables2.2 - Types prdfinis

    2.2.1 - Types caractres2.2.2 - Types numriques2.2.3 - Types pour les grands objets2.2.4 - Types supplmentaires

    2.3 - Les Types et Sous-types dfinis par l'utilisateur2.4 - Les littraux

    2.4.1 - Littral de type caractre2.4.2 - Littral de type entier2.4.3 - Littral de type dcimal2.4.4 - Littral de type intervalle (9i)

    3 - Les fonctions natives3.1 - Les fonctions chanes de caractres3.2 - Les fonctions arithmtiques3.3 - Les fonctions de conversion et de transformation3.4 - Les fonctions sur les dates

    4 - Procdures, Fonctions et paquetages4.1 - Les Procdures4.2 - Les Fonctions4.3 - Les Paquetages4.4 - Fonctions sur des ensembles de lignes (PIPELINED) (9i)4.5 - Maintenance des objets procduraux

    5 - Collections et enregistrements5.1 - Dclarations et initialisation

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 5.2 - Accs aux lments d'une collection5.3 - Mthodes associes aux collections5.4 - Utilisation des collections avec les donnes issues de la base5.5 - Traitements en masse des collections5.6 - Les collections et enregistrements en paramtres des procdures et fonctions

    6 - Les dclencheurs6.1 - Les dclencheurs sur TABLE6.2 - Les dclencheurs sur VUE6.3 - Les dclencheurs sur vnements systme ou utilisateur

    6.3.1 - Les attributs6.3.2 - Les vnements systme6.3.3 - Les vnements utilisateur

    6.4 - Maintenance des dclencheurs7 - Le paquetage DBMS_OUTPUT8 - Le paquetage UTL_FILE

    8.1 - Procdures et fonctions du paquetage8.1.1 - Liste des procdures et fonctions version 8i8.1.2 - Liste des procdures et fonctions version 9i8.2 - Syntaxe des procdures et fonctions

    8.2.1 - IS_OPEN8.2.2 - FCLOSE8.2.3 - FCLOSE_ALL8.2.4 - FCOPY8.2.5 - FOPEN8.2.6 - FOPEN_NCHAR8.2.7 - FFLUSH8.2.8 - FGETATTR8.2.9 - FGETPOS8.2.10 - FREMOVE8.2.11 - FRENAME8.2.12 - FSEEK8.2.13 - GET_LINE8.2.14 - GET_LINE_NCHAR8.2.15 - GET_RAW8.2.16 - NEW_LINE8.2.17 - PUT8.2.18 - PUT_NCHAR8.2.19 - PUT_RAW8.2.20 - PUT_LINE8.2.21 - PUT_LINE_NCHAR8.2.22 - PUTF8.2.23 - PUTF_NCHAR

    8.3 - Exceptions gnres par le paquetage8.3.1 - Exceptions de la version 8i8.3.2 - Exceptions de la version 9i

    8.4 - Exemples concrets9 - Le paquetage DBMS_LOB

    9.1 - Procdures et fonctions du paquetage9.1.1 - Procdures et fonctions des versions 8i et 9i9.1.2 - Procdures de la version 9i9.1.3 - Procdures de la version 10g

    9.2 - Syntaxe des procdures et fonctions9.2.1 - APPEND9.2.2 - CLOSE9.2.3 - COMPARE

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 9.2.4 - CONVERTTOBLOB9.2.5 - CONVERTTOCLOB9.2.6 - COPY9.2.7 - CREATETEMPORARY9.2.8 - ERASE9.2.9 - FILECLOSE9.2.10 - FILECLOSEALL9.2.11 - FILEEXISTS9.2.12 - FILEGETNAME9.2.13 - FILEISOPEN9.2.14 - FILEOPEN9.2.15 - FREETEMPORARY9.2.16 - GETCHUNKSIZE9.2.17 - GETLENGTH9.2.18 - INSTR9.2.19 - ISOPEN9.2.20 - ISTEMPORARY9.2.21 - LOADFROMFILE9.2.22 - LOADBLOBFROMFILE9.2.23 - LOADCLOBFROMFILE9.2.24 - OPEN9.2.25 - READ9.2.26 - SUBSTR9.2.27 - TRIM9.2.28 - WRITE9.2.29 - WRITEAPPEND

    9.3 - Exceptions gnres par le paquetage9.4 - Exemples9.5 - Manipulations courantes des LOB de type caractres (CLOB)

    Index de rechercheRemerciements

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Introduction

    Tutoriel au format PDF

    Tlchargez le tutoriel au format PDF

    PL/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 capacit

    de traitement des donnes

    La gestion des curseurs et du traitement des erreurs accrot les possibilits de traitement

    Les instructions sont regroupes dans une unit appele bloc qui ne gnre qu'un accs la base

    Les 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 applications

    Indication au lecteur

    Cet ouvrage se situe entre le tutorial et le guide de rfrence

    Il n'a pas pour vocation de se substituer un ouvrage de formation l'usage du dbutant

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • La comprhension de cet article sous-entend des connaissances pralables en dveloppement(en gnral)et en SQL(en particulier)

    Versions des logiciels utiliss

    L'intgralit des exemples prsents dans l'article a t effectue avec la configuration suivante

    OS : Windows 2000 5.00.2195 service pack 3

    Noyau Oracle : Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

    Sql*Plus : SQL*Plus: Release 9.2.0.1.0 - Production

    Ce 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' 3 ans de prison et jusqu' 300 000 Ede domages 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-traiteles instructions 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' 3 ans de prison et jusqu' 300 000 Ede domages 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' 3 ans de prison et jusqu' 300 000 Ede domages 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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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' 3 ans de prison et jusqu' 300 000 Ede domages 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

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

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

    BEGINNull ;

    END ;

    Le mot cl BEGIN dtermine le dbut de la section des instructions excutables

    Le mot cl END; indique la fin de la section des instructions excutables

    Une seule instruction figure dans ce bloc : Null; qui ne gnre aucune action

    Ce bloc PL/SQL ne fait donc absolument rien !

    La section dclarative (facultative) d'un bloc dbute par le mot cl DECLARE

    Elle contient toutes les dclarations des variables qui seront utilises localement par la section excutable, ainsique leur ventuelle initialisation.

    DECLARELC$Chaine VARCHAR2(15) := 'Salut Monde' ;

    BEGINDBMS_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'cran

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Cette 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 EXCEPTION

    Elle contient le code excutable mis en place pour la gestion des erreurs

    Lorsqu'une erreur intervient dans l'excution, le programme est stopp et le code erreur est transmis cettesection

    DECLARELC$Chaine VARCHAR2(15) := 'Hello World' ;

    BEGINDBMS_OUTPUT.PUT_LINE( LC$Chaine ) ;

    EXCEPTIONWhen 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/SQL

    Les blocs PL/SQL peuvent tre imbriqus les uns dans les autres

    DECLARE#

    BEGINDECLARE

    #..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).

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Leur initialisation, facultative, s'effectue avec l'oprateur :=

    DECLARELN$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'excution

    Elle est dclare avec le mot cl : CONSTANT qui doit prcder le type

    DECLARELN$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' ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

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

    DeclareLC$Nom_emp EMP.ENAME%Type ;

    Cursor C_EMP IsSelect

    enameFrom

    EMPWhere

    Empno = 1014;

    BeginSelect

    enameInto

    LC$Nom_empFrom

    EMPWhere

    Empno = 1014;

    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 suivantes

    paramtres du curseur reprsente la liste des paramtres transmis au curseur

    le curseur doit avoir t pralablement dfini dans la section dclarative

    DeclareLC$Nom_emp EMP.ENAME%Type ;

    Cursor C_EMP ( LN$Numemp IN EMP.EMPNO%Type ) IsSelect

    enameFrom

    EMPWhere

    Empno = LN$Numemp;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • BeginOpen 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

    DeclareLC$Nom_emp EMP.ENAME%Type ;

    BeginOpen C_EMP For 'Select ename From EMP Where empno = 1024' ;Fetch C_EMP Into LC$Nom_emp ;Close C_EMP ;

    End ;

    1.2.4 - CLOSE

    Cette instruction est utilise pour fermer un curseur pralablement ouvert avec l'instruction OPEN

    CLOSE(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 latransaction

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Le mot cl WORK est facultatif et n'a aucun effet particulier

    Un 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

    - 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' 3 ans de prison et jusqu' 300 000 Ede domages 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 sortie

    Exit 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> Declare2 LN$Num pls_integer := 0 ;3 Begin4 Loop5 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 38 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> Declare2 LN$I pls_integer := 0 ;3 LN$J pls_integer := 0 ;4 Begin5 6 Loop7 LN$I := LN$I + 1 ;8 Loop9 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

    - 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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • nom curseur reprsente le nom d'un curseur pralablement ouvert avec l'instruction OPEN ou OPEN FOR

    nom variable curseur reprsente le nom d'une variable curseur

    nom 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 Select

    enregistrement reprsente le nom d'un enregistrement pralablement dfini dans la section dclarative qui doittre du mme type que la ligne ramene par l'instruction Select

    nom collection reprsente le nom d'une collection pralablement dfinie dans la section dclarative

    nom tableau hte reprsente le nom du tableau transmis par un programme tiers

    Si 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

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • variable index reprsente l'indice de la collection sur laquelle porte l'instruction FORALL

    borne dbut reprsente la valeur d'indice de dpart

    borne fin reprsente la valeur d'indice de fin

    instruction sql doit tre un ordre SQL de type INSERT, UPDATE ou DELETE

    (10g)

    FORALL i IN INDICES OF nom_collection

    permet 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

    Une instruction valide doit suivre la dclaration du label

    SQL> Declare

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 2 LN$I pls_integer := 0 ;3 LN$J pls_integer := 0 ;4 Begin5 Loop6 LN$I := LN$I + 1 ;7 Loop8 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 FALSE

    Seuls les mots cl IF et END IF; sont obligatoires. Les clauses ELSIF et ELSE sont facultatives

    SQL> Declare2 LN$I pls_integer := 0 ;3 LN$J pls_integer := 0 ;4 Begin5 Loop6 LN$I := LN$I + 1 ;7 Loop8 LN$J := LN$J + 1 ;9 If LN$J = 1 Then

    10 dbms_output.put_line( '1' ) ;11 Elsif LN$J = 2 Then12 dbms_output.put_line( '2' ) ;13 Else14 dbms_output.put_line( '3' ) ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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 SQL

    2 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;}...] ENDCASE [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. Dansl'affirmative, l'instruction suivant le mot cl THEN est excute, puis la structure CASE est quitte et l'excution duprogramme est reprise aprs le mot cl END CASE;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • SQL> Declare2 LN$Num pls_integer := 0 ;3 Begin4 Loop5 LN$Num := LN$Num + 1 ;6 CASE LN$Num7 WHEN 1 Then dbms_output.put_line( '1' ) ;8 WHEN 2 Then dbms_output.put_line( '2' ) ;9 WHEN 3 Then dbms_output.put_line( '3' ) ;

    10 ELSE11 EXIT ;12 END CASE ;13 End loop ;14 End ;15 /123

    Procdure PL/SQL termine avec succs.

    Exemple de CASE de recherche

    SQL> Declare2 LN$Num pls_integer := 0 ;3 Begin4 Loop5 LN$Num := LN$Num + 1 ;6 CASE7 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 WHEN

    Il 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 vrifie

    Pour le CASE de recherche, l'omission de la clause ELSE provoque une erreur

    SQL> Declare2 LN$Num pls_integer := 0 ;3 Begin4 Loop5 LN$Num := LN$Num + 1 ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 6 CASE7 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*

    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> Declare2 -- Dclaration du curseur3 CURSOR C_EMP IS4 Select5 *6 From7 EMP

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 8 Where9 job = 'CLERK'

    10 ;1112 Begin13 For Cur IN C_EMP Loop14 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 erreur

    Avec cette syntaxe, l'utilisation des instructions OPEN, FETCH et CLOSE est inutile

    Instruction FOR et curseur paramtr

    SQL> Declare2 -- Dclaration du curseur3 CURSOR C_EMP ( PC$Job IN EMP.job%Type ) IS4 Select5 *6 From7 EMP8 Where9 job = PC$Job

    10 ;1112 Begin13 For Cur IN C_EMP( 'SALESMAN' ) Loop14 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)

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Trois syntaxes sont possibles

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

    Cette syntaxe met en place une boucle simple ou aucune condition de sortie n'est indique

    Il faut donc une instruction EXIT pour sortir de ce type de boucle

    SQL> Declare2 LN$I pls_integer := 0 ;3 Begin4 Loop5 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

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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; neseront pas excutes

    SQL> Declare2 LN$I pls_integer := 0 ;3 Begin4 While LN$I < 35 Loop6 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'entre

    Variable index reprsente le nom de la variable qui servira d'indice. Cette variable ne ncessite pas de dfinitionpralable dans la section dclarative

    Reverse permet de faire varier l'indice dans le sens contraire (dcrmentation)

    borne dbut reprsente l'indice de dpart

    borne fin reprsente l'indice de fin

    SQL> Declare2 LN$I pls_integer := 0 ;3 Begin4 For i in 1..35 Loop6 dbms_output.put_line( to_char( i ) ) ;7 End loop ;8 End ;9 /

    123

    SQL> Declare2 LN$I pls_integer := 0 ;3 Begin4 For i in reverse 1..35 Loop6 dbms_output.put_line( to_char( i ) ) ;7 End loop ;8 End ;9 /

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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> Declare2 LN$I pls_integer := 0 ;3 LE$Fin exception ;4 Begin5 Loop6 LN$I := LN$I + 1 ;7 dbms_output.put_line( to_char( LN$I) ) ;8 If LN$I > 2 Then9 RAISE LE$Fin ;

    10 End if ;11 End loop ;12 Exception13 When LE$Fin Then14 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

    - 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' 3 ans de prison et jusqu' 300 000 Ede domages 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 SAVEPOINT

    Avec TO SAVEPOINT nom savepoint, l'annulation porte sur toutes les modifications effectues partir del'tiquette nom savepoint

    SQL> Begin2 Insert Into EMP( empno, ename, job )3 values( 9991, 'Dupontont', 'CLERK' ) ;4 Insert Into EMP( empno, ename, job )5 values( 9992, 'Duboudin', 'CLERK' ) ;67 SAVEPOINT mise_a_jour ;89 Update EMP Set sal = 2500 Where empno > 9990 ;

    10 ROLLBACK TO SAVEPOINT mise_a_jour ;1112 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 CLERK9992 Duboudin CLERK

    Dans cet exemple, une tiquette SAVEPOINT est place aprs les instructions d'insertion

    Un ROLLBACK TO SAVEPOINT est ajout aprs l'instruction de mise jour

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • puis un COMMIT est effectu

    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'estramene

    ou TOO_MANY_ROWS si plus d'une ligne sont ramenes

    Utilise avec la clause BULK COLLECT, elle permet de charger une collection avec les lignes ramenes

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • item reprsente un littrale ou un nom de colonne

    nom variable reprsente le nom d'une variable d'accueil. Son type doit tre identique celui de item

    nom record reprsente le nom d'un enregistrement compos de champs de mme type que les items ramens

    nom collection reprsente le nom d'une collection d'accueil

    nom tableau hte reprsente le nom de la variable tableau passe par un programme tiers

    rfrence table reprsente la liste des tables et/ou vues de l'ordre SQL

    sous-requte reprsente le texte d'une sous-requte SQL conforme

    suite instruction reprsente la suite de l'ordre Select (clauses Where, Group by, Order by, etc.)

    SQL> Declare2 LN$Num EMP.empno%Type ;3 LC$Nom EMP.ename%Type ;4 LC$Job EMP.job%Type ;5 Begin6 Select7 empno8 ,ename9 ,job

    10 Into11 LN$Num12 ,LC$Nom13 ,LC$Job14 From15 EMP16 Where17 empno = 736918 ;19 End ;20 /

    Procdure PL/SQL termine avec succs.

    Dans l'exemple suivant, aucun employ ne porte le numro 1

    la requte ne ramne donc aucune ligne et gnre l'exception NO_DATA_FOUND

    SQL> Declare2 LN$Num EMP.empno%Type ;3 LC$Nom EMP.ename%Type ;4 LC$Job EMP.job%Type ;5 Begin6 Select7 empno8 ,ename9 ,job

    10 Into11 LN$Num12 ,LC$Nom13 ,LC$Job14 From15 EMP16 Where17 empno = 118 ;19 End ;20 /Declare*

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • ERREUR la ligne 1 :ORA-01403: Aucune donne trouveORA-06512: ligne 7

    Dans l'exemple suivant, la clause WHERE a t retire

    la requte ramne donc plusieurs lignes et gnre l'exception TOO_MANY_ROWS

    SQL> Declare2 LN$Num EMP.empno%Type ;3 LC$Nom EMP.ename%Type ;4 LC$Job EMP.job%Type ;5 Begin6 Select7 empno8 ,ename9 ,job

    10 Into11 LN$Num12 ,LC$Nom13 ,LC$Job14 From15 EMP16 ;17 End ;18 /Declare*

    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> Declare2 LR$Emp EMP%Rowtype ;3 Begin4 Select5 *6 Into7 LR$Emp8 From9 EMP

    10 Where11 empno = 736912 ;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> Declare2 TYPE TYP_TAB_EMP IS TABLE OF EMP%Rowtype ;3 Tabemp TYP_TAB_EMP ;4 Begin5 Select6 *7 BULK COLLECT8 Into9 Tabemp

    10 From11 EMP12 ;13 For i IN Tabemp.first..Tabemp.last Loop14 dbms_output.put_line( To_char( Tabemp(i).empno ) || ' - ' || Tabemp(i).ename ) ;15 End loop ;16 End ;17 /

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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

    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 ordreSQL

    Un curseur explicite, contrairement au curseur implicite (SELECT INTO) est gr par l'utilisateur

    pour traiter un ordre Select qui ramne plusieurs lignes

    Tout curseur explicite gr dans la section excution doit avoir t dclar dans la section dclarative

    Dclaration

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • nom curseur reprsente le nom du curseur que l'on dclare

    dclaration des paramtres(facultatif) reprsente la liste des paramtres transmis au curseur

    instruction select reprsente l'ordre SQL Select d'alimentation du curseur

    SQL> Declare2 -- dclaration du curseur3 CURSOR C_EMP IS4 Select5 empno6 ,ename7 ,job8 From9 EMP

    10 ;11 -- variables d'accueil12 LN$Num EMP.empno%Type ;13 LC$Nom EMP.ename%Type ;14 LC$Job EMP.job%Type ;15 Begin16 Open C_EMP ; -- ouverture du curseur17 Loop -- boucle sur les lignes18 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne19 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne20 End loop ;21 Close C_EMP ; -- fermeture du curseur22 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 OPEN

    lu avec l'instruction FETCH

    et ferm avec l'instruction CLOSE

    Paramtres du curseur

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

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • nom paramtre reprsente le nom de la variable paramtre

    datatype 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> Declare2 -- dclaration du curseur3 CURSOR C_EMP ( PN$Num IN EMP.empno%Type )IS4 Select5 empno6 ,ename7 ,job8 From9 EMP

    10 Where11 empno = PN$Num12 ;13 -- variables d'accueil14 LN$Num EMP.empno%Type ;15 LC$Nom EMP.ename%Type ;16 LC$Job EMP.job%Type ;17 Begin18 Open C_EMP( 7369 ) ; -- ouverture du curseur avec passage du paramtre 736919 Loop20 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne21 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne22 dbms_output.put_line( 'Employ ' || To_char(LN$Num) || ' ' || LC$Nom ) ;23 End loop ;24 Close C_EMP ; -- fermeture du curseur25 Open C_EMP( 7521 ) ; -- ouverture du curseur avec passage du paramtre 752126 Loop27 Fetch C_EMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne28 Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne29 dbms_output.put_line( 'Employ ' || To_char(LN$Num) || ' ' || LC$Nom ) ;30 End loop ;31 Close C_EMP ; -- fermeture du curseur32 End ;33 /Employ 7369 SMITHEmploy 7521 WARD

    Procdure PL/SQL termine avec succs.

    Dclaration d'une variable curseur

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • nom variable curseur reprsente le nom de la variable curseur dclare

    nom type reprsente le nom d'un type curseur

    SQL> Declare2 TYPE TYP_REF_CUR IS REF CURSOR ;3 -- variable curseur4 CEMP TYP_REF_CUR ;5 -- variables d'accueil6 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 curseur11 Loop12 Fetch CEMP Into LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne13 Exit When CEMP%NOTFOUND ; -- sortie lorsque le curseur ne ramne plus de ligne14 End loop ;15 Close CEMP ; -- fermeture du curseur16 End ;17 /

    Procdure PL/SQL termine avec succs.

    Spcification d'un curseur

    Les attributs de curseur

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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

    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 estdonc locale au bloc PL/SQL

    SQL> Begin23 Declare4 LC$Ch1 varchar2(10) := 'Phrase 2';5 Begin6 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ;7 End ;89 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 1011 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 principal

    Dans 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> Declare2 LC$Ch1 varchar2(10) := 'Phrase 1';3 Begin45 Declare6 LC$Ch1 varchar2(10) := 'Phrase 2';7 Begin8 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ;9 End ;

    1011 dbms_output.put_line( 'LC$Ch1 = ' || LC$Ch1 ) ;1213 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'excution

    Une erreur survenue lors de l'excution du code dclenche ce que l'on nomme une exception. Le code erreurassoci est transmis la section EXCEPTION, pour vous laisser la possibilit de la grer et donc de ne pas mettrefin prmaturment l'application.

    Prenons l'exemple suivant :

    Nous souhaitons retrouver la liste des employs dont la date d'entre est infrieure au premier janvier 1970

    SQL> Declare2 LC$Nom EMP.ename%Type ;3 Begin4 Select empno5 Into LC$Nom6 From EMP7 Where hiredate < to_date('01/01/1970','DD/MM/YYYY') ;8 End ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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 la section 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_NULL ORA-06530 -6530CASE_NOT_FOUND ORA-06592 -6592COLLECTION_IS_NULL ORA-06531 -6531CURSOR_ALREADY_OPEN ORA-06511 -6511DUP_VAL_ON_INDEX ORA-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_MISMATCH ORA-06504 -6504SELF_IS_NULL ORA-30625 -30625STORAGE_ERROR ORA-06500 -6500SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532SYS_INVALID_ROWID ORA-01410 -1410TIMEOUT_ON_RESOURCE ORA-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'instructionRAISE

    DECLARELE$Fin Exception ;#

    Begin#..Raise LE$Fin ;

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • #EXCEPTION

    WHEN LE$Fin Then###.

    END ;

    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

    DECLARELE$Fin Exception ;

    BEGINDECLARE

    LE$Fin Exception ;BEGIN

    ...

    EXCEPTIONWHEN 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

    EXCEPTIONWHEN NO_DATA_FOUND Then

    ...

    WHEN OTHERS THENIf 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, Oracledclenche une erreur -6502. Nous allons "nommer" cette erreur en LE$trop_long et l'intercepter dans la sectionexception

    SQL> Declare2 LC$Chaine varchar2(10) ;3 LE$trop_long exception ;4 pragma exception_init( LE$trop_long, -6502 ) ;5 Begin6 LC$Chaine := rpad( ' ', 30) ;7 Exception8 when LE$trop_long then

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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

    SQL> Declare2 LC$Chaine varchar2(10) ;3 Begin4 LC$Chaine := rpad( ' ', 30) ;5 Exception6 when others then7 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 exception

    Une 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 cl

    BEGIN # EXCEPTION # END;

    Cela permet de traiter l'erreur et de continuer l'excution

    1 Declare2 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 Begin7 Begin8 LC$Chaine := LC$Ch1;9 Exception

    10 when LE$trop_long then11 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

    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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Procdure PL/SQL termine avec succs.

    Vous pouvez galement dfinir vos propres messages d'erreur avec la procdureRAISE_APPLICATION_ERROR

    DBMS_STANDARD.raise_application_error(numero_erreur, message[, {TRUE | FALSE}])

    numero_erreur reprsente un entier ngatif compris entre -20000 et -20999

    message reprsente le texte du message d'une longueur maximum de 2048 octets

    TRUE indique que l'erreur est ajoute la pile des erreurs prcedentes

    FALSE indique que l'erreur remplace toutes les erreurs prcdentes

    Du fait que cette procdure appartienne a un paquetage standard, il n'est pas ncessaire de prfixer cetteprocdure

    L'appel de la procdure raise_application_error ne peut tre excut que depuis une procdure stocke, etdclenche un retour immdiat au programme appelant en lui transmettant le code et le libell de l'erreur

    Propagation des exceptions

    Si 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

    - 42 -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' 3 ans de prison et jusqu' 300 000 Ede domages 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

    Oracle PL/SQL par SheikYerbouti

    - 43 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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 traite

    Puis la main est rendue au programme appelant

    Oracle PL/SQL par SheikYerbouti

    - 44 -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' 3 ans de prison et jusqu' 300 000 Ede domages 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 parents

    la main est rendue au programme appelant avec le code erreur

    Commentaires dans les blocs PL/SQL

    Pour mettre une ligne unique en commentaire, il faut la faire prcder d'un double tiret --

    -- cette ligne seule est un commentaire

    Pour mettre plusieurs lignes en commentaire, il faut les encadrer avec les symboles /* et */

    /* toutes les lignes suivantes

    sont en commentaire

    Oracle PL/SQL par SheikYerbouti

    - 45 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • elles ne seront ni compiles

    ni excutes

    */

    Oracle PL/SQL par SheikYerbouti

    - 46 -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' 3 ans de prison et jusqu' 300 000 Ede domages 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_INTEGER DEC 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 DAY TOSECOND(9i)

    INTERVAL YEARTO MONTH(9i)

    TIMESTAMP(9i) TIMESTAMP WITHLOCAL TIMEZONE(9i)

    TIMESTAMP WITHTIME ZONE(9i)

    Types compossRECORD TABLE VARRAY

    Types rfrencesREF CURSOR REF type_objet

    Types grands objetsBFILE BLOB CLOB NCLOB

    Oracle PL/SQL par SheikYerbouti

    - 47 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Typessuplmentaires

    SYS.ANYDATA SYS.ANYTYPE SYS.ANYDATASETXMLTYPE URITYPEMDSYS.SDO_GEOMETRYORDSYS.ORDAUDIO ORDSYS.ORDIMAGE ORDSYS.ORDVIDEO ORDSYS.ORDDOC ORDSYS.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

    %TYPE

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

    nom_variable nom_table.nom_colonne%TYPE ;

    nom_variable nom_variable_ref%TYPE ;

    %ROWTYPE

    rfrence une ligne d'une table ou d'un curseur

    nom_variable nom_table%ROWTYPE ;

    nom_variable nom_curseur%ROWTYPE ;

    Declare-- variable de mme type que le colonne ENAME de la table EMPLC$Nom EMP.ENAME%TYPE ;-- variable de mme type qu'une ligne de la table EMPLR$EMP EMP%ROWTYPE ;LC$Dat1 DATE ;

    Oracle PL/SQL par SheikYerbouti

    - 48 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • -- variable de mme type que LC$Dat1 (DATE)LC$Dat2 LC$Dat1%TYPE ;-- Curseur --Cursor C_EMP isSelect empno, ename, job From EMP ;-- variable de type ligne du curseur C_EMPLR$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 32767

    Ces 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)

    LONG

    Chane 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 RAW

    Identique au type LONG qui peut contenir des donnes binaires

    Oracle PL/SQL par SheikYerbouti

    - 49 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Jeux 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 32767

    Le nombre de caractres rellement stocks dpend du nombre d'octets utiliss pour coder chaque caractre

    UROWID, ROWID

    Permet de stocker l'adresse absolue d'une ligne dans une table sous la forme d'une chane de caractres

    Le format d'une telle variable est le suivant :

    000000FFFBBBBBBRRR

    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 ligne

    BBBBBB reprsente le numro du bloc dans le fichier

    RRR reprsente le numro de ligne dans le bloc

    2.2.2 - Types numriques

    Oracle PL/SQL par SheikYerbouti

    - 50 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • NUMBER[(e,d)]

    Nombre rel avec e chiffres significatifs stocks et d dcimales

    BINARY_INTEGER

    Nombre entier compris entre -2 147 483 647 et +2 147 483 647

    (Utilise les fonctions de la librairie arithmtique)

    (10g)BINARY_FLOAT

    Nombre virgule flottante simple prcision au format IEEE 754

    un littral de ce type est crit avec un f terminateur (ex. 3.125f)

    (10g)BINARY_DOUBLE

    Nombre virgule flottante double prcision au format IEEE 754

    un littral de ce type est crit avec un d terminateur (ex. 3.12548d)

    PLS_INTEGER

    Nombre 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

    BFILE

    Stocke la rfrence vers un fichier du systme d'exploitation

    BLOB

    Permet de stocker un objet binaire jusqu' 4 Go

    Oracle PL/SQL par SheikYerbouti

    - 51 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • CLOB

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

    NCLOB

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

    2.2.4 - Types supplmentaires

    SYS.ANYTYPE, SYS.ANYDATA

    Une variable de ce type peut contenir un objet de n'importe quel type scalaire ou objet

    Dfinie comme colonne d'une table, elle pourrait contenir une variable de type NUMBER dans une ligne, unevariable de 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 ligne

    SYS.ANYDATA.CONVERT...

    SYS.ANYDATA.ConvertNumber(1500) pour insrer une variable numrique

    SYS.ANYDATA.ConvertVarchar2('Hello') pour insrer une variable caractre

    Liste des fonctions de conversion

    ConvertNumber(num IN NUMBER) RETURN AnyData ConvertDate(dat IN DATE) RETURN AnyData ConvertChar(c IN CHAR) RETURN AnyData 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

    Oracle PL/SQL par SheikYerbouti

    - 52 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Et les mthodes suivantes pour retrouver les valeurs insres

    nom_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.ANYDATASET

    Ce 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 XML

    Oracle PL/SQL par SheikYerbouti

    - 53 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Ces types sont utiliss pour stocker des objets XML

    Le type XMLTYPE possde des fonctions membres pour insrer, extraire et interroger les donnes XML via lesexpressions de type XPATH

    Pour manipuler les donnes XML, Oracle met disposition les fonctions

    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 URIFACTORY

    Type Spatial

    MDSYS.SDO_GEOMETRY

    Pour la manipulation d'objets Oracle Spatial

    Types MEDIA

    Oracle PL/SQL par SheikYerbouti

    - 54 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Ces types sont utiliss pour stocker des objets multi-mdia avec Oracle interMedia

    ORDSYS.ORDAUDIO

    Pour le stockage de donnes audio

    ORDSYS.ORDIMAGE

    Pour le stockage des images

    ORDSYS.ORDIMAGESIGNATURE

    Pour le stockage des proprits des images

    ORDSYS.ORDVIDEO

    Pour le stockage des donnes vido

    ORDSYS.ORDDOC

    Pour 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 dclar

    type_base reprsente le nom du type prdfini

    prcision reprsente une longueur pour les caractres et longueur + dcimales pour les numriques

    SUBTYPE 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)

    Oracle PL/SQL par SheikYerbouti

    - 55 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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 EMP

    SUBTYPE REC_EMP IS EMP%ROWTYPE;

    le sous-type REC_EMP dfinit un type identique une ligne de la table EMP

    TYPE tableau_numerique IS TABLE OF NUMBER;

    le type tableau_numerique dfinit un tableau de NUMBER

    TYPE TAB_REC_EMP IS TABLE OF REC_EMP;

    le type TAB_REC_EMP dfinit un tableau d'lments de type REC_EMP

    Lorsque vos nouveaux types et sous-types sont dclars, vous pouvez les utiliser pour typer de nouvelles variables

    SQL> Declare2 -- dfinition des types et sous-types3 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 variables11 LC$cc chaine_courte;12 LC$cl chaine_longue;13 Tab tableau_numerique;14 Begin15 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 Loop19 Tab(i) := i + (.1 * i ) ;20 dbms_output.put_line( 'Tab(' || Ltrim( To_char( i ) ) || ') = ' || To_char( Tab(i) ) ) ;21 End loop ;

    Oracle PL/SQL par SheikYerbouti

    - 56 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 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 numrique

    Ces 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 caractre

    La 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'apostrophes

    Il peut tre prcd du caractre N pour indiquer qu'il doit tre transform dans le jeu de caractres national

    Il a les mmes proprits que les types CHAR et VARCHAR2

    Sa longueur ne peut pas dpasser 4000 octets

    'J''aime le PL/SQL'

    'Cordialement'

    'Select * From EMP'

    2.4.2 - Littral de type entier

    Oracle PL/SQL par SheikYerbouti

    - 57 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Dsigne une valeur fixe comme tant de type entier

    Ne peut contenir que les chiffres de 0 9

    Il peut tre prcd des signes + ou -

    Il peut contenir jusqu' 38 chiffres de prcision

    -12

    267589

    +3

    2.4.3 - Littral de type dcimal

    Dsigne une valeur fixe comme tant de type numrique

    Ne peut contenir que les chiffres de 0 9

    Il peut tre prcd des signes + ou -

    Il peut contenir jusqu' 38 chiffres de prcision

    Il peut contenir le caractre e ou E qui indique que la valeur est spcifie en notation scientifique. Les chiffresaprs le E indiquent l'exposant. Ce dernier est valide dans un intervalle de -130 125

    -54

    +3.1415

    0.006

    75E-12

    2.4.4 - Littral de type intervalle (9i)Nouveaut 9i Spcifie une priode de temps, dcline en annes et mois ou en jours, heures, minutes etsecondes.

    Les deux types de littraux de type intervalle sont YEAR TO MONTH et DAY TO SECOND

    Chaque type contient un prfixe et peut contenir un suffixe. Le prfixe dsigne l'unit de base de date ou d'heure.Le suffixe dfinit les parties d'incrment associes l'unit de base.

    Oracle PL/SQL par SheikYerbouti

    - 58 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Si vos donnes sont sous forme numrique, vous pouvez utiliser les fonctions de conversionNUMTOYMINTERVAL ou NUMTODSINTERVAL pour les convertir en littraux de type intervalle.

    INTERVAL 'nombre_entier [-nombre_entier]' YEAR ou MONTH (prcision) TO YEAR ou MONTH

    Nombre_entier [-nombre_entier] spcifie une valeur entire pour le prfixe et ventuellement le suffixe du littral. Sile prfixe est YEAR et le suffixe est MONTH, nombre_entier pour le mois doit tre entre 0 et 11

    Prcision reprsente le nombre maximum de chiffres pour le prfixe compris entre 0 et 9. Par dfaut sa valeur est2

    INTERVAL '12-3' YEAR TO MONTH : intervalle de 12 ans et 3 mois

    INTERVAL '115' YEAR(3) : intervalle de 115 ans (la prcision du suffixe doit tre spcifie YEAR(3) si elle estsuprieure la valeur par dfaut)

    INTERVAL '24' MONTH : intervalle de 24 mois

    Il est possible d'additionner ou soustraire un littral de type intervalle un autre

    INTERVAL '6-4' YEAR TO MONTH - INTERVAL '6' MONTH

    Intervalle de type DAY TO SECOND

    INTERVAL 'nombre_entier' DAY ou HOUR ou MINUTE ou SECOND (prcision) TO DAY ou HOUR ouMINUTE ou SECOND (fractions de secondes)

    Nombre_entier peut reprsenter soit :

    Un nombre de jours

    Une heure au format HH[ :MI[ :SS[.fractions_de_secondes]]]

    Oracle PL/SQL par SheikYerbouti

    - 59 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • Prcision reprsente le nombre de chiffres du prfixe, compris entre 0 et 9. Par dfaut sa valeur est 2

    Fractions_de_secondes reprsente le nombre de chiffres des fractions de secondes, compris entre 1 et 9. Pardfaut sa valeur est 6

    Les valeurs correctes pour les champs sont :

    HOUR 0 23

    MINUTE 0 59

    SECOND 0 59.999999999

    INTERVAL '6 4 :10 :22.356' DAY TO SECOND(3) : intervalle de 6 jours, 4 heures, 10 minutes, 22 secondes et 356millimes de secondes

    INTERVAL '6 4 :10' DAY TO MINUTE : intervalle de 6 jours, 4 heures et 10 minutes

    INTERVAL '365 12' DAY(3) TO HOUR : intervalle de 365 jours et 12 heures

    INTERVAL '8 :10 :20.3333333' HOUR TO SECOND(7) : Intervalle de 8 heures, 10 minutes, 20.3333333 secondes

    INTERVAL '18 :30' HOUR TO MINUTE : intervalle de 18 heures et 30 minutes

    INTERVAL '20' MINUTE : intervalle de 20 minutes

    INTERVAL '4.12345' SECOND(2,4) : intervalle arrondi 4.1235 secondes car la prcision demande sur lesfractions de secondes est de 4 chiffres

    Il est possible d'additionner ou soustraire un littral de type intervalle un autre

    INTERVAL '30' DAY - INTERVAL '18' HOUR

    Oracle PL/SQL par SheikYerbouti

    - 60 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • 3 - Les fonctions natives

    Ces fonctions SQL ne sont pas propres au PL/SQL et ne sont donc pas dveloppes outre mesure dans cechapitre,

    notamment au niveau des formats et littraux utilisables.

    Reportez-vous la documentation SQL pour davantage de prcisions

    3.1 - Les fonctions chanes de caractres

    2 syntaxes :

    chane || chane

    CONCAT( chane, chane )

    Ces fonctions formatent une chane sur une longueur donne par ajout de caractres avant (LPAD) ou aprs(RPAD) la chane passe en argument

    LPAD( chane, longueur [, 'caractres'] )

    RPAD( chane, longueur [, 'caractres'] )

    chane reprsente le nom d'une colonne, d'une variable ou un littral

    longueur reprsente le nombre total de caractres du rsultat

    caractres reprsente le ou les caractres de remplissage

    RPAD( 'Total', 20, '.' )Total...............

    LPAD( 'Hello', 20, '.' )...............Hello

    RPAD( LPAD( '2320 euros', 20, '*' ), 30, '*' )**********2320 euros**********

    LPAD( 'Hello', 20, '-*-' )

    Oracle PL/SQL par SheikYerbouti

    - 61 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • -*--*--*--*--*-Hello

    Si caractres n'est pas spcifi, le caractre par dfaut est l'espace (CHR(32))

    LTRIM( chane [, 'caractres'] )

    RTRIM( chane [, 'caractres'] )

    LTRIM( '"Libell', '"' )Libell

    RTRIM( 'Libell----', '-' )Libell

    LTRIM( RTRIM( '"Libell"', '"' ), '"' )Libell

    si caractres n'est pas spcifi, le caractre par dfaut est l'espace (CHR(32))

    RTRIM( '(Libell ') || ')'(Libell)

    TRIM

    Cette fonction permet de cumuler les possibilits de LTRIM et RTRIM

    chane reprsente la chane de caractres en entre de la fonction

    si LEADING est spcifi, tous les premiers caractres identiques caractre sont supprims

    si TRAILING est spcifi, tous les derniers caractres identiques caractre sont supprims

    si BOTH ou rien est spcifi, tous les premiers et derniers caractres identiques caractre sont supprims

    si caractre n'est pas spcifi la valeur par dfaut est l'espace

    Oracle PL/SQL par SheikYerbouti

    - 62 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • si seule chane est spcifie tous les espaces en dbut et fin de chane sont supprims

    si caractre ou chane est NULL, la fonction retourne NULL

    SQL> Declare2 LC$Ch1 Varchar(20) := ' libell ' ;3 LC$Ch2 Varchar(20) := '***libell***' ;4 Begin5 dbms_output.put_line( TRIM( LC$Ch1 ) ) ;6 dbms_output.put_line( TRIM( '*' FROM LC$Ch2 ) ) ;7 End ;8 /

    libelllibell

    Procdure PL/SQL termine avec succs.

    LOWER( chane )

    NLS_LOWER( chane [, nls_paramtre ] )

    UPPER( chane )

    NLS_UPPER( chane [, nls_paramtre ] )

    INITCAP( chane )

    NLS_INITCAP( chane [, nls_paramtre ] )

    -- Conversion d'une chane en minusculesLOWER( 'ORACLE' )oracle

    -- Conversion d'une chane en majusculesUPPER( 'oracle' )ORACLE

    -- Conversion d'une chane avec la premire lettre de chaque mot en majusculeINITCAP( 'le sgbd oracle' )Le Sgbd Oracle

    LENGTH( chane )

    LENGTH( 'le sgbd oracle' )14

    SUBSTR( chane, dbut [, 'nombre'] )

    Oracle PL/SQL par SheikYerbouti

    - 63 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • chane reprsente le nom d'une colonne, d'une variable ou un littral

    dbut reprsente la position de dpart de recherche dans la chane

    nombre reprsente le nombre de caractres extraire

    -- extraction de 4 caractres partir du 4me caractreSUBSTR( 'le sgbd oracle', 4, 4 )sgbd

    si nombre est omis, la fonction ramne tous les caractres partir de la position dbut

    SUBSTR( 'le sgbd oracle', 4 )sgbd oracle

    si nombre est ngatif l'extraction dbute partir de la fin de la chane

    SUBSTR( 'le sgbd oracle', -6 )oracle

    INSTR( chane, sous-chane [, dbut [,nombre occurrences] ] )

    INSTRB( chane, sous-chane [, dbut [,nombre occurrences] ] )

    chane reprsente le nom d'une colonne, d'une variable ou un littral pass en argument

    sous-chane reprsente le nom d'une variable ou un littral dont on cherche la position

    dbut (optionnel) reprsente la position de dpart de la recherche dans chane

    nombre occurrences (si dbut renseign) reprsente le nombre d'occurrences trouves ignorer

    Lorsque sous-chane reprsente plusieurs caractres, la fonction retourne la position du premier caractre de lasous-chane

    recherche de la premire position de la sous-chane oracle

    INSTR( 'le sgbd oracle', 'oracle' )9

    recherche de la deuxime position de la sous-chane oracle

    INSTR( 'le sgbd oracle d''oracle corporation', 'oracle', 1, 2 )18

    Oracle PL/SQL par SheikYerbouti

    - 64 -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' 3 ans de prison et jusqu' 300 000 Ede domages et intrts.

    http://sheikyerbouti.developpez.com/pl_sql/

  • si la sous-chane n'est pas trouve, la fonction retourne 0

    INSTR( 'le sgbd oracle d''oracle corporation', 'texte', 1, 2 )0

    REPLACE( chane, chane source, chane cible )

    chane reprsente le nom d'une colonne, d'une variable ou un littral pass en argument

    chane source reprsente le nom d'une variable ou un littral de recherche

    chane cible reprsente le nom d'une variable ou un littral de remplacement

    REPLACE( 'banjaur', 'a', 'o' )bonjour

    Elimination de caractres

    REPLACE( '"champs1","champs2"', '"', '' )champs1,champs2

    TRANSLATE( chane, chane source, chane cible )

    chane reprsente le nom d'une colonne, d'une variable ou un littral pass en argument

    chane source reprsente le nom d'une variable ou un littral de recherche

    chane cible reprsente le nom d'une variable ou un littral de remplacement

    Chaque caractre prsent dans chane qui est galement prsent dans chane source est remplac

    par le caractre qui occupe la mme position dans chane cible

    TRANSLATE( 'Pas d''accents : ', '', 'eeauoo' )Pas d'accents : eeauoo

    Dans l'exemple suivant, le caractre _ est remplac par _ et tous les autres (interdit sous Unix)

    sont galement remplacs par _

    Oracle PL/SQL par SheikYerbouti

    - 65