IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[8.1.7.4.0] gérer des exceptions avec EXECUTE IMMEDIATE ?


Sujet :

Oracle

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [8.1.7.4.0] gérer des exceptions avec EXECUTE IMMEDIATE ?
    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 :
    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;
    Remarque : j'ai mis en commentaire les lignes où je voudrais gérer les exceptions.

    Merci.

    [EDIT]j'ai modifié l'en-tête de la déclaration car c'est une PROCEDURE et non une FUNCTION[/EDIT]
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Essaie :
    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
    24
    25
    CREATE OR REPLACE FUNCTION CNT (PC_table_name VARCHAR2) RETURN NUMBER 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); 
        BEGIN
           EXECUTE IMMEDIATE LC_sql_stmt INTO LN_nb_lignes; 
        EXCEPTION WHEN OTHERS THEN 
           DBMS_OUTPUT.PUT_LINE(LC_owner || ' -> NF'); 
        END; 
        DBMS_OUTPUT.PUT_LINE(LC_owner || ' => ' || LN_nb_lignes); 
      END LOOP; 
      CLOSE LCu_owners; 
    END;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    C'est exactement ça.
    Eh ben... merci plaineR
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [11g] Gérer des exceptions en dehors des procédures ?
    Par ctobini dans le forum SQL
    Réponses: 4
    Dernier message: 11/08/2014, 14h27
  2. gérer des exceptions
    Par artemis93 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 26/05/2011, 12h53
  3. problème pour gérer des exceptions
    Par slyfer dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 17/02/2009, 09h50
  4. Problème pour gérer des exceptions
    Par Jiyuu dans le forum GUI
    Réponses: 3
    Dernier message: 29/05/2008, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo