powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поможите плиз ERROR: SELECT query has no destination for result data
21 сообщений из 21, страница 1 из 1
Поможите плиз ERROR: SELECT query has no destination for result data
    #32798238
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос к гуру или к тем, кто наступал уже на это. Почему при выборке из функции SELECT * FROM getscheduledata();, база ругается
ERROR: SELECT query has no destination for result data код далее

Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
CREATE TYPE www_type AS (
    object_id integer,
    parent_id integer,
    type_id integer,
    type_name varchar(100),
    dvalue date,
    tvalue time,
    bvalue boolean,
    mvalue varchar(20),
    ivalue integer,
    sortvalue varchar(100),
    svalue varchar(6000)
);

CREATE TABLE www_temp(
       object_id integer,
       parent_id integer,
       step integer,
       UNIQUE (object_id, parent_id, step)
);

CREATE OR REPLACE FUNCTION getwwwdata()  
    RETURNS SETOF www_type
    LANGUAGE 'plpgsql'
    AS'
DECLARE
    i integer;
    var_rec RECORD;
BEGIN
    DELETE FROM www_temp;

    INSERT INTO www_temp
    SELECT
		o1.object_id,
		NULL AS parent_id,
		1 AS step
	FROM
		object o1
	WHERE
		o1.type_id IN (
			SELECT
				type_id
			FROM
				obj_types
			WHERE
				name IN (''data'', ''free'', ''noname'')
	        ) AND
		o1.dvalue BETWEEN (date ''2004-11-29'') AND (date ''2004-11-29'' + integer ''7'');

	LOOP
        SELECT object_id FROM www_temp WHERE step=i-1;
        IF NOT FOUND THEN
            EXIT;  -- exit loop
        END IF;
        IF i>10 THEN
            EXIT;  -- exit loop
        END IF;

        INSERT INTO www_temp
	    SELECT
                o2o.obj2 AS object_id,
                o2o.obj1 AS parent_id,
                i AS step
	       FROM
                obj_to_obj o2o
	    WHERE
                o2o.obj1 IN (SELECT object_id FROM www_temp WHERE step=i-1);

        i:=i+1;
    END LOOP;
    
    FOR var_rec IN 
        SELECT
            o1.object_id,
            tmp.parent_id,
            o1.type_id,
            ot.name AS type_name,
            o1.dvalue,
            o1.tvalue,
            o1.bvalue,
            o1.mvalue,
            o1.ivalue,
            o1.sortvalue,
            CAST(o1.svalue AS varchar(6000))
        FROM
            object o1
        INNER JOIN
            obj_types ot
        ON
            ot.type_id=o1.type_id
        INNER JOIN
            (SELECT * FROM www_temp) tmp
        ON
            o1.object_id=tmp.object_id
    LOOP
        RETURN NEXT var_rec;
    END LOOP;
    
    RETURN;
END;
';
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32798531
R@ven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так попробуй
SELECT getscheduledata();
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32798611
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неее, не работает - та же ошибка
ERROR: SELECT query has no destination for result data
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32798766
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут уже обсуждалось - при возвращение record нужно вызывать как


select * from f(x,y) as (a int2,b text,c varchar)
иначе как парсер поймет какого типа данные на выход отправлять. неудобно, но афаик это единственный способ возвращать различные выборки с разным сожержимым
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32798767
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps - вроде как по функции планируешь возвращать набор типа www_type
а сам в функции возвращаешь record var_rec
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799264
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как ты заметил, у меня на выходе www_type а не record и то что ты рекомендуешь выдает в моем случае вот такую ошибку

ERROR: a column definition list is only allowed for functions returning "record"
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799278
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если я выставляю все таки RECORD и использую вывод типа
SELECT * FROM "getwwwdata"() AS data(...)
то получаю опять эту ошибку
ERROR: SELECT query has no destination for result data
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799304
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм.. посмотрел свои коды - у меня так только с Language 'sql' сделано...
по твоему коду не совсем ясно вот что

1. SELECT object_id FROM www_temp WHERE step=i-1;
раз у тебя pgsql - будь добр выбирать куда либо - попробуй
declare xxx type.xxx
...
select into xxx object_id FROM www_temp WHERE step=i-1;
if xxx

2. повторюсь - ты объявляешь что будешь возвращать тип ВВВ, а возвращаешь рекорд... думаю (не на чем проверить ща) тут будет затык - рекорд вряд ли автоматически преобразуется к ВВВ, т.е. тебе нужно или объявлять переменную типа ВВВ и в цикле ее заполнять и возвращать, или возвращать из функции рекорд ...
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799479
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
centurтут уже обсуждалось - при возвращение record нужно вызывать как


select * from f(x,y) as (a int2,b text,c varchar)
иначе как парсер поймет какого типа данные на выход отправлять. неудобно, но афаик это единственный способ возвращать различные выборки с разным сожержимым

