是否可以在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";
这是我想使用SQL Developer Tools在PL / SQL中执行它的方式:
BEGIN
:returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;
OR
Declare
returnRes Varchar2(200);
BEGIN
returnRes := PKG_PACKAGE1.FNC_PACKAGE1(:PARAM1,:PARAM2);
END;
当我运行其中任何一个时,都会出现错误:PLS-00382:表达式类型错误。 当我通过向导运行程序包时,它会返回值。
有没有一种特定的方式可以执行软件包?
谢谢。
答案 0 :(得分:4)
用于接收该函数返回的结果的变量必须是同一类型:
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
而不是定义自己的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;
/
只要您将变量更改为匹配,上述匿名块仍将起作用:
DECLARE
returnRes sys_refcursor;
res varchar2(200);
BEGIN
...
但是您可能会使用第一种形式,例如使用SQL * Plus或SQL Developer时,使用时钟或使用exec
包装器:
var param1 number;
var param2 number;
var returnres refcursor;
exec :returnres := pkg_package1.fnc_package1(:param1,:param2);
print :returnRes
'DATARETURNED
-------------
Data Returned
函数自变量尚未使用,但是即使存在,您仍然需要为其声明变量,即使它们为空。