使用序列更新表时出错

Posted

技术标签:

【中文标题】使用序列更新表时出错【英文标题】:Error while updating a table with sequence 【发布时间】:2020-05-31 17:52:20 【问题描述】:

我有表 Hash_emp 和如下序列

顺序:

CREATE SEQUENCE Increment_bY_1 
START WITH 1 
INCREMENT BY 1 
NOMAXVALUE NOCYCLE
CACHE 10;

当我使用For 循环更新Employee_id 时,它会引发错误。有人能解释一下出了什么问题吗?

declare 
i number;
begin
for i in 2..29  
update hash_emp set EMPLOYEE_ID=INCREMENT_BY_1.nextval where rownum=i; 
end loop;
end;

错误

PLS-00103:在预期以下情况之一时遇到符号“更新”:

& - + / 在循环 mod 余数 rem || 多组 符号“循环”被替换为“更新”以继续。
    00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 --------------

【问题讨论】:

【参考方案1】:

请使用下面的查询,不用for循环,直接使用查询

update hash_emp set EMPLOYEE_ID=INCREMENT_BY_1.nextval where rownum between 2 and 29;

【讨论】:

【参考方案2】:

正如另一个答案指出的那样,不需要 FOR LOOP。但为了完整起见,这就是你首先得到错误的原因。实际错误是由 FOR LOOP 语句中的语法错误引起的。 FOR 循环的syntax 是:


FOR index IN lower_bound .. upper_bound LOOP
  statement;
END LOOP;

在您的情况下,缺少第一个“LOOP”。

【讨论】:

【参考方案3】:

还请注意,ROWNUM 的使用不是必需的。 ROWNUM 是仅在查询或命令运行时由 Oracle 填充的伪列。它仅在具有特定谓词和排序的命令的上下文中有意义,并且与存储在磁盘或表中的数据的顺序没有任何关系。通过在没有其他条件的情况下指定 ROWNUM,您实际上是在告诉 Oracle 更新在结果集的位置 2 到 29 中碰巧返回的任何 随机 行。

如果您想保留已单独分配 EMPLOYEE_ID 值的行并仅更新那些为空的行,请使用以下命令:

update hash_emp set EMPLOYEE_ID=INCREMENT_BY_1.nextval where EMPLOYEE_ID IS NULL;

【讨论】:

以上是关于使用序列更新表时出错的主要内容,如果未能解决你的问题,请参考以下文章

在存储过程中使用日期时间作为参数更新表时出错

更新我的 sql 中的两个表时出错

更新表时 H2 数据库“重命名文件时出错”

更新 DynamoDB 表时出错:表已启用流

创建 SQL 触发器以更新另一个表时出错

在 Access 中通过 VBA 传输表时出错