[oracle]同时从壳到 sqlplus 传递的变量长度的变化

标签: sql shell UNIX Oracle
发布时间: 2014/3/9 13:32:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

同时传递 1 个字符变量来自 sqlplus 的壳,我发现这令人讨厌的反常现象。

echo "Please enter the upgrade option: "
read type

if [[ "$type" != "1" ]] && [[ "$type" != "2" ]]
then
            echo "You have entered an invalid response. Exiting."
    exit 0;
fi

sql_result=$($ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF
connect $eval_user/$eval_pass@$db_name

SPOOL results.txt;
WHENEVER OSERROR EXIT 9;

DEFINE vType = '$type'
DEFINE type_flag = '$t_flag'
DEFINE vOrigowner = '$origOwner'
@@EV_DBUPGRADE.sql '&vType' '&vOrigowner' '&vAppConvFromDt' '&vAppConvThruDt' '&vAppConvStatusFlg' '&type_flag'

根据 EV_DBUPGRADE.sql,我同时使用变量 vType 找到了此错误:

vOption        varchar2(1)  := UPPER('&1');

我得到这恼人的错误,抱怨的缓冲区长度

declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 7

如果使用 varchar2(10),则不会发生该错误。但是,我不想改变它在 100 万不同的地方。有无论如何要限制它吗?和任何人都可以告诉我如何打印在 sqlplus 在开始新的调试消息吗?

解决方法 1:

不知道到底怎么回在这里,但外壳程序在干什么你的 shell 变量。

我是能够重复您在 ksh ("testme.ksh") 中的错误

#!/bin/ksh

type="1"

sqlresult=$($ORACLE_HOME/bin/sqlplus -s /nolog << EOF
connect user/pswd@database
define vType = '$type'
@test.sql &vType
exit
/
EOF)

echo $sqlresult

SQL 脚本 ("test.sql"):

declare
   vOption varchar2(1) := UPPER('&1');
begin
   dbms_output.put_line('Test: ' || vOption);
end;
/

输出:

Connected. old 2: vOption varchar2(1) := UPPER('&1'); new 2: vOption varchar2(1)
:= UPPER('$type'); declare test.sql testme.ksh ERROR at line 1: ORA-06502: PL/SQ
L: numeric or value error: character string buffer too small ORA-06512: at line
2

我不知道为什么可以这样做,却能够在它附近工作由将 shell 变量传递给 SQL 脚本的执行直接和绕过的"定义"的语句:

#!/bin/ksh

type="1"

sqlresult=$($ORACLE_HOME/bin/sqlplus -s /nolog << EOF
connect user/pswd@database
@test.sql $type
exit
/
EOF)

echo $sqlresult

输出:

Connected. old 2: vOption varchar2(1) := UPPER('&1'); new 2: vOption varchar2(1)
:= UPPER('1'); PL/SQL procedure successfully completed.
官方微信
官方QQ群
31647020