在表中创建新行。

语法

INSERT INTO table[subquery][@dblink ] [ ( column [, ...] ) ]
  { VALUES ( { expression | DEFAULT } [, ...] )
    [ RETURNING return_expression [, ...]
        { INTO { record | variable [, ...] }
        | BULK COLLECT INTO collection [, ...] } ]
  | query }

说明

INSERT 允许您在表中插入新行。您可以一次插入一行,也可以插入多个行作为查询结果。

目标列表中的列可以按任意顺序列出。目标列表中不存在的各列将使用默认值插入,即其声明的默认值或 null 值。

如果各列的表达式没有采用正确的数据类型,将尝试进行自动类型转换。

仅当在 SPL 程序中使用 INSERT 命令且使用 VALUES 子句时,才能指定 RETURNINGINTO { record | variable [, ...] } 子句。

仅当在 SPL 程序中使用 INSERT 命令时,才能指定 RETURNING BULK COLLECT INTO collection [, ...] 子句。如果指定多个 collection 作为 BULK COLLECT INTO 子句,则每个 collection 必须由单个标量字段组成,即 collection 不能是记录。对于插入的每行,return_expression 的计算值成为 collection 中的元素,从第一个元素开始。会删除 collection 中的所有现有行。如果结果集为空,则 collection 也将为空。

您必须具有表的 INSERT 特权,才能在其中插入。如果您使用 query 子句插入来自查询的行,还需要对查询中使用的所有表具有 SELECT 特权。

参数

参数 说明
table 现有表的名称(可能是 schema 限定的)。
dblink 用于标识远程数据库的 database link 名称。有关 database link 的信息,请参见 CREATE DATABASE LINK 命令。
column table 中的列名。
expression 要分配给 column 的表达式或值。
DEFAULT 该列中将填入其默认值。
query 提供要插入的行的查询(SELECT 语句)。请参见 SELECT 命令中的语法说明。
return_expression 可能包括 table 中一列或多列的表达式。如果在 return_expression 中指定 table 中的列名,则按如下方式确定在对 return_expression 求值时替换该列的值:
  • 如果在 INSERT 命令中为在 return_expression 中指定的列分配值,则在对 return_expression 求值时会使用分配的值。
  • 如果在 INSERT 命令中没有为在 return_expression 中指定的列分配值,且表的列定义中不存在列的默认值,则在对 return_expression 求值时会使用 null。
  • 如果在 INSERT 命令中没有为在 return_expression 中指定的列分配值,且表的列定义中不存在列的默认值,则在对 return_expression 求值时会使用默认值。
record 要为其字段分配 return_expression 求值结果的记录。第一个 return_expression 分配给 record 中的第一个字段,第二个 return_expression 分配给 record 中的第二个字段,以此类推。record 中的字段数量必须与表达式数量准确匹配,而且字段类型必须与为其分配的表达式类型兼容。
variable 要为其分配 return_expression 求值结果的变量。如果指定多个return_expressionvariable,则第一个 return_expression 分配给第一个 variable,第二个 return_expression 分配给第二个 variable,以此类推。在 INTO 关键字之后指定的变量数量必须与在 RETURNING 关键字之后的表达式数量准确匹配,而且变量类型必须与为其分配的表达式类型兼容。
collection 根据 return_expression 求值结果在其中创建元素的集合。可能存在单个集合(该集合可能是由单个字段组成的集合,也可能是由记录类型组成的集合),也可能存在多个集合(在这种情况下,每个集合必须由单个字段组成)。返回表达式的数量和顺序必须与所有指定集合中字段的数量和顺序匹配。每组对应的 return_expressioncollection 字段的类型必须兼容。
subquery 子查询语句。

示例

将单个行插入表 emp

INSERT INTO emp VALUES (8021,'JOHN','SALESMAN',7698,'22-FEB-07',1250,500,30);

在以上第二个示例中,列 comm 被省略,因此它将具有默认值 null:

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, deptno)
    VALUES (8022,'PETERS','CLERK',7698,'03-DEC-06',950,30);

第三个示例为 hiredatecomm 列使用 DEFAULT 子句而不是指定值:

INSERT INTO emp VALUES (8023,'FORD','ANALYST',7566,NULL,3000,NULL,20);

该示例为部门名称创建一个表,然后通过选择 dept 表的 dname 列来插入表中:

CREATE TABLE deptnames (
    deptname        VARCHAR2(14)
);
INSERT INTO deptnames SELECT dname FROM dept;

select * from table1的结果作为一个目标对象,并在目标对象中插入一行数据(1,1,1):

INSERT INTO (SELECT * FROM table1) VALUES (1, '1', 1) ;