2017-12-13 17 views
1

Microsoft SQL Server에서 출력 매개 변수와 선택 결과를 모두 사용하여 데이터를 클라이언트에 반환 할 수 있습니다. 이것은 페이징과 같은 유스 케이스에서 유용합니다. 여기에서는 총 페이지 수와 같은 관련 메타 데이터와 함께 메인 세트를 반환해야합니다. Postgres에서 지금까지 본 모든 예제는 출력 매개 변수를 통해 또는 테이블 결과를 통해 데이터를 반환합니다. 나는 다음과 같은 오류와 함께 실패로 함께 모두 프로 시저를 만들 수 없습니다입니다 : ERROR : OUT 및 INOUT 인수가 표 기능을 사용할 수 없습니다 여기Postgresql : Microsoft SQL Server에서와 같이 저장 프로 시저에서 테이블 데이터와 출력 매개 변수를 모두 반환하는 방법이 있습니까

내가 뭘하려 :

CREATE OR REPLACE FUNCTION fn_Test(out p_count int) 
RETURNS TABLE (CustomerId int, CustomerName varchar(50)) 
LANGUAGE 'plpgsql' 
AS $BODY$ 
BEGIN 

    INSERT INTO Customers(CustomerName, Address, Area, Phonenumber, Email, communicationpreference) 
    VALUES ('Julie Yellow', 'JY Ad', 'JY Ar', 'JV0987654', '[email protected]', 1); 

    SELECT COUNT(*) FROM CUSTOMERS INTO p_count; 
    SELECT CustomerId, CustomerName FROM Customers; 
EXCEPTION WHEN OTHERS THEN 
    RAISE exception '% %', SQLERRM, SQLSTATE; 
END; 
$BODY$ 

함께 갈 수 없습니까? PostgreSQL에 대체 접근법이 있습니까?

대답은 '노

답변

1

조언을주세요 - 중 당신은 함수가 뭔가를 반환하거나 뭔가 OUT 매개 변수에 의해 정의된다 만듭니다.

https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html

If you declared the function with output parameters, write just RETURN with no expression. The current values of the output parameter variables will be returned.

ephasis 광산.

1

당신은 마지막 쿼리의 수를 포함 단순히 수 있지만

https://www.postgresql.org/docs/current/static/sql-createfunction.html

Also OUT and INOUT arguments cannot be used together with the RETURNS TABLE notation

당신은 raise info 또는 notify 채널로 재생할 수 있습니다. 당신이 따옴표에 넣어하지 않는, 언어 이름은 식별자입니다 return query

CREATE OR REPLACE FUNCTION fn_test() 
    RETURNS TABLE (customerid int, customername varchar(50), newcount int) 
AS $BODY$ 
BEGIN 

    INSERT INTO customers(customername, address, area, phonenumber, email, communicationpreference) 
    VALUES ('Julie Yellow', 'JY Ad', 'JY Ar', 'JV0987654', '[email protected]', 1); 

    return query 
     SELECT customerid, customername, count(*) over() as newcount 
     FROM customers; 
EXCEPTION WHEN OTHERS THEN 
    RAISE exception '% %', SQLERRM, SQLSTATE; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

사용할 필요가 PL/pgSQL의에서 쿼리 결과를 반환 할 수 있지만

.


또는 함수에서 refcursors로 여러 결과를 반환 할 수 있습니다. 그러나 이것은 대부분의 SQL 클라이언트에서 사용하기에는 다소 번거 롭습니다.

CREATE OR REPLACE FUNCTION fn_test() 
    returns setof refcursor 
AS $BODY$ 
DECLARE 
    c1 refcursor; 
    c2 refcursor; 
BEGIN 

    INSERT INTO customers(customername, address, area, phonenumber, email, communicationpreference) 
    VALUES ('Julie Yellow', 'JY Ad', 'JY Ar', 'JV0987654', '[email protected]', 1); 

    open c1 for 
     select count(*) from customers; 
    return next c1; 

    open c2 for 
     SELECT customerid, customername 
     FROM customers; 
    return next c2; 

EXCEPTION WHEN OTHERS THEN 
    RAISE exception '% %', SQLERRM, SQLSTATE; 
END; 
$BODY$ 
LANGUAGE plpgsql;