2010-10-26 21 views
0

J'ai deux procédures (A, B) dans Oracle 9i. En individuel, ils fonctionnent tous très bien. Mais je ne peux pas faire une procédure C qui appelle A, qui à son tour appelle B. Je mets un dbms_output.put_line avant que C appelle A, avant que A appelle B et un dans B. D'une certaine manière, seul le premier put_line fonctionne. Quelles sont les raisons possibles pour lesquelles cela ne fonctionne pas? Merci,Pourquoi une procédure ne peut pas appeler une autre instance dans 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

Avez-vous essayé de mettre un dbms_output avant d'ouvrir le curseur dans A pour vous assurer que vous êtes déjà dans la boucle? – climbage

Répondre

2

obviusly, le curseur c1 est vide, de sorte que votre condition (sortie lorsque c1% notfound) est vrai et la boucle est terminée avant que l'appel DBMS_OUTPUT.

Si vous souhaitez imprimer la ligne quel que soit d'un curseur vide, changer sa position, par exemple:

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

Essayez de mettre un gestionnaire d'exception en C pour détecter si une exception est levée; Quelque chose comme

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

Si une exception est levée, elle sera propagée à la procédure d'appel, ce gestionnaire d'exception WHEN OTHERS THEN NULL est inutile et inapproprié. À tout le moins inclure une déclaration RAISE. – pablo