为什么一个过程不能在Oracle中调用另一个过程
我在Oracle 9i中有两个过程(A、B)。就个人而言,它们都工作得很好。但是我不能让一个过程C调用a,它反过来调用B。我在C调用a之前,在a调用B之前,在B中放置一个dbms_output.put_行。不知何故,只有第一个put_行起作用。这不起作用的可能原因是什么?谢谢,为什么一个过程不能在Oracle中调用另一个过程,oracle,plsql,procedure,Oracle,Plsql,Procedure,我在Oracle 9i中有两个过程(A、B)。就个人而言,它们都工作得很好。但是我不能让一个过程C调用a,它反过来调用B。我在C调用a之前,在a调用B之前,在B中放置一个dbms_output.put_行。不知何故,只有第一个put_行起作用。这不起作用的可能原因是什么?谢谢, CREATE OR REPLACE PROCEDURE C (num in number) as begin for r in (select col1 from Table1) loop
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;
很明显,游标c1是空的,所以您的条件(当c1%notfound时退出)为true,循环在dbms_输出调用之前终止 如果要打印该行而不考虑空光标,请更改其位置,例如:
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;
尝试将异常处理程序放在C中,以检测是否抛出异常;差不多
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;
在中打开游标之前,您是否尝试过放置dbms_输出,以确保您甚至进入循环?如果引发异常,它将传播到调用过程,而其他人则不需要NULL异常处理程序,这是一种不好的做法。至少包括一份加薪声明。