SQLPLUS 脚本调用函数并执行 return 字符串

SQLPLUS script calling a function and executing the return String

我有一个需要调用函数的sqlplus脚本。这个函数动态创建了一个SQL select 并且已经在数据库中编译好了。 我的脚本需要调用此函数,执行 SQL 请求 returns,然后将数据假脱机存储在 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函数,它运行正常; return 字符串中的查询。

语法错误...也许您可以调用刚刚创建的假脱机?

以下是可行的方法:

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;

希望对您有所帮助。

您的代码几乎没有问题。

  • 没有包含您的 EXECUTE IMMEDIATEBEGIN END 块 表达式。
  • 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