无法动态启动序列
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),然后重新创建序列以从那里开始,这与应该使用序列的方式有点倒退。一次创建一个序列,然后多次使用它。
希望这会有所帮助。
分享和享受。
【讨论】:
为了搞清楚这个练习,我已经做了很多试验和错误,这就是为什么我需要确保在继续之前删除之前创建的序列。请不要将我的代码解释为现实生活中的示例,这只是一个学校练习。以上是关于无法动态启动序列的主要内容,如果未能解决你的问题,请参考以下文章
PHP 无法加载 Imagick 库 - PHP 启动:无法加载动态库