Есть запрос Oracle PL/SQL:
create type my_row_type as (
accountid NUMBER(10),
postid NUMBER(10),
postid timestamp
)
/
create or replace type virtual_table_type as table of my_row_type
/
Подскажите, пожалуйста, аналог для PostgreSQL PL/PGSQL этого момента:
create or replace type virtual_table_type as table of my_row_type
Мне почему-то кажется что это оно
http://postgresql.ru.net/manual/rowtypes.html
Нет, не оно… Необходим тип
Нет, не оно…
Необходим тип virtual_table_type, который содержит множество my_row_type.
также, есть функция, которая возвращает virtual_table_type;
Вам надо возвращать из
Вам надо возвращать из функции набор из нескольких my_row_type?
Тогда ф-ю можно объявить как returns setof my_row_type.
Н-р:
$ \d testt;
Таблица "public.testt"
Колонка | Тип | Модификаторы
---------+---------+----------------------------------------------------
id | integer | NOT NULL DEFAULT nextval('testt_id_seq'::regclass)
val | text | NOT NULL
$ create function test_fn() returns setof testt AS $test_fn$ select * from testt; $test_fn$ LANGUAGE sql volatile;
$ select * from test_fn();
id | val
---------+---------
1 | 1
2 | 2
3 | 3
4 | 4
........
(вместо testt -- тип таблицы -- можно использовать любой композитный тип)
В PL/pgsql ф-ях можно использовать return next.
Во-вторых, можно использовать my_row_type[] (Postgres с массивами работает прекрасно, как только начинаешь их использовать диву даешься чего можно с ними сделать!) и в качестве возвращаемого результата и как тип колонки таблицы:
$ create type test_t AS (idx integer,map integer[]);
$ create table testcmp (id serial NOT NULL PRIMARY KEY, extents test_t[]);
$ insert into testcmp (extents) values (ARRAY[(1, ARRAY[1,2,3,4]::integer[])::test_t, (2, ARRAY[5,6,7,8]::integer[])::test_t]);
$ create OR replace function test_fn2() returns test_t[] AS $test_fn$ select array_agg((id, ARRAY[1,2,id])::test_t) from (select id FROM testt LIMIT 10) as foo; $test_fn$ LANGUAGE sql volatile;
Понял. Спасибо!
Понял. Спасибо!