oracle - 试图在 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
如果某些值被隐藏,请忽略,因为我无法在此处显示完整代码。
解决方案
您的代码中有一些错误:
- 使用
-S
SQL*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"
推荐阅读
- python - Python文字冒险店
- javascript - 如何将现有值输入到 React 中的输入字段中以进行编辑表单
- spring-boot - Eureka 和 Feign 客户端防止 springboot 关闭
- javascript - HTML/CSS - 轮播幻灯片中的多个图像
- javascript - 从承诺将数据推送到局部变量?
- javascript - Vanilla Javascript 中是否有 requireJS toUrl 等价物
- truffle - Truffle 部署资金不足(尽管使用了 Truffle 的总价格估算)
- html - 是否可以在网页内制作网页视图?
- python - 熊猫 - 创建新列 - 如果另一个列值在列表中(正确的方式)
- amazon-web-services - 尽管按照规则配置了 NAT、Internet 网关,AWS VPC 仍无法访问 Internet