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

How to get the dbms_output.put_line within the store procedure result by unix korn shell

请参考我的示例, 在 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;

我用unixshell调用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) 根据Alex的评论,这两个选项需要写成两行吗?但你没有在它们之间使用 \n

 set serveroutput on
set feedback off

当我在它们之间添加 \n 时如下所示。它遇到如下错误,但是 'hellow world!' 有输出,

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

问题来了,为什么不在 set serveroutput on 和 set feedback off 之间使用 \n,这个 DB 命令(set feedback off)运行 成功了吗?

期待您的回复。 提前致谢!

您正在使用的命令甚至无法连接,因为您需要在 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}

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

如果您使用单行回显传递给 sqlplus,您应该使用 echo

-e 选项放置换行符
output=$(IFS='';echo -e "connect  ${DBUSER}/${DBPASS}@${ORACLE_SID}\nset serveroutput on feedback off\n execute SP_TEST_PUTLINE" |sqlplus -s /nolog )

您还必须指定 set serveroutput onfeedback off 以仅查看输出。

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