2010-10-26 20 views
0

我在Oracle 9i中有2個程序(A,B)。在個人中,他們都很好。但是我不能創建一個調用A的過程C,而該過程又調用B.我在C調用A之前放置了一個dbms_output.put_line,然後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

您是否曾嘗試在您打開A中的遊標之前放置dbms_output以確保您甚至進入循環? – climbage 2010-10-26 21:37:26

回答

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

如果發生異常,它將傳播到調用過程,因此WHEN OTHERS THEN NULL異常處理程序是不必要的,也是不好的做法。至少包括RAISE聲明。 – pablo 2010-10-27 12:37:40

相關問題