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)