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

PL/SQL Oracle Discussion :

Équivalent de IF EXIST en PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut Équivalent de IF EXIST en PL/SQL
    Bonjour,

    En faisant des recherche, je suis tombé sur cette page :
    https://forums.oracle.com/forums/thr...hreadID=319710

    J'ai décidé d'appliquer la dernière proposition postée malheureusement je n'est pas l'impression que mon IF fonctionne ! J'ai toujours une erreur si la table existe déjà.

    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 Package
    CREATE OR REPLACE PACKAGE pkg IS
      -- Create Table
      PROCEDURE create_table (p_table_name IN VARCHAR2 );
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY pkg IS
      PROCEDURE create_table ( p_table_name IN VARCHAR2) IS
     
          l_table_name VARCHAR2(30);
          l_test NUMBER;
     
      BEGIN
        l_table_name := dbms_asset.simple_sql_name(p_table_name);
     
          EXECUTE IMMEDIATE 'SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper(' || l_table_name || ')' INTO l_test;
     
        IF l_test = 0 THEN
         EXECUTE IMMEDIATE 'CREATE TABLE ' || l_table_name || ' AS SELECT * FROM v$session';
     
        END IF;
    END;
     
    END;
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Comme souvent l'affichage de ce qui est exécuté vous donnera la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        l_exec := 'SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper(' || l_table_name || ')';
        dbms_output.put_line(l_exec);
     
    ...
     
    begin pkg.create_table('tutu'); end;
     
    SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper(tutu)
    Je vous laisse trouver l'erreur !

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Ceci marche chez moi :

    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
    26
    27
    28
    29
    DECLARE
          --l_table_name VARCHAR2(30);
          lv_query       varchar2(4000);
          l_test         NUMBER;
          lv_table       varchar2(30) := 'TABLE_QUI_EXISTE_PAS';
     
      BEGIN
        --l_table_name := dbms_asset.simple_sql_name(p_table_name);
        lv_query := ' ';
        lv_query :=  lv_query || ' SELECT count(table_name)' ;
        lv_query :=  lv_query || ' FROM all_tables' ;
        lv_query :=  lv_query || ' WHERE upper(table_name) = upper(:1)' ;
     
        EXECUTE IMMEDIATE lv_query 
                          INTO  l_test
                          USING lv_table;
     
        IF l_test = 0 THEN
           lv_query := ' ';
           lv_query :=  lv_query || ' CREATE TABLE ' || lv_table;
           lv_query :=  lv_query || ' AS SELECT * FROM v$session ';
     
           EXECUTE IMMEDIATE lv_query ;
     
           DBMS_OUTPUT.put_line('Existe pas');
        ELSE 
           DBMS_OUTPUT.put_line('Existe');
        END IF;
    END;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Comme souvent l'affichage de ce qui est exécuté vous donnera la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        l_exec := 'SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper(' || l_table_name || ')';
        dbms_output.put_line(l_exec);
     
    ...
     
    begin pkg.create_table('tutu'); end;
     
    SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper(tutu)
    Je vous laisse trouver l'erreur !
    dbms_output.put_line ne fonctionne pas chez moi :$ Mais je pense savoir ce que vous voulez me montrer. Il manque les simples quotes autour de ma variable ?
    Si le problème vient de la je ne vois pas comment faire. J'ai essayé en mettant des ''' mais sans résultat.


    ORA-007 :
    lv_query := ' ';
    lv_query := lv_query || ' SELECT count(table_name)' ;
    lv_query := lv_query || ' FROM all_tables' ;
    lv_query := lv_query || ' WHERE upper(table_name) = upper(:1)' ;

    EXECUTE IMMEDIATE lv_query
    INTO l_test
    USING lv_table;
    Cette partie ne fonctionne pas chez moi !J'ai toujours la même erreur.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par alex_972 Voir le message
    Mais je pense savoir ce que vous voulez me montrer. Il manque les simples quotes autour de ma variable ?

    Si le problème vient de la je ne vois pas comment faire. J'ai essayé en mettant des ''' mais sans résultat.
    Oui c'est bien ça. Il faut bien compter le nombre de quote :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    l_exec := 'SELECT count(table_name) FROM tabs WHERE table_name = upper(''' || l_table_name || ''')';
    dbms_output.put_line('-- ' || l_exec);
     
    -- SELECT count(table_name) FROM tabs WHERE upper(table_name) = upper('tutu')
    Quand vous dites dbms_output ne fonctionne pas, ça provoque une erreur ou ça n'affiche rien ?
    Si c'est le dernier problème, placez DBMS_OUTPUT.ENABLE dans votre fonction.

    À noter car c'est important, je vous ai montré où était votre erreur, mais la bonne manière de développer est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(table_name) INTO l_test
      FROM tabs
     WHERE table_name = upper(l_table_name);
    Pour le create table, pas le choix par contre, il faut utiliser du SQL dynamique avec EXECUTE IMMEDIATE.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Merci ca fonctionne !

    par contre l'affichage via dbms_output ne fonctionne qu'une fois puis plus rien !

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

Discussions similaires

  1. Utilisation de la clause exists dans proc sql
    Par enicnath dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/09/2013, 16h11
  2. Équivalent du profiling "postgres -s" en SQL ?
    Par kedare dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 26/08/2009, 23h38
  3. Quelle est l'équivalent de cette fonction en PL/SQL ?
    Par alichoupi dans le forum PL/SQL
    Réponses: 11
    Dernier message: 15/06/2009, 11h00
  4. [DOM] L'équivalent de innerHtml existe-t-il sans parser ?
    Par zefrit dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2005, 19h08
  5. [Syntaxe SQL]Un équivalent de "IF EXISTS" ?
    Par Quentin dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/03/2005, 18h09

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