Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
рекурсивный вызов функции в plperl
|
|||
|---|---|---|---|
|
#18+
Вот нехитрая функция CREATE OR REPLACE FUNCTION "public"."correct_keys_catalog" (integer, integer, integer) RETURNS integer AS $$ my $key = $_[2] + 1; my $lvl = $_[3] + 1; my $ddd = 'SELECT id FROM portal_catalog WHERE parent_id = '.$_[1].' ORDER BY sort ASC;'; my $my_rv = spi_exec_query($ddd); my $nrows = $my_rv->{processed}; foreach my $rn (0 .. $nrows - 1) { my $catalog_row = $my_rv->{rows}[$rn]; my $l_key = $key; $recurs_q = 'SELECT * FROM correct_keys_catalog('.$catalog_row->{id}.', '.$l_key.', '.$lvl.');'; my $recurs = spi_exec_query($recurs_q); $key = $recurs->{rows}[0]->{correct_keys_portal_catalog}; my $upd_query = 'UPDATE catalog SET left_key='.$l_key.', right_key='.$key.' WHERE id = '.$catalog_row->{id}.';'; spi_exec_query($upd_query); $key++; } $lvl--; return $key; $$ LANGUAGE "plperl" VOLATILE CALLED ON NULL INPUT SECURITY DEFINER; для таблицы CREATE TABLE "catalog" ( "id" INTEGER NOT NULL, "name" VARCHAR(255), "left_key" INTEGER, "right_key" INTEGER, "inlev" INT2, "parent_id" INTEGER default 0, "num_goods" INTEGER, "sort" INTEGER default 0, "type" INTEGER default 1, "ident" INTEGER, "latin_name" VARCHAR(255), PRIMARY KEY ("id") ); Задача - корректировать левые/правые ключи дерева. На php есть рекурсивная функция для решения этой задачи, но сейчас потребовалось переписать в субд. В таком виде функция работает не корректно - при рекурсивном вызове всегда возвращает значение, полученное при первом вызове. Может рекурсия запрещена в plperl? Или результаты выполнения как то кэшируются? Подскажите, пожалуста, уже много времени убил, не знаю где искать причину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2009, 16:39 |
|
||
|
рекурсивный вызов функции в plperl
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. Код: plaintext Код: plaintext -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2009, 17:29 |
|
||
|
рекурсивный вызов функции в plperl
|
|||
|---|---|---|---|
|
#18+
Проверку поставил. Лишней не будет. Название столбца поменял, это просто опечатка. Работает как прежде. При замене my на local Код: plaintext 1. 2. 3. 4. либо выдает ошибку в строке Код: plaintext либо проставляет другие ключи, правда тоже не верные. Может здесь искать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2009, 18:11 |
|
||
|
рекурсивный вызов функции в plperl
|
|||
|---|---|---|---|
|
#18+
Вот вид в котором функция работает: Код: plaintext 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. Можно применять для деревьев вида CREATE my_tree ( id INT(10) NOT NULL AUTO_INCREMENT, name VARCHAR(150) NOT NULL, left_key INT(10) NOT NULL DEFAULT 0, right_key INT(10) NOT NULL DEFAULT 0, level INT(10) NOT NULL DEFAULT 0, PRIMARY KEY id, INDEX left_key (left_key, right_key, level) ) Наверняка изобрел велосипед. Если есть более оптимизированные примеры или предложения по оптимизации, пишите, наверняка кому-нибуь пригодится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2009, 09:02 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35751780&tid=2003734]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 254ms |
| total: | 397ms |

| 0 / 0 |
