Salut tout le monde,
Je débute en PL/SQL et je cherche à écrire une procédure contenant une requête SQL dynamique avec gestion d'exceptions.
En lisant l'article, technique et très complet, de SheikYerbouti sur EXECUTE IMMEDIATE, j'ai réussi à écrire la fonction mais il me manque la gestion des exceptions.
D'où ma question : est-il possible de gérer les exceptions avec EXECUTE IMMEDIATE ?
Pour information voici ma fonction actuelle dont le but est de lister le nombre de lignes d'une table fournie en paramètre pour chaque owner du schéma :Remarque : j'ai mis en commentaire les lignes où je voudrais gérer les exceptions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE OR REPLACE PROCEDURE CNT (PC_table_name VARCHAR2) IS LC_sql_stmt VARCHAR2(250); LN_nb_lignes NUMBER(8); CURSOR LCu_owners IS SELECT DISTINCT USERNAME FROM ALL_USERS ORDER BY 1; LC_owner ALL_USERS.USERNAME%TYPE; BEGIN OPEN LCu_owners; LOOP FETCH LCU_owners INTO LC_owner; EXIT WHEN LCu_owners%NOTFOUND; DBMS_OUTPUT.PUT_LINE('owner -> ' || LC_owner); LC_sql_stmt := ' SELECT COUNT(*) AS ' || UPPER(PC_table_name) || ' FROM ' || LC_owner || '.' || UPPER(PC_table_name); EXECUTE IMMEDIATE LC_sql_stmt INTO LN_nb_lignes; -- EXCEPTION WHEN OTHERS THEN -- DBMS_OUTPUT.PUT_LINE(LC_owner || ' -> NF'); DBMS_OUTPUT.PUT_LINE(LC_owner || ' => ' || LN_nb_lignes); END LOOP; CLOSE LCu_owners; END;
Merci.
[EDIT]j'ai modifié l'en-tête de la déclaration car c'est une PROCEDURE et non une FUNCTION[/EDIT]
Partager