函数结果类型必须为整数,因为postgresql中有OUT参数

xpcnnkqh  于 12个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(237)

在下面的查询中,当我执行它抛出一个错误函数,结果类型必须是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;

字符串

s5a0g9ez

s5a0g9ez1#

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$ 
. . .

gv8xihay

gv8xihay2#

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

字符串
或者,您可以使用PROCEDUREout参数

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;


希望对你有帮助。

imzjd6km

imzjd6km3#

我得到了下面相同的错误。* 下面的错误发生在PL/pgSQL functionSQL function
错误:由于OUT参数,函数结果类型必须为整数
因为OUT参数(INTEGER)和RETURNS <type>子句(VOID)在PL/pgSQL函数中的类型不一样,如下所示:

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;

相关问题