2017-10-22 50 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

返回數據類型的簽名必須是可用來調用程序。由於您目前在proc中聲明瞭'COUNTRY_REC',因此它只能在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; 

另一個選項是在包規範中定義包範​​圍中的記錄。

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