如何使用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中存储存储过程返回的多个输出列的主要内容,如果未能解决你的问题,请参考以下文章