首页 > 解决方案 > PL/SQL 的返回值

问题描述

所以,我们有一个 shell 脚本,它需要调用一个匿名块,并接收一个返回的值。匿名块大约有 100 行,所以我们将它放在一个文件中,因此对于 SQL*Plus,它被称为:

@/directory_path/anonymous_block "'param1'" "'param2'"

是的,我们传递了几个参数。最后,我们有一个DBMS_OUTPUT.PUT_LINE.......

那么,我们的问题是,如何将其返回给壳牌?我们尝试了各种类似的代码:

proc=TEMPLATE1_MV<BR>
code=513

x=`print "
  set heading off feedback off verify off timing off
  @/u01/sql/stock_rpt_stats '$code' '$proc';
  exit" | sqlplus -s $user/$pass`

y=`echo $x | awk '{print $1}'`<BR>
printf "HERE: $y\n"

但没有运气,只有错误。

如果这仅包含一个直接 SQL:

SELECT TRUNC(SYSDATE) FROM dual;

这可以正常工作,但不引用包含 SQL 的文件。

任何有一些想法的人都会很棒。提前致谢。

标签: oracleshellvariablesplsql

解决方案


您是否尝试添加SET SERVEROUTPUT ON

我通常更喜欢sqlplus使用heredoc方法运行并将块的结果传递给这样的变量,它对我来说很好。

scripts-$cat ./sqlplus_exec.sh
#!/bin/bash
output=$(sqlplus -s  $user/$pass <<INP
set heading off feedback off verify off timing off
set serveroutput on
@print_output.sql
INP
)

echo "$output"

这是SQL文件

scripts-$cat print_output.sql
BEGIN
  DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
END;
/

scripts-$./sqlplus_exec.sh
HELLO WORLD

推荐阅读