【问题标题】: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 行

可能出了什么问题?

【问题讨论】:

    标签: plsql sequence


    【解决方案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),然后重新创建序列以从那里开始,这与应该使用序列的方式有点倒退。一次创建一个序列,然后多次使用它。

      希望这会有所帮助。

      分享和享受。

      【讨论】:

      • 为了搞清楚这个练习,我已经做了很多试验和错误,这就是为什么我需要确保在继续之前删除之前创建的序列。请不要将我的代码解释为现实生活中的示例,这只是一个学校练习。
      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2021-04-03
      相关资源
      最近更新 更多