Plsql PL/SQL过程,游标,PLS-00103错误

Plsql PL/SQL过程,游标,PLS-00103错误,plsql,cursor,procedure,Plsql,Cursor,Procedure,拜托,这个程序有什么不好。错误是8,9行中的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_n

拜托,这个程序有什么不好。错误是8,9行中的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;

PL/SQL中的赋值运算符是
:=
。此外,局部变量声明中缺少类型(由于@Nitish)。因此,有效代码是:

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

在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\u输出应该在%NOTFOUND检查之后。

顺便说一句。从文档:
EXIT语句退出循环并将控制转移到循环的末尾。
但是在您的代码中没有循环。还有其他错误,如
f\u name
l\u name
没有类型的声明。