用户定义的记录作为OUT参数

时间:2017-10-22 00:34:58

标签: oracle stored-procedures plsql

这是我目前的代码。我的错误是必须声明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;

非常感谢任何帮助......

1 个答案:

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