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_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检查之后。
【讨论】:
以上是关于PL/SQL 过程、游标、PLS- 00103 错误的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL 函数错误 - PLS-00103:遇到符号“IS”