【发布时间】: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
/
【问题讨论】: