powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите разобрать функцию.
4 сообщений из 4, страница 1 из 1
Помогите разобрать функцию.
    #40067922
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Хочу разобарться, как работает это функция

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?
...
Рейтинг: 0 / 0
Помогите разобрать функцию.
    #40068006
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
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);

return query
with tmpCustomer  as (SELECT p.customer_id
FROM payment p
WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end 
GROUP BY customer_id
HAVING SUM(p.amount) > min_dollar_amount_purchased 
AND COUNT(customer_id) > min_monthly_purchases )
SELECT c.* FROM tmpCustomer AS t INNER JOIN customer AS c ON t.customer_id = c.customer_id;


RETURN;
END;
$function$
;

...
Рейтинг: 0 / 0
Помогите разобрать функцию.
    #40068566
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111, Спасибо, учту насчет подстветки. А зачем вообще применялась переменная tmpSQL TEXT? Без динамического SQL, она вообще не надо, как я понял, как и rr RECORD. Но я не могу понять, зачем они используются в динамическом SQL
...
Рейтинг: 0 / 0
Помогите разобрать функцию.
    #40068568
Moneta13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Moneta13, Я предпологаю, что эта переменная хранит запрос, правильно думаю?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите разобрать функцию.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]