【问题标题】:Oracle Spool using Dynamic SQL使用动态 SQL 的 Oracle 假脱机
【发布时间】:2015-09-11 15:22:47
【问题描述】:

我正在尝试使用 SQL*Plus 将动态 SQL 语句传递给一个文本文件,但我似乎无法执行我正在生成的选择语句。

set linesize 10000 pagesize 0 embedded on
set heading off feedback off verify off trimspool on trimout on  termout off
set underline off

COLUMN gen_sql   NEW_VALUE gen_sql_
SELECT 'SELECT * FROM USER_TAB_COLS WHERE ROWNUM < 10' gen_sql_ FROM DUAL;

SPOOL 'myfilename.csv'

EXECUTE IMMEDIATE &gen_sql_

SPOOL OFF
/

我似乎无法使用EXECUTE IMMEDIATE。有没有其他方法可以执行select语句的结果??

更多细节:

我有一组视图,我想将其输出生成为格式化 CSV 文件。我基本上使用动态 SQL 来创建格式。我生成类似于:

SELECT TRIM(col1)||','||TRIM(col2)...FROM {myview}

我正在使用以下方法来生成它:

COLUMN gen_sql   NEW_VALUE gen_sql_
SELECT 'SELECT ' || LISTAGG ('TRIM('||COLUMN_NAME||')', '||'',''|| ') 
     WITHIN GROUP (ORDER BY COLUMN_ID) gen_sql FROM...

无论如何,我可以生成这个 SQL 语句并将其存储到 SQL*PLUS 变量中,但我只需要在 SPOOL 语句之后执行它,它就会打印到文件中。我不确定如何执行它。正常的语句工作,例如:

SPOOL 'myfilename.csv'
SELECT 1 col1 FROM DUAL;
SPOOL OFF
/

因此,我可以执行类似的操作但执行变量的内容,例如:

SPOOL 'myfilename.csv'
--- RUN MY DYNAMIC SQL ----
SPOOL OFF
/

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我认为这是您想要实现的目标:

    set linesize 10000 pagesize 0 embedded on
    set heading off feedback off verify off trimspool on trimout on  termout off
    set underline off
    
    SPOOL myfilename.sql
    
    SELECT 'SELECT table_name||'',''||column_name FROM USER_TAB_COLS WHERE ROWNUM < 10;' gen_sql_ FROM DUAL;
    
    SPOOL OFF
    
    spool results.csv
    
    @myfilename.sql
    
    SPOOL OFF
    

    即首先将查询结果假脱机到一个文件中,然后在假脱机完成后,调用刚刚创建的脚本,将结果假脱机到一个单独的文件中。

    【讨论】:

    • 不过,我需要将生成的动态 sql 的结果转换为 CSV 文件。在这里,“myfilename.sql”将包含 'SELECT * FROM USER_TAB_COLS WHERE ROWNUM
    【解决方案2】:

    相信你会发现EXECUTE IMMEDIATE是一个PL/SQL命令,所以不能直接在SQL或SQL*plus中使用。

    http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems017.htm

    另外,SPOOL 是 SQL*Plus 命令,不能在 PL/SQL 中使用 ..

    所以你有问题;)

    您能后退一步,解释一下您要做什么吗? 你有什么要求?

    【讨论】:

    • Spool 是 SQL*Plus 命令,而不是 SQL 或 PL/SQL。 docs.oracle.com/cd/B19306_01/server.102/b14357/…
    • 是的,对不起,我的意思是 :) 我不好,速记 .. :) 我会解决的。
    • 在原帖中添加了更多细节,希望它有助于澄清问题。
    • 我看到了您的更新,基于此,我建议您阅读 Boneist 的回答……这可能是您想要的方向。还有其他“更复杂”的解决方案..与他所拥有的相比,您绝对没有任何收获.. ;)
    • {咳嗽}她{咳嗽} *{;-)
    【解决方案3】:

    首先你需要使用spool动态构造一个sql。 然后执行。

    set echo off
    set verify off
    set feedback off
    set linesize 256
    set pagesize 0
    set term off
    SPOOL 'myscript.sql'
    SELECT * FROM USER_TAB_COLS WHERE ROWNUM < 10;
    SPOOL OFF
    
    set colsep ,
    SPOOL myfile.csv
    @myscript.sql
    SPOOL OFF
    

    【讨论】:

    • 我如何将@myscript.sql 的内容保存到 CSV 文件中,因为这是我最终想要的。
    • 使用 set colsep , 应该可以解决问题。查看编辑后的答案
    • 这没有意义。您应该在发布之前测试您的答案。 myscript.sql 的内容是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多