PL/SQL 抛出错误 ORA-02289: 序列不存在 (Oracle SQL)

PL/SQL Throwing Error ORA-02289: sequence does not exist (Oracle SQL)

我使用 SQL Developer 创建了一个 table。在我的 table ID 列中,我将其设为自动递增数字列。当我从 SQL Developer 中的 SQL 选项卡获取 table 的 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 开发者那里得到了脚本。

推测 DEVICE_LOCKING_SEQ 序列对象不存在。

这本身就是一个独立的对象,而不是 table 的一部分。所以你应该有一个 CREATE SEQUENCE ... 语句

生成的代码通常很丑陋。我只是将 table 创建为:

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