Как сохранить несколько выходных столбцов, возвращаемых хранимым процессом в оболочке, используя sqlplus - PullRequest
0 голосов
/ 27 августа 2018

У меня есть чтение значений, возвращаемых в sql хранимых процедур для переменных в сценарии оболочки Мне удалось добиться этого с одной переменной, но не для двух переменных.

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 в моей программе. Так как же мне этого добиться?

1 Ответ

0 голосов
/ 28 августа 2018

Я не знаю, как сделать этот интерфейс между PL / SQL (язык сервера Oracle) и Unix. Возможно, вы захотите иметь разъем JDBC для более расширенного использования.

Решением вашей проблемы является для построения выходной строки непосредственно из запроса (или вы можете использовать процедуру и вывод результата с помощью dbms_output) и обработки строки в вашей оболочке.

Вот как (без процедуры):

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}"

И вы можете сделать это с помощью dbms_output.put_line в блоке pl / sql:

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

Надеюсь, это поможет

...