繁体   English   中英

Oracle中如何使用SQL或PLSQL将多行数据插入到一个表中?

[英]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 命令未正确结束

使用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 执行隐式字符串到日期的转换,并且如果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;

输出:

\n  MNR |  BEGINJAAR | 初中 | 英达图姆 |  AFD | 曼萨尔 |  OPMERKINGEN\n ---: |  --------: |  :------------------ |  :------------------ |  --: |  -------: |  :----------\n 7499 |  1988 |  1988-06-01 00:00:00 |  1989-07-01 00:00:00 |  30 |  1000 |            \n 7499 |  1989 |  1989-07-01 00:00:00 |  1993-12-01 00:00:00 |  30 |  1300 |            \n

db<> 在这里摆弄

SQL Workshop,对吧? 将这些命令包含在一个begin-end块中(并将它们改为 PL/SQL):

begin
  insert into historie ...;
  insert into historie ...;
end;
/

然后按下RUN按钮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM