if [ $returncode -eq 0 ]
then
query_msg=`$ISQL -S $USERNAME/$PASSWD@$SERVICENAME <<EOJ
set serveroutput on;
set heading off;
set feedback off;
set linesize 150;
declare
out_value varchar2(32767);
BEGIN
SELECT MESSAGE into out_value FROM RED.ERROR_LOG WHERE PROC = 'colour' and
to_char(to_date(DT,'DD-MON-YY')) = to_char(to_date(sysdate,'DD-MON-YY'));
dbms_output.put_line(out_value);
END;
/
EOJ`
echo $query_msg > $DATADIR/colour_DB.log
在该日志中,我沿垃圾值获取查询结果?我在plsql块中声明变量时缺少什么?可以帮我吗?
查询结果:-
+query_msg=$'declare\n*\nERROR at line 1:\nORA-01403: no data found\nORA-06512: at line 5'
+ echo declare 0 1 221.log 132.log 321.log 456.log --> these are the files in the server path(unwanted result).
*
会扩展到当前目录中的文件列表,因此echo *
将产生您正在查看的文件列表。来自SQL * Plus的PL / SQL块的输出类似于:
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 5
因此,echo $query_msg
将打印单词declare
,后跟当前目录中的文件列表,然后显示消息的其余部分。为了防止这种情况,请将其放在软引号中:
echo "$query_msg"
或使用SQL * Plus spool
命令捕获文件中的原始文本,这也将保留格式。
一种可能的解决方法是在SQL语句的开头用SPOOL命令替换echo $query_msg > $DATADIR/colour_DB.log
:
SPOOL colour_DB.log
ORA-01403: no data found
。您应该使用类似的东西来捕获它:DECLARE
out_value varchar2(32767);
BEGIN
SELECT MESSAGE into out_value
FROM RED.ERROR_LOG
WHERE PROC = 'colour'
AND to_char(to_date(DT,'DD-MON-YY')) = to_char(to_date(sysdate,'DD-MON-YY'));
dbms_output.put_line(out_value);
EXCEPTION WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Nothing found');
END;