这是我目前的代码。我的错误是必须声明COUNTRY_REC。我理解所有这些我在网上找不到任何,它将记录作为参数进行讨论。这是问题的要求。我必须非常接近解决方案,但我只是不明白。
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;
非常感谢任何帮助......
答案 0 :(得分:1)
您的记录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)
);
然后您不需要另一个本地记录变量。但是,您需要使用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;
/