无法动态启动序列

Posted

技术标签:

【中文标题】无法动态启动序列【英文标题】:Unable to dynamically start sequence 【发布时间】:2014-04-04 11:24:12 【问题描述】:

基于this example,我创建了这段代码:

DECLARE
    new_employee_id INTEGER;
BEGIN
    SELECT MAX(EMP_ID) + 1 INTO new_employee_id FROM EMPLOYEE;
    EXECUTE IMMEDIATE 'CREATE OR REPLACE SEQUENCE primary_key_seq START WITH ' || new_employee_id || ' INCREMENT BY 1';
END;
/

OBS:也许使用序列来自动增加表的主键没有多大意义,但这是一个学校练习,这是我们应该做的,所以请忽略这方面。

这是我遇到的错误: 第 1 行错误 ORA-00922: 缺少或无效选项 ORA-06512: 在第 5 行

可能出了什么问题?

【问题讨论】:

【参考方案1】:

没有 CREATE OR REPLACE SEQUENCE 选项,因此如果您需要先删除它,则必须使用 CREATE SEQUENCE 语句和 DROP 语句。

DECLARE
    new_employee_id INTEGER;
BEGIN
    SELECT MAX(EMP_ID) + 1 INTO new_employee_id FROM EMPLOYEE;
    EXECUTE IMMEDIATE 'CREATE SEQUENCE primary_key_seq START WITH ' || new_employee_id || ' INCREMENT BY 1';
END;
/

【讨论】:

天啊...我怎么看不到 :-) 谢谢。【参考方案2】:

在创建序列命令检查documentation 中没有 REPLACE(这总是一个好主意 ;-)

应该是

DECLARE
    new_employee_id INTEGER;
BEGIN
    SELECT MAX(EMP_ID) + 1 INTO new_employee_id FROM EMPLOYEE;
    EXECUTE IMMEDIATE 'CREATE SEQUENCE primary_key_seq START WITH ' || new_employee_id || ' INCREMENT BY 1';
END;
/

【讨论】:

【参考方案3】:

这个问题引出了另一个问题 - 为什么你要删除并重新添加一个序列?你永远不需要这样做。创建一次序列:

CREATE SEQUENCE PRIMARY_KEY_SEQ
  MINVALUE 1
  MAXVALUE 9999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  NOCACHE;

然后,在您的代码中使用它

DECLARE
  new_employee_id INTEGER;
BEGIN
  new_employee_id := PRIMARY_KEY_SEQ.NEXTVAL;

  INSERT INTO SOME_TABLE_MAYBE_EMPLOYEES
    (ID, WHATEVER, WHATEVER_ELSE)
  VALUES
    (new_employee_id, 'WHATEVER', 'WHATEVER_ELSE');
END;

序列的全部目的是提供唯一的、不重复的值。走到桌子旁,获取 MAX(ID),然后重新创建序列以从那里开始,这与应该使用序列的方式有点倒退。一次创建一个序列,然后多次使用它。

希望这会有所帮助。

分享和享受。

【讨论】:

为了搞清楚这个练习,我已经做了很多试验和错误,这就是为什么我需要确保在继续之前删除之前创建的序列。请不要将我的代码解释为现实生活中的示例,这只是一个学校练习。

以上是关于无法动态启动序列的主要内容,如果未能解决你的问题,请参考以下文章

无法使用泛型使用 Jackson 反序列化动态 json

无法反序列化 - 休眠弹簧启动

PHP 无法加载 Imagick 库 - PHP 启动:无法加载动态库

PHP 启动:无法加载动态库 'sqlsrv'

`PHP 警告:PHP 启动:无法加载动态库 'mcrypt.so'

PHP 警告:PHP 启动:无法加载动态库 'bz2'