首页 > 解决方案 > 存储 postgres 函数导致记录

问题描述

我正在尝试创建一些子功能,这些子功能将用于为我客户的数据库系统创建完全配置的产品。其中一个功能是根据一组参数计算商品的标价和折扣价。由于不同类型的项目是由不同的函数创建的,但计算价格的方式基本相同,我想要一个函数来计算我所有不同类型项目的标价和折扣价。

我的主函数(我们称之为 create_item)成功地向我的子函数(我们称之为 calculate_price)发送参数,并且我的子函数成功地发送回表中的标价和折扣价。我遇到的问题是如何将这些结果存储在主函数的记录中。

CREATE OR REPLACE FUNCTION create_item(
          integer, 
          integer)
Returns VOID
LANGUAGE 'plpgsql'

AS $BODY$

DECLARE

accessory_price alias for $1;
customer_discount alias for $2;
list_price numeric;
discounted_price numeric;
returnRecord record;

BEGIN

SELECT * FROM calculate_price(accessory_price, customer_discount) INTO returnRecord;

list_price = SELECT list_price FROM returnRecord;
discounted_price = SELECT discounted_price FROM returnRecord;

END;

$BODY$;

----------END OF MAIN FUNCTION

----------BEGINNING OF SUB FUNCTION

CREATE OR REPLACE FUNCTION calculate_price(
          integer, 
          integer)
RETURNS TABLE (
      list_price numeric,
      discounted_price numeric) 
LANGUAGE 'plpgsql'

AS $BODY$

DECLARE

accessory_price alias for $1;
customer_discount alias for $2;
list_price numeric;
discounted_price numeric;

---*** INSERT LOGIC USED TO CALCULATE LIST_PRICE BASED ON VARIABLES
---*** INSERT LOGIC USED TO CALCULATE DISCOUNTED_PRICE BASED ON LIST_PRICE AND VARIABLES

RETURN QUERY SELECT list_price, discounted_price;

END;

$BODY$

到目前为止,这几乎可行。我可以通过发出通知来检查整个过程中的变量,并且一切都正确计算,但是当我尝试将 calculate_price 的结果存储到 returnRecord 中时,我收到一个错误“返回的结果没有地方可以存储”或类似的东西(对不起,我不记得确切的措辞)。对我做错了什么有帮助吗?

标签: sqlpostgresqlfunction

解决方案


您必须在主函数中进行一些更改(INTO returnRecord after * and returnRecord.list_price,returnRecord.discounted_price 而不是 select ),如下所示:

CREATE OR REPLACE FUNCTION create_item(
      integer, 
      integer)
Returns VOID
LANGUAGE 'plpgsql'

 AS $BODY$

 DECLARE

  accessory_price alias for $1;
  customer_discount alias for $2;
  list_price numeric;
  discounted_price numeric;
  returnRecord record;

 BEGIN

  SELECT * INTO returnRecord FROM calculate_price(accessory_price, customer_discount);

 list_price = returnRecord.list_price;
 discounted_price = returnRecord.discounted_price;

END;

$BODY$;

推荐阅读