如何通过shell脚本捕获存储过程的结果?

时间:2015-08-17 16:57:43

标签: sql oracle shell plsql

我尝试通过shell脚本执行存储过程并尝试从存储过程返回但是我没有从存储过程中获取任何东西,与sqlplus提示符相同的事情我和我#39;能够得到结果

sqlplus -silent xxx@xxx <<EOF
set serveroutput on
declare

DE_REC_COUNT number(10);
begin
    DE_DUP_PROC ('T_MCL_30404_20150317_020','MCL','30404','FT',DE_REC_COUNT);

end;

EOF

通过sqlplus提示

SQL> set serveroutput on
declare

DE_REC_COUNT number;
begin
    DE_DUP_PROC ('T_MCL_30404_20150317_020','MCL','30404','FT',DE_REC_COUNT);

end;  

0

PL/SQL procedure successfully completed.

3 个答案:

答案 0 :(得分:1)

shell脚本中匿名块的版本将不会如图所示执行,因为您没有a slash after the block to run it。如果你运行它根本没有输出。如果您将其更改为斜杠:

sqlplus -silent xxx@xxx <<EOF
set serveroutput on
declare
  DE_REC_COUNT number(10);
begin
    DE_DUP_PROC ('T_MCL_30404_20150317_020','MCL','30404','FT',DE_REC_COUNT);
end;
/
EOF

然后你会看到:

0

PL/SQL procedure successfully completed.

您已经在SQL * Plus中显示了交互式版本,但没有使用斜杠,但您必须拥有该版本才能看到您显示的输出。

如果你想要零 - 这似乎来自你的程序中的dbms_output调用,而不是直接来自你的匿名块 - 你可以参考后面的shell变量,你可以分配输出heredoc变量:

MY_VAR=`sqlplus -silent xxx@xxx <<EOF
set serveroutput on
set feedback off
declare

DE_REC_COUNT number(10);
begin
    DE_DUP_PROC ('T_MCL_30404_20150317_020','MCL','30404','FT',DE_REC_COUNT);
end;
/

EOF`

printf "Got back MY_VAR as %s\n" ${MY_VAR}

请注意,我已添加set feedback off,因此您无法看到PL/SQL procedure successfully completed行。现在当你跑步时,你会看到:

Got back MY_VAR as 0

您可以使用${MY_VAR}做任何您需要的事情。这取决于你的意思&#39;捕获&#39;虽然。

答案 1 :(得分:0)

以下是使用评估运算符(`后引号)包围代码可以完成的示例:

#!/bin/sh
results=`sqlplus -s xxx@xxx <<EOF
set serveroutput on feedback off
declare

DE_REC_COUNT number(10);
begin
    DE_DUP_PROC ('T_MCL_30404_20150317_020','MCL','30404','FT',DE_REC_COUNT);

end;
/
EOF`

echo $results

答案 2 :(得分:0)

让我们说比如说我有一个下面的程序来计算两个数字的总和并使用 dbms_output.put_line()方法打印总数

CREATE OR REPLACE
PROCEDURE SUM
  (
    a IN NUMBER,
    b IN NUMBER)
AS
  total NUMBER;
BEGIN
  total:= a + b;
  dbms_output.put_line(total);
END;

然后,为了在我们的shell脚本中调用它,我们需要在匿名块中调用此过程并存储在变量中,稍后使用echo我们可以执行命令。

plsqlcode=`sqlplus -silent hr/sandeep@orcl <<EOF
set serveroutput on
begin
sum(10,20);
end;
/
EOF`

echo $plsqlcode

理想情况下,这不是推荐的方法,您应该将shell和pl / sql代码保存在单独的文件中。