2016-09-02 2 views
0

아래 쿼리에서 오류가 발생합니다. 결과 유형이 OUT 매개 변수 때문에 정수 여야합니다. 누구든지이 문제를 과도하게 해결할 수 있습니다.postgresql의 OUT 매개 변수로 인해 함수 결과 유형이 정수 여야합니다

CREATE OR REPLACE FUNCTION funinsertupdateproduct(i_productid integer, t_productname text, t_productdesc text, i_brandid integer, i_varianceid integer, i_packsizeid integer, i_clientid integer, i_userid integer,out i_prodid integer) 
    RETURNS void AS 
$BODY$ 
BEGIN 
    IF EXISTS (SELECT 1 FROM "product" WHERE product_id = i_productid) THEN 
     UPDATE "product" SET "product_name" = t_productname, "product_desc" = t_productdesc, "brand_id"=i_brandid,variance_id=i_varianceid,pack_size_id=i_packsizeid WHERE product_id = i_productid; 
    ELSE 
     INSERT INTO "product"("product_name", "product_desc", "create_by","client_id",variance_id,brand_id,pack_size_id) VALUES ( t_productname, t_productdesc,i_userid,i_clientid,i_varianceid,i_brandid,i_packsizeid) returning product_id INTO i_prodid; 

END IF; 
    RETURN; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION funinsertupdateproduct(integer, text, text, integer, integer, integer, integer, integer,integer) OWNER TO postgres; 
+0

"_ OUT 또는 INOUT 매개 변수가있는 경우 RETURNS 절을 생략 할 수 있습니다. 존재하는 경우 출력 매개 변수에 포함 된 결과 유형과 일치해야합니다. 여러 출력 매개 변수가 있거나 단일 유형과 동일한 유형 인 경우 RECORD 출력 매개 변수 ._ "- [doc에서] (https://www.postgresql.org/docs/current/static/sql-createfunction.html) – Abelisto

답변

1

Postgres 함수는 익숙해 져 있습니다. 트리거 및 저장 프로 시저가되는 것 외에도 반환 값을 처리하는 방법은 다른 언어와 다릅니다.

본질적으로 OUT 매개 변수는 함수가 반환하는 레코드를 나타냅니다. 값을 반환하는 별도의 메서드가 없으므로 void은 중복됩니다. . . 사실 OUT 매개 변수와 호환되지 않습니다.

해결책은 간단합니다. 그냥 RETURNS 절 제거 :

CREATE OR REPLACE FUNCTION funinsertupdateproduct (
    i_productid integer, 
    t_productname text, 
    t_productdesc text, 
    i_brandid integer, 
    i_varianceid integer, 
    i_packsizeid integer, 
    i_clientid integer, 
    i_userid integer 
) 
RETURNS integer AS 
$BODY$ 
. . . 
0

은 일반적으로 우리가 매개 변수와 반환 형식과 절차를 함수를 정의 : i_prodid을 정의하지 제외

CREATE OR REPLACE FUNCTION funinsertupdateproduct (
    i_productid integer, 
    t_productname text, 
    t_productdesc text, 
    i_brandid integer, 
    i_varianceid integer, 
    i_packsizeid integer, 
    i_clientid integer, 
    i_userid integer, 
    out i_prodid integer 
) AS 
$BODY$ 
. . . 

을,이에 해당합니다. 당신이 함수를 정의하려면

, 다른 방법으로 당신이 out 매개 변수

CREATE OR REPLACE PROCEDURE funinsertupdateproduct(i_productid integer, t_productname text, t_productdesc text, i_brandid integer, i_varianceid integer, i_packsizeid integer, i_clientid integer, i_userid integer ,out i_prodid integer) 
    AS 

BEGIN 
    IF EXISTS (SELECT 1 FROM "product" WHERE product_id = i_productid) THEN 
     UPDATE "product" SET "product_name" = t_productname, "product_desc" = t_productdesc, "brand_id"=i_brandid,variance_id=i_varianceid,pack_size_id=i_packsizeid WHERE product_id = i_productid; 
     i_prodid:=i_productid; 
    ELSE 
     INSERT INTO "product"("product_name", "product_desc", "create_by","client_id",variance_id,brand_id,pack_size_id) VALUES ( t_productname, t_productdesc,i_userid,i_clientid,i_varianceid,i_brandid,i_packsizeid) returning product_id INTO i_prodid; 

END IF; 
END; 

희망은 도움과 PROCEDURE를 사용할 수있는이

CREATE OR REPLACE FUNCTION funinsertupdateproduct(i_productid integer, t_productname text, t_productdesc text, i_brandid integer, i_varianceid integer, i_packsizeid integer, i_clientid integer, i_userid integer) 
    RETURNS integer AS 
$BODY$ 
declare 
i_prodid integer; 
BEGIN 
    IF EXISTS (SELECT 1 FROM "product" WHERE product_id = i_productid) THEN 
     UPDATE "product" SET "product_name" = t_productname, "product_desc" = t_productdesc, "brand_id"=i_brandid,variance_id=i_varianceid,pack_size_id=i_packsizeid WHERE product_id = i_productid; 
     i_prodid:=i_productid; 
    ELSE 
     INSERT INTO "product"("product_name", "product_desc", "create_by","client_id",variance_id,brand_id,pack_size_id) VALUES ( t_productname, t_productdesc,i_userid,i_clientid,i_varianceid,i_brandid,i_packsizeid) returning product_id INTO i_prodid; 

END IF; 
    RETURN i_prodid; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

으로 시도합니다.

관련 문제