Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/11/2011, 10h48   #1
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
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 :
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
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 11h06   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Comme souvent l'affichage de ce qui est exécuté vous donnera la réponse :
Code :
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 !
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 11h21   #3
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Ceci marche chez moi :

Code :
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;
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 12h59   #4
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Citation:
Envoyé par Waldar Voir le message
Comme souvent l'affichage de ce qui est exécuté vous donnera la réponse :
Code :
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 :
Citation:
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.
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 14h35   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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 :
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.
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2011, 08h25   #6
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Merci ca fonctionne !

par contre l'affichage via dbms_output ne fonctionne qu'une fois puis plus rien !
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h46.


 
 
 
 
Partenaires

Hébergement Web