Как заполнить коллекцию в postgreSQL - PullRequest
0 голосов
/ 20 декабря 2018

Я очень новичок в PostgreSQL и работаю над задачей миграции.Я ищу альтернативу синтаксиса «массового сбора в» в PostgreSQL или как я могу добиться этой функциональности в PostgreSQL.

    CREATE FUNCTION test."printEmpIds"()
RETURNS test.emp_add
LANGUAGE 'plpgsql'
COST 100
VOLATILE 
AS $BODY$
declare 
empIds test.emp_add;
begin
select ids bulk collect empIds from test.emp;
-- for idx in 1..empIds.count loop
-- raise notice '%%%', empIds.idx;
-- end loop;
return empIds;
end;
$BODY$;
ALTER FUNCTION test."printEmpIds"()
OWNER TO postgres;

В основном я хочу заполнить все идентификаторы из таблицы emp в определяемые пользователем empIds коллекции ивозвращение

Любая помощь будет заметна?

1 Ответ

0 голосов
/ 20 декабря 2018

В Postgres вы можете вернуть массив целых чисел INT[], выполнив ARRAY_AGG из выбора

Тестовые данные

create table emp ( ids INTEGER );
insert into emp(ids) values(1),(2),(3);

Функция

CREATE OR REPLACE FUNCTION printempids ()
RETURNS INT[]
LANGUAGE plpgsql
COST 100 volatile as $body$ 
declare empids int[];
BEGIN
     SELECT array_agg(ids) INTO empids
      FROM emp;
     RETURN empids;
END;
$body$;

Результат

knayak=# select printempids ();
 printempids
-------------
 {1,2,3}
(1 row)

Чтобы получить их в виде строк, вы можете сделать

select * FROM  UNNEST(printempids ()) as id;

Хотя эта функцияможет реплицировать функциональность Oracle TABLE, используя коллекцию, я бы предложил вам использовать RETURNS TABLE и RETURN QUERY SELECT .. вместо этого в Postgres.

CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( p_ids INT )
LANGUAGE plpgsql
COST 100 volatile as $body$ 
declare empids int[];
BEGIN
     RETURN QUERY SELECT ids 
      FROM emp;
END;
$body$;

Результат

knayak=# select printempids ();
 printempids
-------------
           1
           2
           3
(3 rows)

Или простая функция SQL также работает.

CREATE OR REPLACE FUNCTION printempids ()
RETURNS TABLE ( ids INT ) as 
$body$ 
  SELECT ids FROM emp;
$body$ LANGUAGE SQL
COST 100 volatile;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...