如何将oracle的流水线函数迁移到PostgreSQL中

如何将oracle的流水线函数迁移到PostgreSQL中,postgresql,plpgsql,Postgresql,Plpgsql,因为我是plpgSQL的新手 我在将Oracle查询迁移到PostgreSQL时卡住了 Oracle查询: create or replace FUNCTION employee_all_case( p_ugr_id IN integer, p_case_type_id IN integer ) RETURN number_tab_t PIPELINED -- LANGUAGE 'plpgsql' -- COST 100 -- VOLATILE --

因为我是plpgSQL的新手

我在将Oracle查询迁移到PostgreSQL时卡住了

Oracle查询:

create or replace FUNCTION employee_all_case(
   p_ugr_id IN integer,
   p_case_type_id IN integer
)
RETURN number_tab_t PIPELINED
--       LANGUAGE 'plpgsql'
--     COST 100
--     VOLATILE 
--     AS $$
--     DECLARE
is
  l_user_id        NUMBER;
  l_account_id     NUMBER;
BEGIN
  l_user_id      := p_ugr_id;
  l_account_id   := p_case_type_id;
  FOR cases IN
    (SELECT ccase.case_id, ccase.employee_id
     FROM ct_case ccase
       INNER JOIN ct_case_type ctype
         ON (ccase.case_type_id=ctype.case_type_id)
     WHERE ccase.employee_id = l_user_id)
  LOOP
    IF cases.employee_id IS NOT NULL THEN
      PIPE ROW (cases.case_id);
    END IF;
  END LOOP;
  RETURN;
END;
--$$
当我执行这个函数时,我得到以下结果

select * from table(select employee_all_case(14533,1190) from dual)
我在这里的问题是:我真的不理解流水线函数,如何在PostgreSQL中获得与Oracle查询相同的结果


请提供帮助。

您需要将其重写为一个设置返回函数:

将返回类型更改为

RETURNS SETOF integer
并废除管道系统

将PIPE ROW语句更改为

RETURN NEXT cases.case_id;
当然,您必须进行明显的语法更改,例如使用整数而不是数字,并在参数名之前插入


但实际上,没有必要为此编写函数。在单个SELECT语句中执行此操作将更简单、更快。

流水线函数最好转换为返回表的简单SQL函数

大概是这样的:

create or replace function employee_all_case(p_ugr_id integer, p_case_type_IN integer)
   returns table (case_id integer)
as
$$
  SELECT ccase.case_id
  FROM ct_case ccase
     INNER JOIN ct_case_type ctype ON ccase.case_type_id = ctype.case_type_id
  WHERE ccase.employee_id = p_ugr_id
    and cases.employee_id IS NOT NULL;
$$
language sql;
请注意,示例代码没有使用第二个参数p_case_type_id

用法也更简单:

select * 
from employee_all_case(14533,1190);

谢谢你们,你们的解决方案非常有用

我找到了渴望的结果:

-- select * from employee_all_case(14533,1190);

-- drop function employee_all_case

  create or replace FUNCTION employee_all_case(p_ugr_id IN integer ,p_case_type_id IN integer)
returns table (case_id double precision)
  -- PIPELINED
   LANGUAGE 'plpgsql'
COST 100
 VOLATILE 
 AS $$
 DECLARE
 -- is
  l_user_id        integer;
  l_account_id     integer;
BEGIN
  l_user_id      := cp_lookup$get_user_id_from_ugr_id(p_ugr_id);
  l_account_id   := cp_lookup$acctid_from_ugr(p_ugr_id);
  RETURN QUERY SELECT ccase.case_id
    FROM ct_case ccase
    INNER JOIN ct_case_type ctype ON ccase.case_type_id = ctype.case_type_id
    WHERE ccase.employee_id = p_ugr_id
    and ccase.employee_id IS NOT NULL; 
    --return NEXT;
END;
$$

这里不需要PL/pgSQL,这两个局部变量似乎没有用,因为您根本不使用它们,因此这两个函数调用也很简单unnecessary@a_horse_with_no_name是的,我不想改变语言,就两个变量而言,这个查询更大。它在别的地方用过。感谢您的建议不是答案,但在Oracle select*from tableselect employee_all_案例中,不需要dual的145331190。从表格中选择*Employee_all_Case145331190就足够了