如何使用 SQL 或 PLSQL 将多行数据插入到 Oracle 中的 table 中?
How do you insert multiple rows of data using SQL or PLSQL into a table in Oracle?
几天来我一直在为此苦苦挣扎,但无法同时插入多行。这只是基本的东西,见下文。在 Oracle Application Express 5.1.4.00.08 中工作。
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
values (7499,1988,'01-06-1988','01-07-1989',30,1000,' ');
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
values (7499,1989,'01-07-1989','01-12-1993',30,1300,' ');
它一次只接受 1 行,一旦我尝试多行,它就会给出这个一般错误:
ORA-00933: SQL command not properly ended
SQL工坊吧?将这些命令包含到 begin-end
块中(并将它们设为 PL/SQL):
begin
insert into historie ...;
insert into historie ...;
end;
/
然后按下 RUN
按钮。
使用INSERT ... SELECT
:
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
SELECT 7499, 1988, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' FROM DUAL UNION ALL
SELECT 7499, 1989, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' FROM DUAL;
或者,使用 INSERT ALL
:
INSERT ALL
INTO historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
VALUES ( 7499, 1988, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' )
INTO historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
VALUES ( 7499, 1989, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' )
SELECT * FROM DUAL;
不要将 DATE
值作为字符串插入,因为这需要 Oracle 执行隐式 string-to-date 转换,如果 NLS_DATE_FORMAT
会话参数更改,那么您的代码将停止工作。相反,要么使用 TO_DATE
明确执行转换,要么使用日期文字(如 DATE '1988-06-01'
)。
此外,如果 beginjaar
列应与 begindatum
列具有相同的年份,则使用虚拟列而不是复制数据(因为复制数据可能会不同步)。例如:
CREATE TABLE historie (
mnr NUMBER,
beginjaar NUMBER
GENERATED ALWAYS AS ( EXTRACT( YEAR FROM begindatum ) ) VIRTUAL,
begindatum DATE,
einddatum DATE,
afd NUMBER,
maandsal NUMBER,
opmerkingen VARCHAR2(20)
);
然后:
insert into historie (mnr, begindatum, einddatum, afd, maandsal, opmerkingen)
SELECT 7499, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' FROM DUAL UNION ALL
SELECT 7499, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' FROM DUAL;
和:
SELECT * FROM historie;
输出:
MNR | BEGINJAAR | BEGINDATUM | EINDDATUM | AFD | MAANDSAL | OPMERKINGEN
---: | --------: | :------------------ | :------------------ | --: | -------: | :----------
7499 | 1988 | 1988-06-01 00:00:00 | 1989-07-01 00:00:00 | 30 | 1000 |
7499 | 1989 | 1989-07-01 00:00:00 | 1993-12-01 00:00:00 | 30 | 1300 |
db<>fiddle here
几天来我一直在为此苦苦挣扎,但无法同时插入多行。这只是基本的东西,见下文。在 Oracle Application Express 5.1.4.00.08 中工作。
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
values (7499,1988,'01-06-1988','01-07-1989',30,1000,' ');
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
values (7499,1989,'01-07-1989','01-12-1993',30,1300,' ');
它一次只接受 1 行,一旦我尝试多行,它就会给出这个一般错误:
ORA-00933: SQL command not properly ended
SQL工坊吧?将这些命令包含到 begin-end
块中(并将它们设为 PL/SQL):
begin
insert into historie ...;
insert into historie ...;
end;
/
然后按下 RUN
按钮。
使用INSERT ... SELECT
:
insert into historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
SELECT 7499, 1988, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' FROM DUAL UNION ALL
SELECT 7499, 1989, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' FROM DUAL;
或者,使用 INSERT ALL
:
INSERT ALL
INTO historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
VALUES ( 7499, 1988, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' )
INTO historie (mnr, beginjaar, begindatum, einddatum, afd, maandsal, opmerkingen)
VALUES ( 7499, 1989, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' )
SELECT * FROM DUAL;
不要将 DATE
值作为字符串插入,因为这需要 Oracle 执行隐式 string-to-date 转换,如果 NLS_DATE_FORMAT
会话参数更改,那么您的代码将停止工作。相反,要么使用 TO_DATE
明确执行转换,要么使用日期文字(如 DATE '1988-06-01'
)。
此外,如果 beginjaar
列应与 begindatum
列具有相同的年份,则使用虚拟列而不是复制数据(因为复制数据可能会不同步)。例如:
CREATE TABLE historie (
mnr NUMBER,
beginjaar NUMBER
GENERATED ALWAYS AS ( EXTRACT( YEAR FROM begindatum ) ) VIRTUAL,
begindatum DATE,
einddatum DATE,
afd NUMBER,
maandsal NUMBER,
opmerkingen VARCHAR2(20)
);
然后:
insert into historie (mnr, begindatum, einddatum, afd, maandsal, opmerkingen)
SELECT 7499, DATE '1988-06-01', DATE '1989-07-01', 30, 1000,' ' FROM DUAL UNION ALL
SELECT 7499, DATE '1989-07-01', DATE '1993-12-01', 30, 1300,' ' FROM DUAL;
和:
SELECT * FROM historie;
输出:
MNR | BEGINJAAR | BEGINDATUM | EINDDATUM | AFD | MAANDSAL | OPMERKINGEN ---: | --------: | :------------------ | :------------------ | --: | -------: | :---------- 7499 | 1988 | 1988-06-01 00:00:00 | 1989-07-01 00:00:00 | 30 | 1000 | 7499 | 1989 | 1989-07-01 00:00:00 | 1993-12-01 00:00:00 | 30 | 1300 |
db<>fiddle here