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) );
我使用 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) );