2017-05-07 1 views
0

이 절차에서 잘못된 점을 알려주십시오. 실수는 PLS-00103의 8,9 행입니다.PL/SQL 프로 시저, 커서, PLS-00103 오류

create or replace PROCEDURE test_one(l_f_name VARCHAR2,l_l_name VARCHAR2) 
IS 
    CURSOR c1(f_name VARCHAR2,l_name VARCHAR2) IS 
    SELECT lastname,firstname 
    FROM CUSTOMER; 

    v_complex c1%ROWTYPE; 
    f_name = l_f_name; 
    l_name = l_l_name; 

BEGIN 
    open c1(f_name,l_name); 
    fetch c1 into v_complex; 

    dbms_output.put_line(v_complex.lastname|| ' ' ||v_complex.firstname); 

    exit when c1%notfound; 
    close c1; 
end; 

답변

0

PL/SQL의 대입 연산자는 :=입니다. 또한 형식이 지역 변수 선언에 없습니다 (@Nitish 덕분에). 그래서 유효한 코드는 다음과 같습니다 :

f_name VARCHAR2(50) := l_f_name; 
l_name VARCHAR2(50) := l_l_name; 
+0

BTW. 문서에서 :'EXIT 문은 루프를 빠져 나와 제어를 루프의 끝으로 전송합니다. '하지만 코드에는 루프가 없습니다. – kpater87

+0

'f_name'과'l_name'에 대한 타입이없는 선언과 같은 다른 오류가 있습니다. – Nitish

+0

@ 니치 당신이 옳습니다. 내 대답을 업데이트했습니다. – kpater87

0

PLSQL과 같은 명백한 커서는 피해야합니다.

그것은해야한다 :

FOR v_complex IN c1(l_f_name, l_l_name) LOOP 
    dbms_output.put_line(v_complex.lastname|| ' ' ||v_complex.firstname); 
END LOOP; 

경우에 당신은 전혀, 또는 f_name, 또는 l_name을 v_complex 선언 할 필요가 없습니다. 또한 커서는 실제로 이러한 변수를 사용하는 것으로 나타나지 않습니다. 너 뭐하려고?

이 암시 적 커서는 명시 적 OPEN 및 CLOSE 문이 필요하지 않으므로 커서 누출을 이런 방식으로 가져 오지 않습니다.

실제 문제는 초기화가 수정 된 경우 DBMS_OUTPUT이 % NOTFOUND 검사 뒤에 있어야합니다.