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

7 浏览
0 Comments

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

在Oracle 11gR2中,我遇到了这个问题:\n我有一个名为TABLE_A的表,结构如下:\n+--------+--------+--------+\n| COL1 | COL2 | COL3 |\n+--------+--------+--------+\n和一个名为TABLE_B_的表,结构如下:\n+--------+--------+--------+\n| COL2 | COL1 | COL3 |\n+--------+--------+--------+\n(列定义相同,但顺序不同)\n执行以下操作:\nINSERT INTO TABLE_A \nSELECT * FROM TABLE_B;\n会正常工作吗?\n我的问题是,列的列表将超过32767个字符,无法在EXECUTE IMMEDIATE语句中执行。

0
0 Comments

问题的出现原因是在使用INSERT INTO SELECT语句时,Oracle不能自动匹配正确的列。这可能会导致数据插入错误的列中,导致数据不一致或错误。

为了解决这个问题,可以使用DBMS_SQL包来运行超过32K的语句。可以使用DECLARE和BEGIN语句来定义一个存储过程,在存储过程中使用DBMS_SQL来执行INSERT INTO SELECT语句。

下面是一个示例代码,演示了如何使用DBMS_SQL来执行INSERT INTO SELECT语句:

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 ... '; 
    -- 每个元素可以有多达32K个字符,元素数量(几乎)没有限制
    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;
/

通过使用DBMS_SQL包,我们可以将需要执行的INSERT INTO SELECT语句拆分为多个部分,并在声明的数组stmt中存储这些部分。然后,使用DBMS_SQL.parse函数将这些部分组合成完整的INSERT INTO SELECT语句。最后,使用DBMS_SQL.execute函数执行该语句。

通过使用DBMS_SQL包,我们可以确保INSERT INTO SELECT语句中的列与目标表的列匹配,从而避免数据插入错误的列中。这样可以确保数据的一致性和准确性。

0
0 Comments

问题出现的原因是,在使用INSERT语句从SELECT语句中插入数据时,ORACLE无法自动匹配正确的列。为了解决这个问题,需要在INSERT语句中明确指定列的顺序。

解决方法是在INSERT语句中使用列的顺序,例如:

INSERT INTO TABLE_A SELECT col2,col1,col3 FROM TABLE_B

需要注意的是,在SELECT语句中列的顺序必须与要插入的目标表中的默认顺序相匹配。

0