Как конвертировать массовый сбор и сбор в его эквивалент для postgresql - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть такой код, который необходимо преобразовать в Oracle. По сути, это код, который выбирает из таблицы все или большую часть ее данных, помещает их в коллекцию и затем загружает в другую таблицу, используя BULK COLLECT и FORALL. Я буду благодарен за помощь. Ниже приведен код оракула, который необходимо перенести в postgresql.

SQL> desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER(38)
 ENAME                                              VARCHAR2(4)

SQL> desc t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER(38)
 ENAME                                              VARCHAR2(4)

SQL> select * from t;

     EMPNO ENAM
---------- ----
         1 a
         4 d
         3 c
         2 b
CREATE OR REPLACE PROCEDURE temp_n_bulk_load
IS
   TYPE v_t IS TABLE OF t%ROWTYPE;

   v1_t   v_t;
BEGIN
   SELECT t.*
     BULK COLLECT INTO v1_t
     FROM t;

   DBMS_OUTPUT.put_line (TO_CHAR (v1_t.COUNT));

   FORALL i IN 1 .. v1_t.COUNT
      INSERT INTO T1 (EMPNO, ENAME)
           VALUES (V1_T (i).empno, v1_t (i).ename);

   COMMIT;
END;
/

1 Ответ

0 голосов
/ 10 сентября 2018

Прямой перевод будет использовать массив типа таблицы.

CREATE OR REPLACE function temp_n_bulk_load()
 returns void
as
$$
declare
   v_t t[]; -- t is the table name and at the same time a data type
   l_count bigint;
BEGIN
   SELECT array_agg(t)
     into v_t
   FROM t;

   l_count := cardinality(v_t);
   raise notice 'Retrieved % rows', l_count;

   INSERT INTO T1 (EMPNO, ENAME)
   select r.*
   from unnest(v_t) as r;

   -- you can't COMMIT in a function
END;
language plpgsql;

Но весь подход излишне сложен и не будет масштабироваться - это также верно для решения Oracle. Использование одного insert into .. select является способом более эффективным - как в Postgres, так и в Oracle.

Вся процедура должна быть заменена на:

insert into t1 (empno, ename)
select empno, ename
from t1;

Если вы хотите, вы можете поместить это в функцию:

CREATE OR REPLACE function temp_n_bulk_load()     
   returns void
as $$
  insert into t1 (empno, ename)
  select empno, ename
  from t1;
$$
language sql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...