从Oracle中的函数返回表

时间:2015-08-28 10:20:25

标签: oracle psql

以下功能适用于SQL Server。

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 个答案:

答案 0 :(得分: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 :(得分: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;