Rappels syntaxiques : -------------------- 1. Déclarations et initialisations (ex) ======================================== DECLARE v_utilisateur VARCHAR2(35) := USER; v_notnull INTEGER NOT NULL := 1; v_def INTEGER DEFAULT 1; 2. %TYPE (ex) ============ DECLARE v_Nom Etudiants.Nom%TYPE; 3. %ROWTYPE (ex) ================ DECLARE v_Etudiant Etudiants%ROWTYPE; 4. Ecrire dans SQL*Plus (ex) ============================ SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE('Le client n°2 : '||v_Client.RefClient||v_Client.NomClient); END; 5. SELECT INTO =============== SELECT ... INTO ... FROM ... WHERE ...; 6. Fonctions utiles Oracle ========================== CAST (expression AS type) COALESCE(variable_ou_champ,valeur_si_null) 7. Structures de controle et boucles ===================================== - IF condition THEN traitement1 ELSE traitement2 END IF; - IF condition THEN traitement1 ELSIF condition THEN traitement2 END IF; - CASE expression WHEN valeur1 THEN .... WHEN valeur2 THEN .... ELSE ... END CASE; - CASE WHEN condition THEN ... ELSE ... END CASE; - LOOP ... EXIT WHEN condition END LOOP; - WHILE condition LOOP ... END LOOP; - FOR v_iterateur IN borneInf..borneSup LOOP ... END LOOP; 8. Exceptions ============= PRAGMA EXCEPTION_INIT(exception_utilisateur,erreur_oracle); -- Pour les erreurs définies redirigées monException EXCEPTION; -- Dans le bloc de déclaration RAISE monException; -- Lance l'exception WHEN OTHERS THEN ... -- Traitement pour les exceptions non définies/non traitées 9. Exceptions spécifiques (analyse SQLCODE) ========================================== Exception Erreur ORACLE Valeur du SQLCODE DUP_VAL_ON_INDEX ORA-00001 -1 NO_DATA_FOUND ORA-01403 +100 10. Tableaux et Rowtype ======================= Associatif : TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size_limit)]; -- Indice non consécutif Imbriqué : TYPE type_name IS TABLE OF element_type [NOT NULL]; -- Indice consécutif Prédimensionné : TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL]; -- Indice consécutif nomCollection.first : indice du premier élément si c'est un tableau imbriqué/prédimensionné nomCollection.last : idem pour le dernier élément nomCollection.count : donne le nombre d'objets nomCollection == NULL : tableau non instancié (dans le cas d'un imbriqué par exemple) EXTEND : étend une table imbriquée TRIM : diminuer la taille DELETE : supprimer tous les éléments d'une collection (ex : PckLimitSection.TabAnsco.delete;) SELECT * BULK COLLECT INTO table_imbriquee FROM...; UPDATE ... SET ... WHERE .... RETURNING x,y,z INTO ....; -- Returning fonctionne aussi avec INSERT et DELETE -- Insertion d'un rowtype INSERT INTO agenda VALUES r_agenda; -- Mise à jour d'un rowtype UPDATE agenda SET ROW = r_agenda WHERE userid = 456; 11. Records =========== Table imbriquée peut etre atomically null 12. Procédures =============== CREATE PROCEDURE nom (param1 IN type) IS -- variables eventuelles BEGIN ... END; CREATE OR REPLACE FUNCTION nom (param1 IN type) RETURN type IS -- variables eventuelles BEGIN ... END; IN, OUT, IN OUT, NOCOPY -- Paramètres d'entrée sortie et de non-copie RAISE_APPLICATION_ERROR(-20001,'Message_d_erreur'); -- Lancer une exception avec message PRAGMA AUTONOMOUS_TRANSACTION ; -- Pour procédures autonomes 13. Packages ============ CREATE OR REPLACE PACKAGE nom AS BEGIN … END nom; CREATE OR REPLACE PACKAGE BODY nom AS END nom; 14. Fonctions autonomes ======================= PRAGMA RESTRICT_REFERENCES(nom_fonction,WNDS); RNDS : on vérifie qu'on ne fera pas de lecture dans la base de données RNPS : on vérifie qu’on ne lira pas de variables d'un package WNDS : on s'assure qu'on n'écrira pas dans la BDD WNPS : on s'assure qu’on n’écrira pas dans une var. d'un package. 15. Curseurs ============= DECLARE CURSOR nom IS expression_de_selection; FETCH nom_curseur INTO liste_variable | record; FETCH nom_curseur BULK COLLECT INTO collection; CLOSE nom_curseur; -- Si curseur non-ouvert => exception Attributs: curseur%found TRUE si fetch a extrait un tuple curseur%notfound TRUE si fetch n'a pas extrait curseur%isopen TRUE si ouvert curseur%rowcount Nbre de tuples déjà extraits Curseurs for implicites: FOR client IN (expression_selection) LOOP ... END LOOP; -- Close automatique dans end loop END; Curseurs for explicites: DECLARE CURSOR lesClients IS expression_selection BEGIN FOR unClient IN lesClients LOOP ... END LOOP ; END ; 16. SQL%NOTFOUND ================ Si rien n'a été trouvé (ex: pour un delete) 17. Triggers =========== CREATE TRIGGER nom_déclencheur BEFORE | AFTER | INSTEAD OF DELETE | INSERT | UPDATE [ OF liste_colonne ] ON nom_table | nom_vue [ FOR EACH ROW ] [ WHEN condition ] [ bloc pl/sql ] ; :NEW.xxxx -- Pour triggers ligne :OLD.xxxx -- Pour triggers ligne