Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
Ситуация: По замыслу, функция должна динамически генерировать текст запроса с переменным количеством полей (типа "перекрестного" запроса), и потом выводить результат этого запроса. Суть проблемы: Поскольку количество полей переменное, в выводе функции нельзя объявить RETURNS SETOF _Композитный_Тип_, поскольку у любого типа структура строго определена. А объявить RETURNS SETOF RECORD -- ругается "a column definition list is required for functions returning "record", т.е не определены колонки рекорда. Как быть? Не получать же текст запроса в клиентскую часть, а потом снова пихать его серверу уже в текстовом виде... Глуповато получается, хотелось бы все реализовать в одной функции. Поделитесь мыслями, плиз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 02:19 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
/topic/419461&hl=returns+setof+record обратите внимание на формат вызова этой функции (с returns setof record) - SELECT * FROM foo() AS (c1 INTEGER, c2 INTEGER) пожалуйста, пользуйтесь поиском, всё это много раз обсуждалось... :( -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 07:26 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
Уважаемый Ёш! Спасибо что откликнулись. С форматом вызова функций возвращающих RECORD я уже сталкивался. Но как раз в нем и суть проблемы. В предложенном Вами примере предложение "AS (c1 INTEGER, c2 INTEGER)" как раз задает тот самый недостающий column definition list, на который идет ругань в моей функции. Но дело в том что при вызове моей функции _неизвестно_, сколько полей вернется (зависит от количества записей в одной из объединяемых таблиц), поэтому нельзя при вызове задать конкретный column definition list. В голову пока приходит только одна идея: 1)Сформировать в отдельной функции SQL-текст запроса (возвращается как текст); 2)Отдельно сформировать _в_текстовом_виде_ вызов функции, возвращающей RECORD, и предложение AS(...) к этому вызову, на основе того же количества полей, что и основной запрос. 3)Подсунуть это все функции (по типу Вашего примера), через Execute, передав SQL-текст как параметр, и предложив в вызове динамически сгенерированное предложение AS(...) . Не слишком изящно выходит, но других направлений мысли пока не вижу. Не попадались ли Вам другие, более оптимальные пути (возможно с использованием курсоров или еще как)? (В любом случае спасибо за ответ.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 13:17 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
можно возвращать набор рефкусоров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 14:18 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
kuklyuk ... нельзя при вызове задать конкретный column definition list. например можно сделать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. (или SELECT test_test1() as f;) так как это срабатывает (по крайней мере вплоть до 8.1) , то разумно ожидать возможности такой модификации последнего запроса Код: plaintext Код: plaintext добраться до содержимого по именам в исходном типе тоже не получается: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2007, 14:45 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
4321добраться до содержимого по именам в исходном типе тоже не получается: Код: plaintext 1. Может так? SELECT foo.name FROM (SELECT test_test1() as f) as foo; Сам не проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 11:06 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan Может так? SELECT foo.name FROM (SELECT test_test1() as f) as foo; Сам не проверял.да нет. дело в частности и в том, что если тип у поля в SELECT test_test1() - record, а не test, то и имен там нет, а вот так уже не работает: SELECT test_test1()::test; ERROR: cannot cast type record to test а даже если бы работало, то нельзя никак: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 12:22 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
4321 а даже если бы работало, то нельзя никак: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Да, я уже тоже подергал. Действительно не выкручивается. Была мысль закрутить RECORD в AnyElement[]. Где-то я даже подобное проворачивал, но может меня где-то склероз подводит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 14:30 |
|
||
|
Вывод из функции с переменным кол-вом полей
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan Да, я уже тоже подергал. Действительно не выкручивается. Была мысль закрутить RECORD в AnyElement[]. Где-то я даже подобное проворачивал, но может меня где-то склероз подводит. А еще я так подергал: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 14:46 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34856954&tid=2004955]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 269ms |
| total: | 455ms |

| 0 / 0 |
