PROCEDURE TEST
(
I_EMP_NAME IN EMP.EMP_NAME%TYPE,
I_EMP_ID IN EMP.EMP_ID %TYPE,
O_SET OUT SRESULTSET,
O_FLAG OUT NUMBER
)
IS
BEGIN
UPDATE
EMP
SET
EMP_NAME = I_EMP_NAME,
LAST_DATE = SYSDATE,
DEPTNO = 30
WHERE
EMP_ID = I_EMP_ID;
IF SQL%ROWCOUNT = 0 THEN
O_FLAG := 1;
ELSE
O_FLAG := 0;
END IF;
OPEN O_SET FOR
SELECT
EMP_ID,
EMP_JOINING_DATE,
EMP_LAST_DATE,
EMP_SAL
FROM
EMP
WHERE
EMP_NAME = I_EMP_NAME AND EMP_ID = I_EMP_ID;
END TEST;
任何人都可以建议我如何在PostgreSQL之类的Oracle中同时返回两个输出(以上代码在Oracle中)。
我可以在returns table
中使用sResultSet
(它是sysrefcursor),但是我无法在PostgreSQL中返回标志值。
CREATE OR REPLACE FUNCTION test(i_emp_name text, i_emp_ID double precision)
RETURNS TABLE(
emp_ID numeric,
emp_joining_date timestamp without time zone,
emp_last_date timestamp without time zone,
emp_sal double precision
) LANGUAGE plpgsql
AS $function$ ...
答案 0 :(得分:0)
至少从8.1版开始,Postgresql就支持OUT
参数。在pgplsql中,指定的OUT参数与在PL / SQL中指定的稍有不同-您将OUT
放在参数名称的前面 而不是后面。因此,您的程序应定义为
CREATE OR REPLACE FUNCTION test(IN i_emp_name text,
IN i_emp_ID numeric,
OUT o_flag numeric,
OUT emp_joining_date timestamp without time zone,
OUT emp_last_date timestamp without time zone,
OUT emp_sal double precision
) LANGUAGE plpgsql
AS $function$ ...
请注意,带有输出参数的函数被视为返回记录,因此不需要定义要返回的记录。还要注意,没有定义其他返回类型,因为OUT
参数的隐式记录成为返回类型。您可以通过以下方式调用上面的
SELECT test('Bob', '1').emp_sal;
,它应该显示鲍勃的薪水。或者你可以做
select * from test('Bob', '1');
它应该显示类似
o_flag emp_joining_date emp_last_date emp_sal
1 11-Jan-2016 28-Nov-2017 1000000.00
请参见this slightly confusing journal post,this somewhat better tutorial和of course there's always the documentation (see 'argmode')。