本帖最后由 wangzairong 于 2009-08-29 15:44:01 编辑

解决方案 »

  1.   

    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;
      

  2.   

    同意楼上做法,且非常巧妙;
    注意楼上“ :new.d :=v_no; ” 写法,插入SQL时d为编号字段。
    从效率上考虑个人愚见将计算编号写成公共函数,插入SQL时调用函数即可。
      

  3.   

    a,b,c是从表A的三条记录的第一个字段的值,这样会出错
      

  4.   

    也就是说A,B,C三个可能会不同,也可能有四条记录(这些是用户自己设定的规则,如A代表教材ISBN,B代表教材版次,C代表教材印次,还可能有其它的选项如条形码)
      

  5.   

    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表
      

  6.   

    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