create or replace trigger trg_test before insert on tmp_b for each row declare v_no varchar2(10); begin v_no := to_char(sysdate, 'yyyymmdd') || (:new.a + :new.b + :new.c); :new.d :=v_no;
insert into tmp_c (a) values (v_no); end trg_test;
A表为编号规则(由用户设定)数据如下 colname cx isbn 1 bc 3 yc 2B表的数据 jcbh barcode ISBN bc yc jcmc null 9787302107682 7302107688 1 2 LINUX教程 null 9603312107643 7303117676 1 2 计算机基础要求在B表插入数据时生成编号,如B表的第一条记录的JCBH为73021076882120090830,第二条记录的JCBH为:73031176762120090830(编号分别对应isbn,yc,bc,date) 但是A表中的数据用户是可以设置的,这些字段都来至B表
1.创建函数,返回用户定义的编号顺序对应的字段顺序; create or replace function ft return varchar2 is type cur is ref cursor; c cur; vt varchar2(100); v_str varchar2(1000); begin open c for select col2 from a order by col1; loop fetch c into vt; exit when c%notfound; v_str := v_str||vt||'||'; dbms_output.put_line('v_str='||v_str); end loop; return(substr(v_str,1,length(v_str)-2)); end ft; 2.创建触发器; create or replace trigger tr_a before insert on b for each row declare v_sql varchar2(1000); begin v_sql := 'update b set jcbh='||ft||'||to_char(sysdate,''YYYYMMDD'') where jcbh is null'; execute immediate v_sql; end tr_a; ****** 补充:a表中的从col1为cx,col2为colname
before insert on tmp_b
for each row
declare
v_no varchar2(10);
begin
v_no := to_char(sysdate, 'yyyymmdd') || (:new.a + :new.b + :new.c);
:new.d :=v_no;
insert into tmp_c (a) values (v_no);
end trg_test;
注意楼上“ :new.d :=v_no; ” 写法,插入SQL时d为编号字段。
从效率上考虑个人愚见将计算编号写成公共函数,插入SQL时调用函数即可。
colname cx
isbn 1
bc 3
yc 2B表的数据
jcbh barcode ISBN bc yc jcmc
null 9787302107682 7302107688 1 2 LINUX教程
null 9603312107643 7303117676 1 2 计算机基础要求在B表插入数据时生成编号,如B表的第一条记录的JCBH为73021076882120090830,第二条记录的JCBH为:73031176762120090830(编号分别对应isbn,yc,bc,date)
但是A表中的数据用户是可以设置的,这些字段都来至B表
create or replace function ft
return varchar2
is
type cur is ref cursor;
c cur;
vt varchar2(100);
v_str varchar2(1000);
begin
open c for select col2 from a order by col1;
loop
fetch c into vt;
exit when c%notfound;
v_str := v_str||vt||'||';
dbms_output.put_line('v_str='||v_str);
end loop;
return(substr(v_str,1,length(v_str)-2));
end ft; 2.创建触发器;
create or replace trigger tr_a
before insert on b
for each row
declare
v_sql varchar2(1000);
begin
v_sql := 'update b set jcbh='||ft||'||to_char(sysdate,''YYYYMMDD'') where jcbh is null';
execute immediate v_sql;
end tr_a;
******
补充:a表中的从col1为cx,col2为colname