Почему процедура не может вызвать другую в Oracle - PullRequest
0 голосов
/ 27 октября 2010

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

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 ]

2 голосов
/ 27 октября 2010

Очевидно, курсор 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 голосов
/ 27 октября 2010

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