setval - 在错误的位置找到FROM关键字[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我正在尝试创建一个从我的表中的最大ID开始的序列。

我离开了之前提出的问题How to create sequence using starting value from query?

这是顺序:

CREATE SEQUENCE q9_seq;

SELECT setval('q9_seq', (SELECT MAX(department_id) FROM hr_departments));

我得到的结果是:

ORA-00923:未找到FROM关键字的预期错误。

sql oracle
2个回答
1
投票
declare
v_num number;
begin
    select nvl(max(value), 0) + 1
    into v_num
    from table;

    execute immediate 'create sequence drop_me_seq start with ' || v_num;
end;
/

1
投票

您可以使用特定于客户端的功能,例如替换变量,例如在SQL * Plus或SQL Developer中:

column v_start new_value v_start

select nvl(max(department_id), 0) + 1 as v_start from hr_departments;

create sequence q9_seq start with &v_start;

old:create sequence q9_seq start with &v_start
new:create sequence q9_seq start with 43

Sequence Q9_SEQ created.

select q9_seq.nextval from dual;

   NEXTVAL
----------
        43

或者您可以更改现有序列以跳过数字,或调用nextval直到达到现有最大值(as here)。

或者你可以使用一个简单的匿名块:

declare
  l_start number;
begin
  select nvl(max(department_id), 0) + 1 into l_start from hr_departments;

  execute immediate 'create sequence q9_seq start with ' || l_start;
end;
/

PL/SQL procedure successfully completed.

select q9_seq.nextval from dual;

   NEXTVAL
----------
        43

动态SQL语句的生成方式与替换变量方法相同,如create sequence q9_seq start with 43

(这两个都假设你的桌子的最高当前值是42 ......)

© www.soinside.com 2019 - 2024. All rights reserved.