powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация функции
1 сообщений из 1, страница 1 из 1
Оптимизация функции
    #38945507
Genkopura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так (нужно наверное как то оптимизировать ее), все работает, но есть одно НО: если для какого то номера нет значения (например, rec2.summary), то результат не заносится в таблицу t_numbers.
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
CREATE OR REPLACE FUNCTION updatebalance()
RETURNS void AS
$BODY$
DECLARE
rec1 RECORD;
rec2 RECORD;
rec3 RECORD;
rec4 RECORD;
rec5 RECORD;
rec6 RECORD;
BEGIN
FOR rec1 IN (SELECT n.vnumber, t.vname, noutfavoritecost, noutsystemcost, noutothercost, noutcityphonecost, noutinternationalcost, nsmscost, nmmscost, nwapcost FROM t_numbers n   -- t_numbers + t_tariff 
FULL JOIN t_contract c 
FULL JOIN t_tariff t ON c.ntariffid=t.id
ON c.id=n.ncontractid
GROUP BY n.vnumber, t.noutfavoritecost, t.vname, noutsystemcost, noutothercost, noutcityphonecost, noutinternationalcost, nsmscost, nmmscost, nwapcost)
LOOP
FOR rec2 IN (SELECT c.nnumberid, n.vnumber, t.vname, sum(c.vvalue) as summary FROM t_numbers n   -- t_numbers + t_units
LEFT JOIN t_units c 
LEFT JOIN t_unittype t ON c.ntypeid=t.id
ON c.nnumberid=n.id
WHERE vinout='OUTGOING' AND t.vname = 'WAP'
GROUP BY n.vnumber, t.vname, c.nnumberid)
LOOP
FOR rec3 IN (SELECT c.nnumberid, n.vnumber, t.vname, sum(c.nvalue) as summary FROM t_numbers n   -- t_numbers + t_cashactions 
FULL JOIN t_cashactions c 
FULL JOIN t_cashactiontype t ON c.ncashactiontypeid=t.id
ON c.nnumberid=n.id
GROUP BY n.vnumber, t.vname, c.nnumberid)
LOOP
FOR rec4 IN (SELECT c.nnumberid, n.vnumber, t.vname, sum(c.vvalue) as summary FROM t_numbers n   -- t_numbers + t_units
LEFT JOIN t_units c 
LEFT JOIN t_unittype t ON c.ntypeid=t.id
ON c.nnumberid=n.id
WHERE vinout='OUTGOING' AND t.vname = 'SMS'
GROUP BY n.vnumber, t.vname, c.nnumberid)
LOOP
FOR rec5 IN (SELECT c.nnumberid, n.vnumber, t.vname, sum(c.vvalue) as summary FROM t_numbers n   -- t_numbers + t_units
LEFT JOIN t_units c 
LEFT JOIN t_unittype t ON c.ntypeid=t.id
ON c.nnumberid=n.id
WHERE vinout='OUTGOING' AND t.vname = 'MMS'
GROUP BY n.vnumber, t.vname, c.nnumberid)
LOOP
FOR rec6 IN (SELECT c.nnumberid, n.vnumber, t.vname, sum(c.vvalue) as summary FROM t_numbers n   -- t_numbers + t_units
LEFT JOIN t_units c 
LEFT JOIN t_unittype t ON c.ntypeid=t.id
ON c.nnumberid=n.id
WHERE vinout='OUTGOING' AND t.vname = 'вызов'
GROUP BY n.vnumber, t.vname, c.nnumberid)
LOOP
UPDATE t_numbers SET nbalance = (rec1.nwapcost*rec2.summary + rec1.noutsystemcost*rec6.summary + rec1.nsmscost*rec4.summary + rec1.nmmscost*rec5.summary)+rec3.summary WHERE id=rec2.nnumberid AND id=rec3.nnumberid;
END LOOP;
END LOOP;
END LOOP;
END LOOP;
END LOOP;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;



Как оптимизировать можно эту функцию и как исправить ошибку с отсутствием значения?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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