unix korn shell如何在存储过程结果中获取dbms_output.put_line

时间:2018-07-04 09:58:31

标签: oracle ksh dbms-output

请参考我的示例, 在oracle DB中,这些位于SP之下

CREATE OR REPLACE PROCEDURE SP_TEST_PUTLINE AS 
BEGIN
DBMS_OUTPUT.ENABLE;
  dbms_output.put_line('Hello world!');
END SP_TEST_PUTLINE;

我使用unix外壳程序调用SP来从SP获取dbms_output.put_line('Hello world!'),我应该怎么做。 我使用sqlplus命令登录到数据库,似乎无法获得想要的结果。

   output=$(IFS='';echo connect ${DBUSER}/${DBPASS}@${ORACLE_SID} execute SP_TEST_PUTLINE|sqlplus -s /nolog )

有人可以帮助我吗? 预先感谢...

------------------------------------分割线20180705 -------- -----------------------------

感谢Alex和Kaushik Nayak的帮助,非常有帮助。

以下是Kaushik Nayak的一些发现,请参考。

您好,Kaushik,它可以工作,但是起初,它失败并出现以下错误

unknown command beginning "-e connect..." - rest of line ignored. SP2-0734: 

所以我将echo -e选项更改为echo,然后它起作用了。 所以这是问题 1)为什么我使用不带-e选项的echo会得到以下结果,是由于IFS引起的吗?

echo "abc\n def \nghi" 
abc
 def 
ghi

2)根据亚历克斯的评论,有两个选项需要将它们写到两行吗?但您没有在它们之间使用\ n

 set serveroutput on
set feedback off

当我在它们之间添加\ n时,如下所示。它提示了如下错误,但“地狱世界”!有输出,

SP2-0734: unknown command beginning "feedback o..." - rest of line ignored. Hello world! PL/SQL procedure successfully completed. 

这是一个问题,为什么您没有在打开服务器输出和关闭反馈之间使用\ n,这个DB命令(关闭反馈)是否已成功运行?

期待您的回复。 预先感谢!

2 个答案:

答案 0 :(得分:2)

您正在使用的命令甚至无法连接,因为您需要在connectexecute之间换行。

但是您还需要set serveroutput on,并且您可能也想set feedback off(也许还有其他选择。

我会使用a heredoc使其更易于阅读和维护:

output=$(
sqlplus -s /nolog <<!EOF
connect ${DBUSER}/${DBPASS}@${ORACLE_SID}
set serveroutput on
set feedback off
execute SP_TEST_PUTLINE
!EOF
)

# then do whatever you want with the output
echo ${output}

您可能还想进行一些错误检查...

答案 1 :(得分:2)

如果您使用单行回显传递给sqlplus,则应使用-e的{​​{1}}选项放置换行符

echo

您还必须指定output=$(IFS='';echo -e "connect ${DBUSER}/${DBPASS}@${ORACLE_SID}\nset serveroutput on feedback off\n execute SP_TEST_PUTLINE" |sqlplus -s /nolog ) set serveroutput on才能仅查看输出。

因此,更好的选择是使用Alex所指的此处文档。