是否可以从嵌套脚本换行到不同的文件? 我有一个脚本调用另一个脚本。第一个脚本将所有内容假脱机到输出。我想只将第二个脚本的某些部分保存在不同的文件中。
但是当我在第二个脚本中停止假脱机时,它会完全停止,并且我不知道如何再次启动它以使其在第一个文件中继续假脱机。
例如,有这两个脚本,第二个选择到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
答案 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输出,虽然我知道这只是一个例子。