首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用动态SQL的Oracle Spool

使用动态SQL的Oracle Spool
EN

Stack Overflow用户
提问于 2015-09-11 15:22:47
回答 3查看 4K关注 0票数 0

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

代码语言:javascript
复制
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}

我使用以下方法生成它:

代码语言:javascript
复制
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变量中,但是我只需要在假脱机语句之后执行它,这样它就可以打印到文件中了。我不知道怎么执行。正常的语句起作用,例如:

代码语言:javascript
复制
SPOOL 'myfilename.csv'
SELECT 1 col1 FROM DUAL;
SPOOL OFF
/

因此,我可以做一些类似的事情,但执行变量的内容,这似乎是合理的,比如:

代码语言:javascript
复制
SPOOL 'myfilename.csv'
--- RUN MY DYNAMIC SQL ----
SPOOL OFF
/
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-11 16:15:17

我想这就是你想要达到的目标:

代码语言:javascript
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2015-09-11 15:32:44

我相信您会发现EXECUTE IMMEDIATE是PL/SQL命令,因此不能直接在SQL或SQL*plus中使用。

elems017.htm

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

所以你有一个问题;)

你能退后一点解释一下你想做什么吗?你有什么要求?

票数 0
EN

Stack Overflow用户

发布于 2015-09-11 15:44:10

首先,您需要使用假脱机动态地构造sql。然后执行。

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32526917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档