我正在尝试使用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
/
答案 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