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

Posted

技术标签:

【中文标题】PL/SQL 过程、游标、PLS- 00103 错误【英文标题】:PL/SQL procedure, cursor, PLS- 00103 ERROR 【发布时间】:2017-05-07 22:16:11 【问题描述】:

请问,这个程序有什么不好的地方。错误是 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;

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

顺便说一句。来自文档:The EXIT statement exits a loop and transfers control to the end of the loop. 但在您的代码中没有循环。 还有其他错误,例如 f_namel_name 的无类型声明。【参考方案2】:

在 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检查之后。

【讨论】:

以上是关于PL/SQL 过程、游标、PLS- 00103 错误的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 函数错误 - PLS-00103:遇到符号“IS”

令人沮丧的 PL/SQL 错误...PLS-00103

PLS--00103 pl/sql 中的错误

琐碎的 PL/SQL 块生成令人沮丧的 PLS-00103 错误

Oracle PL/SQL 错误 PLS-00103

PL SQL 遇到符号“文件结尾”... PLS-00103