从sql文件获取值到正在调用的sql文件

时间:2018-12-20 10:27:17

标签: oracle sqlplus

我有一个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 :(得分: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