Oracle的insert的批量插入语句

在 Oracle 数据库中,不能直接使用类似于那种多行 VALUES 语法。

这种语法在某些其他数据库系统(如 MySQL、PostgreSQL)中是合法的,但不适用于 Oracle。

不支持:

INSERT INTO 
[表名]([列名],[列名]) 
 VALUES
([列值],[列值])),
([列值],[列值])),
([列值],[列值]));

但是,您可以使用以下几种方法来实现批量插入:

在 Oracle 中进行批量插入(Bulk Insert)可以通过多种方式实现,下面介绍几种常见的方法:

1. 使用 INSERT INTO ... SELECT 语句

这种方法适用于从一个表复制数据到另一个表,或者从查询结果中插入数据。

INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;
  • 示例
    INSERT INTO employees (id, name, salary)
    SELECT id, name, salary
    FROM temp_employees;
    

2. 使用 INSERT ALL 语句

INSERT ALL 允许一次性指定多个插入操作,每个操作可以插入到同一表中的不同行。

INSERT ALL
INTO target_table (column1, column2, ...) VALUES (value1, value2, ...)
INTO target_table (column1, column2, ...) VALUES (value1, value2, ...)
...
SELECT * FROM dual;
  • 示例
    INSERT ALL
    INTO employees (id, name, salary) VALUES (1, 'Alice', 5000)
    INTO employees (id, name, salary) VALUES (2, 'Bob', 6000)
    INTO employees (id, name, salary) VALUES (3, 'Charlie', 5500)
    SELECT * FROM dual;
    

3. 使用 FORALL PL/SQL 语句(适用于大量数据)

FORALL 是 PL/SQL 的语句,用于执行高效的批量绑定插入操作。它通常与数组结合使用,可以在一个事务中插入多行数据。

  • 示例
    DECLARE
      TYPE id_array IS TABLE OF employees.id%TYPE;
      TYPE name_array IS TABLE OF employees.name%TYPE;
      TYPE salary_array IS TABLE OF employees.salary%TYPE;
      
      ids id_array := id_array(1, 2, 3);
      names name_array := name_array('Alice', 'Bob', 'Charlie');
      salaries salary_array := salary_array(5000, 6000, 5500);
    BEGIN
      FORALL i IN 1..ids.COUNT
        INSERT INTO employees (id, name, salary)
        VALUES (ids(i), names(i), salaries(i));
    END;
    

注意事项:

  • 在 Oracle 中,批量插入可以显著提高性能,特别是在处理大量数据时。选择合适的方法取决于你的具体需求和数据量。
  • 使用 INSERT ALL 语句时,确保每个 INTO 子句都合法且满足目标表的约束条件。
  • 对于大规模数据插入,FORALL 在 PL/SQL 中通常是最有效的方式,因为它可以减少与数据库之间的通信次数。

根据你的具体需求和数据情况,选择合适的方法来执行批量插入操作。