Perché una procedura non può chiamare un altro in Oracle
Domanda
Ho 2 procedure (A, B) in Oracle 9i. Nei singoli, tutti funzionano bene. Ma non posso fare una procedura C che chiama A, che a sua volta chiama B. Ho messo un dbms_output.put_line prima C chiama A, prima di A chiama B e uno in B. In qualche modo, solo i primi lavori put_line. Quali sono le possibili ragioni per cui questo non funziona? Grazie,
CREATE OR REPLACE PROCEDURE C (num in number)
as
begin
for r in (select col1 from Table1)
loop
dbms_output.put_line ('Inside C');
A(r.col1);
end loop;
end;
CREATE OR REPLACE PROCEDURE A (var1 IN varchar2)
AS
v1 varchar2;
cursor c1(c_var in varchar2) is
select col1 from table2 where col2=c_var;
BEGIN
open c1(var1);
loop
fetch c1 into v1;
exit when c1%notfound;
dbms_output.put_line ('Inside A');
B(v1);
end loop;
close c1;
END;
Soluzione
obviusly, c1 cursore è vuoto, in modo che le condizioni (uscita quando c1% notfound) è vero e ciclo viene terminato prima della chiamata DBMS_OUTPUT.
Se si desidera stampare la linea a prescindere di un cursore vuoto, cambiare la sua posizione, per esempio:
CREATE OR REPLACE PROCEDURE C (num in number)
as
begin
dbms_output.put_line ('Inside C');
for r in (select col1 from Table1)
loop
dbms_output.put_line ('Calling A');
A(r.col1);
end loop;
end;
CREATE OR REPLACE PROCEDURE A (var1 IN varchar2)
AS
v1 varchar2;
cursor c1(c_var in varchar2) is
select col1 from table2 where col2=c_var;
BEGIN
dbms_output.put_line ('Inside A');
open c1(var1);
loop
fetch c1 into v1;
exit when c1%notfound;
dbms_output.put_line ('Calling B');
B(v1);
end loop;
close c1;
END;
Altri suggerimenti
Prova a mettere un gestore di eccezioni in C per rilevare se viene generata un'eccezione; qualcosa come
CREATE OR REPLACE PROCEDURE C (num in number)
as
begin
for r in (select col1 from Table1)
loop
dbms_output.put_line ('Inside C');
A(r.col1);
end loop;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception caught in C : ' || SQLCODE || ' ' || SQLERRM);
RAISE;
end;