Можете ли вы отправить полный набор результатов в функцию SQL? - PullRequest
1 голос
/ 21 апреля 2010

Я работаю в Postgres, и мне нужно отправить полный набор результатов со множеством строк и столбцов в хранимую процедуру или функцию. Это возможно? Если да, где я могу найти ресурсы для синтаксиса?

Хорошо, это то, как я настроил его, не имея возможности отправлять набор результатов, это заставляет меня нарушить логику сравнения и поместить его в два разных места, однако моя цель - сохранить фактическое нахождение логики продвижения в одном месте, что я сделал здесь. Это может измениться однажды, логика сравнения менее вероятно изменится, она довольно стандартна.

Логика рекламной позиции

- В INSERT будут установлены триггеры для таблиц promo_objects, promo_buy_objects и promo_get_objects, в промо-таблице будет триггер UPDATE. Триггер для внешних ссылок вызовет хранимую процедуру set_best_product_promos, которая определит, какое продвижение лучше для этого объекта, и затем сохранит в новую таблицу:

promo_best_product_promos

promo_id, object_id, expiration_date

- Триггер для промо вызовет update_best_product_promos и отправит promo_id, и если active = true, он обновит дату истечения срока для этого промо, иначе он удалит все записи для этого промо

Новая таблица была добавлена ​​в сценарий promo.sql, однако триггеры и функцию нельзя добавить до тех пор, пока функция не будет написана.

Сценарий будет запускаться каждую ночь в полночь для удаления записей, срок действия которых истек. PSEUDO FOR код корзины (код приложения) Запустите запрос на объединение так же, как мы теперь показываем_объект_промоции (получаются все доступные акции для элемента)

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

Ответы [ 2 ]

1 голос
/ 21 апреля 2010

Пользовательские функции Postgres могут быть написаны на многих языках

С форматами входных и выходных параметров для PL / pgSQL вы можете ознакомиться с документацией здесь

Вы уверены, что вам нужно передать это функции? Я полагаю, что вы могли бы структурировать свои функции, чтобы избежать этого, функции могут возвращать таблицы и получать таблицы внутри них. Если ваша таблица является запросом / таблицей / представлением, то вы можете использовать SQL внутри функции, чтобы добраться до нее (передавая только параметры другого типа данных); если эта таблица является результатом другой функции, вы можете вызвать функцию, чтобы попасть в таблицу. Какой у вас сценарий?

1 голос
/ 21 апреля 2010

Взгляните на курсоры .

...