【问题标题】:PL/SQL procedure, cursor, PLS- 00103 ERRORPL/SQL 过程、游标、PLS- 00103 错误
【发布时间】: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;

【问题讨论】:

    标签: plsql cursor procedure


    【解决方案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_name 和 l_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检查之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2011-08-06
      相关资源
      最近更新 更多