Bonjour,
Quelqu'un a t'il une astuce pour éviter l'erreur 942 lors d'un drop table si celle ci n'existe pas (c'est a dire avoir l'équivalent du if existe en sql serveur)
Si vous avec une procedure ou un exemple, merci de me les donner
Bonjour,
Quelqu'un a t'il une astuce pour éviter l'erreur 942 lors d'un drop table si celle ci n'existe pas (c'est a dire avoir l'équivalent du if existe en sql serveur)
Si vous avec une procedure ou un exemple, merci de me les donner
pour savoir si la table existe ou non, regardez dans la vue user_tables.
Puis vous pourrez faire votre drop table si elle existe bien evidement
faire un select pour voir si la table existe dans la user_table ok, c'est simple mais faire un drop .. if .... , cela se corse
auriez vous un exemple de script ou procédure ?
merci d'avance
Voila une routine rudimentaire qu'il convient d'améliorer ( notament en l'intégrant à une procédure ) :
Bon courage
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 SQL> create table dvp ( a number ) ; Table créée. SQL> set serveroutput on ; SQL> declare 2 temp number ; 3 tab_supp varchar2(30) := 'DVP'; 4 begin 5 select count (table_name) into temp from user_tables where table_name =tab_supp; 6 if temp = 0 7 then 8 dbms_output.put_line ('table non presente') ; 9 else 10 execute immediate 'drop table '||tab_supp; 11 dbms_output.put_line ('table suivante a été supprimer'|| tab_supp) ; 12 end if ; 13 dbms_output.put_line (temp) ; 14 end ; 15 16 / table suivante a été supprimerDVP 1 Procédure PL/SQL terminée avec succès. SQL> set serveroutput on ; SQL> declare 2 temp number ; 3 tab_supp varchar2(30) := 'DVP'; 4 begin 5 select count (table_name) into temp from user_tables where table_name =tab_supp; 6 if temp = 0 7 then 8 dbms_output.put_line ('table non presente') ; 9 else 10 execute immediate 'drop table '||tab_supp; 11 dbms_output.put_line ('table suivante a été supprimer'|| tab_supp) ; 12 end if ; 13 dbms_output.put_line (temp) ; 14 end ; 15 16 / table non presente 0 Procédure PL/SQL terminée avec succès. SQL>
tu crée une fonction exoist par exemple
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 Function EXIST( req in varchar2) return boolean is myREQUEST varchar2(1000); myRESULT boolean; begin myREQUEST := 'select 1 from dual where exists ('||req||') and rownum=1'; execute immediate myREQUEST into myRESULT ; return myRESULT; exception when no_data_found then return false; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 puis tu envoie quelque chose du genre if not exist(select table_name from user_table where....) then.. else drop table ... end if
Aline,
voilà ce que j'ai fait (excuse je dois pas etre doué ...)
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
30
31
32
33
34
35
36
37
38 CREATE OR REPLACE FUNCTION AKFSI.EXIST (req in varchar2) RETURN boolean is myREQUEST varchar2(1000); myRESULT boolean; BEGIN myREQUEST :='select 1 from dual where exists ('||req||') and rownum=1'; execute immediate myREQUEST into myRESULT ; return myRESULT; exception when no_data_found then return false; END; / voila ce que je teste en sqlplus begin if exists(select table_name from sys.dba_tables where table_name = 'ESSAIPV') then drop table ESSAIPV; end if; end; / et il me renvoie les erreurs suivantes : drop table ESSAIPV; * ERROR at line 4: ORA-06550: line 4, column 1: PLS-00103: Encountered the symbol "DROP" when expecting one of the following: begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge <a single-quoted SQL string> pipe
essaye
execute immediate 'drop table ESSAIPV'
Bonjour
voici le resultat ce matin , vois tu ou se trouve l'erreur
MERCI D'AVANCE
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
30
31
32 Connected to: Oracle9i Release 9.2.0.5.0 - Production JServer Release 9.2.0.5.0 - Production SQL> begin 2 if exxist(select table_name from sys.dba_tables where table_name = 'ESSAIPV') 3 then 4 execute immediate 'drop table akfsi.ESSAIPV' 5 end if; 6 end ; 7 / if exxist(select table_name from sys.dba_tables where table_name = 'ESSAIPV') * ERROR at line 2: ORA-06550: line 2, column 11: PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ( ) - + case mod new not null others <an identifier> <a double-quoted delimited-identifier> <a bind variable> table avg count current exists max min prior sql stddev sum variance execute multiset the both leading trailing forall merge year month DAY_ hour minute second timezone_hour timezone_minute timezone_region timezone_abbr time timestamp interval date <a string literal with character set specificat ORA-06550: line 2, column 77: PLS-00103: Encountered the symbol ")" when expecting one of the following: . ( * @ % & - + ; / at for mod rem <an exponent (**)> and or group having intersect minus order start union where connect || SQL>
C'est la foire aux erreurs ce post !!!![]()
Essaie plutôt :
Code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE OR REPLACE FUNCTION AKFSI.EXIST (req in varchar2) RETURN boolean IS myREQUEST varchar2(1000); myRESULT number; BEGIN myREQUEST :='select 1 from dual where exists ('||req||') and rownum=1'; execute immediate myREQUEST into myRESULT ; return (myRESULT=1); exception when no_data_found then return false; END; /
Pour la lancer :
Notes que tu aurais pu tout faire en une seule procédure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 begin if exist('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') then execute immediate 'drop table ESSAIPV'; end if; end;
Et l'appel sous SQL*Plus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 create or replace procedure drop_table (p_table in varchar2) is not_dropable exception; pragma exception_init (not_dropable, -942); begin execute immediate 'drop table ' || p_table; exception when not_dropable then dbms_output.put_line ('Inexistante'); end; /
Code : Sélectionner tout - Visualiser dans une fenêtre à part exec drop_table ('toto')
désolé mais la création de la fonction ne passe plus avec result=1
sinon l'idée avec pragma est bonne ...pls-00306 wrong number or types of arguments in call to '='
mais maintenant que je suis partie avec cette solution, j'aimerai bien que cela ce solde par un succès
histoire d'être moins bète ce soir ...
Bonjour sqlakf76
Merci d'utiliser le forum Oracle de DVP ,
Merci d'utiliser les balises QUOTE et CODE qui améliorent la lisibilité du code.
Jaouad
J'avais laissé la déclaration de myResult en boolean.
J'ai corrigé mon précédent message, la création de la fonction EXIST est bonne.
En effet on avance le procédure s'est bien compilée
mais au lancement
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 SQL> begin 2 if exists('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') 3 then 4 execute immediate 'drop table ESSAIPV'; 5 end if; 6 end; 7 / erreur renvoyée ERROR at line 2: ORA-06550: line 2, column 11: PLS-00103: Encountered the symbol "select table_name from sys.dba_tables where table_name = 'ESSAIP" when expecting one of the following: ( select
Petite question pour tout embrouiller.Envoyé par plaineR
![]()
C'est quoi la différence entre ta fonction exist et celle que j'avais posté?
Je viens de tester et elle marche très bien.
Ben chez moi il n'aimait pas que je renvoie 1 dans la variable MyResult qui est de type boolean.Envoyé par aline
Ta fonction s'appelle exist et non existsEnvoyé par sqlakf76
![]()
bizarre, c'est à creuser alors.Envoyé par plaineR
J'utilise toujours ca moi!
![]()
hello tous
personne ne vois ou se trouve mon erreur:
en effet, j'ai corrigé mon erreur au niveau du nom de fonction
merci![]()
mais je crois que je vais tout de même craqué![]()
car
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SQL> begin 2 if exist('select table_name from sys.dba_tables where table_name = ''ESSAIPV''') 3 then 4 execute immediate 'drop table ESSAIPV'; 5 end if; 6 end; 7 8 / begin * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at "AKFSI.EXIST", line 8 ORA-06512: at line 2
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager