【问题标题】:How to spool to different files from nested scripts?如何从嵌套脚本假脱机到不同的文件?
【发布时间】:2015-07-27 14:06:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: oracle sqlplus


    【解决方案1】:

    当您使用@ 运行脚本时,该文件的内容嵌入在父级中,因此从 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
    

    您可能还想在@secondscript 之前先spool off。还有set long 32000(或其他一些大数字),所以您可以看到整个 dbms_metadata 输出,尽管我意识到这只是一个示例。

    【讨论】:

    • 谢谢! - 抱歉我的无知,但除了@,还有其他方法可以调用脚本吗?这是一个例子,但我仍在学习应该设置什么样的东西,我不完全理解 LONG 属性,我可能需要为此打开一个单独的问题。
    • @Dzyann - set long 确定 SQL*Plus 为 LONG(和 CLOB)值显示多少个字符;它默认为 80,因此您的 DDL 被部分切断。具有很大的价值,你会看到整个事情。而且,不是真的; you can use @@ or start 但它们是相似的。 (我倾向于使用@,因为您可以从命令行使用它,但有细微的差别)。
    • Alex - 我明白这一点,但我不知道当我的输出长度未知时我应该做什么。我在这里发布了一个问题 => stackoverflow.com/questions/30267215/…
    • @Dzyann - 我认为贾斯汀已经报道了它 *8-)
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多