create global temporary table system.TMP20101108
(
serial NUMBER(10) not null,
zzcj VARCHAR2(20),
zzjhrq VARCHAR2(20)
)--建立临时表
1. CREATE SEQUENCE SYSTEM.seq_TMP20101108
MINVALUE 1
NOMAXVALUE
START WITH 1
INCREMENT BY 1
NOCYCLE
NOCACHE
2 alter table SYSTEM.TMP20101108 ADD(PRIMARY KEY(serial))
3 create or replace trigger SYSTEM.tg_TMP20101108
before insert on SYSTEM.TMP20101108 for each row when (new.serial is null)
begin
select seq_TMP20101108.nextval into :new.serial from dual;
end;
这是一种方法 不过比较麻烦,因为我从sql server 2000导到oracle的数据,每建立一个都要检索出最大值
select max(serial) from SYSTEM.TMP20101108
然后把最大值赋值到 START WITH 后面后来我在网上看到一个这种方式
CREATE OR REPLACE TRIGGER system.TR1
BEFORE INSERT ON system.TMP20101108 FOR EACH ROW
declare com_num NUMBER;
BEGIN
SELECT MAX(serial) INTO :com_num FROM SYSTEM.TMP20101108;
NEW.serial:=com_num+1;
END TR1;
可是问题出现了 根本在企业管理器中编译不过去,
提示我
ora-00942 表或视图不存在
你没有足够的权限执行该操作。
你必须具备适当的权限编辑删除数据库对象或者不属于您的方案的对象这是什么问题啊
(
serial NUMBER(10) not null,
zzcj VARCHAR2(20),
zzjhrq VARCHAR2(20)
)--建立临时表
1. CREATE SEQUENCE SYSTEM.seq_TMP20101108
MINVALUE 1
NOMAXVALUE
START WITH 1
INCREMENT BY 1
NOCYCLE
NOCACHE
2 alter table SYSTEM.TMP20101108 ADD(PRIMARY KEY(serial))
3 create or replace trigger SYSTEM.tg_TMP20101108
before insert on SYSTEM.TMP20101108 for each row when (new.serial is null)
begin
select seq_TMP20101108.nextval into :new.serial from dual;
end;
这是一种方法 不过比较麻烦,因为我从sql server 2000导到oracle的数据,每建立一个都要检索出最大值
select max(serial) from SYSTEM.TMP20101108
然后把最大值赋值到 START WITH 后面后来我在网上看到一个这种方式
CREATE OR REPLACE TRIGGER system.TR1
BEFORE INSERT ON system.TMP20101108 FOR EACH ROW
declare com_num NUMBER;
BEGIN
SELECT MAX(serial) INTO :com_num FROM SYSTEM.TMP20101108;
NEW.serial:=com_num+1;
END TR1;
可是问题出现了 根本在企业管理器中编译不过去,
提示我
ora-00942 表或视图不存在
你没有足够的权限执行该操作。
你必须具备适当的权限编辑删除数据库对象或者不属于您的方案的对象这是什么问题啊
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
CREATE OR REPLACE TRIGGER system.TR1
BEFORE INSERT ON system.TMP20101108
FOR EACH ROW
DECLARE
com_num NUMBER;
BEGIN
SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108; --com_num 变量前面不要冒号
:NEW.serial:=com_num+1; --这里关键字new要用冒号 :new.serial
END TR1;
这个表啊 我还需要赋予什么权限啊 我用的用户是system 这个应该具备所有权限吧
select max(serial) from table 查询出来最大的值 然后手工的添加到 start with 后面去,
start with 不是从哪个开始的意思吗 我只有查询到最大的值 一个一个加1才不会重复 因为serial是主键不可以重复的
create global temporary table system.TMP20101108
(
serial NUMBER(10) not null,
zzcj VARCHAR2(20),
zzjhrq VARCHAR2(20)
)
on commit delete rows;
然后用system 登陆的企业管理器 查看创建的触发器 也是sysdba 角色登陆的
问题出在我把脚本写错了 按你给的那种方式写就没问题了 我该有:的地方没有 不该有的地方就有了
--那你可不可以这样?动态创建你的序列
CREATE OR REPLACE TRIGGER system.TR1
BEFORE INSERT ON system.TMP20101108
FOR EACH ROW
DECLARE
com_num NUMBER;
BEGIN
SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108;
execute immediate 'CREATE OR REPLACE SEQUENCE SYSTEM.seq_TMP20101108 MINVALUE 1 NOMAXVALUE START WITH ||col_num||' INCREMENT BY 1 NOCYCLE NOCACHE';
select seq_TMP20101108.nextval into :new.serial from dual;
END TR1;
CREATE OR REPLACE TRIGGER TR1 BEFORE INSERT ON temp_table FOR EACH ROWdeclare com_num NUMBER;BEGINSELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE; :NEW.ID:=COM_NUM+1;END TR1;
我给乱改一通 你那么写
CREATE OR REPLACE TRIGGER system.TR1
BEFORE INSERT ON system.TMP20101108
FOR EACH ROW
DECLARE
com_num NUMBER;
BEGIN
SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108; --com_num 变量前面不要冒号
:NEW.serial:=com_num+1; --这里关键字new要用冒号 :new.serial
END TR1;是没有问题的 也不提示我错误了 ,也不用动态创建序列了
我觉得第二种创建触发器的方法 比创建序列那个简单明了的 难道会有什么隐患吗