在PostgreSQL中追加多行结果

时间:2019-04-22 17:46:52

标签: sql postgresql function database-cursor

在使用postgreSQL中的Cursor / Function连接多个值时是否遇到问题。

我有一个名为Products的表,其中包含购买不同产品的客户的多个值,因此客户可以有多个条目。

因此,如果我将客户电子邮件作为参数,那么我的要求是获取HTML的一部分。

例如: 如果我给ss@gmail.com在表中包含两个条目,则输出应如下所示,

<p style="line-height: 14px; text- 
   align: center; font-size: 12px; margin: 0;"> product 1 </p>
<p style="line-height: 14px; text- 
    align: center; font-size: 12px; margin: 0;"> product 2 </p>

但是现在我只获得一种产品的详细信息,就像这样,       产品1

CREATE OR REPLACE FUNCTION 
Append_Products(Customer_Email TEXT)
RETURNS text AS $$
DECLARE 
rowcount  BIGINT;
Products TEXT DEFAULT '';
HTMLscript TEXT DEFAULT '<p style="line-height: 14px; text- 
align: center; font-size: 12px; margin: 0;">';
rec_Product   RECORD;
cur_AppendProducts CURSOR(Customer_Email TEXT) 
FOR SELECT "Name", "Product","itemcount"
FROM dl."Products"
WHERE "email" = Customer_Email;
 BEGIN
 -- Open the cursor
  OPEN cur_Appendproducts(Customer_Email);
 LOOP
  -- fetch row into the film
  FETCH cur_Appendproducts INTO rec_Product;
 -- exit when no more row to fetch
  EXIT WHEN NOT FOUND; 
 -- build the output
  IF rec_Product.itemcount > 0 THEN 
     Products := HTMLscript || rec_Product."Product" || '</p>';
  END IF;
 END LOOP;
-- Close the cursor
CLOSE cur_Appendproducts;
RETURN Products;
END; $$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:0)

我认为您可以尝试不使用CURSOR的另一种解决方案如下:

CREATE OR REPLACE FUNCTION append_products(cust_email TEXT)
RETURNS SETOF TEXT
AS $$
DECLARE
    html_script TEXT DEFAULT '<p style="line-height: 14px; text-align: center; font-size: 12px; margin: 0;"> ';
    rec_product RECORD;
BEGIN
    FOR rec_product IN
        SELECT "Name", "Product", "itemcount"
        FROM dl."Products"
        WHERE "email" = cust_email
    LOOP
        IF rec_product.itemcount > 0 THEN
            RETURN NEXT html_script || rec_Product."Product" || ' <\p>';
        END IF;
    END LOOP;
END;
$$  LANGUAGE PLPGSQL;

您可以查看示例DBFiddle here

如果您不希望使用返回函数集,则可以使用单个字符串返回选项:

CREATE OR REPLACE FUNCTION append_products(cust_email TEXT)
RETURNS TEXT
AS $$
DECLARE
    html_script TEXT DEFAULT '<p style="line-height: 14px; text-align: center; font-size: 12px; margin: 0;"> ';
    rec_product RECORD;
    result TEXT DEFAULT '';
BEGIN
    FOR rec_product IN
        SELECT "Product"
        FROM "Products"
        WHERE "email" = cust_email
    LOOP
        result := result || html_script || rec_Product."Product" || ' <\p>';
    END LOOP;

    RETURN result;
END;
$$  LANGUAGE PLPGSQL;

使用新的小提琴here