ORA-00900:无效的SQL语句-在Oracle 12c中运行程序包

时间:2019-04-09 07:34:04

标签: oracle plsql package oracle12c ora-00900

我正在使用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"

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这里没有动态,所以-为什么要使用动态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>

答案 1 :(得分:0)

就像@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