微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用SQL或PLSQL将多行数据插入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,1989,'01-12-1993',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 '1993-12-01',1300,' ' FROM DUAL;

或者,使用INSERT ALL

INSERT ALL
INTO historie (mnr,opmerkingen)
  VALUES ( 7499,' ' )
INTO historie (mnr,opmerkingen) 
  VALUES ( 7499,' ' )
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,' ' 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 提琴here

,

SQL Workshop,对吗?将这些命令包括在begin-end块中(并使其变为PL / SQL):

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

,然后按下RUN按钮。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。