プロシージャのパラメータの範囲内でアクセスすることはできません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;
もう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;
/
戻りデータ・タイプの署名は、呼び出しプログラムに利用可能でなければなりません。現在COUNTRY_RECをproc内に宣言しているので、proc内でのみ使用できます。戻り値としてRECORDを使用する必要がある場合は、パッケージで定義し、procと呼び出しコードで 'PACKAGE_NAME.COUNTRY_REC'と参照するだけです。 –