如何从嵌套脚本假脱机到不同的文件?

How to spool to different files from nested scripts?

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

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

例如,有这两个脚本,第二个 Select 到 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

当您 运行 具有 @ 的脚本时,该文件的内容嵌入到父级中,因此从 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 "Whosebug"."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

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