Вызов функции, которая возвращает рефкурсор - PullRequest
11 голосов
/ 13 июля 2011

Я использую Postgresql 8.3 и имею следующую простую функцию, которая возвращает refcursor клиенту

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR;
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;

Теперь я могу использовать следующие команды SQL для вызова этой функции и манипулирования возвращаемым курсором, но имя курсора автоматически генерируется PostgreSQL

BEGIN;
SELECT function_1();  --It will output the generated cursor name , for example , "<unnamed portal 11>" ;
FETCH 4   from  "<unnamed portal 11>"; 
COMMIT;

Кроме того, явное объявление имени курсора в качестве входного параметра функции, как описано в 38.7.3.5. Возврат курсоров .Могу ли я объявить собственное имя курсора и использовать это имя курсора для манипулирования возвращаемым курсором вместо того, чтобы Postgresql автоматически генерировал для меня? Если нет, есть ли команды, которые могут получить сгенерированное имя курсора?

Ответы [ 2 ]

16 голосов
/ 18 сентября 2012

Я не совсем уверен, из какой версии Postgre это доступно (в 8.4 это допустимо), но я обнаружил, что проще всего определить имя курсора при его объявлении, например:

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR := 'mycursor';
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;

И тогда вы можете получить это так:

BEGIN;
SELECT function_1();
FETCH 4   from  mycursor; 
COMMIT;

Я считаю этот метод менее громоздким.Надеюсь, это поможет.

5 голосов
/ 13 июля 2011

Да, используйте:

CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$
BEGIN
        OPEN $1 FOR SELECT * FROM some_table;
        RETURN $1;    
END;
$$ LANGUAGE plpgsql;

Результат:

SELECT function_1('myowncursorname');
   function_1
-----------------
 myowncursorname
(1 row)

Похоже, автоматически генерируемое имя <unnamed portal n>, где n - натуральное число (из 1).

РЕДАКТИРОВАТЬ:

В качестве другого способа вы можете использовать pg_cursors представление с таким запросом для получения сгенерированного имени курсора:

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';

Например:

BEGIN;
SELECT function_1();
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
COMMIT;

Результат:

     function_1
--------------------
 <unnamed portal 3>
(1 row)

        name
--------------------
 <unnamed portal 3>
(1 row)
...