Получить значение из файла sql в вызывающий файл sql - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть file1.sql, который вызывает file2.sql.

file2.sql:

declare
v_stmt varchar2(1000);
begin
v_stmt := 'create index idx on tab1(&1)';
:stmt  := v_stmt;
end;
/

file1.sql:

var stmt varchar2(4000);
@file2.sql 'col1'
:stmt;

Выполнение file1.sql выдает следующие ошибки:

SP2-0552: Bind variable "STMT" not declared.  
SP2-0042: unknown command ":stmt" - rest of line ignored.

Как получить значение переменной v_stmt в file1.sql?

1 Ответ

0 голосов
/ 20 декабря 2018

Вы не можете запустить произвольный код из командной строки SQL * Plus, используя переменную связывания;Переменная bind относится к операторам SQL и PL / SQL, а не к SQL * Plus (даже если она объявлена ​​там с помощью var).

Для выполнения оператора вам необходимо использовать динамический SQLв анонимном PL / SQL блоке;поэтому изменение file1.sql на:

var stmt varchar2(4000);
@file2.sql 'col1'

begin
  execute immediate :stmt;
end;
/

или немного короче, но, возможно, слегка сбивает с толку: *

var stmt varchar2(4000);
@file2.sql 'col1'
exec execute immediate :stmt;

Когда я запускаю, я вижу:

SQL> @file1

PL/SQL procedure successfully completed.

begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

, что разумно, поскольку у меня нет вашей таблицы tab1 в моей схеме.Вы можете видеть, что пытается выполнить оператор, хотя;и нет ошибки SP2-0552 (хотя я не вижу это и с вашим исходным кодом).

Вы также можете использовать print stmt, чтобы увидеть сгенерированное значение перед его запуском (обратите внимание, что двоеточие отсутствуетпрефикс);или, конечно, вы можете использовать dbms_output в анонимном блоке.

...