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

时间:2016-09-02 02:21:26

标签: sql 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;

2 个答案:

答案 0 :(得分: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 :(得分:0)

  

通常我们使用OUT定义具有返回类型和过程的函数   参数。

如果您想定义功能,请尝试使用此

$('input[name*="payment"]').on('change', function() {
  var type = this.value;
  switch (type) {
    case 'paypal':
      $('#payment input').each(function() {
        if ($(this).hasClass('required')) {
          $(this).removeClass('required');
          $(this).addClass('requiredFalse');
        }
      });
    case 'creditcard':
      $('#payment input').each(function() {
        if ($(this).hasClass('requiredFalse')) {
          $(this).addClass('required');
          $(this).removeClass('requiredFalse');
        }
      });
  }
});

或者,您可以将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

希望它有所帮助。