使用 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
函数参数还没有被使用,但是因为它们在那里你仍然需要为它们声明变量,即使它们被留空。
有没有办法在 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
函数参数还没有被使用,但是因为它们在那里你仍然需要为它们声明变量,即使它们被留空。