【问题标题】:PL/SQL Throwing Error ORA-02289: sequence does not exist (Oracle SQL)PL/SQL 抛出错误 ORA-02289: 序列不存在 (Oracle SQL)
【发布时间】:2021-08-01 18:24:03
【问题描述】:

我使用SQL Developer 创建了一个表。在我的表中的 ID 列中,我将其设置为自动增量数字列。当我从SQL Developer 中的 SQL 选项卡获取表的 SQL 并尝试在数据库的另一个实例中运行它时,我得到一个异常:

我正在尝试运行脚本:

CREATE TABLE "GAL_ABS_DB"."DEVICE_LOCKING" 
(   "ID" NUMBER(*,0), 
"TECH" VARCHAR2(6 BYTE), 
"DEVICENAME" VARCHAR2(20 BYTE), 
"LOCKINGTYPE" VARCHAR2(16 BYTE), 
"LOCKINGDEFINITION" VARCHAR2(6 BYTE)
) SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "GAL_ABS_DB" ;

CREATE OR REPLACE TRIGGER "GAL_ABS_DB"."DEVICE_LOCKING_TRIGGER" 
BEFORE INSERT ON DEVICE_LOCKING 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.ID IS NULL THEN
      SELECT DEVICE_LOCKING_SEQ.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "GAL_ABS_DB"."DEVICE_LOCKING_TRIGGER" ENABLE;

你能告诉我这是在抱怨什么吗?我从 SQL Developer 本身获得了脚本。

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:

    大概 DEVICE_LOCKING_SEQ 序列对象不存在。

    这将是一个独立的对象,而不是例如表格的一部分。所以你应该有一个 CREATE SEQUENCE ... 语句

    【讨论】:

    • 那么只要在开头加上语句:CREATE SEQUENCE DEVICE_LOCKING_SEQ;就行了?
    • “那么只要在开头加上语句:CREATE SEQUENCE DEVICE_LOCKING_SEQ; 就应该可以了?” 为什么不直接试试看呢?
    • 最好是查找创建序列的正确语法,然后从那里开始
    • 可能的原因是:序列不存在或您没有执行此操作所需的权限。确保序列名称正确,并且您有权执行所需的操作这个序列
    • @hell_storm2004 是的,create sequence device_locking_seq; 可能没问题。如果缓存容量非常大,您可以增加缓存大小,并检查the docs 中的其他选项是否有任何不标准(多个RAC 实例等),但create sequence sequencename 几乎总是可以的。
    【解决方案2】:

    生成的代码通常是可怕的。我只是将表创建为:

    create table device_locking 
    ( id                 integer generated always as identity
    , tech               varchar2(6)
    , devicename         varchar2(20)
    , lockingtype        varchar2(16)
    , lockingdefinition  varchar2(6) );
    

    除了SEGMENT CREATION IMMEDIATE 之外,大多数存储设置都是默认值 - 你真的想要吗? FLASH_CACHE 详细信息仅适用于 Exadata。

    如果你想要老式的命名序列,也许还有一个 PK,你可以使用

    create sequence device_locking_seq;
    
    create table device_locking 
    ( id                 integer
                         default on null device_locking_seq.nextval
                         constraint device_locking_pk primary key
    , tech               varchar2(6)
    , devicename         varchar2(20)
    , lockingtype        varchar2(16)
    , lockingdefinition  varchar2(6) );
    

    【讨论】:

    • 我不是很懂数据库专家。我只知道日常使用的基本选择、插入、更新、删除命令。这就是为什么依靠 SQL Developer 的 GUI 创建表并自动生成脚本来将表添加到其他数据库实例的原因。上次我做 PL/SQL 是在 2000 年代中期,所以不用说,不记得太多了。我让我的工作在桌子之前添加一个序列。感谢大家的帮助。
    • 我希望我可以选择两个答案!但既然尼克的来了,我不得不选择它! :(
    • 不用担心。很高兴它有帮助。
    猜你喜欢
    • 2021-09-19
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多