Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возврат таблицы из функции, PostgreSQL 
:(
    Опции темы
Value
Дата 7.10.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



ещё один вопрос по ф-иям

создаю ф-ию по созданию таблицы 
Код

drop function if exists sp_custtable();
CREATE OR REPLACE FUNCTION sp_custtable () RETURNS setof tsquery AS
$body$
BEGIN 
create table customer (
user_id integer not NULL,
bb_id integer not null,
bb_coordinates point not NULL);
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


потом другую чтобы заполнить только что созданную
Код

drop function if exists sp_fillcusttable();
CREATE FUNCTION sp_fillcusttable() RETURNS tsquery AS
$body$
begin
select users.id as user_id, billboards.id as bb_id, billboards.coordinates as bb_coordinates
from billboards left outer join users on sp_custtable();
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;


когда хочу посмотреть результат выдаёт ошибку

ERROR:  argument of JOIN/ON must be type boolean, not type tsquery
CONTEXT:  SQL statement "select users.id as user_id, billboards.id as bb_id, billboards.coordinates as bb_coordinates from billboards left outer join users on sp_custtable()"

вот выделенного не понимаю почему связь JOIN/ON должна быть булева
и как здесь правильно запрос создать ?

Это сообщение отредактировал(а) Value - 8.10.2008, 13:01
PM MAIL   Вверх
DEER
Дата 8.10.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: нет
Всего: 13



1)у вас функция sp_custtable должна возвращать набор данных, а она только создает таблицу
2) ошибка означает то, что в разделе ON должно быть булево значение (условия отбора), а не набор данных.
правильнее было бы
Код

select users.id as user_id, billboards.id as bb_id, billboards.coordinates as bb_coordinates from billboards left outer join sp_custtable() as func_result on (billboards.user_id=func_result.user_id)

и то, это сработает, если функция sp_custtable будет реально возвращать набор данных
3)sp_fillcusttable тожде ничего не заполняет, а елает выборку из таблицы  smile 


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Value
Дата 8.10.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



тогда можно хотябы пример как фунуция возвращает набор данных (мне надо именно через функцию а не view) ?  просто дело в том что в postgresql нет комманды returns table, вот мне очень интерестно что надо писать после returns чтобы вернуть набор данных (данные не одного типа (int, varchar, bytea))

Это сообщение отредактировал(а) Value - 8.10.2008, 16:35
PM MAIL   Вверх
DEER
Дата 8.10.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: нет
Всего: 13



http://www.postgresql.org/docs/7.2/static/xfunc-sql.html
SQL
Код

CREATE FUNCTION new_emp() RETURNS EMP AS '
    SELECT text ''None'' AS name,
        1000 AS salary,
        25 AS age,
        point ''(2,2)'' AS cubicle;
' LANGUAGE SQL;

plpgsql. пишу на память, могут быть ошибки
Код

--Таблица типа уже создана
create table customer (
user_id integer not NULL,
bb_id integer not null,
bb_coordinates point not NULL);
--Заполним
INSERT INTO customer(user_id, bb_id, bb_coordinates) VALUES (1,1,1);
INSERT INTO customer(user_id, bb_id, bb_coordinates) VALUES (2,1,2);
INSERT INTO customer(user_id, bb_id, bb_coordinates) VALUES (1,2,3);
INSERT INTO customer(user_id, bb_id, bb_coordinates) VALUES (2,2,4);
--Сама функция
drop function if exists sp_custtable();
CREATE OR REPLACE FUNCTION sp_custtable () RETURNS setof tsquery AS
$body$
DECLARE
 r RECORD
BEGIN 
 FOR r IN SELECT user_id, bb_id, bb_coordinates FROM customer 
   RETURN NEXT r;
LOOP
RETURN;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
--Выполним, как у тебя
select users.id as user_id, billboards.id as bb_id, billboards.coordinates as bb_coordinates
from billboards left outer join sp_custtable() as users ON (billboards.id=users.bb_id);

как то так.

Это сообщение отредактировал(а) DEER - 8.10.2008, 18:20


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Value
Дата 9.10.2008, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



спасибо что-то начинает вырисовываться smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.