在下面的查询中,当我执行它时,它会抛出一个错误函数结果类型必须是
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;
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$
. . .
一般我们用返回类型定义函数,用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;
希望有帮助。
我在下面遇到了同样的错误。 *以下错误发生在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;