powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / цикл по столбцам или метаданные курсора (+)
11 сообщений из 11, страница 1 из 1
цикл по столбцам или метаданные курсора (+)
    #34959694
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача - сформировать из хранимой процедуры таблицу в html заданного формата.
Записать в поле типа text. Данные получаю в виде refcursor'а

В лоб решается организацией цикла по строкам и столбцам record'а.
Где то видел пример на plperl, но потерял.

Второй вариант, можно получить перечислимый список названий столбцов из курсора.
Есть ли средства в plpgsql получить метаданные из курсора?
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34960912
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третий вариант - темповая таблица. Сделать её имея курсор не получится, но если есть возможность отказаться от курсора и делать CREATE AS SELECT тогда можно попробовать.

Правда были какие-то траблемы с temp таблицами, созданными из динамического SQL в plpgsql. Поищите по форуму.
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34960947
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ThamerlanТретий вариант - темповая таблица. Сделать её имея курсор не получится, но если есть возможность отказаться от курсора и делать CREATE AS SELECT тогда можно попробовать.
а как по временой таблице сделать цикл по столбцам?

Thamerlan
Правда были какие-то траблемы с temp таблицами, созданными из динамического SQL в plpgsql. Поищите по форуму.
Этот вопрос я уже решил. Используем execute и нет проблем.
/topic/476393&hl=
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34961002
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin
а как по временой таблице сделать цикл по столбцам?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
START TRANSACTION ;

CREATE TEMP TABLE temp1 AS SELECT * FROM pg_user;

SELECT pga.attname,
       (pga.attnum <  0 ) AS is_system
FROM   pg_attribute pga
WHERE  pga.attrelid = (SELECT oid FROM pg_class WHERE relname = 'temp1')
ORDER  BY pga.attnum;

Получаете имена всех столбцов (можно и тип данных получить). Ну и дальше можно попытаться прямо через INSERT AS SELECT вставить в TEXT поле имена столбцов и данные, сконкатенировав ( тьфу ты язык чуть не сломал ) их с
Код: plaintext
<td>
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34961415
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Thamerlan, так и попробую.
я не догадался бы.

Если кто то знает решение с получением метаданных (имена столбцов курсора), не скрывайте.
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34961656
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminСпасибо, Thamerlan, так и попробую.
я не догадался бы.

Если кто то знает решение с получением метаданных (имена столбцов курсора), не скрывайте.Не знаю, но к примеру перед открытием проделать CREATE AS SELECT xxxxxxx LIMIT 1 - далее по тексту.

Хотя, думается, метод не может не быть. Вот только не обязательно плпгскл-ный
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34962426
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод, предложенный Thamerlan, оказался очень удобен.
кеширование OID временных таблиц преодолел стандартно
Код: plaintext
open in_cursorname for execute 'select ....;';
Но!
в pg_class столько временных таблиц с одинаковым именем, сколько сессий.

вот, например, две сессии и две временные таблицы.
Код: plaintext
SELECT oid,* FROM pg_class WHERE relname = 'access_level';
(приведены только отличающиеся поля)
____oid; relname; relnamespace; reltype; relfilenode; relfrozenxid907277; "access_level"; 907276; 907278; 907277; 630664907413; "access_level"; 907332; 907414; 907413; 632660


Не могу понять, как отличить таблицу "своей" сессии от "чужой".
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34962453
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы же создаете временную таблицу, которую используете в пределах одной хранимой процедуры. Генерите ей новое имя каждый раз. Например, 32-х символьное имя для таблицы врятли повторится на таком коротком временном интервале (длина транзакции).
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34962512
tkopets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT CASE WHEN count(*)= 0  THEN FALSE
              ELSE TRUE END AS table_exists
  FROM pg_catalog.pg_class c
       join pg_catalog.pg_namespace n on n.oid = c.relnamespace
  WHERE nspname ~ '^pg_temp_'
    AND pg_catalog.pg_table_is_visible(c.oid)
    AND c.relkind = 'r'
    AND c.relname = 'my_tablename'
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34964790
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смежная проблема: как можно сделать цикл по курсору. Не по столбцам, а просто по строкам?

Код: plaintext
1.
2.
3.
FOR id IN SELECT * FROM table WHERE id <  4 
	LOOP
--	
	END LOOP
это я понимаю, а как сделать цикл, если я получаю курсор в виде результата ХП?
...
Рейтинг: 0 / 0
цикл по столбцам или метаданные курсора (+)
    #34964956
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
   OPEN my_cur;
   LOOP
     FETCH my_cur INTO my_rec;
     EXIT WHEN NOT FOUND;
     ...
   END LOOP;
   CLOSE my_cur;
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / цикл по столбцам или метаданные курсора (+)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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