使用sysrefcursor(如Oracle)返回标志值

时间:2018-10-15 10:23:27

标签: postgresql postgresql-9.5

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$ ...

1 个答案:

答案 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 postthis somewhat better tutorialof course there's always the documentation (see 'argmode')