在PL / SQL中执行具有功能的Oracle软件包

mrH*_*and 0 oracle plsql plsqldeveloper

有没有办法在Oracle PL / SQL中执行包功能?

这是带有函数的示例包,该函数返回参考光标:

create or replace PACKAGE "PKG_PACKAGE1"
AS
    TYPE CURS_OUT IS REF CURSOR;
    FUNCTION fnc_PACKAGE1(PARAM1 VARCHAR2, PARAM2 INT) RETURN CURS_OUT;
 END "PKG_PACKAGE1";


create or replace PACKAGE BODY "PKG_PACKAGE1"
AS
FUNCTION fnc_PACKAGE1(PARAM1 VARCHAR2, PARAM2 INT) RETURN CURS_OUT
AS
    RUNCURS CURS_OUT;
        BEGIN
            OPEN  RUNCURS FOR
                SELECT 'Data Returned' FROM DUAL;
            RETURN RUNCURS;
            END;
END "PKG_PACKAGE1";
Run Code Online (Sandbox Code Playgroud)

这是我想使用SQL Developer Tools在PL / SQL中执行的方法:

 BEGIN
   :returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
 END;
Run Code Online (Sandbox Code Playgroud)

要么

Declare 
returnRes Varchar2(200);
BEGIN
   returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;
Run Code Online (Sandbox Code Playgroud)

当我运行任何一个时,我都会收到错误消息:PLS-00382:表达式类型错误。当我通过向导运行程序包时,它将返回值。

有没有一种特定的方式来执行软件包,或者不可能?

谢谢。

Ale*_*ole 5

用于接收该函数返回的结果的变量必须为同一类型:

DECLARE 
   returnRes PKG_PACKAGE1.CURS_OUT;
BEGIN
   returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;
Run Code Online (Sandbox Code Playgroud)

然后,您需要遍历返回的游标以查看函数查询中的实际字符串值,例如:

set serveroutput on
DECLARE 
   returnRes PKG_PACKAGE1.CURS_OUT;
   res varchar2(200);
BEGIN
   returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
   loop
      fetch returnRes into res;
      exit when returnRes%NOTFOUND;
      dbms_output.put_line(res);
    end loop;
END;
/
Run Code Online (Sandbox Code Playgroud)

您可能想考虑使用SYS_REFCURSOR而不是定义自己的ref游标类型;即:

create or replace package pkg_package1
as
    function fnc_package1(param1 varchar2, param2 int)
    return sys_refcursor;
end pkg_package1;
/

create or replace package body pkg_package1
as
    function fnc_package1 (param1 varchar2, param2 int)
    return sys_refcursor as
        runcurs sys_refcursor;
    begin
        open  runcurs for
            select 'Data Returned' from dual;
        return runcurs;
    end fnc_package1;
end pkg_package1;
/
Run Code Online (Sandbox Code Playgroud)

只要您将变量更改为匹配,上面的匿名块仍将起作用:

DECLARE 
   returnRes sys_refcursor;
   res varchar2(200);
BEGIN
...
Run Code Online (Sandbox Code Playgroud)

但是您可能会使用第一种形式来代替,例如exec使用SQL * Plus或SQL Developer时,使用时钟或使用包装器:

var param1 number;
var param2 number;
var returnres refcursor;

exec :returnres := pkg_package1.fnc_package1(:param1,:param2);

print :returnRes

'DATARETURNED
-------------
Data Returned
Run Code Online (Sandbox Code Playgroud)

函数参数尚未使用,但是即使它们保留为null,它们仍然存在,因此仍需要为其声明变量。