向各位高手问个问题:
有三张表:
CREATE TABLE SMS_1
(
  BATCHSENDID    VARCHAR2(32 BYTE)              NOT NULL,
  TEMPLATE       CLOB,
  SENDTYPE       NUMBER(1)                      DEFAULT (0)                   NOT NULL,
  ORGID          VARCHAR2(32 BYTE)              NOT NULL,
  USERID         VARCHAR2(32 BYTE)              NOT NULL
)CREATE TABLE SMS_2
(
  SUBSCRIBEID    VARCHAR2(32 BYTE)              NOT NULL,
  BATCHSENDID    VARCHAR2(32 BYTE)              NOT NULL,
  SUMMARY        VARCHAR2(80 BYTE),
  CONTENT        CLOB                           NOT NULL,
  SENDPOINT      DATE,
)CREATE TABLE SMS_3
(
  SUBSCRIBEID     VARCHAR2(32 BYTE)             NOT NULL,
  MSGLOGDETAILID  VARCHAR2(32 BYTE)             NOT NULL,
  MOBILEPHONE     VARCHAR2(18 BYTE),
)CREATE TABLE SMSC_4
(
  MSGID        NUMBER(8)                        NOT NULL,
  MOBILEPHONE  VARCHAR2(13 BYTE),
  MSGCONTENT   VARCHAR2(1000 BYTE),
  SENDTIME     DATE                             NOT NULL,
  USERID       VARCHAR2(50 BYTE),
  ORGID        VARCHAR2(50 BYTE),
)SMS_3 是 SMS_2 的子表,SMS_2 又是 SMS_1 的子表,判断如果SMS_2表中的某条记录有子记录,且SENDPOINT为当前系统时间时,
就将SMS_2表中SENDPOINT字段值与它子表(SMS_3)里对应的MOBILEPHONE字段值,与它的主表(SMS_1)里对应的ORGID,USERID字段值插入
表SMSC_4里对应的SENDTIME,MOBILEPHONE,ORGID,USERID字段值里去;请高手指教,回复必给分;

解决方案 »

  1.   

    看你的需求应该是要在SMS_3加一个trigger,试一下下面的,好久没用了,也没有oracle环境没办法调试,create or replace trigger SMS_3_Trigger1 
    before insert on SMS_3 
    for each row 
    referencing new as new old as old
    declare
    pragma autonomous_transaction;
    begin
      insert into SMSC_4
      select S3.MSGLOGDETAILID,S3.MOBILEPHONE,S2.CONTENT,S2.SENDPOINT,S1.USERID,S1.ORGID
      from SMS_1 S1,SMS_2 S2,SMS_3 S3
      where 1=1
        and S1.BATCHSENDID = S2.BATCHSENDID
        and S2.SUBSCRIBEID = :New.SUBSCRIBEID
        and turnc(:New.SENDPOINT) = turnc(sysdate);
      commit;
    exception 
      when dup_val_on_index then
        dbms_output.put_line(sqlerror);
      when others then
        dbms_output.put_line(sqlerror);
    end; 
      

  2.   

    楼一的dba高手,按照你的方法我测试过了,是可以的..
    但是我要在SMS_3上插入记录时,判断它的父表(SMS_2)里的SENDPOINT是否为系统时间,
    我的意思是SENDPOINT一般不为系统时间,它是未来的时间,所以我要一直等到系统时间为SENDPOINT的时间
    时再触发事件,请问应怎么改..
    如:SENDPOINT为2009-2-28,而今天是2009-2-26,所以我是要到了2009-2-28这一天再触发事件;
      

  3.   

    这个用触发器没办法实现,你把上面的改成过程,用外部程序或者DB Job定时去执行吧.