Вы не можете запустить произвольный код из командной строки SQL*Plus, используя переменную связывания; переменная связывания имеет отношение к операторам 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
в анонимном блоке.
20.12.2018