возвращать значение флага с помощью sysrefcursor, например Oracle - PullRequest
0 голосов
/ 15 октября 2018
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 голосов
/ 15 октября 2018

Postgresql поддерживает параметры OUT, начиная с версии 8.1.В 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

См. это немного запутанное сообщение в журнале , это несколько лучший урок и конечно, всегда есть документация (см. 'argmode') .

...