2015-08-28 33 views
-2

以下函數與SQL Server一起使用。Oracle中的函數返回表

CREATE FUNCTION GET_EMP_PROB_START_ATT_CODE(@EVAL_TYPE VARCHAR(6)) 
RETURNS @EMP_PROB_START_ATT_CODE TABLE ( 
    PROBATION_START_ATT_CODE varchar(6) NULL 
) 
AS 
BEGIN 
IF @EVAL_TYPE='New' 
    INSERT INTO @EMP_PROB_START_ATT_CODE (PROBATION_START_ATT_CODE) 
    SELECT NEW_EMP_PROB_START_ATT_CODE FROM HS_HR_PEA_DYNAMIC_ATTRIBUTES;   
    ELSE 
    INSERT INTO @EMP_PROB_START_ATT_CODE (PROBATION_START_ATT_CODE) 
    SELECT EXIS_EMP_PROB_START_ATT_CODE FROM HS_HR_PEA_DYNAMIC_ATTRIBUTES;  
RETURN; 
END; 

我只是想將其轉換爲Oracle等效查詢。試過但沒有成功。

CREATE FUNCTION GET_EMP_PROB_START_ATT_CODE(EVAL_TYPE VARCHAR(6)) 
RETURN EMP_PROB_START_ATT_CODE IS TABLE  
    PROBATION_START_ATT_CODE VARCHAR(6) NULL; 

AS 
BEGIN 
IF EVAL_TYPE='New' 
    INSERT INTO EMP_PROB_START_ATT_CODE (PROBATION_START_ATT_CODE) 
    SELECT NEW_EMP_PROB_START_ATT_CODE FROM HS_HR_PEA_DYNAMIC_ATTRIBUTES;   
    ELSE 
    INSERT INTO EMP_PROB_START_ATT_CODE (PROBATION_START_ATT_CODE) 
    SELECT EXIS_EMP_PROB_START_ATT_CODE FROM HS_HR_PEA_DYNAMIC_ATTRIBUTES;  
RETURN; 
END; 

警告:編譯但編譯錯誤

任何幫助傢伙..

+2

運行'show errors'來查看真實的錯誤信息。 –

+0

或者select * from user_errors; – Boneist

回答

3

首先,創建一個數據庫範圍類型:

create type string_tab6 is table of varchar2(6); 

然後你會像這樣創建你的功能:

create or replace function get_emp_prob_start_att_code(eval_type varchar2) 
return string_tab6 
is 
    v_array string_tab6; 
begin 
    if eval_type = 'New' then 
    select new_emp_prob_start_att_code 
    bulk collect into v_array 
    from hs_hr_pea_dynamic_attributes; 
    else 
    select exis_emp_prob_start_att_code 
    bulk collect into v_array 
    from hs_hr_pea_dynamic_attributes; 
    end if; 

    return v_array; 
end get_emp_prob_start_att_code; 
/

但是,我會質疑爲什麼你需要這樣的功能。你打算如何使用它?

在Oracle中,我希望看到將邏輯直接嵌入到任何需要該信息的SQL語句中,您可以通過case語句輕鬆完成該操作。

1

首先定義行類型。對於現有的數據庫表,您可以使用%ROWTYPE
然後定義表格類型。 最後使用表格類型作爲函數的返回類型。

TYPE tr_row IS my_table%ROWTYPE; 
TYPE tab_row IS TABLE OF tr_row; 
FUNCTION get_row RETURN tab_row IS 
    mytab tab_row; 
BEGIN 
    SELECT * FROM my_table 
    BULK COLLECT INTO mytab; 
    RETURN mytab; 
END; 
+1

這對於只在PL/SQL上下文中調用過的包中定義的函數是有效的;但是由於OP似乎需要模式級功能,它需要是模式級(SQL)類型(並且不能在PL/SQL之外使用'%rowtype')。 –

+0

@alexpoole我不會爲這種專門的行爲創建一個模式級別的函數。但是創建一個模式級別的函數並不是問題,它只是調用打包的函數。 –

+0

不,我不會在Oracle中爲此創建函數;骨頭分子也注意到了這一點。 –