Bonjour,
J'exécute le script suivant (extrait d'un script plus complet) qui contient deux procédures déclarées en même temps de la même manière. Cependant, l'une des procédures est correctement exécutée et pas l'autre. J'ai le message suivant :
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[oracle@linux ~]$ sqlplus 'ops$ope'/opeope00@ACE2011B
 
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Apr 17 18:03:31 2012
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production
 
SQL> create or replace procedure dropsynonym(synonym varchar2) as
  2     cursor1 integer;
  3  begin
  4     cursor1:=dbms_sql.open_cursor;
  5     dbms_sql.parse(cursor1,'DROP SYNONYM ' || synonym,dbms_sql.NATIVE);
  6     dbms_sql.close_cursor(cursor1);
  7  EXCEPTION WHEN OTHERS THEN
  8     dbms_output.put_line(sqlerrm);
  9     if dbms_sql.is_open(cursor1) then
 10        dbms_sql.close_cursor(cursor1);
 11     end if;
 12  end;
 13  /
 
Procedure created.
 
SQL> grant execute on dropsynonym to public;
 
Grant succeeded.
 
SQL> create or replace procedure dropsynonymp(synonym varchar2) as
  2     cursor1 integer;
  3  begin
  4     cursor1:=dbms_sql.open_cursor;
  5     dbms_sql.parse(cursor1,'DROP PUBLIC SYNONYM ' || synonym,dbms_sql.NATIVE);
  6     dbms_sql.close_cursor(cursor1);
  7  EXCEPTION WHEN OTHERS THEN
  8     dbms_output.put_line(sqlerrm);
  9     if dbms_sql.is_open(cursor1) then
 10        dbms_sql.close_cursor(cursor1);
 11     end if;
 12  end;
 13  /
grant execute on dropsynonymp to public;
 
Procedure created.
 
SQL> 
Grant succeeded.
 
SQL> connect IPAS1/ipas0@ACE2010A
Connected.
SQL> execute dropsynonym('EXERCISE_FLIGHT');
 
PL/SQL procedure successfully completed.
 
SQL> execute dropsynonymp('EXERCISE_FLIGHT');
BEGIN dropsynonymp('EXERCISE_FLIGHT'); END;
 
      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DROPSYNONYMP' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
 
 
SQL>
Voici mon script en question :
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
create or replace procedure dropsynonym(synonym varchar2) as
   cursor1 integer;
begin
   cursor1:=dbms_sql.open_cursor;
   dbms_sql.parse(cursor1,'DROP SYNONYM ' || synonym,dbms_sql.NATIVE);
   dbms_sql.close_cursor(cursor1);
EXCEPTION WHEN OTHERS THEN
   dbms_output.put_line(sqlerrm);
   if dbms_sql.is_open(cursor1) then
      dbms_sql.close_cursor(cursor1);
   end if;
end;
/
grant execute on dropsynonym to public;
 
create or replace procedure dropsynonymp(synonym varchar2) as
   cursor1 integer;
begin
   cursor1:=dbms_sql.open_cursor;
   dbms_sql.parse(cursor1,'DROP PUBLIC SYNONYM ' || synonym,dbms_sql.NATIVE);
   dbms_sql.close_cursor(cursor1);
EXCEPTION WHEN OTHERS THEN
   dbms_output.put_line(sqlerrm);
   if dbms_sql.is_open(cursor1) then
      dbms_sql.close_cursor(cursor1);
   end if;
end;
/
grant execute on dropsynonymp to public;
 
connect IPAS1/ipas0@ACE2010A
execute dropsynonym('EXERCISE_FLIGHT');
execute dropsynonymp('EXERCISE_FLIGHT');
Si je déclare la procédure dans la session IPAS1, elle va évidemment marcher.
Je ne vois pas ou j'ai pu faire une erreur : si il y avait une erreur, les deux procédures devraient être en échec (!).
Merci