如何将oracle的流水线函数迁移到PostgreSQL中
因为我是plpgSQL的新手 我在将Oracle查询迁移到PostgreSQL时卡住了 Oracle查询:如何将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 --
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就足够了