这个bug花了我一整天的功夫,最后还是在别人帮助下解决了。
虽然费这么多时间和当初轻视它有关,这个错误本身也有点奇怪了。
[@more@]为了说明问题,新写了一个测试程序
数据库里有表aa,
SQL> desc aa
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
COL1 VARCHAR2(10) Y
SQL> select * from aa;
COL1
----------
b
a
shell脚本内容:
/export/home/deverdb/p482/scripts>cat test1
#!/usr/bin/bash
DB_CHAR=`sqlplus -s edentest/edentest@perdb<SET HEAD OFF
SET TERM OFF
SET FEED OFF
SELECT col1 FROM aa WHERE rownum<2;
EOF`
echo $DB_CHAR
export DB_CHAR
sqlplus edentest/edentest@perdb<set serveroutput on
execute dbms_output.put_line('before');
execute dbms_output.put_line('$DB_CHAR');
exit;
EOF
执行过程和错误:
/export/home/deverdb/p482/scripts>test1
b
SQL*Plus: Release 8.1.7.0.0 - Production on Tue Dec 14 09:05:14 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
SQL> SQL> before
PL/SQL procedure successfully completed.
SQL> ERROR:
ORA-01756: quoted string not properly terminated
SQL> SP2-0042: unknown command "b')" - rest of line ignored.
SQL> Disconnected from Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
究其原因,是因为 DB_CHAR 从 sql*plus 取得值,又将值作为参数传入存储过程时,DB_CHAR 的值(字符串)前面多了一个回车符。
加上语句:
SQLSTR="dbms_output.put_line('${DB_CHAR}')"
echo $SQLSTR
可以看到返回的SQLSTR值为 dbms_output.put_line(' b'),注意b前面有空格,其实是个回车符。在sql*plus执行时,该语句就成了
SQL>dbms_output.put_line('
SQL>b')
所以出现了运行时的错误信息。
解决:在 DB_CHAR赋值后加如下语句 DB_CHAR = `echo $DB_CHAR|sed -e "s/^n//"` 将前面的回车符去掉。
但是为什么会有那个回车符,目前尚不明了中。
还企望高手解答。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/207/viewspace-784471/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/207/viewspace-784471/