2010-10-26 4 views
0

У меня есть 2 процедуры (A, B) в Oracle 9i. В отдельных случаях все они работают нормально. Но я не могу выполнить процедуру C, которая вызывает A, которая, в свою очередь, вызывает B. Я помещаю dbms_output.put_line до того, как C вызовет A, до того, как A вызовет B и один в B. Как-то работает только первая put_line. Каковы возможные причины, по которым это не работает? Спасибо,Почему процедура не может вызвать другую в Oracle

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; 
+2

Вы пытались поставить dbms_output перед тем, как открыть курсор в A, чтобы убедиться, что вы даже попадаете в цикл? – climbage

ответ

2

Obviusly, курсор c1 пуст, поэтому ваше состояние (выход когда c1% NOTFOUND) истинно и цикл завершается перед вызовом DBMS_OUTPUT.

Если вы хотите, чтобы напечатать строку независимо от пустого указателя, изменить его положение, например:

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; 
0

Попробуйте поместить обработчик исключений в 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; 
+1

Если возникает исключение, оно будет распространяться на вызывающую процедуру, это КОГДА ПРОЧИТАЕТ, ЧЕМ NULL обработчик исключений является ненужным и плохой практикой. По крайней мере, включить заявление RAISE. – pablo