Oracle Spool使用动态SQL

时间:2015-09-11 15:22:48

标签: sql oracle

我正在尝试使用SQL * Plus传递动态SQL语句来假脱机到文本文件,但我似乎无法执行我正在生成的select语句。

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
/

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

我相信你会发现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中使用..

所以你有问题;)

你可以退一步说明你想要做什么吗? 你有什么要求?

答案 2 :(得分:-1)

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

ls