首页 > 解决方案 > 我正在尝试在 shellscript 中执行 PL/SQL 块。但是在执行脚本时,out 变量会抛出 DB 结果和垃圾值

问题描述

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).

标签: oracleshellunixplsqlsqlplus

解决方案


在 shell 中,*扩展为当前目录中的文件列表,因此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*Plusspool命令捕获文件中的原始文本,这也将保留格式。


推荐阅读