Цели курсора Postgres - PullRequest
       9

Цели курсора Postgres

0 голосов
/ 10 ноября 2018

Буду признателен за рекомендации по созданию оптимальной структуры pg9.6 для хранения нескольких строк из нескольких соединенных таблиц в качестве цели курсора. Документы не были ясны по этому поводу, другие поиски, казалось, указывали на использование временной таблицы, такой как ниже.

DECLARE
    mycursor refcursor;
BEGIN
CREATE TEMPORARY TABLE tmp_persons (
    personid INTEGER,
    primaryconnect INTEGER
);
OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
LOOP
    FETCH mycursor INTO tmp_persons;

    .. do something using tmp_persons.personid, tmp_persons.primaryconnect

1 Ответ

0 голосов
/ 11 ноября 2018

Я надеюсь, что документация чистая.

FETCH извлекает следующую строку из курсора в цель, которая может быть переменной строки, переменной записи или списком простых переменных, разделенных запятыми, подобно SELECT INTO. Если следующей строки нет, цель устанавливается в NULL. Как и в случае SELECT INTO, можно проверить специальную переменную FOUND, чтобы узнать, получена строка или нет.

Таким образом, вы не можете использовать временную таблицу в качестве цели. Используйте переменную record, если нет особых требований:

DECLARE 
  r record;
  mycursor refcursor;
BEGIN
  OPEN mycursor ..
  LOOP
    FETCH mycursor INTO r;
    EXIST WHEN NOT FOUND;
    RAISE NOTICE 'personid: %', r.personid;

Для этой простой задачи лучше использовать оператор FOR IN SELECT.

DECLARE r record;
BEGIN
  FOR r IN SELECT p.personid, ...
  LOOP
    RAISE NOTICE 'personid: %', r.personid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...