如何将匿名PL/SQL块的返回码传递至ksh变量
问题描述
如何将PL/SQL中的error值传递至SQLPlus变量,再将该SQLPlus变量传递至ksh变量return_code?
现有KSH脚本
$ORACLE_HOME/bin/sqlplus id/psw@$ORACLE_SID @$P_SQL/mysql.sql $1 return_code=$? echo return_code
现有SQL脚本
set serverout on var error number ... declare error number(1) := 0; begin ....... exception when too_many_rows then error := 2; end; / exit
实现步骤
要完成变量传递,需分两步实现:将PL/SQL变量赋值给SQLPlus绑定变量,再让SQLPlus将该变量值作为退出码返回给ksh。
1. PL/SQL变量赋值到SQL*Plus绑定变量
修改SQL脚本,把PL/SQL局部变量的值传递给已声明的SQL*Plus绑定变量(注意绑定变量前要加冒号:),并通过exit命令将绑定变量值作为退出码返回:
set serverout on var error number ... declare l_error number(1) := 0; -- 重命名局部变量,避免与绑定变量重名混淆 begin ....... exception when too_many_rows then l_error := 2; end; / -- 将PL/SQL局部变量赋值给SQL*Plus绑定变量 begin :error := l_error; end; / -- 直接用绑定变量值作为SQL*Plus的退出码返回给shell exit :error
注意:SQL*Plus的退出码范围为0-255,需确保
error变量值处于该区间内,超出范围会被自动取模处理。
2. KSH获取SQL*Plus返回的退出码
调整KSH脚本,通过$?直接获取SQLPlus的退出码(即传递过来的error值),建议添加-s参数启用静默模式,避免输出SQLPlus的欢迎/退出冗余信息:
$ORACLE_HOME/bin/sqlplus -s id/psw@$ORACLE_SID @$P_SQL/mysql.sql $1 return_code=$? echo "返回码:$return_code"
简化写法(可选)
如果无需保留PL/SQL局部变量,可直接在PL/SQL块中操作SQL*Plus绑定变量,省去额外赋值步骤:
set serverout on var error number ... declare begin :error := 0; -- 直接初始化绑定变量 ....... exception when too_many_rows then :error := 2; -- 直接修改绑定变量值 end; / exit :error
内容的提问来源于stack exchange,提问作者mlwacosmos
相关产品推荐
相关产品推荐

