|
Помогите разобрать функцию.
|
|||
---|---|---|---|
#18+
Добрый день. Хочу разобарться, как работает это функция CREATE OR REPLACE FUNCTION public.rewards_report(min_monthly_purchases integer, min_dollar_amount_purchased numeric) RETURNS SETOF customer LANGUAGE plpgsql SECURITY DEFINER AS $function$ DECLARE last_month_start DATE; last_month_end DATE; rr RECORD; tmpSQL TEXT; BEGIN /* Some sanity checks... */ IF min_monthly_purchases = 0 THEN RAISE EXCEPTION 'Minimum monthly purchases parameter must be > 0'; END IF; IF min_dollar_amount_purchased = 0.00 THEN RAISE EXCEPTION 'Minimum monthly dollar amount purchased parameter must be > $0.00'; END IF; last_month_start := DATE_TRUNC ('month', (CURRENT_DATE - '4 year'::INTERVAL - '1 month'::INTERVAL)); last_month_end := LAST_DAY(last_month_start); /* Create a temporary storage area for Customer IDs. */ CREATE TEMPORARY TABLE tmpCustomer (customer_id INTEGER NOT NULL PRIMARY KEY); /* Find all customers meeting the monthly purchase requirements */ tmpSQL := 'INSERT INTO tmpCustomer (customer_id) SELECT p.customer_id FROM payment p WHERE DATE(p.payment_date) BETWEEN '||quote_nullable(last_month_start) ||' AND '|| quote_nullable(last_month_end) || ' GROUP BY customer_id HAVING SUM(p.amount) > '|| $2|| ' AND COUNT(customer_id) > ' ||$1 ; EXECUTE tmpSQL; /* Output ALL customer information of matching rewardees. Customize output as needed. */ FOR rr IN EXECUTE 'SELECT c.* FROM tmpCustomer AS t INNER JOIN customer AS c ON t.customer_id = c.customer_id' LOOP RETURN NEXT rr; END LOOP; /* Clean up */ tmpSQL := 'DROP TABLE tmpCustomer'; EXECUTE tmpSQL; RETURN; END $function$ ; Меня интересует момент, что результаты временной таблицы не смогут храниться в другом запросе, именно поэтому мы сохраняем их в tmpSQL? Далее из временной таблицы для каждого значения мы делаем другой запрос SELECT c.* FROM tmpCustomer AS t INNER JOIN customer AS c ON t.customer_id = c.customer_id и записываем его в rr RECORD так же с помощью динамического sql? И можно обойтись без динамического sql? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2021, 15:54 |
|
Помогите разобрать функцию.
|
|||
---|---|---|---|
#18+
Moneta13, Используйте, пожалуйста, соответствующие теги подсветки блоков кода. В таком виде, можно обойтись без динамики. Я бы даже сказал что он здесь лишняя. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2021, 01:27 |
|
Помогите разобрать функцию.
|
|||
---|---|---|---|
#18+
Swa111, Спасибо, учту насчет подстветки. А зачем вообще применялась переменная tmpSQL TEXT? Без динамического SQL, она вообще не надо, как я понял, как и rr RECORD. Но я не могу понять, зачем они используются в динамическом SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 13:55 |
|
|
start [/forum/topic.php?fid=53&msg=40068006&tid=1994046]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 399ms |
0 / 0 |