【问题标题】: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 ||
    多组
    符号“循环”被替换为“更新”以继续。
    1. 00000 - “第 %s 行,第 %s 列:\n%s”
      *原因:通常是 PL/SQL 编译错误。 --------------

【问题讨论】:

    标签: sql oracle sql-update sequence


    【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 2017-12-27
          • 2016-03-31
          相关资源
          最近更新 更多