2017-06-22 78 views
1

我有一個記錄類型如下,我們可以使用表類型參數作爲PLSQL中的默認空參數嗎?

TYPE x_Rec IS RECORD(
    master_company   x_tab.master_company%TYPE, 
    report_trans_type  x_tab.report_trans_type%TYPE, 
    balance_version_id  x_tab.balance_version_id%TYPE, 
    reporting_entity  x_tab.reporting_entity%TYPE, 
    year_period_from  x_tab.year_period%TYPE, 
    year_period_to   x_tab.year_period%TYPE, 
    journal_id    x_tab.journal_id%TYPE, 
    row_id     x_tab.row_id%TYPE); 

和我創建使用這個記錄表類型:

TYPE x_rec_tab IS TABLE OF x_Rec INDEX BY PLS_INTEGER; 

我想在一個過程中使用此表類型的默認爲空參數。

PROCEDURE x_Balance___(x_param IN NUMBER, 
         x_rec_ IN x_rec_tab default null) 
IS 
BEGIN 
...My code 
END; 

它提供了以下錯誤消息

PLS-00382:表達式是錯誤的類型

+1

對我來說這種代碼的作品。在哪一行你會得到這個錯誤,我認爲它會在其他地方出現。 –

+0

它在過程的表類型參數中。我們可以使用默認的null作爲表類型參數嗎? –

回答

1

的你不能做到這一點與an associative array,作爲可以never be null。如果您嘗試將空值分配給類型爲x_rec_tab的變量,則會出現相同的錯誤。他們也don't have constructors,所以你不能使用一個空的集合。

爲此,您可以將一個varray或更有效地爲您的情況nested table

create or replace package p42 as 

TYPE x_Rec IS RECORD(
    master_company   x_tab.master_company%TYPE, 
    report_trans_type  x_tab.report_trans_type%TYPE, 
    balance_version_id  x_tab.balance_version_id%TYPE, 
    reporting_entity  x_tab.reporting_entity%TYPE, 
    year_period_from  x_tab.year_period%TYPE, 
    year_period_to   x_tab.year_period%TYPE, 
    journal_id    x_tab.journal_id%TYPE, 
    row_id     x_tab.row_id%TYPE); 

-- no index-by clause, so nested table not associative array 
TYPE x_rec_tab IS TABLE OF x_Rec; 

end p42; 
/

Package P42 compiled 

show errors 

No errors. 


create or replace package body p42 as 

PROCEDURE x_Balance___(x_param IN NUMBER, 
         x_rec_ IN x_rec_tab default null) 
IS 
BEGIN 
    --...My code 
    null; 
END; 

PROCEDURE dummy IS 
    l_rec_tab x_rec_tab; 
BEGIN 
    l_rec_tab := null; 
END; 

end p42; 
/

Package Body P42 compiled 

show errors; 

No errors. 

你也可以默認爲一個空的集合,而不是:

PROCEDURE x_Balance___(x_param IN NUMBER, 
         x_rec_ IN x_rec_tab default x_rec_tab()) 
IS 
... 

這並不能真正幫助你很多,如果你有其他的代碼依賴於類型是一個關聯數組當然。

0

老問題,但仍可能會有所幫助。 您可以創建一個功能:

function empty_tab 
return x_rec_tab 
as 
    l_tab x_rec_tab; 
begin 

    return l_tab; 

end empty_tab; 

這樣你就可以(注意empty_tab作爲默認參數):

PROCEDURE x_Balance___(x_param IN NUMBER, 
         x_rec_ IN x_rec_tab default empty_tab) 
IS 
BEGIN 
...My code 
END; 
0

我解決了這個用CAST(NULL AS/your_type /)在程序的簽名中。

例如,你的情況,這將是這樣的:

程序x_Balance(x_param在數量上, x_rec_ IN x_rec_tab默認投(null作爲x_rec_tab)

然後,內該過程中,您只需使用count方法檢查x_rec_是否具有元素。

這種方式適用於我。

相關問題