问题描述
我已经为此苦苦挣扎了好几天,但是不能同时插入多行。这只是基本内容,请参见下文。在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
按钮。