2017-10-22 15 views
0

これは私の現在のコードです。私のエラーは、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; 

任意の助けをいただければ幸いです...

+2

戻りデータ・タイプの署名は、呼び出しプログラムに利用可能でなければなりません。現在COUNTRY_RECをproc内に宣言しているので、proc内でのみ使用できます。戻り値としてRECORDを使用する必要がある場合は、パッケージで定義し、procと呼び出しコードで 'PACKAGE_NAME.COUNTRY_REC'と参照するだけです。 –

答えて

1

プロシージャのパラメータの範囲内でアクセスすることはできませんTYPECOUNTRY_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; 

もう1つのオプションは、パッケージ仕様のパッケージスコープにレコードを定義することです。

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; 
/
関連する問題