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

Posted

技术标签:

【中文标题】如何使用 SQL 或 PLSQL 将多行数据插入 Oracle 中的表中?【英文标题】:How do you insert multiple rows of data using SQL or PLSQL into a table in Oracle? 【发布时间】:2020-10-13 08:37:39 【问题描述】:

我已经为此苦苦挣扎了好几天,但无法同时插入多行。这只是基本的东西,见下文。在 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 命令未正确结束

【问题讨论】:

【参考方案1】:

使用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;

输出:

MNR |开始 |开始 |电子数据 | AFD |曼萨尔 |奥默金根 ---: | --------: | :----------------- | :----------------- | --: | --------: | :---------- 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

【讨论】:

【参考方案2】:

SQL 研讨会,对吧?将这些命令包含到 begin-end 块中(并将它们改为 PL/SQL):

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

然后按下RUN 按钮。

【讨论】:

哇,非常感谢,我已经在尝试制作程序,但是太难了。祝福

以上是关于如何使用 SQL 或 PLSQL 将多行数据插入 Oracle 中的表中?的主要内容,如果未能解决你的问题,请参考以下文章

plsql子查询查出多行怎么修改

plsql:从选择中插入多行并忽略重复项

使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表

插入数据

插入数据

Flink SQL 如何实现列转行 ?