SQLPLUS脚本调用函数并执行返回String

时间:2017-10-13 12:06:57

标签: sql oracle sqlplus

我有一个需要调用函数的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中的查询。

2 个答案:

答案 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,则更好的解决方案是

Generating SQL*Plus script using SQL*Plus

答案 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;

希望它有所帮助。