在 Oracle 11gR2 中,我遇到了这个问题:
我有TABLE_A
结构:
+--------+--------+--------+
| COL1 | COL2 | COL3 |
+--------+--------+--------+
和TABLE_B_
结构:
+--------+--------+--------+
| COL2 | COL1 | COL3 |
+--------+--------+--------+
(所以列定义相同,但它们的顺序不同)
执行类似的事情:
INSERT INTO TABLE_A
SELECT * FROM TABLE_B;
工作正常吗?
我的问题是列的列表将超过 32767 字符EXECUTE IMMEDIATE
字符。
答案 0 :(得分:3)
不,请指定列:
INSERT INTO TABLE_A SELECT col2,col1,col3 FROM TABLE_B
答案 1 :(得分:2)
在较新的Oracle版本中,您可以在EXECUTE IMMEDIATE中使用CLOB,但我不知道32K限制是否也适用。
无论如何,您可以使用DBMS_SQL包来运行大于32k的语句。
DECLARE
stmt DBMS_SQL.VARCHAR2A;
c number;
res number;
BEGIN
stmt(1) := 'insert into table_a (';
stmt(2) := 'col_a, ';
stmt(3) := 'col_b, ';
stmt(4) := 'col_c) ';
stmt(5) := 'select ';
stmt(6) := 'col_bb, ';
stmt(7) := 'col_cc + col_ee + DECODE(...), ';
stmt(8) := 'col_dd) ';
stmt(9) := 'from table_b ';
stmt(10) := 'where ... ';
-- each element can have up to 32K characters, number of elements is (almost) unlimited
c := DBMS_SQL.open_cursor;
DBMS_SQL.parse(c, stmt, 1,10, TRUE, DBMS_SQL.NATIVE);
res := DBMS_SQL.execute(c);
DBMS_SQL.close_cursor(c);
END;
/