Create Or Replace Trigger Trg_t
  Before Insert Or Update Or Delete 
On t
  For Each Row
DECLARE
X_VCH_ERROR_MSG VARCHAR2(255);
ROWNUMCOUNT     NUMBER(10);
STR_NAMETYPENEW NUMBER(10) := 1;
CODE            VARCHAR2(20);
CODE2           VARCHAR2(20);
BEGIN
SELECT COUNT(*) INTO ROWNUMCOUNT FROM T;
IF ROWNUMCOUNT >= 10 THEN
UP_T(STR_NAMETYPENEW);
TEST(STR_NAMETYPENEW, CODE, CODE2);
ELSE
DEL_T(STR_NAMETYPENEW);
TEST(STR_NAMETYPENEW, CODE, CODE2);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
X_VCH_ERROR_MSG := SUBSTR(SQLERRM(SQLCODE), 1, 100);
DBMS_OUTPUT.PUT_LINE(X_VCH_ERROR_MSG);

END TRG_T;
/
说明:
UP_T(STR_NAMETYPENEW); /*一个update 语句*/
TEST(STR_NAMETYPENEW, CODE, CODE2);/*一个insert 语句(包含游标)*/问题: 
为什么 这个触发器执行 总是 倒序执行啊?
就是:先执行 insert 后执行的update 为什么会是这样呢?

解决方案 »

  1.   

    Create Or Replace Trigger TEST.Trg_t
      Before Update Or Insert  Or Delete
    On community_subject_base
      For Each Row
    Declare
      x_Vch_Error_Msg Varchar2(255);
      Str_Type_Id     Number(10);
      Str_Name        Varchar2(255);
      Str_Flag        Number(20) := 1;
      Str_Appcode     Varchar2(20);
      Str_Errmsg      Varchar2(50);
      Cursor Cur_Comm Is
        Select Log.Com_Id, Log.Com_Name
          From Community_Subject_Base Log
         Order By Log.Com_Id Asc;Begin    Update t Set t.Charcontent = '不好使了!';  Begin
        --Insert Into t (id,charcontent,dd) Values (234234,'asdfasfasf',Sysdate);
        If Cur_Comm%Isopen Then
          Close Cur_Comm;
        End If;
      
        If Str_Flag = '1' Then
        
          Open Cur_Comm;
          Loop
            Fetch Cur_Comm
              Into Str_Type_Id, Str_Name;
            Exit When Cur_Comm%Notfound;
            Begin
              Insert Into t
                (Id, Charcontent, Dd)
              Values
                (Str_Type_Id, Str_Name, Sysdate);
            Exception
              When Others Then
                Str_Appcode := Sysdate || Sqlcode;
                Str_Errmsg  := '插入数据错误' || Sqlerrm;
                Rollback;
                Return;
            End;
            Close Cur_Comm;
          End Loop;
          Commit;    
        End If;
      Exception
        When Others Then
          x_Vch_Error_Msg := Substr(Sqlerrm(Sqlcode), 1, 100);
          Dbms_Output.Put_Line(x_Vch_Error_Msg);
      End;
    End;我转贴了一个 简单的描述,如上:就是 这个触发器总是先执行了insert 后把insert数据全部update了,不知道为什么是这么个流程?