我有三张表:
表一:
CREATE TABLE SMSC_MSGUPINTER
(
  MSGID         NUMBER                          DEFAULT 8                     NOT NULL,
  MSGCONTENT    VARCHAR2(1000 BYTE)             NOT NULL,
  MOBILEPHONE   VARCHAR2(13 BYTE),
  RECEIVEDTIME  DATE,
  DESTNUMBER    VARCHAR2(30 BYTE)               DEFAULT (0),
  EXNUMBER      VARCHAR2(10 BYTE)
)表二:
CREATE TABLE SMS_MSGQUERYTYPE
(
  QUERYTYPEID  VARCHAR2(32 BYTE)                NOT NULL,
  QUERYNAME    VARCHAR2(30 BYTE)                NOT NULL,
  QUERYCODE    VARCHAR2(10 BYTE)                NOT NULL,
  DESCRIPTION  VARCHAR2(300 BYTE),
  ISEXECSQL    NUMBER(1)                        DEFAULT (0)                   NOT NULL,
  QUERYSQL     CLOB,
  STATE        NUMBER(1)                        DEFAULT (1),
  ORGID        VARCHAR2(32 BYTE)                NOT NULL
)表三:
CREATE TABLE SMSC_MSGDOWNINTER
(
  MSGID        NUMBER(8)                        NOT NULL,
  MOBILEPHONE  VARCHAR2(13 BYTE),
  MSGCONTENT   VARCHAR2(1000 BYTE),
  FLAG         NUMBER(2)                        DEFAULT 0,
  SENDTIME     DATE                             NOT NULL,
  USERID       VARCHAR2(50 BYTE),
  ORGID        VARCHAR2(50 BYTE),
  APPCODE      VARCHAR2(20 BYTE)                NOT NULL,
  EXNUMBER     VARCHAR2(10 BYTE)
)现在要求:
当向表一中插入一条记录时,判断这条记录中的'EXNUMBER'字段值是否与表二中的QUERYCODE的字段值相等, 
如果相等,就将表二中相等字段值的那条记录中的部分数据插入到表三中去;
如:将表二的'QUERYCODE','DESCRIPTION'和表一中的'MOBILEPHONE'的值分别插入表三中的'APPCODE','MSGCONTENT','MOBILEPHONE'里去;
我触发器不是很熟,特向高手请教;

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER TEST 
    BEFORE UPDATE OR DELETE OR INSERT 
    ON SMSC_MSGUPINTER  
    FOR EACH ROW 
    IF INSERTING THEN 
    BEGIN 
    IF EXISTS(SELECT 1 FROM SMS_MSGQUERYTYPE  WHERE QUERYCODE=:NEW.EXNUMBER) 
    BEGIN 
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
    SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER; 
    COMMIT; 
    END; 
    END IF; 
    END IF; 
      

  2.   

    但不过执行时有错;
    CREATE OR REPLACE TRIGGER TEST 
    BEFORE UPDATE OR DELETE OR INSERT 
    ON SMSC_MSGUPINTER  
    FOR EACH ROW 
    IF INSERTING THEN 
    BEGIN 
    IF EXISTS(SELECT 1 FROM SMS_MSGQUERYTYPE  WHERE QUERYCODE=:NEW.EXNUMBER) 
    BEGIN 
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE) 
    SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER; 
    COMMIT; 
    END; 
    END IF; 
    END IF; 
    我在IF INSERTING THEN上面加一句BEGIN就执行不报错了,
    但触发时会报错,请问什么回事..
      

  3.   

    报的是这个错;
    ORA-04098: 触发器 'JSTMIIUSER.SMSC_MSGUPINTER_INSERT' 无效且未通过重新验证
    不明白哎..
    又不好调试..
      

  4.   

    只要插入触发器就行了吧?
    CREATE OR REPLACE TRIGGER TEST 
    BEFORE INSERT 
    ON SMSC_MSGUPINTER  
    FOR EACH ROW 
    declare 
    cnt number;
    BEGIN 
    select count(*) into cnt from SMS_MSGQUERYTYPE
    WHERE QUERYCODE=:NEW.EXNUMBER;
    if cnt>0 then
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE) 
    SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE 
    FROM SMS_MSGQUERYTYPE 
    WHERE QUERYCODE=:NEW.EXNUMBER; 
    COMMIT; 
    end if; 
    END;
    /
      

  5.   

    恩。insert部分我复制LS的,少了点东西。
    把:
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE) 
    SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE 
    FROM SMS_MSGQUERYTYPE 
    WHERE QUERYCODE=:NEW.EXNUMBER; 
    COMMIT; 
    end if;
    改为:
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE) 
    SELECT QUERYCODE,DESCRIPTION,:NEW.MOBILEPHONE 
    FROM SMS_MSGQUERYTYPE 
    WHERE QUERYCODE=:NEW.EXNUMBER;  
    end if;
    这样其实还是会报错,因为你的第三个表建表时MSGID字段和其他几个字段都要求not null,但是你又在触发器中要求:
    “就将表二中相等字段值的那条记录中的部分数据插入到表三中去; 
    如:将表二的'QUERYCODE','DESCRIPTION'和表一中的'MOBILEPHONE'的值分别插入表三中的'APPCODE','MSGCONTENT','MOBILEPHONE'里去; ”
    你没说MSGID等几个字段在触发器触发新插入时如何处理。
    这几个字段该插入什么值?又不能为空。
      

  6.   

    CREATE OR REPLACE TRIGGER TEST 
    BEFORE INSERT 
    ON SMSC_MSGUPINTER  
    FOR EACH ROW 
    declare 
    cnt number;
    BEGIN 
    select count(*) into cnt from SMS_MSGQUERYTYPE
    WHERE QUERYCODE=:NEW.EXNUMBER;
    if cnt>0 then
    INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE) 
    SELECT QUERYCODE,DESCRIPTION,:NEW.MOBILEPHONE 
    FROM SMS_MSGQUERYTYPE 
    WHERE QUERYCODE=:NEW.EXNUMBER; 
    end if; 
    END;数五,它报错是end if; 这地方错,是不是语法错?
    错误为:
    Error: PLS-00103: 出现符号 "IF"在需要下列之一时:
            ; <an identifier>
              <a double-quoted delimited-identifier>
    Line: 15
    Text: END IF;