首页 > 解决方案 > 试图在 UNIX 变量中存储 PL/SQL 块的值

问题描述

UNIX 代码:

#!/bin/sh

if [ $# -gt 0 ]

    then

    ## Checking wheather or all the Server Objects are up and working

        if [[ $1 = 'PreCheck' ]];then

            COUNT_SERV=`${ORACLE_HOME}/bin/sqlplus ${dbConnect} <<GETCOUNT|tee -a ${logFile}

                SET HEADING ON
                SET SERVEROUTPUT ON SIZE 10000
                SET ECHO OFF
                SET FEEDBACK OFF

                @PLSQLBLCK1.sql

            GETCOUNT`

        fi
fi

exit 0;

SQL 代码:

DECLARE

   COUNT_SERV INTEGER;

BEGIN

    DBMS_OUTPUT.ENABLE(1000000);

    SELECT COUNT (*) INTO COUNT_SERV FROM FT_LM_SERVERS WHERE STATE <> 'START';

        IF COUNT_SERV > 0 THEN

            DBMS_OUTPUT.PUT_LINE('******ERROR1: One or More BG Object is Down, please restart the BG to proceed ahead******');

        END IF;

END;

我正在尝试获取存储在 COUNT_SERV(UNIX)中的 DBMS_OUTPUT.PUT_LINE 的值,以便我可以提前相应地使用它。但是,如果我执行 shell 脚本,我会在日志文件中得到如下输出:

SQL> SQL> SQL> SQL> SQL> SQL> SQL>  18   19   20  

如果某些值被隐藏,请忽略,因为我无法在此处显示完整代码。

标签: oracleshellunixplsqlsh

解决方案


您的代码中有一些错误:

  • 使用-SSQL*Plus 的参数
  • 在 PL/SQL 块的末尾放置一个斜杠
  • 把结尾GETCOUNT放在第一

...然后代码将起作用,例如:

测试.sql:

DECLARE
    i PLS_INTEGER;
BEGIN
    SELECT COUNT(1)
    INTO i
    FROM dual;

    IF (i > 0)
    THEN
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(i));
    END IF;
END;
/
-- ^^^ Slash!!!

测试.sh:

foo=`sqlplus -S foo/bar@bla <<EOF | tee -a logfile
    SET HEADING ON;
    SET SERVEROUTPUT ON SIZE 10000;
    SET ECHO OFF;
    SET FEEDBACK OFF;
    @test.sql;
EOF` # <-- First column!!!

echo $foo; # --> Prints "1"

cat logfile # Prints "1"


推荐阅读