ORACLE会自动匹配SELECT中INSERT中的正确列吗?

时间:2013-12-12 19:42:39

标签: sql oracle oracle11g oracle11gr2

Oracle 11gR2 中,我遇到了这个问题:

我有TABLE_A结构:

+--------+--------+--------+
|  COL1  |  COL2  |  COL3  |
+--------+--------+--------+

TABLE_B_结构:

+--------+--------+--------+
|  COL2  |  COL1  |  COL3  |
+--------+--------+--------+

(所以列定义相同,但它们的顺序不同)

执行类似的事情:

INSERT INTO TABLE_A 
SELECT * FROM TABLE_B;

工作正常吗?

我的问题是列的列表将超过 32767 字符EXECUTE IMMEDIATE字符。

2 个答案:

答案 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;
/