Postgres & functions
От: Darkman_VLT Россия  
Дата: 09.05.06 22:55
Оценка:
Помогите разобратся с тем, как функция может возвращать не одно значение, а скажем
свормированную таблицу. Вьюха мне не подходит, т.к. нужны параметры,
а where накладывать очень напряжно по ресурсам.

Создавать сообственный тип, а потом его возвращать?
Чёт не нравится мне это.

Есть ещё какие-то способы?
Re: Postgres & functions
От: 191540 Россия  
Дата: 12.05.06 09:07
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

D_V>Помогите разобратся с тем, как функция может возвращать не одно значение, а скажем

D_V>свормированную таблицу. Вьюха мне не подходит, т.к. нужны параметры,
D_V>а where накладывать очень напряжно по ресурсам.

D_V>Создавать сообственный тип, а потом его возвращать?

D_V>Чёт не нравится мне это.

D_V>Есть ещё какие-то способы?


Может использовать Курсор (Cursor) ?
Re: Postgres & functions
От: Ананий  
Дата: 12.05.06 11:13
Оценка:
Пример табличной функции с параметром. Для MSSQL правда, но наверное должно подойти...

CREATE FUNCTION FN1( @A INT )
RETURNS @RET TABLE( A INT)
AS
BEGIN
INSERT @RET
SELECT @A 
UNION SELECT @A + 1
UNION SELECT @A + 2
RETURN
END
GO
SELECT * FROM FN1(1)
GO
DROP FUNCTION FN1
Re: Postgres & functions
От: Laurel  
Дата: 13.05.06 07:22
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

D_V>Помогите разобратся с тем, как функция может возвращать не одно значение, а скажем

D_V>свормированную таблицу. Вьюха мне не подходит, т.к. нужны параметры,
D_V>а where накладывать очень напряжно по ресурсам.

D_V>Создавать сообственный тип, а потом его возвращать?

D_V>Чёт не нравится мне это.

D_V>Есть ещё какие-то способы?


Способов несколько.

1. Можно создать свой тип и использовать SETOF. Ничего страшного в этом нет.
2. Можно возвращать курсор (RETURNS refcursor).
3. Postgres умеет возвращать массивы. В некоторых случаях, наверное, это может пригодиться.

Первый способ лично мне кажется самым удачным. Кстати, тип создавать необязательно, если возвращается выборка, совпадающая по типу с какой-то таблицей. В этом случае достаточно %ROWTYPE.
А с курсором потребуются дополнительные телодвижения при вызове функции (FETCH ALL).
Re[2]: Postgres & functions
От: Darkman_VLT Россия  
Дата: 14.05.06 22:14
Оценка:
Здравствуйте, Laurel, Вы писали:

L>Первый способ лично мне кажется самым удачным. Кстати, тип создавать необязательно, если возвращается выборка, совпадающая по типу с какой-то таблицей. В этом случае достаточно %ROWTYPE.


А что делать, если это часть таблицы, а не вся таблица?
Re[3]: Postgres & functions
От: Laurel  
Дата: 15.05.06 05:37
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

L>>Первый способ лично мне кажется самым удачным. Кстати, тип создавать необязательно, если возвращается выборка, совпадающая по типу с какой-то таблицей. В этом случае достаточно %ROWTYPE.


D_V>А что делать, если это часть таблицы, а не вся таблица?


Создавать тип или использовать refcursor.
Re: Postgres & functions
От: valera_k2000  
Дата: 25.05.06 20:06
Оценка:
можно обойтись и без объявления типа.
CREATE OR REPLACE FUNCTION work_schema.Who_Lock_Object(IN _Name_Object TEXT,
IN _ID_Row INTEGER,
OUT ID_Session INTEGER,
OUT ID_User INTEGER,
OUT NAME_User VARCHAR(100))
RETURNS SETOF RECORD AS $$
DECLARE
_id_obj INTEGER;
_row_lock work_schema.Lock_Objects%ROWTYPE;
BEGIN
SELECT ID INTO _id_obj
FROM work_schema.Dict_Objects
WHERE NAME=_Name_Object;
--
IF FOUND THEN
FOR _row_lock IN SELECT *
FROM work_schema.Lock_Objects
WHERE ID_Object=_id_obj AND ID_Row=_ID_Row AND Status='L'
LOOP
ID_Session:=_row_lock.ID_Session;
ID_User:=_row_lock.ID_User;
NAME_User:=(SELECT NAME FROM work_schema.Dict_Users WHERE ID=_row_lock.ID_User LIMIT 1);
--
RETURN NEXT;
END LOOP;
END IF;
END;
$$ LANGUAGE 'plpgsql' RETURNS NULL ON NULL INPUT STABLE SECURITY DEFINER;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Postgres & functions
От: Darkman_VLT Россия  
Дата: 26.05.06 03:59
Оценка:
Thanx,
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.