如何从嵌套脚本换行到不同的文件?

时间:2015-05-15 15:14:44

标签: oracle sqlplus

是否可以从嵌套脚本换行到不同的文件? 我有一个脚本调用另一个脚本。第一个脚本将所有内容假脱机到输出。我想只将第二个脚本的某些部分保存在不同的文件中。

但是当我在第二个脚本中停止假脱机时,它会完全停止,并且我不知道如何再次启动它以使其在第一个文件中继续假脱机。

例如,有这两个脚本,第二个选择到MY_TABLE没有假脱机。

firstScript.sql

prompt --------------Start firstScript--------------
set pagesize 0
set heading on 
set feedback on 
set timing on
set time on
set echo on
set verify on

spool testFirstScript.sql

select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') from dual;

@secondScript.sql

select * from MY_TABLE where Id = 1; -- This doesn't get spooled.

spool off

prompt --------------End firstScript--------------

secondScript.sql

prompt --------------Start secondScript--------------

spool testSecondScript.sql

select * from MY_TABLE;

spool off
prompt --------------End secondScript--------------

假脱机输出:

testFirstScript.sql

11:28:23 SQL> 
11:28:23 SQL> select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') from dual;

  CREATE TABLE "S1"."MY_TABLE"                                             
   (    "ID" NUMBER,                                                               
    "NAME" VARCHAR2(30)                                                            



1 row selected.

Elapsed: 00:00:01.08
11:28:24 SQL> 
11:28:24 SQL> @secondScript.sql
11:28:24 SQL> prompt --------------Start secondScript--------------
11:28:24 > 
--------------Start secondScript------------- 
11:28:24 SQL> spool testSecondScript.sql

testSecondScript.sql

11:28:24 SQL> 
11:28:24 SQL> select * from MY_TABLE;
         1 Test1                                                                
         2 Test2                                                                

2 rows selected.

Elapsed: 00:00:00.36
11:28:24 SQL> 
11:28:24 SQL> spool off

1 个答案:

答案 0 :(得分:6)

当您运行带有@的脚本时,该文件的内容嵌入在父级中,因此从SQL * Plus的角度来看,您只需运行一个长脚本。 SQL * Plus命令未本地化到子脚本。

您必须在嵌入式脚本之后使用APPEND clause重新开始假脱机,例如在firstScript.sql

...
spool testFirstScript.sql

select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') from dual;

@secondScript.sql

-- restart spooling
spool testFirstScript.sql append

...

有了这个改变,testFirstScript.sql现在有:

16:28:14 SQL>
16:28:14 SQL> select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') from dual;

DBMS_METADATA.GET_DDL('TABLE','MY_TABLE')
--------------------------------------------------------------------------------

  CREATE TABLE "STACKOVERFLOW"."MY_TABLE"
   (    "ID" NUMBER,
    "NAME" VARCHAR2(


1 row selected.

Elapsed: 00:00:00.26
16:28:14 SQL>
16:28:14 SQL> @secondScript.sql
16:28:14 SQL> prompt --------------Start secondScript--------------
16:28:14 >
--------------Start secondScript-------------
16:28:14 SQL> spool testSecondScript.sql
16:28:14 SQL>
16:28:14 SQL> select * from MY_TABLE where Id = 1; -- This doesn't get spooled.
16:28:14   2
16:28:14 SQL> spool off

testSecondScript.sql仍然有:

16:28:14 SQL>
16:28:14 SQL> select * from MY_TABLE;

no rows selected

Elapsed: 00:00:00.00
16:28:14 SQL>
16:28:14 SQL> spool off

您可能还想在spool off之前@secondscript。和set long 32000(或其他一些大数字)所以你看到整个dbms_metadata输出,虽然我知道这只是一个例子。