Получение значений из переменной в 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, и он, вероятно, будет слишком тесно связан с вызывающей стороной.Лучше использовать подход аргумента командной строки, описанный выше.