用户定义的记录作为OUT参数
问题描述:
这是我当前的代码。我的错误是必须声明COUNTRY_REC。我明白所有我只是无法找到任何在线,谈论记录作为输出参数。这是问题的要求。我必须非常接近解决方案,但我不明白。用户定义的记录作为OUT参数
CREATE OR REPLACE PROCEDURE find_region_and_currency_sp(
p_country_name IN COUNTRIES.COUNTRY_NAME%TYPE,
p_country_rec OUT country_rec)
IS
TYPE country_rec IS RECORD(
country_name COUNTRIES.COUNTRY_NAME%TYPE,
region COUNTRIES.REGION_ID%TYPE,
currency COUNTRIES.CURRENCY_CODE%TYPE);
country_record country_rec;
BEGIN
SELECT COUNTRY_NAME, REGION_ID, CURRENCY_CODE INTO country_rec
FROM COUNTRIES
where COUNTRY_NAME = p_country_name;
END;
任何帮助将不胜感激......
答
你记录TYPE
COUNTRY_REC
的内部程序定义的不是过程参数范围内的访问。
您有以下选择。
创建并存储一个TYPE OBJECT COUNTRY_REC
,其结构与查询结果和兼容数据类型的结构相同。
CREATE OR REPLACE TYPE country_rec AS OBJECT (
country_name VARCHAR2(10),
region VARCHAR2(10),
currency VARCHAR2(5)
);
然后,您不需要另一个地方记录variable.But,您需要使用NEW
关键字如图所示进行初始化。然后您可以简单地将值提取到相应的记录元素中。
CREATE OR REPLACE PROCEDURE find_region_and_currency_sp (
p_country_name IN countries.country_name%TYPE,
p_country_rec OUT country_rec
)
IS
BEGIN
p_country_rec := NEW country_rec(NULL,NULL,NULL); --Initialization
SELECT
country_name,
region_id,
currency_code
INTO
p_country_rec.country_name,p_country_rec.region,p_country_rec.currency
FROM
countries
WHERE
country_name = p_country_name;
END;
另一个选项是在包规范中定义包范围中的记录。
CREATE OR REPLACE PACKAGE pkg_country_op
AS
TYPE country_rec IS RECORD(
country_name COUNTRIES.COUNTRY_NAME%TYPE,
region COUNTRIES.REGION_ID%TYPE,
currency COUNTRIES.CURRENCY_CODE%TYPE);
PROCEDURE find_region_and_currency_sp (
p_country_name IN COUNTRIES.country_name%TYPE,
p_country_rec OUT country_rec
);
END;
/
然后在PACKAGE BODY
里面包含相同的程序。
CREATE OR REPLACE PACKAGE BODY pkg_country_op..
..
..
PROCEDURE find_region_and_currency_sp (
p_country_name IN countries.country_name%TYPE,
p_country_rec OUT country_rec
)
IS
..
调用过程。您可以按照以下方式调用该过程。
案例1:
DECLARE
v_country_rec country_rec; --Global Scope
BEGIN
find_region_and_currency_sp('India',v_country_rec);
END;
/
案例2:
DECLARE
v_country_rec pkg_country_op.country_rec; --Package Global variable
BEGIN
pkg_country_op.find_region_and_currency_sp('India',v_country_rec);
END;
/
返回数据类型的签名必须是可用来调用程序。由于您目前在proc中声明了'COUNTRY_REC',因此它只能在proc中使用。如果您需要使用RECORD作为返回,只需将其定义在包中,并在proc和调用代码中将其引用为“PACKAGE_NAME.COUNTRY_REC”。 –