powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему pg не позволяет возвратить курсор?
8 сообщений из 8, страница 1 из 1
Почему pg не позволяет возвратить курсор?
    #39838278
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее придумано, но тем не менее.

Непонятно, зачем в pg так обрабатывается факт неоткрытия курсора.
Неоткрытый курсор нельзя присвоить и передать дальше по цепочке - ок.
Но зачем на него ругаться так-то:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
?

Ситуация:
Код: sql
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.
create or replace function myfunc_dbcommon(
		    OUT o_rc    INTEGER,
		    OUT o_err   VARCHAR,
		    OUT o_rs    refcursor,
		    IN i_myparam bigint
		)
RETURNS RECORD AS $BODY$
BEGIN
  o_rc := 0;
  o_err := 'nothing happened';
  open o_rs for
  select * from pg_user;
END $BODY$  LANGUAGE 'plpgsql' VOLATILE COST 100;


create or replace function myfunc_someserver(
		    OUT o_rc    INTEGER,
		    OUT o_err   VARCHAR,
		    OUT o_rs    refcursor,
		    IN i_myparam bigint
		)
RETURNS RECORD AS $BODY$
BEGIN
  /*
  someserver logic here
  */
  select t.o_rc, t.o_err, t.o_rs into o_rc, o_err, o_rs 
  from myfunc_dbcommon(i_myparam) t;
  
END $BODY$  LANGUAGE 'plpgsql';



тут все в порядке, и код select * from myfunc_someserver(111); возвращает положенные ему данные из нужных таблиц.
Далее в результате ребилда отваливается строчка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace function myfunc_dbcommon(
		    OUT o_rc    INTEGER,
		    OUT o_err   VARCHAR,
		    OUT o_rs    refcursor,
		    IN i_myparam bigint
		)
RETURNS RECORD AS $BODY$
BEGIN
  o_rc := 0;
  o_err := 'nothing happened';
--  open o_rs for
  select * from pg_user;
END $BODY$  LANGUAGE 'plpgsql';



Все компилится, но при этом
Код: sql
1.
2.
3.
4.
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function myfunc_dbcommon(bigint) line 4 at SQL statement
SQL statement "select t.o_rc, t.o_err, t.o_rs                            from myfunc_dbcommon(i_myparam) t"



1) сообщение совсем не о том, что на самом деле
2) самое интересное, что в этом логе напрочь отсутствует INTO-секция, что наводит на мысли о всяком нехорошем типа "на БД совсем не то, что в исходниках, кто-то залез в БД и накатил фигню" и проч.
собственно, ЗАЧЕМ pg ругается на неоткрытый курсор ТАК?
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39838442
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HawkmoonДалее в результате ребилда отваливается строчка:
Почему она отваливается?
У вас нет курсора. Вы просто пытаетесь сделать select никуда. На это plpgsql и обижается. См. CONTEXT - жалуется строго на dbcommon.

HawkmoonВсе компилится
Если create function сказал "ок" - это значит только и только то, что функция зарегистрирована. Компилировать сейчас её даже не пытаются.
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39839836
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijHawkmoonДалее в результате ребилда отваливается строчка:
Почему она отваливается?
У вас нет курсора. Вы просто пытаетесь сделать select никуда. На это plpgsql и обижается. См. CONTEXT - жалуется строго на dbcommon.

HawkmoonВсе компилится
Если create function сказал "ок" - это значит только и только то, что функция зарегистрирована. Компилировать сейчас её даже не пытаются.

У вас нет курсора. - согласен. Но у меня есть переменная типа refcursor .
И я хочу передать ей ошибочно (что к делу не относится) неоткрытый результат.

В оракле к такой переменной:

VARIABLE O_RC VARCHAR2;
VARIABLE O_ERR VARCHAR2;
variable o_rs REFCURSOR;
EXEC PKG_functional_someserver.sp_myfunc (:O_RC, :O_ERR, 101, 1, :o_rs);
PRINT O_RC
PRINT O_ERR
PRINT O_RS

а) можно обратиться
б) можно присвоить одно к другому
в) можно вывести-вычитать курсор (получив ожидаемое "ничего") безо всяких ORA-ошибок.


В pg позиция "нет курсора - нет переменной"?
Тогда давайте и выборку из bytea в declare foo bytea гробить, если откуда выбирается - null. Логично же.
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39839840
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"логично" в том смысле, что в bytea также есть отдельные тоаст-хранилища и прочая лабутень, которая пользователя, обращающегося к БД извне, не интересует.

Почему bytea вида null нормально присваивается переменной bytea, а попытка запихать неоткрытое в refcursor приводит не к NULL (я бы понял), не к понятной ошибке, а к
"query has no destination for result data"
???
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39839847
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HawkmoonУ вас нет курсора. - согласен. Но у меня есть переменная типа refcursor .
Так где вы к ней обращаетесь? plpgsql должен сам угадать, что вы хотите этот select вникуда использовать для курсора? Нет, будьте добры это попросить явно.

Ещё раз: почему у вас вдруг отваливается строчка? Курсор не курсор не имеет абсолютно никакого значения. Во втором листинге у вас есть в тексте plpgsql хранимки есть select * from pg_user; ничего не указывающий что делать с результатом этого select. plpgsql не может делать select вникуда.
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39839861
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij plpgsql не может делать select вникуда.

Блин. То есть ругань идет не на то, что

select t.o_rc, t.o_err, t.o_rs from myfunc_dbcommon(i_myparam) t
без слова INTO,

а на то, что
select * from pg_user;
со звездочкой и без слова into?
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39839865
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoonа на то, что
select * from pg_user;
со звездочкой и без слова into?
Здёздочка без разницы. Главное что есть select, а куда его результат девать - не написано.
Но да, ошибка именно отсюда.

MelkijСм. CONTEXT - жалуется строго на dbcommon.
в CONTEXT stacktrace. Ошибка времени разбора текста функции myfunc_dbcommon, вызванной запросом с таким-то текстом.
...
Рейтинг: 0 / 0
Почему pg не позволяет возвратить курсор?
    #39840429
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

спасибо бол. Стал ближе к пониманию.
При попытке воспроизведения на Oracle и комментарии open o_rs тот сразу отругался на "где into, билли? Нам нужны into"
А PG непонятно, и детектируемое место, SQL statement, оказывается , указывает на уровень выше .


еще раз спс.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему pg не позволяет возвратить курсор?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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