Передайте переменную из одного сценария SQL в другой в качестве параметра - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь вызвать сценарий sql из другого сценария и сталкиваюсь с некоторыми проблемами при попытке передать переменную в качестве параметра.

При определении константы я могу передать ее следующим образом:

DEFINE MY_PARAM = "test"
BEGIN
    @mysqlscript.sql "&MY_PARAM"
END;
/

Однако я хочу вызвать скрипт с переменной, должен выглядеть примерно так:

DECLARE 
v_MY_PARAM VARCHAR(32) := 'test'
BEGIN
    @mysqlscript.sql :V_MY_PARAM
END;
/

Я пробовал разные способы (например, "&V_MY_PARAM", '&V_MY_PARAM', ':V_MY_PARAM',...) но пока не повезло.

1 Ответ

1 голос
/ 20 июня 2019

Получение значений из переменной в DEFINE - это немного хлопотно и требует запутанного процесса.Создайте переменную связывания в SQL * Plus и делайте все, что хотите, чтобы получить значение в этой переменной связывания.Теперь используйте команду COLUMN с NEW_VALUE, чтобы определить столбец и переменную define, в которую он войдет.Затем используйте SELECT, чтобы получить переменную связывания в новую переменную define.

Возможно, вы захотите добавить некоторые настройки SQL * Plus, чтобы минимизировать выходные данные некоторых из этих действий.

Вот пример:

script.sql

set serveroutput on size unlimited

-- use a bind variable defined at SQL*Plus level for this
variable v_MY_PARAM VARCHAR2(32)

BEGIN
    -- can use SELECT to do this too
    :v_MY_PARAM := 'test';
END;
/

-- Here is the magic that converts a bind variable to a DEFINE variable
column mycol new_value myvar
select :v_MY_PARAM as mycol from dual;

BEGIN
    @mysqlscript.sql &myvar
END;
/

myscript.sql

dbms_output.put_line('Working? &1');
-- But wait!!!
dbms_output.put_line('This works too: ' || :v_MY_PARAM);

Первый параметр использует правильный аргумент, обработанный как SQL *Плюс определить, поменять местами дословно.

Второй вариант использует переменную связывания непосредственно во втором файле.Переменная bind является глобальной для SQL * Plus и может быть видна всем сценариям.Недостатком этого второго подхода является то, что вашему второму сценарию необходимо знать имя переменной bind, и он, вероятно, будет слишком тесно связан с вызывающей стороной.Лучше использовать подход аргумента командной строки, описанный выше.

...