由于postgresql中的OUT参数,函数结果类型必须是整数

问题描述 投票:0回答:3

在下面的查询中,当我执行它时,它会抛出一个错误函数结果类型必须是

integer
,因为
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;
sql database postgresql plpgsql dbfunctions
3个回答
2
投票

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,
    out i_prodid integer
) AS
$BODY$ 
. . . 

除了不定义

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
) 
RETURNS integer AS
$BODY$ 
. . . 

1
投票

一般我们用返回类型定义函数,用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$ 
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;

您也可以将

PROCEDURE
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; 

希望有帮助。


0
投票

我在下面遇到了同样的错误。 *以下错误发生在PL/pgSQL函数SQL函数中:

错误:由于 OUT 参数,函数结果类型必须为 void

因为 PL/pgSQL 函数中

OUT
参数 (
INTEGER
) 和
RETURNS <type>
子句 (
VOID
) 的类型不相同,如下所示:

CREATE FUNCTION my_func(OUT value INTEGER) RETURNS VOID AS $$
BEGIN                             -- ↑ Here      -- ↑ Here
END;
$$ LANGUAGE plpgsql;

所以,我将

INTEGER
设置为
RETURNS <type>
子句,如下所示,然后错误就解决了:

CREATE FUNCTION my_func(OUT value INTEGER) RETURNS INTEGER AS $$
BEGIN                                              -- ↑ Here
END;
$$ LANGUAGE plpgsql;

或者,我取消设置

RETURNS <type>
子句,如下所示,然后错误就解决了:

CREATE FUNCTION my_func(OUT value INTEGER) /* RETURNS VOID */ AS $$
BEGIN                                         -- ↑ Unset ↑
END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.