我有一个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
的值?
答案 0 :(得分:1)
您不能使用绑定变量从SQL * Plus命令行运行任意代码;绑定变量与SQL和PL / SQL语句有关,而与SQL * Plus无关(即使在var
中声明了该变量)。
要执行该语句,您需要在匿名PL / SQL块中使用动态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
。