如何使用sqlplus在shell中存储存储过程返回的多个输出列

Posted

技术标签:

【中文标题】如何使用sqlplus在shell中存储存储过程返回的多个输出列【英文标题】:How to store multiple output columns returned by stored proc in shell using sqlplus 【发布时间】:2018-08-27 09:50:36 【问题描述】:

我有 o 读取 sql 存储过程返回的值到 shell 脚本中的变量。我可以用单个变量来实现这一点,但不能用两个变量来实现。

Oracle 存储过程

PROCEDURE get_values (ip_var   IN  NUMBER,
op_var1  OUT VARCHAR2,
op_var2  OUT VARCHAR2)
IS
BEGIN
    SELECT col1, col2
    INTO   op_var1, op_var2
    FROM   emp
    WHERE  emp_id = ip_var;
END;

在 unix bash 中调用这个过程为

sql_status=`sqlplus -silent /nolog << END
whenever sqlerror exit sql.sqlcode
whenever oserror exit -2
set pagesize 0 feedback off verify off heading off echo off scan off serveroutput on
connect $DATABASE 
declare
var1   VARCHAR2(20);
var2   VARCHAR2(20);
begin
get_values($input_val, var1, var2);
end;
/
exit;
END`

我需要在我的程序中进一步分配 var1 和 var2。那么我该如何实现呢?

【问题讨论】:

您可以简单地将值分配给 bash 脚本中声明的 2 个变量,例如 v1=$var1;v2=$v2;,并在程序的其余部分使用 v1 and v2 【参考方案1】:

我不知道如何在 PL/SQL(Oracle 服务器端语言)和 Unix 之间建立这个接口。您可能需要一个 jdbc 连接器以进行更高级的使用。

您的问题的解决方案是直接从查询构建输出字符串(或者您可以使用过程,并使用dbms_output 输出结果),并在您的shell 中处理该字符串.

这里是如何(无程序):

COL_SEP="%"
RETURN_STRING=`sqlplus -silent /nolog << END
whenever sqlerror exit sql.sqlcode
whenever oserror exit -2
set pagesize 0 feedback off verify off heading off echo off scan off serveroutput on
connect $DATABASE 
  SELECT col1 ||'$COL_SEP'|| col2
  FROM   emp
  WHERE  emp_id = ip_var;
exit;
END`

echo "RETURN CODE IS: $? "
echo "RETURN STRING : $RETURN_STRING "
v1=`echo $RETURN_STRING | cut -d$COL_SEP -f1 `
v2=`echo $RETURN_STRING | cut -d$COL_SEP -f2 `

echo "Variables set: V2:$v2 and V1:$v1"

您可以在 pl/sql 块中使用 dbms_output.put_line 来做到这一点:

declare
  v varchar2(100) := '00';
begin
  select 'a'||'$COL_SEP'||'b' into v from dual;
  dbms_output.put_line(v);
end;
/

希望对你有帮助

【讨论】:

以上是关于如何使用sqlplus在shell中存储存储过程返回的多个输出列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLPlus 查看 Oracle 存储过程?

shell 中执行Oracle查询和执行存储过程

如何从 Windows 脚本文件执行 oracle 存储过程?

获取存储过程 sqlplus 的执行计划

Oracle中执行存储过程call和exec区别

代理返点存储过程