Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
Пишу функцию, которая возвращает setof record. Требуется в цикле составить этот самый record, но каждый элемент записи - это отдельная строка, выбираемая из таблицы. CREATE TABLE foo(field int); INSERT VALUES INTO foo (1); INSERT VALUES INTO foo (2); INSERT VALUES INTO foo (3); ... INSERT VALUES INTO foo (20); В теле функции идёт селект, подобный этому: DECLARE fields RECORD; result RECORD; ... FOR fields IN SELECT * FROM foo WHERE field < 4; LOOP а здесь нужно в result добавлять fields.field END LOOP; И в результате нужно получить запись (1,2,3) . В самой функции используется именно return next result;. Известно заранее, что кол-во возвращаемых строк в селекте всегда одинаково (в реальности это контроллируется left join'ом). Но сама функция, взависимости от входного параметра, может возвращать различное кол-во полей: SELECT * from my_func(3) AS (f1 int, f2 text, f3 int); SELECT * from my_func(2) AS (f1 int, f2 int); Делается это с целью уйти от динамического sql (execute). Я пытался пошариться в гугле и тут на форуме, но не смог найти способа преобразования массива в row или конкатенации рекорда. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 14:43 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
поищите по слову refcursor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 14:53 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
Serik Akhmetovпоищите по слову refcursor Что-то у меня получаются те же туфли, только шнурками вниз. DECLARE rc REFCURSOR: val RECORD; OPEN rc FOR SELECT field FROM foo WHERE field < 4; Если я делаю FETCH rc INTO val, то получаю одно значение, если сделаю loop, то вернусь к схеме с обычным FOR val IN SELECT .... LOOP ... END LOOP; FETCH ALL вне функции возвращает просто все записи в столбик. А мне нужно вернуть строчки вида: (1,2,3,4), а не по четыре строки вместо одной. Вот на это я не смог найти ответа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 16:37 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
Mayc... А мне нужно вернуть строчки вида: (1,2,3,4), а не по четыре строки вместо одной. Имеется ввиду, что нужно возвращать рекорд из четырёх полей. А в общем случае, n-ое количество. На данный момент приходится выполнять динамический SQL. Чего очень не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 17:24 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
В общем, сотворил я агрегатную функцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2007, 20:04 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
Mayc Ибо клиент - это ПыхПых и он способен распарсить строчки сам через split ой вы же сами знаете, что это bad... что прямо-таки никак нельзя уйти от record-а произвольной ширины? misdesign какой-то, поскольку в SQL у таблицы всегда должна быть определенная ширина и record соответственно тоже хорошо иметь какого-то определенного типа, связанного с конкретной таблицей. иначе же нужно как-то пытаться сделать через массивы, но уже понятно что такое решение тоже не будет простым и красивым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 01:33 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
этот вопрос тут всплывает с периодичностью 2-3 раза в месяц. понятно, что поиском пользоваться лома. но краткое содержание предыдущих серий: 1. основной тезис - пользоваться каким либо иным языком для хранимки (plperl) 2. финт ушами для размещения в рекорд предлагаю примерно такой (найдете его в поиске для специфических вариантов рекорда именуемых NEW /OLD) : Код: 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. , хотя именно в вашем случае - есть идея поманьячить на тему запихивания полей в конструкцию Код: plaintext но вот так не получицо: Код: 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. а вот так - похоже на правду Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 11:27 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
iz Mayc Ибо клиент - это ПыхПых и он способен распарсить строчки сам через split ой вы же сами знаете, что это bad... что прямо-таки никак нельзя уйти от record-а произвольной ширины? misdesign какой-то, поскольку в SQL у таблицы всегда должна быть определенная ширина и record соответственно тоже хорошо иметь какого-то определенного типа, связанного с конкретной таблицей. иначе же нужно как-то пытаться сделать через массивы, но уже понятно что такое решение тоже не будет простым и красивым. Эмм.. У меня структура a-la Модель Тенцера. Вы видели на форуме лучший способ по вытаскиванию всех параметров за раз? Без использования Execute? Другой вариант, что может и не понадобится вовсе для всех сущностей определённого класса за раз выбирать его характеристики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 20:23 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
4321этот вопрос тут всплывает с периодичностью 2-3 раза в месяц. понятно, что поиском пользоваться лома. но краткое содержание предыдущих серий: 1. основной тезис - пользоваться каким либо иным языком для хранимки (plperl) 2. финт ушами для размещения в рекорд предлагаю примерно такой (найдете его в поиске для специфических вариантов рекорда именуемых NEW /OLD) : Код: plaintext 1. Во-первых, я прекрасно умею пользоваться поиском. И уже находил рецепт с plperl. Позвольте, вы мерили скорость выполнения таких хранимок? Во-вторых, я чётко обозначил, что пытаюсь уйти от динамического SQL, т.е. никаких EXECUTE. Если совместить второе и первое, то ни первый, ни второй ваш совет не подходит под постановку задачи. Посему, прежде чем тыкать носом в поисковик (что для меня обидно), сначала вникните в тему вопроса. А не кидайтесь по первым двум-трём моим словам, что это уже все пытались делать и общее решение такое. Кстати, через Execute я уже делал - это слишком банальный выход. А так, зайдите в раздел "Проектирование БД" и ищите по словам: EAV , Модель Тенцера . Вот мне нужно нечто подобное, но без использования Execute и уж точно без всяких там plperl/ruby/... Пока схожусь во мнении, что нужно менять немного логику того, что будет тащить данные из базы. Благо, есть, где разгуляться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 20:36 |
|
||
|
Добавление/расширение record'a новыми записями
|
|||
|---|---|---|---|
|
#18+
MaycВо-первых, я прекрасно умею пользоваться поиском. И уже находил рецепт с plperl. Позвольте, вы мерили скорость выполнения таких хранимок? Во-вторых, я чётко обозначил, что пытаюсь уйти от динамического SQL, т.е. никаких EXECUTE. Если совместить второе и первое, то ни первый, ни второй ваш совет не подходит под постановку задачи. Посему, прежде чем тыкать носом в поисковик (что для меня обидно), сначала вникните в тему вопроса. А не кидайтесь по первым двум-трём моим словам, что это уже все пытались делать и общее решение такое. Кстати, через Execute я уже делал - это слишком банальный выход. А так, зайдите в раздел "Проектирование БД" и ищите по словам: EAV , Модель Тенцера . Вот мне нужно нечто подобное, но без использования Execute и уж точно без всяких там plperl/ruby/... Пока схожусь во мнении, что нужно менять немного логику того, что будет тащить данные из базы. Благо, есть, где разгуляться.1. гм. и чем вам не нравится Execute? Имхо, мутный вы какой-то. 2. под динамич. SQL что только не подпадает (в том числе и пошив скл на клиенте и т.п.), т.ч. я просил бы в следующий раз пояснее выражать свою мысль. 3. просил бы идти с вашими пожеланиями вникания фтему вопроса далеко и надолго. преимущественно - лесом. Да и не забывать: на обиженных - воду возят. 4. с еавом и тенцером - идите в проектирование. к гуесту_ххх - он вас там просветит. потом догонит и еще раз просветит (желательно - чтобы до гланд проняло). И будет прав, что интересно. и поиск мне в этом случае не нужен - не мою задачу решаем, что симптоматично. 5. зы: последний предложенный мной скрипт без создание времянок должен неплохо выигрывать по времени (нет дисковых промежуточных). но это если вы до него дошли, пусть и затуманившись слёзками абидок. успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 17:10 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34715306&tid=2005174]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 308ms |

| 0 / 0 |
