لماذا الإجراء لا يمكن استدعاء آخر في أوراكل
سؤال
لدي 2 الإجراءات (أ ، ب) في Oracle 9i.في الفرد ، جميعها تعمل بشكل جيد.ولكن أنا لا يمكن أن تجعل الإجراء ج أن يدعو الذي يتطلب بدوره B.لقد وضعت dbms_output.put_line قبل C يدعو قبل أن يدعو ب واحد في 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;
المحلول
Obviusly, المؤشر c1 فارغة لذلك حالتك (الخروج عندما c1%نوتفوند) صحيح وحلقة يتم إنهاء قبل 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;
نصائح أخرى
محاولة وضع معالج استثناء في ج للكشف إذا كان استثناء يتم طرح;شيء مثل
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;
لا تنتمي إلى StackOverflow