如何从嵌套脚本假脱机到不同的文件?
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 off
。 set long 32000
(或其他一些大数字)所以你会看到整个 dbms_metadata 输出,虽然我知道这只是一个例子。
是否可以从嵌套脚本假脱机到不同的文件? 我有一个脚本调用另一个脚本。第一个脚本将所有内容假脱机输出。我只想将第二个脚本的某些部分保存在不同的文件中。
但是当我在第二个脚本中停止假脱机时,它完全停止了,我不知道如何再次启动它以使其在第一个文件中继续假脱机。
例如,有这两个脚本,第二个 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 off
。 set long 32000
(或其他一些大数字)所以你会看到整个 dbms_metadata 输出,虽然我知道这只是一个例子。