在使用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;
答案 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。