使用 PL/SQL 中的函数执行 Oracle 程序包

Execute Oracle Package with Function in PL/SQL

有没有办法在 Oracle 中执行包函数 PL/SQL?

这是一个示例包,其中包含 returns 引用光标的功能:

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";

下面是我想在 PL/SQL 中使用 SQL 开发人员工具执行它的方式:

 BEGIN
   :returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
 END;

Declare 
returnRes Varchar2(200);
BEGIN
   returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;

当我 运行 要么我得到错误:PLS-00382:表达式类型错误。 当我 运行 包通过向导时它变成了 returns 的值。

是否有特定的方式以这种方式执行包,或者不可能?

谢谢。

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

DECLARE 
   returnRes PKG_PACKAGE1.CURS_OUT;
BEGIN
   returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;

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

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;
/

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

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;
/

上面的匿名块仍然有效,只要您更改变量以匹配:

DECLARE 
   returnRes sys_refcursor;
   res varchar2(200);
BEGIN
...

但是您可以使用您的第一种形式,作为您拥有的时钟,或者如果您使用 SQL*Plus 或 SQL 包装器,则使用 exec 包装器:

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

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

print :returnRes

'DATARETURNED
-------------
Data Returned

函数参数还没有被使用,但是因为它们在那里你仍然需要为它们声明变量,即使它们被留空。