我正在尝试在shellscript中执行PL / SQL块。但是在执行脚本时,out变量将垃圾结果与垃圾值一起抛出

问题描述 投票:2回答:3
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).
oracle shell unix plsql sqlplus
3个回答
1
投票
在外壳程序中,*会扩展到当前目录中的文件列表,因此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命令捕获文件中的原始文本,这也将保留格式。

0
投票
我可以复制但不能解释这个问题。

一种可能的解决方法是在SQL语句的开头用SPOOL命令替换echo $query_msg > $DATADIR/colour_DB.log

SPOOL colour_DB.log


0
投票
因为您的查询未找到任何数据,所以引发了错误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;

© www.soinside.com 2019 - 2024. All rights reserved.