【问题标题】:ORA-00900: invalid SQL statement- when run a package in oracle 12cORA-00900: SQL 语句无效 - 在 oracle 12c 中运行包时
【发布时间】:2019-08-30 10:12:54
【问题描述】:

我正在使用 Oracle 12c 数据库并尝试使用 SQL 命令运行包。

CREATE OR REPLACE PACKAGE "PK_CP_OTM" as
FUNCTION F_CP_OPTIMIZATION (
     v_current_day IN VARCHAR2,
     v_branch_code IN VARCHAR2)
     RETURN VARCHAR2;
END PK_CP_OTM;

当我尝试使用:

DECLARE
BEGIN
EXECUTE IMMEDIATE PK_CP_OTM.F_CP_OPTIMIZATION('20190409','BRNCD001');
END;

它显示:

ORA-00900: invalid SQL statement
ORA-06512: at line 3
00900. 00000 -  "invalid SQL statement"

感谢您的帮助。

【问题讨论】:

    标签: oracle plsql package oracle12c ora-00900


    【解决方案1】:

    这里没有什么动态的,所以 - 为什么要使用动态 SQL?

    无论如何:如果你坚持,那么你将不得不选择函数进入一些东西(例如一个局部变量)。这是一个例子

    一、包装:

    SQL> set serveroutput on
    SQL>
    SQL> create or replace package pk_cp_otm
      2  as
      3     function f_cp_optimization (v_current_day  in varchar2,
      4                                 v_branch_code  in varchar2)
      5        return varchar2;
      6  end pk_cp_otm;
      7  /
    
    Package created.
    
    SQL> create or replace package body pk_cp_otm
      2  as
      3     function f_cp_optimization (v_current_day  in varchar2,
      4                                 v_branch_code  in varchar2)
      5        return varchar2
      6     is
      7     begin
      8        return 'Littlefoot';
      9     end;
     10  end pk_cp_otm;
     11  /
    
    Package body created.
    

    如何调用函数?

    SQL> declare
      2     l_result  varchar2 (20);
      3  begin
      4     execute immediate
      5        'select pk_cp_otm.f_cp_optimization (''1'', ''2'') from dual'
      6        into l_result;
      7
      8     dbms_output.put_line ('result = ' || l_result);
      9  end;
     10  /
    result = Littlefoot
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 是的,动态和静态调用都工作正常,非常感谢!
    【解决方案2】:

    正如@Littlefoot 所说,这里不需要动态SQL,可以进行静态调用;但是当你调用一个函数时,你确实需要在某个地方放置调用的结果:

    declare
      l_result varchar2(30); -- make it a suitable size 
    begin
      l_result := pk_cp_otm.f_cp_optimization('20190409','BRNCD001');
    end;
    /
    

    在 SQL*Plus、SQL Developer 和 SQLcl 中,您可以使用 execute 客户端命令(这可能会引起一些混乱)和结果的绑定变量:

    var result varchar2(30);
    
    exec :result := pk_cp_otm.f_cp_optimization('20190409','BRNCD001');
    
    print result
    

    【讨论】:

    • 是的,动态和静态调用都工作正常,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2013-06-07
    • 2010-12-29
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多