2016-09-02 4 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句削除:一般的に、我々は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 
) 
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$ 
. . . 

を、これは同等です。

あなたが関数を定義したい場合は、この

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; 

と試みる代わりに、あなたは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を使用することができ、それがお役に立てば幸いです。

関連する問題