Вы не можете запустить произвольный код из командной строки 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
в анонимном блоке.