您可以将完整的结果集发送到 SQL 函数吗?

发布于 2024-08-29 22:07:59 字数 4051 浏览 6 评论 0原文

我在 Postgres 中工作,需要将包含许多行和列的完整结果集发送到存储过程或函数中。这可能吗?如果是这样,我在哪里可以看到语法资源?

好的,这就是我在无法发送结果集的情况下进行设置的方式,它迫使我打破比较逻辑并将其放在两个不同的位置,但是我的目标是将实际查找提升逻辑保留在一个地方,我已经在这里完成了。这可能有一天会改变,比较逻辑不太可能改变,这是相当标准的。

促销行项目逻辑

- 将在 promo_objects、promo_buy_objects 和 promo_get_objects 表的 INSERT 上设置触发器,promo 表上将有一个 UPDATE 触发器。 -外部参照的触发器将调用一个名为 set_best_product_promos 的存储过程,该过程将决定哪种促销最适合该对象,然后保存到一个新表:

promo_best_product_promos

promo_id, 对象 ID, 过期日期

- 促销的触发器将调用 update_best_product_promos 并将发送促销 ID,如果 active = true 它将更新该促销的到期日期,否则它将删除该促销的所有条目

新表已添加到促销中.sql脚本,但是在编写函数之前无法添加触发器和函数。

每天晚上午夜都会运行一个脚本来删除已过期的条目。 PSEUDO FOR 购物车代码(应用程序代码) 就像我们现在显示的那样运行联合查询_object_promotions(这会获取该项目的所有可用促销)

Loop through results
  if buy_quantity > 0
        IF the quantity of the buy item in the cart is greater than or = the buy_quantity (I think c.active_items is the items in the cart)
          IF get_quantity > 0
            If the get item is in the cart AND it is the item sent into this function (I think c.active_items is the items in the cart) 
              run the get_best_product_promos function
              run comparison logic
          else
            run the get_best_product_promos function 
            run comparison logic

编辑:所以我想我也可以将此购物车逻辑转储为存储过程,然后为比较逻辑创建一个,并繁荣它的所有存储过程和可移植和通用?

PSEUDO FOR set_best_product_promos:

-You will send in the object_id and promo_id
-You will declare all of your variables
-Go ahead an query the end date of the promo
-You will then query the promo_best_product_promos table to see if an entry exists for this product

IF exists:
    RUN YOUR UNION QUERY accept this time you will have to explicitly say all the fields you want and what variables to select them into

    Then loop through your query
    LOOP
      run get_best_product_promos
      run comparison logic
    END LOOP

    Now take those variables you set in the crazy logic and update promo_best_product_promos
ELSE:
    insert the object_id, promo_id, and end date (expiration_date) into the promo_best_product_promos table

PSEUDO FOR get_best_product_promos:

If no buy and no get quantities
    If discount type = percent
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount type = dollar
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount type = price
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount amount = Free
      do nothing 
      pass
  If buy quantity but no get quantity
      If discount type = percent
        calculate value of the promotion for this item to compare later
      If discount type = dollar
        calculate value of the promotion for this item to compare later
      If discount type = price
        calculate value of the promotion for this item to compare later
      If discount amount = Free
        do nothing
        pass
  Else (assumes there is both buy and get)
    IF the quantity of the buy item in the cart is >= the buy_quantity (I think c.active_items is the items in the cart)
      If discount type = percent 
            calculate value of the promotion for this item to compare later
      If discount type = dollar
            calculate value of the promotion for this item to compare later
      If discount type = price    
            calculate value of the promotion for this item to compare later
      If discount amount = Free
        #Use a different var here like in select_cart_promotion - they will always get this promotion
        calculate the value of the promotion for these items
        do something here to ensure the get product is in the cart

I am working in Postgres and I need to send in a full result set with many rows and column into a stored procedure or a function. Is this possible? If so, where can I see resources for syntax?

OK this is how I have it set up without being able to send in a result set, it forces me to break out comparison logic and put it in two different spots, however my goal is to keep the actual finding the promotion logic in one place, which I have done here. This may change one day, the comparison logic is less likely to change, it is pretty standard.

