现在有一数据表如下所示:
会议类型表(FS_ CONFERENCE_TYPE):记录会议类型信息序号 中文字段名 英文字段名 字段类型 长度 是否为空 主、外键
1 ID号 cnf_type_id Number 14 F 主
2 会议类型名 cnf_type_name Varchar2 100 F
3 操作员ID User_ID number 14 F 要求ID号为自增,规则为:4位当前年份+2位当前月份+2位当前日期+6位记录流水号,共14位。完全用触发器来实现
如:20060105000001
20060105000002
20080116000003
.......................................
请问该如何解决。
会议类型表(FS_ CONFERENCE_TYPE):记录会议类型信息序号 中文字段名 英文字段名 字段类型 长度 是否为空 主、外键
1 ID号 cnf_type_id Number 14 F 主
2 会议类型名 cnf_type_name Varchar2 100 F
3 操作员ID User_ID number 14 F 要求ID号为自增,规则为:4位当前年份+2位当前月份+2位当前日期+6位记录流水号,共14位。完全用触发器来实现
如:20060105000001
20060105000002
20080116000003
.......................................
请问该如何解决。
before insert on FS_ CONFERENCE_TYPE
for each row
begin
:new.id:=to_char(sysdate,'yyyymmdd')||to_char(SEQNAME.nextval,'000000');
end TGNAME;
to_char(SEQNAME.nextval,'000000');好像不对,我运行试了一下老提示错误
SEQNAME是指序列
你自己创建序列,用你的序列名来代替这个序列名
create sequence SEQNAME
maxvalue 999999
minvalue 1
cycle;
create sequence EQNAME
minvalue 000001
maxvalue 999999
start with 000001
increment by 1
cache 20;
ora-04098:触发器‘SYSTEM.FS_AREA’无效且未通过重新确认。而我进行分部检查,日期转字符串没有错误,但是后面的自增好象不对,我转们定义了一个变量获取自增值,获取不到。
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW begin
:new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000');
end
;
序列:
CREATE SEQUENCE "SYSTEM"."FS_AREA_SEQUENCE" INCREMENT BY 1 START
WITH 42 MAXVALUE 999999 MINVALUE 1 CYCLE
CACHE 20 NOORDER触发器:CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW begin
:new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000');
end
;
'000000'也稍改下,去掉空格
to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000')
CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW begin
select to_char(FS_CONFERENCE_TYPE_SEQUENCE.nextval,'000000') into :new.CNF_TYPE_ID from dual;
:new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||:new.CNF_TYPE_ID;
end
这样看看。
11g以前在触发器上不允许直接用FS_CONFERENCE_TYPE_SEQUENCE.nextval取数据的。
CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW begin
select to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000') into :new.CNF_TYPE_ID from dual;
:new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')||:new.CNF_TYPE_ID;
end
序列:
CREATE SEQUENCE "SYSTEM"."FS_CONFERENCE_TYPE_SEQUENCE" INCREMENT
BY 1 START WITH 21 MAXVALUE 1.0E28 MINVALUE 1 CYCLE
CACHE 20 NOORDER
触发器:
CREATE OR REPLACE TRIGGER "SYSTEM"."FS_CONFERENCE_TYPE_TRIGGER"
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW begin
:new.CNF_TYPE_NAME:=to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000');
end
;这样改后还是原来的问题
你试试
begin
dbms_output.put_line(to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'));
end;
看看输出是否正确我测试了没问题
你说的不正常表现在什么地方?
CREATE OR REPLACE TRIGGER SYSTEM.FS_CONFERENCE_TYPE_TRIGGER
BEFORE
INSERT ON FS_ CONFERENCE_TYPE
FOR EACH ROW begin
:new.cnf_type_id :=to_char(sysdate,'yyyymmdd')||to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000');
end
;
你说定义了变量来获取,我以为你使用select into了...分并不重要,即使没有分,还能分享到你的经验
to_char(system.FS_CONFERENCE_TYPE_SEQUENCE.nextval,'fm000000'))
这样位数就统一了
BEFORE
INSERT ON "FS_ CONFERENCE_TYPE"
FOR EACH ROW
DECLARE
SEQ_VAR VARCHAR2(6);
begin
select to_char(system.FS_AREA_SEQUENCE.nextval,'fm000000') into SEQ_VAR from dual;
:new.CNF_TYPE_ID:=to_char(sysdate,'yyyymmdd')|| SEQ_VAR;
end