لماذا الإجراء لا يمكن استدعاء آخر في أوراكل

StackOverflow https://stackoverflow.com/questions/4028187

  •  26-09-2019
  •  | 
  •  

سؤال

لدي 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top