全部插入

Insert All into

下面和之前的换行有区别吗select


INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)

SELECT * FROM dual;

并且在 select

之前没有换行

INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)
SELECT * FROM dual;

我注意到第一个没有在 table 中插入任何内容,并且在日志中显示为

D
-
X

虽然没有换行符的第二个块在日志中显示为 创建了 3 行。

++日志

SQL> desc LOOKUPTABLE_TYPE;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LOOKUPTABLE_NAME                          NOT NULL VARCHAR2(32)
 COLUMN_NAME                               NOT NULL VARCHAR2(32)
 COLUMN_ORDER                              NOT NULL NUMBER(2)
 COLUMN_TYPE                               NOT NULL NUMBER(1)
 COLUMN_MODE                               NOT NULL NUMBER(1)

SQL> INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)

SELECT * FROM dual;  2    3    4    5  SQL> 

D
-
X

SQL> commit
  2  ;

Commit complete.

SQL> select * from LOOKUPTABLE_TYPE where LOOKUPTABLE_NAME='LT_EMERGENCY_NUMBER';

no rows selected

SQL> 
SQL> 
SQL> 
SQL> INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)
SELECT * FROM dual;  2    3    4    5  

3 rows created.

SQL> select * from LOOKUPTABLE_TYPE where LOOKUPTABLE_NAME='LT_EMERGENCY_NUMBER';

LOOKUPTABLE_NAME                 COLUMN_NAME                      COLUMN_ORDER
-------------------------------- -------------------------------- ------------
COLUMN_TYPE COLUMN_MODE
----------- -----------
LT_EMERGENCY_NUMBER              BNUMBER                                     2
          0           1

LT_EMERGENCY_NUMBER              Description                                 3
          9           0

LT_EMERGENCY_NUMBER              STREAM                                      1
          0           1

没有区别。您可以根据需要添加任意多的空格(最多 SQL 语句的最大大小)而不影响查询的含义。

CREATE TABLE lookuptable_type (
  a VARCHAR2(50),
  b VARCHAR2(50),
  c INT,
  d INT,
  e INT
);

然后:

INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)

SELECT * FROM dual;

将给予:

3 rows affected

和:

INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)
SELECT * FROM dual;

还将给予:

3 rows affected

db<>fiddle here


更新

Why does SQL/Plus show this?

D
-
X

SQL/Plus 的默认行为是不接受 SQL 语句中的空行,并假定这将终止语句 (SQL/Plus documentation and relevant dba.stackechange question)。要更改此行为以允许空行,您需要包含指令:

set sqlblanklines on

当SQL/Plus解析带有空行的语句时,它将把它分成两个语句:

INSERT ALL
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','STREAM',1,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','BNUMBER',2,0,1)
INTO LOOKUPTABLE_TYPE VALUES ('LT_EMERGENCY_NUMBER','Description',3,9,0)

SELECT * FROM dual;

第一个是无效语法,第二个是有效语句,SQL/Plus 将对其进行处理并显示查询的输出。

如果您启用空行,那么它将处理完整的语句。