Skip to content

INSERT

添加一个或多个记录到表中。

主要语法结构

语法格式

sql
INSERT INTO [schema_name.] table_name
    [PARTITION ( part_name_list ) | SUBPARTITION ( subpart_name_list )]
    insert_rest
[RETURNING target_list opt_bulk opt_into_list];

参数说明

  • schema_name:模式名。
  • table_name:表名。
  • part_name_list:表的分区名。
  • subpart_name_list:表的子分区名。

插入内容insert_rest

语法格式

sql
insert_rest::=
    VALUES ( target_list )[( target_list ) | ,( target_list )]...
|   DEFAULT VALUES
|   selectstmt
|   ( columnList ) VALUES ( target_list )[( target_list ) | ,( target_list )]...
|   ( columnList ) selectstmt
|   VALUES ident
|   ( columnList ) VALUES ident

参数说明

  • VALUES ( target_list )[( target_list ) | ,( target_list )]...:直接插入一组或多组值。
  • DEFAULT VALUES:插入默认值,适用于所有列都有默认值的情况。
  • selectstmt:一个 SELECT 语句,返回要插入的数据。从子查询中插入数据。
  • ( columnList ) VALUES ( target_list )[( target_list ) | ,( target_list )]...:指定列列表并插入一组或多组值。( target_list )插入的数据有以下形式:
    • (expr1, expr2, ..., exprn),括号中以逗号分隔的每项可以是常值、表达式等,每项与要插入数据的列对应。
    • (expr1, expr2, ..., exprn) (expr1, expr2, ..., exprn) ... 等,用以在一条语句里插入多行数据。
    • (expr1, expr2, ..., exprn),(expr1, expr2, ..., exprn),... 等,使用英文逗号分隔每一行插入的数据,插入多行数据。
  • ( columnList ) selectstmt:指定列列表并从子查询中插入数据。
  • VALUES ident:插入一个标识符(通常是变量或参数)。
  • ( columnList ) VALUES ident :指定列列表并插入一个标识符(通常是变量或参数)。

返回结果target_list

语法格式

sql
target_list::=
    target_el[,target_el]...

target_el::=
    b_expr AS ColLabel
|   b_expr ColId
|   DEFAULT
|   b_expr
|   ident  .*
|   *

opt_bulk::=
    /*EMPTY*/
|   BULK COLLECT    

opt_into_list::=
    INTO ident[,ident]...
|   /*empty*/

参数说明

  • target_list:可选项,RETURNING后的target_list用来指定返回的内容,有以下形式:
    • b_expr:是一个表达式,它可以是一个简单的列名、计算表达式等。
    • AS ColLabelColId:用于给返回的结果列重命名。
    • DEFAULT:关键字,可以用来表示默认值。
    • ident .**用于选择所有列。
  • opt_bulk:可选的关键词,指定该关键词后结果将一次性输出,而不是每次输出一行数据。
  • opt_into_list:可选的关键词, 把返回的结果输出至指定的变量或数据结构中。

示例

  • 示例1
    不指定插入列,插入值为常值。

    sql
    INSERT INTO test_tab_1 VALUES(DEFAULT, NULL, '2000-01-01', 2.459E+23);
  • 示例2
    指定插入列,插入值为表达式。

    sql
    INSERT INTO test_tab_2(c3, c4) VALUES(2+3, SUBSTR(c3,LEN(c3)-3,1));
  • 示例3
    指定插入列,插入值为子查询。

    sql
    INSERT INTO test_tab_3(c3, c4)SELECT salary,addr FROM t2 WHERE t2.id > 10;
  • 示例4
    一条语句中插入多行数据。

    sql
    INSERT INTO test_tab_4 VALUES(1, 'alpha')(DEFAULT, '')(NULL, 'beta')(4, 'gamma');
  • 示例5
    插入时将结果RETURNING。

    sql
    DECLARE
      TYPE type_table_varchar IS TABLE OF VARCHAR;
      var_chr TYPE_TABLE_VARCHAR;
    BEGIN
      FOR i IN 1..10 LOOP
        INSERT INTO test_tab_5(id, c2, c3) VALUES(i, i*2.1, 'STRING_'||i)
          RETURNING '('||c2||','||c3||')' BULK COLLECT INTO var_chr;
        -- 将返回结果输出至屏幕
        FOR j IN 1..var_chr.COUNT() LOOP
          SEND_MSG(var_chr(j));
        END LOOP;
      END LOOP;
    END;
  • 示例6
    插入RECORD类型

    sql
      -- 创建表1
    CREATE TABLE t1(a INT,name VARCHAR(100));
    
    -- 插入t1表数据
    INSERT INTO t1 VALUES(1,'123')(2,'123')(3,'345');
    
    -- 创建表2
    CREATE TABLE t2(a INT,name VARCHAR(100));
    
    -- 插入t2数据 
    DECLARE
      TYPE r IS TABLE OF t1%ROWTYPE;
      rs r;
    BEGIN
      SELECT * BULK COLLECT INTO rs FROM t1;
      FOR i IN rs.FIRST ..rs.LAST loop
        INSERT INTO t2 VALUES rs(i);
      END LOOP;
    END;