我有一个需要调用函数的sqlplus脚本。此函数动态创建SQL选择,并且已在数据库中编译。 我的脚本需要调用此函数,执行它返回的SQL请求,然后将数据假脱机存储在CSV文件中。 我的SQLPLUS代码如下:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ,
spool /a/b/rvibap/c/&1..csv
EXECUTE IMMEDIATE build_select(&1)
spool off;
/
但是,我在CSV文件中收到以下错误:
BEGIN IMMEDIATE build_select(TYPE); END;
*
ERROR at line 1:
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "BUILD_SELECT" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "BUILD_SELECT" to continue.
我以下列方式调用我的SQL脚本:
@ test.sql TYPE
我还测试了build_select函数,它正常运行;返回String中的查询。
答案 0 :(得分:1)
您的代码存在一些问题。
BEGIN END
封闭您的EXECUTE IMMEDIATE
封锁
表达EXECUTE IMMEDIATE
不显示sql select语句的结果。@test.sql TYPE
,它将被解析为EXECUTE IMMEDIATE build_select(TYPE)
,即没有引号的普通TYPE
- 这会引发错误。您可以通过将其作为 @test.sql "'TYPE'"
正如我所说,你不能直接执行和查看11g及以下的动态SQL select
语句的结果。所以你可以使用另一个答案中使用的技术,我不清楚它是否能整齐地生成select
SQL。
如果您在12c
,则可以使用
open a_ref_cursor for build_select(&1);
dbms_sql.return_result(a_ref_cursor);
对于11g
及以下,以下是一些解释的技术。
How to output result of SELECT statement which is executed using native dynamic SQL?
如果您可以不使用function
,则更好的解决方案是
答案 1 :(得分:0)
语法错误......也许您可以调用刚创建的假脱机?
以下是可行的:
SET HEAD OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 32000
SET PAGESIZE 0
SET TERMOUT OFF
SET ECHO OFF
SET COLSEP ''
spool /a/b/rvibap/c/&1..sql
prompt SET COLSEP ,
select build_select(&1) from dual;
spool off;
spool /a/b/rvibap/c/&1..csv
@/a/b/rvibap/c/&1
spool off;
希望它有所帮助。