如何转换批量收集和forall在其等效的postgresql

问题描述 投票:-1回答:1

我有以下代码需要转换为Oracle。它基本上是从表中选择其全部或大部分数据的代码,将其放入集合中,然后使用BULK COLLECT和FORALL将其加载到另一个表中。我会感谢你的帮助。以下是需要迁移到postgresql的oracle代码。

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;
/
postgresql stored-procedures
1个回答
1
投票

直接翻译将使用表格类型的数组。

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;
© www.soinside.com 2019 - 2024. All rights reserved.