【问题标题】:SQLPLUS script calling a function and executing the return StringSQLPLUS 脚本调用函数并执行返回字符串
【发布时间】:2017-10-13 12:06:56
【问题描述】:

我有一个需要调用函数的 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 类型

我还测试了 build_select 函数,它运行正常;以字符串形式返回查询。

【问题讨论】:

    标签: sql oracle sqlplus


    【解决方案1】:

    您的代码几乎没有问题。

    • 没有包含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

    【讨论】:

      【解决方案2】:

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

      以下是可行的方法:

      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;
      

      希望对您有所帮助。

      【讨论】:

      • 解决方案不起作用:PLS-00221:'BUILD_SELECT' 不是过程或未定义。 Build_Select 是一个函数,我希望 SQLPLUS 脚本执行 Build_select 返回的 SQL 请求,并将数据假脱机到 CSV 文件中。
      • 这是另一个建议:select your_function from dual 可能会起作用。这取决于您的功能的内容。我编辑了。
      • 是的,它有效。但仅显示 CSV 文件中的 select 语句。我希望它执行选择并在 CSV 中假脱机结果。在 CSV 中,它显示“select * from TYPE;”。我希望它执行选择查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多