SQL*Plus执行含BEGIN END的PL/SQL脚本时挂起,寻求原因
SQL*Plus脚本执行异常问题排查
问题重现
执行的SQL*Plus脚本
select * from dual; select * from dual; declare foo number(10); begin select 'abc' from dual; end;
执行命令
sqlplus user/password@DB @myscript.sql
实际输出
D - X D - X 7
此时SQL*Plus挂起等待用户输入,按下回车后会依次输出8、9、10等数字。
问题原因
- PL/SQL查询缺少INTO子句:在PL/SQL块里执行
SELECT语句时,必须通过INTO子句把查询结果赋值给变量,不能像普通SQL那样直接返回结果集。你的代码里select 'abc' from dual;没有指定接收结果的变量,触发了SQL执行错误。 - SQL*Plus错误交互机制:PL/SQL执行出错后,SQL*Plus会进入错误提示的交互模式,输出的数字是错误对应的行号,等待你输入后续指令,因此出现挂起;按回车相当于跳过当前错误提示,所以会依次输出后续行号。
- 变量类型不匹配:你定义的
foo是number(10)类型,但要接收的'abc'是字符串,即便加上INTO也会触发类型错误,需要把变量类型改成varchar2。 - PL/SQL块结束标记缺失:PL/SQL块结尾需要加上
/才能让SQL*Plus正确识别并执行块,否则也可能导致执行异常。
修复后的脚本
select * from dual; select * from dual; declare foo varchar2(10); -- 修改为匹配字符串的类型 begin select 'abc' into foo from dual; -- 添加INTO子句赋值给变量 end; / -- 添加PL/SQL块执行标记
内容的提问来源于stack exchange,提问作者xpusostomos
相关产品推荐
相关产品推荐