Может чё пропустил, но где это обсуждалось?
Так вот такое
Код: plaintext
1.
2.
SELECT *
FROM get_creative( 100000 , '10.10.4.10', 'MSIE', - 1 );
работает. Ссылку дай пожалуста.

Дальше.
Объясните мне назначение последнего RETURN перед END
Код: plaintext
1.
2.
3.
4.
  LOOP
    RETURN NEXT var_rec;    
  END LOOP;
  RETURN; -- <-- это зачем???
END;';

И второе - пропиши на всяк случай тип var_rec не RECORD, а www_type - и понятнее и правильнее.
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799639
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю, че обсуждает народ.

1. Наименование ф-ции
в
SELECT * FROM getscheduledata();
не совпадает с таковым в
CREATE OR REPLACE FUNCTION getwwwdata()
т.ч. некоторым сыршенно не яасно, а таа ли вообще-тто этто функция?

2. Определение таблиц, участвующих в функции в коде не приведено - запустить проверку у себя, даже в предположении, что ф-я одна и та же, вряд ли кто сможет.

3. Ну и непонятно, зачем тип возврата определяется как (вообще) рекорд внутри, но как конкретный тип - в объявлении. Чаго этим добивается автор в данном конкретном случае? Что это ему дает?
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799723
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
43211. Наименование ф-ции
в
SELECT * FROM getscheduledata();
не совпадает с таковым в
CREATE OR REPLACE FUNCTION getwwwdata()
т.ч. некоторым сыршенно не яасно, а таа ли вообще-тто этто функция?

рабочая функция - getscheduledata();
для теста переименовал в getwwwdata()
так что тут не важно какая функция

пробовал объявление типа внутри функции типа
var_rec www_type;
в EMS PostgreSQL при дебаге кричит на все это дело,
потом пишу var_rec www_type%ROWTYPE - работает, но при селекте все та же ошибка :(

mwolf LOOP
RETURN NEXT var_rec;
END LOOP;
RETURN; -- <-- это зачем???
END;';
в доке сказано делайте так, первый ретурн возвращает строки по одной, второй ретурн говорит функции что она завершина, это как я понял, точной формулировки не скажу
в примерах еще встречал второй ретурн типа

RETURL null;
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799739
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
centur1. SELECT object_id FROM www_temp WHERE step=i-1;
раз у тебя pgsql - будь добр выбирать куда либо - попробуй
declare xxx type.xxx
...
select into xxx object_id FROM www_temp WHERE step=i-1;
if xxx


а зачем мне еще один тип объявлять?
я проверяю при предыдущей итерации что-то выбролось, пора ли остановиться?
мне хранить эти данные не нужно!
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32799756
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри за спам, но для тех, кто хочет этот пример проверить, привожу код таблиц, которые участвуют в выборке
Индексы не буду приводить, в данном случае они не нужны

Код: plaintext
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.
CREATE TABLE "public"."obj_types" (
  "type_id" SERIAL, 
  "name" VARCHAR( 100 ) NOT NULL,
  CONSTRAINT "obj_types_pkey" PRIMARY KEY("type_id")
) WITH OIDS;

CREATE TABLE "public"."object" (
  "object_id" SERIAL, 
  "type_id" INTEGER, 
  "reg_date" TIMESTAMP, 
  "svalue" TEXT, 
  "dvalue" DATE, 
  "tvalue" TIME WITHOUT TIME ZONE, 
  "bvalue" BOOLEAN, 
  "ivalue" INTEGER, 
  "mvalue" VARCHAR( 20 ), 
  "sortvalue" VARCHAR( 100 ), 
  "city" INTEGER, 
  "check_date" TIMESTAMP WITHOUT TIME ZONE, 
  CONSTRAINT "object_pkey" PRIMARY KEY("object_id")
) WITH OIDS;

CREATE TABLE "public"."obj_to_obj" (
  "obj1" INTEGER NOT NULL, 
  "obj2" INTEGER NOT NULLб
  CONSTRAINT "o_to_o_con2" CHECK (obj1 <> obj2)
) WITH OIDS;
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32800032
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
WARNING:  Error occurred while executing PL/pgSQL function getwwwdata
WARNING:  line  26  at SQL statement

ERROR:  SELECT query has no destination for result data.
	If you want to discard the results, use PERFORM instead.
т.е. ошибка в передаче внешней i в SQL строку:
Код: plaintext
SELECT object_id FROM www_temp WHERE step=i- 1 ;
т.ч. используйте что-то наподобие:
Код: plaintext
PERFORM \'SELECT object_id FROM www_temp WHERE step=\' || (i- 1 )::text|| \';\';
(могабыть хуры подправят)
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32800487
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использовал для возврата переменную типа ROWTYPE.
Для вызова функций используется:

select * from func(x,y);

если функция возвращает одно или более значение, и :

select func(x,y);

если возвращает одно значение.

И еще вопрос, а версия постгреса у вас точно поддерживает возврат множественного результата?
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32801195
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия PostgreSQL 7.4.6 on i386-portbld-freebsd4.9, compiled by GCC 2.95.4

Есть еще предложения?
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32801202
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я похоже соврамши про причину ошибки, - т.к.
Код: plaintext
PERFORM SELECT object_id FROM www_temp WHERE step=(i- 1 );
у меня почему-то сразу не прошло (но не из-за подстановки преременных, а еще почему-то)
Но прходит кажется следующее:
Код: plaintext
PERFORM (SELECT object_id FROM www_temp WHERE step=(i- 1 ));
(в PostgreSQL 7.3.4.)

т.е. причина ошибки на самом деле в том, что вы не делаете SELECT INTO

Note: One might expect that SELECT with no INTO clause would accomplish this result, but at present the only accepted way to do it is PERFORM.

там же:
Sometimes one wishes to evaluate an expression or query but discard the result (typically because one is calling a function that has useful side-effects but no useful result value). To do this in PL/pgSQL, use the PERFORM statement:

PERFORM query;
This executes query, which must be a SELECT statement, and discards the result. PL/pgSQL variables are substituted in the query as usual. Also, the special variable FOUND is set to true if the query produced at least one row or false if it produced no rows.

еще раз мои извинения
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32801268
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо 4321SELECT object_id FROM www_temp WHERE step=i-1;

Дело в том, что EMS 2 не ругается на такие ошибки при дебаге функции и отрабатывает все на ура

Запустил все это дело из консоли и действительно увидел эту ошибку
Код: plaintext
1.
2.
3.
4.
select * from "public"."getwwwdata" ();
ERROR:  SELECT query has no destination for result data
HINT:  If you want to discard the results, use PERFORM instead.
CONTEXT:  PL/pgSQL function "getwwwdata" line  28  at SQL statement
Вариант который ниже - помог и EMS 2 стал все отрабатывать
Код: plaintext
PERFORM 'SELECT object_id FROM www_temp WHERE step=' || (i- 1 )::text|| ';';
Хотя вариант
4321PERFORM (SELECT object_id FROM www_temp WHERE step=(i-1));
Мне нравиться больше, по своей красоте :)