Promotion Line Item Logic

-There will be triggers set on INSERT for the promo_objects, promo_buy_objects, and promo_get_objects tables, there will be an UPDATE trigger on the promo table.
-The trigger for the xrefs will call a stored procedure called set_best_product_promos that will decide which promotion is best for that object and it will then save to a new table:

promo_best_product_promos

promo_id,
object_id,
expiration_date

-The trigger for promo will call update_best_product_promos and will send in the promo_id and if active = true it will update the expiration date for that promo else it will delete all entries for that promo

The new table has been added to the promo.sql script, however the triggers and function can not be added until the function is written.

A script will run at midnight every night to delete the entries that have expired.
PSEUDO FOR cart code (application code)
Run the union query just as we are now shown_object_promotions (this gets all available promotions for the item)

Loop through results
  if buy_quantity > 0
        IF the quantity of the buy item in the cart is greater than or = the buy_quantity (I think c.active_items is the items in the cart)
          IF get_quantity > 0
            If the get item is in the cart AND it is the item sent into this function (I think c.active_items is the items in the cart) 
              run the get_best_product_promos function
              run comparison logic
          else
            run the get_best_product_promos function 
            run comparison logic

EDIT: So I guess I could dump this cart logic as a stored procedure as well, and then make one for the comparison logic, and boom its all in stored procedures and portable and generic?

PSEUDO FOR set_best_product_promos:

-You will send in the object_id and promo_id
-You will declare all of your variables
-Go ahead an query the end date of the promo
-You will then query the promo_best_product_promos table to see if an entry exists for this product

IF exists:
    RUN YOUR UNION QUERY accept this time you will have to explicitly say all the fields you want and what variables to select them into

    Then loop through your query
    LOOP
      run get_best_product_promos
      run comparison logic
    END LOOP

    Now take those variables you set in the crazy logic and update promo_best_product_promos
ELSE:
    insert the object_id, promo_id, and end date (expiration_date) into the promo_best_product_promos table

PSEUDO FOR get_best_product_promos:

If no buy and no get quantities
    If discount type = percent
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount type = dollar
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount type = price
      calculate value of the promotion for this item to compare later
      calculate the new price for the product and update the estimated unit price
    If discount amount = Free
      do nothing 
      pass
  If buy quantity but no get quantity
      If discount type = percent
        calculate value of the promotion for this item to compare later
      If discount type = dollar
        calculate value of the promotion for this item to compare later
      If discount type = price
        calculate value of the promotion for this item to compare later
      If discount amount = Free
        do nothing
        pass
  Else (assumes there is both buy and get)
    IF the quantity of the buy item in the cart is >= the buy_quantity (I think c.active_items is the items in the cart)
      If discount type = percent 
            calculate value of the promotion for this item to compare later
      If discount type = dollar
            calculate value of the promotion for this item to compare later
      If discount type = price    
            calculate value of the promotion for this item to compare later
      If discount amount = Free
        #Use a different var here like in select_cart_promotion - they will always get this promotion
        calculate the value of the promotion for these items
        do something here to ensure the get product is in the cart

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玩物 2024-09-05 22:07:59

看一下游标

Take a look at cursors.

梦亿 2024-09-05 22:07:59

Postgres 用户定义函数可以用多种语言编写,

格式如下PL/pgSQL 的输入和输出参数您可以在此处查看文档

您确定需要将其传递给函数吗?我相信你可以构建你的函数来避免这种情况,函数可以返回表并在其中获取表。如果您的这张表是查询/表/视图,那么您可以在函数内使用 SQL 来获取它(仅传递其他数据类型的参数);如果该表是另一个函数的结果,您可以调用该函数来访问该表。你的情况是什么?

Postgres user defined functions can be written in many languages

On the formats of input and output parameters for PL/pgSQL you can check the documentation here

Are you sure that you need to pass this to a function? I believe you could structure your functions to avoid this, functions can return tables and get get tables inside of them. If this table of yours is a query/table/view then you can use SQL inside the function to get to it (passing only parameters of other data type); if this table is the result of another function you can call the function to get to the table. What's your scenario?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文