我试图使用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 'myfilename.csv'
SELECT 1 col1 FROM DUAL;
SPOOL OFF
/因此,我可以做一些类似的事情,但执行变量的内容,这似乎是合理的,比如:
SPOOL 'myfilename.csv'
--- RUN MY DYNAMIC SQL ----
SPOOL OFF
/发布于 2015-09-11 16:15:17
我想这就是你想要达到的目标:
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也就是说,首先将查询的结果放到一个文件中,然后在后台完成后,调用刚才创建的脚本,将结果假脱机到一个单独的文件中。
发布于 2015-09-11 15:32:44
我相信您会发现EXECUTE IMMEDIATE是PL/SQL命令,因此不能直接在SQL或SQL*plus中使用。
elems017.htm
另外,SPOOL是一个SQL*Plus命令,不能在PL/SQL中使用。
所以你有一个问题;)
你能退后一点解释一下你想做什么吗?你有什么要求?
发布于 2015-09-11 15:44:10
首先,您需要使用假脱机动态地构造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 OFFhttps://stackoverflow.com/questions/32526917
复制相似问题