0

Oracle 9i には 2 つの手順 (A、B) があります。個人的には、それらはすべて正常に機能します。しかし、A を呼び出し、次に B を呼び出すプロシージャ C を作成することはできません。C が A を呼び出す前に、A が B を呼び出す前に dbms_output.put_line を配置し、B に 1 つを配置します。どういうわけか、最初の 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;
4

2 に答える 2

2

明らかに、カーソル c1 は空であるため、条件 (c1%notfound 時に終了) は true であり、ループは 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;
于 2010-10-26T23:50:53.750 に答える
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;
于 2010-10-26T23:52:15.233 に答える