Sql 在Postgres函数中设置变量

Sql 在Postgres函数中设置变量,sql,postgresql,function,variable-assignment,plpgsql,Sql,Postgresql,Function,Variable Assignment,Plpgsql,我需要将couponCode的变量设置为以下输出: CREATE OR REPLACE FUNCTION "freeTicket" (eid integer NOT NULL) DECLARE couponCode text BEGIN INSERT INTO purchases p (cid, pdate, eid, ccode) VALUES ( SELECT p.cid, GETDATE(), $1, couponCode FROM purchase p GROU

我需要将
couponCode
的变量设置为以下输出:

CREATE OR REPLACE FUNCTION "freeTicket" (eid integer NOT NULL)

DECLARE
    couponCode text 
BEGIN


INSERT INTO purchases p (cid, pdate, eid, ccode) 
VALUES
(
  SELECT p.cid, GETDATE(), $1, couponCode FROM purchase p
  GROUP BY p.cid
 HAVING COUNT(1) > 5
  ORDER BY p.cid
);

END; LANGUAGE plpgsql;
并在上面的插入查询中使用它。

执行此操作的最佳方法是什么?

这将是
从…选择进入…
,但您可以在一条语句中完成所有操作:

Select code from couponCode where eid = $1 and percentage = 100; 

orderby
在这里毫无意义。

关于在PL/pgSQL中分配变量的基本知识:

除此之外,函数还有许多语法错误和其他问题。首先是:

INSERT INTO purchases p (cid, pdate, eid, ccode) 
   SELECT p.cid,
          current_date,
          $1,
          (SELECT code FROM couponcode
           WHERE eid = $1 AND percentage = 100)
   FROM purchase p
   GROUP BY p.cid
   HAVING COUNT(1) > 5:
添加的
OUT行\u ct int
将在函数末尾自动返回。它不需要显式的
返回
声明

您在中还有一个表别名:

CREATE OR REPLACE FUNCTION free_ticket(_eid integer, OUT _row_ct int) AS
$func$
DECLARE
   coupon_code text;  -- semicolon required
BEGIN
   INSERT INTO purchases (cid, pdate, eid, ccode)
   SELECT cid, now()::date, _eid
       , (SELECT code FROM couponCode WHERE eid = _eid AND percentage = 100)
   FROM   purchase
   GROUP  BY cid
   HAVING COUNT(*) > 5  -- count(*) is faster
   ORDER  BY cid;       -- ORDER BY is *not* pointless.

   GET DIAGNOSTICS _row_ct := ROW_COUNT;
END
$func$  LANGUAGE plpgsql;
插入采购p(cid、pdate、eid、ccode)
但为了避免歧义(与其他DML语句不同)。所以:
作为p插入采购…
。但是不需要别名,因为语句中没有歧义

相关的:

旁白:两个表名为
purchase
purchases
,这肯定会导致混淆。第二个表也可以替换为or

CREATE OR REPLACE FUNCTION free_ticket(_eid integer, OUT _row_ct int) AS
$func$
DECLARE
   coupon_code text;  -- semicolon required
BEGIN
   INSERT INTO purchases (cid, pdate, eid, ccode)
   SELECT cid, now()::date, _eid
       , (SELECT code FROM couponCode WHERE eid = _eid AND percentage = 100)
   FROM   purchase
   GROUP  BY cid
   HAVING COUNT(*) > 5  -- count(*) is faster
   ORDER  BY cid;       -- ORDER BY is *not* pointless.

   GET DIAGNOSTICS _row_ct := ROW_COUNT;
END
$func$  LANGUAGE plpgsql;
INSERT INTO purchases p (cid, pdate, eid, ccode)