2017-05-07 58 views
0

请问,这个程序中有什么不好。错误是8,9行中的PLS-00103PL/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

顺便说一句。从文档中:'EXIT语句退出一个循环并将控制转移到循环结束.'但是在你的代码中没有循环。 – kpater87

+0

还有其他一些错误,比如'f_name'和'l_name'的声明没有类型。 – Nitish

+0

@Nitish你是对的。我已经更新了我的答案。 – 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; 

在这种情况下,你不需要申报v_complex所有,或f_name,或l_name。另外,游标似乎并未实际使用这些变量。你想做什么?

这个隐式游标也避免了显式OPEN和CLOSE语句的需要,你永远不会得到这种游标泄漏。

至于实际的问题,如果初始化是固定的,那么你的DBMS_OUTPUT应该在%NOTFOUND检查之后。