无法动态启动序列

时间:2014-04-04 11:24:13

标签: plsql sequence

基于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行

可能出现什么问题?

3 个答案:

答案 0 :(得分:1)

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

应该是

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;
/

答案 1 :(得分: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 :(得分:0)

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

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),并重新创建从那里开始的序列,从序列的使用方式来看,有点倒退。创建一个序列,然后多次使用它。

希望这有帮助。

分享并享受。