我有以下代码需要转换为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;
/
直接翻译将使用表格类型的数组。
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;