Если нет доступа через консоль, какое средство в разработке будет отрабатывать коректно, а то что-то EMS2 меня разочаровал!?
Ты чем пользовался для дебага?
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32801284
cyberboom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только что проверил вариант
Код: plaintext
1.
2.
3.
4.
PERFORM (SELECT object_id FROM www_temp WHERE step=(i- 1 ));

ERROR:  more than one row returned by a subquery used as an expression
CONTEXT:  PL/pgSQL function "getwwwdata" line  28  at perform
Не работает, так как мне это нужно только для проверки, ограничил все это одним элементом
Код: plaintext
PERFORM (SELECT object_id FROM www_temp WHERE step=(i- 1 ) LIMIT  1 );

Не объясните в чем разница?
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32801608
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запускал через PgAdminIII, но и он не без проблем - иногда сам падает при ошибках (видимо не все возвраты нормально съедает). В этих случаях просылаю через MSAccess (+ODBC) - пишу в окно запросов SQL запрос к серверу, в св-ва запроса - строку подключения - "ODBC;DRIVER={PostgreSQL Legacy};DATABASE=test;SERVER=ххх.ххх.ххх.ххх;PORT=хххх" И запущаю - вроде не падает, и ошибку можно прочесть.

По поводу разницы - не знаю. Есть предположение, что должен по "идеалогическим соображениям" работать "правильно"
PERFORM SELECT object_id FROM www_temp WHERE step=(i-1);
но он не работает. Почему - не понял. (скудно в доке с этим)
В случае
PERFORM (SELECT ....) ;
SELECT ххх - это видимо уже подзапрос а "(SELECT ....)" - соответственно выражение, долженствующее (?) вернуть одно (не более одного) значение (запись?). Вот и ругается. (Если нароешь в доке подробные указания - прошли ссылки).
...
Рейтинг: 0 / 0
Поможите плиз ERROR: SELECT query has no destination for result data
    #32804840
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну собственно как и говорилось - SELECT INTO...
но проверьте еще такой момент - то ли перформ то ли execute НЕ устанавливают переменную FOUND , т.е. в FOUND лежит то что установилось предыдущими выборками... проверьте в вашей ситуации конструкцией типа
perform (select * from xxx where нереальные условия) и проверьте FOUND.. именно после этих граблей я предпочитаю выбирать во что-то и проверять конкретный параметр, береженного бог бережет
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поможите плиз ERROR: SELECT query has no destination for result data
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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