首页  ·  知识 ·  数据库
oracle标准插入删除修改锁定
网友   http://blog.csdn.net/vshirleyzhxl/archive/2008/08/01/2753412.aspx    编辑:德仔   图片来源:网络
对于视图的插入删除修改而言,其实就是对视图中某张基表的DML操作,至于选择那张表,个人认为要看具体的业务逻辑 PAC

对于视图的插入删除修改而言,其实就是对视图中某张基表的DML操作,至于选择那张表,个人认为要看具体的业务逻辑


PACKAGE BODY LINES_PRIVATE IS
   PROCEDURE Insert_Row is
       CURSOR C IS
         SELECT ROWID
         FROM    DEM_ORDER_LINES
         WHERE   ORDER_ID =  INES.ORDER_ID AND
         ORDER_LINE_NUM=INES.ORDER_LINE_NUM;
--要存在一条记录,数据库就自动为这条记录分配一个rowid
对rowid进行操作比对其他cloumn要快
rowid不能插入的,是oracle自动生成的
-- 这个游标的作用是当数据插入后,取得该数据的rowid
                                                 如果数据没有插入成功,则返回警告,并且为下面的修改,删除等操作
                                                 提供rowid
BEGIN
     INSERT INTO DEM_ORDER_LINES
     (
   ORDER_ID            ,
   ORDER_LINE_NUM      ,
   LAST_UPDATE_DATE    ,
   LAST_UPDATED_BY     ,
   CREATION_DATE       ,
   CREATED_BY          ,
   LAST_UPDATE_LOGIN   ,
   PRODUCT_ID          ,
   GL_ACCOUNT_CC_ID    ,
   ORDERED_QUANTITY    ,
   ATTRIBUTE_CATEGORY ,
   ATTRIBUTE1          ,
   ATTRIBUTE2          ,
   ATTRIBUTE3          ,
   ATTRIBUTE4          ,
   ATTRIBUTE5          ,
   ATTRIBUTE6          ,
   ATTRIBUTE7          ,
   ATTRIBUTE8          ,
   ATTRIBUTE9          ,
   ATTRIBUTE10           
     ) 
     VALUES
     ( 
        INES.ORDER_ID            ,
         :LINES.ORDER_LINE_NUM      ,
   :LINES.LAST_UPDATE_DATE    ,
   :LINES.LAST_UPDATED_BY     ,
   :LINES.CREATION_DATE       ,
   :LINES.CREATED_BY          ,
   :LINES.LAST_UPDATE_LOGIN   ,
   :LINES.PRODUCT_ID          ,
   :LINES.GL_ACCOUNT_CC_ID    ,
   :LINES.ORDERED_QUANTITY    ,
   :LINES.ATTRIBUTE_CATEGORY ,
   :LINES.ATTRIBUTE1          ,
   :LINES.ATTRIBUTE2          ,
   :LINES.ATTRIBUTE3          ,
   :LINES.ATTRIBUTE4          ,
   :LINES.ATTRIBUTE5          ,
   :LINES.ATTRIBUTE6          ,
   :LINES.ATTRIBUTE7          ,
   :LINES.ATTRIBUTE8          ,
   :LINES.ATTRIBUTE9          ,
   :LINES.ATTRIBUTE10        
     ) ;

     OPEN C ;
     FETCH C INTO :LINES.ROW_ID ;

     IF (C%NOTFOUND) THEN
         CLOSE C ;
         RAISE NO_DATA_FOUND ;
     END IF ;

     CLOSE C ;

END Insert_Row ;

PROCEDURE Lock_Row IS

     Counter NUMBER ;
     CURSOR C IS
         SELECT
   ORDER_ID            ,
   ORDER_LINE_NUM      ,
   LAST_UPDATE_DATE    ,
   LAST_UPDATED_BY     ,
   CREATION_DATE       ,
   CREATED_BY          ,
   LAST_UPDATE_LOGIN   ,
   PRODUCT_ID          ,
   GL_ACCOUNT_CC_ID    ,
   ORDERED_QUANTITY    ,
   ATTRIBUTE_CATEGORY ,
   ATTRIBUTE1          ,
   ATTRIBUTE2          ,
   ATTRIBUTE3          ,
   ATTRIBUTE4          ,
   ATTRIBUTE5          ,
   ATTRIBUTE6          ,
   ATTRIBUTE7          ,
   ATTRIBUTE8          ,
   ATTRIBUTE9          ,
   ATTRIBUTE10  
         FROM    DEM_ORDER_LINES
         WHERE   ROWID = :LINES.ROW_ID
         FOR UPDATE OF ORDER_ID,ORDER_LINE_NUM NOWAIT ;
     Recinfo C%ROWTYPE ;

BEGIN
     Counter := 0 ;
     LOOP
     BEGIN
         Counter := Counter + 1 ;
         OPEN C ;
         FETCH C INTO Recinfo ;

     IF (C%NOTFOUND) THEN
         CLOSE C ;
         FND_MESSAGE.Set_Name('FND','FORM_RECORD_DELETED') ;
         FND_MESSAGE.Error ;
         RAISE FORM_TRIGGER_FAILURE ;
     END IF ;

     CLOSE C ;
   

   

     IF
     (
         ((Recinfo.ORDER_ID = :LINES.ORDER_ID) OR
         ((Recinfo.ORDER_ID IS NULL) AND
         (:LINES.ORDER_ID IS NULL))) AND
         ((Recinfo.ORDER_LINE_NUM = :LINES.ORDER_LINE_NUM) OR
         ((Recinfo.ORDER_LINE_NUM IS NULL) AND
         (:LINES.ORDER_LINE_NUM IS NULL))) AND
         ((Recinfo.LAST_UPDATE_DATE = :LINES.LAST_UPDATE_DATE) OR
         ((Recinfo.LAST_UPDATE_DATE IS NULL) AND
         (:LINES.LAST_UPDATE_DATE IS NULL))) AND
         ((Recinfo.LAST_UPDATED_BY = :LINES.LAST_UPDATED_BY) OR
         ((Recinfo.LAST_UPDATED_BY IS NULL) AND
         (:LINES.LAST_UPDATED_BY IS NULL))) AND
         ((Recinfo.CREATION_DATE = :LINES.CREATION_DATE) OR
         ((Recinfo.CREATION_DATE IS NULL) AND
         (:LINES.CREATION_DATE IS NULL))) AND
         ((Recinfo.CREATED_BY = :LINES.CREATED_BY) OR
         ((Recinfo.CREATED_BY IS NULL) AND
         (:LINES.CREATED_BY IS NULL))) AND
         ((Recinfo.LAST_UPDATE_LOGIN = :LINES.LAST_UPDATE_LOGIN) OR
         ((Recinfo.LAST_UPDATE_LOGIN IS NULL) AND
         (:LINES.LAST_UPDATE_LOGIN IS NULL))) AND
         ((Recinfo.PRODUCT_ID   = :LINES.PRODUCT_ID ) OR
         ((Recinfo.PRODUCT_ID   IS NULL) AND
         (:LINES.PRODUCT_ID   IS NULL))) AND
         ((Recinfo.GL_ACCOUNT_CC_ID = :LINES.GL_ACCOUNT_CC_ID) OR
         ((Recinfo.GL_ACCOUNT_CC_ID IS NULL) AND
         (:LINES.GL_ACCOUNT_CC_ID IS NULL))) AND
         ((Recinfo.ORDERED_QUANTITY = :LINES.ORDERED_QUANTITY) OR
         ((Recinfo.ORDERED_QUANTITY IS NULL) AND
         (:LINES.ORDERED_QUANTITY IS NULL))) AND       
         ((Recinfo.ATTRIBUTE_CATEGORY = :LINES.ATTRIBUTE_CATEGORY) OR
         ((Recinfo.ATTRIBUTE_CATEGORY IS NULL) AND
         (:LINES.ATTRIBUTE_CATEGORY IS NULL))) AND
         ((Recinfo.ATTRIBUTE1 = :LINES.ATTRIBUTE1) OR
         ((Recinfo.ATTRIBUTE1 IS NULL) AND
         (:LINES.ATTRIBUTE1 IS NULL))) AND
         ((Recinfo.ATTRIBUTE2 = :LINES.ATTRIBUTE2) OR
         ((Recinfo.ATTRIBUTE2 IS NULL) AND
         (:LINES.ATTRIBUTE2 IS NULL))) AND
         ((Recinfo.ATTRIBUTE3 = :LINES.ATTRIBUTE3) OR
         ((Recinfo.ATTRIBUTE3 IS NULL) AND
         (:LINES.ATTRIBUTE3 IS NULL))) AND
         ((Recinfo.ATTRIBUTE4 = :LINES.ATTRIBUTE4) OR
         ((Recinfo.ATTRIBUTE4 IS NULL) AND
         (:LINES.ATTRIBUTE4 IS NULL))) AND
         ((Recinfo.ATTRIBUTE5 = :LINES.ATTRIBUTE5) OR
         ((Recinfo.ATTRIBUTE5 IS NULL) AND
         (:LINES.ATTRIBUTE5 IS NULL))) AND
         ((Recinfo.ATTRIBUTE6 = :LINES.ATTRIBUTE6) OR
         ((Recinfo.ATTRIBUTE6 IS NULL) AND
         (:LINES.ATTRIBUTE6 IS NULL))) AND
         ((Recinfo.ATTRIBUTE7 = :LINES.ATTRIBUTE7) OR
         ((Recinfo.ATTRIBUTE7 IS NULL) AND
         (:LINES.ATTRIBUTE7 IS NULL))) AND
         ((Recinfo.ATTRIBUTE8 = :LINES.ATTRIBUTE8) OR
         ((Recinfo.ATTRIBUTE8 IS NULL) AND
         (:LINES.ATTRIBUTE8 IS NULL))) AND
         ((Recinfo.ATTRIBUTE9 = :LINES.ATTRIBUTE9) OR
         ((Recinfo.ATTRIBUTE9 IS NULL) AND
         (:LINES.ATTRIBUTE9 IS NULL))) AND
         ((Recinfo.ATTRIBUTE10 = :LINES.ATTRIBUTE10) OR
         ((Recinfo.ATTRIBUTE10 IS NULL) AND
         (:LINES.ATTRIBUTE10 IS NULL)))
     ) THEN
         RETURN ;
     ELSE
             
         FND_MESSAGE.Set_Name('FND','FORM_RECORD_CHANGED') ;
         FND_MESSAGE.Error ;
         RAISE FORM_TRIGGER_FAILURE ;
     END IF ;

         EXCEPTION
             WHEN APP_EXCEPTIONS.RECORD_LOCK_EXCEPTION THEN

                 IF (C%ISOPEN) THEN
                     CLOSE C ;
                 END IF ;

                 APP_EXCEPTION.Record_Lock_Error(Counter) ;
         END ;

     END LOOP ;

END Lock_Row ;

PROCEDURE Update_Row IS
BEGIN
     UPDATE DEM_ORDER_LINES SET
        ORDER_ID=:LINES.ORDER_ID            ,
        ORDER_LINE_NUM=:LINES.ORDER_LINE_NUM      ,
        LAST_UPDATE_DATE=:LINES.LAST_UPDATE_DATE    ,
        LAST_UPDATED_BY=:LINES.LAST_UPDATED_BY     ,
        CREATION_DATE=:LINES.CREATION_DATE       ,
        CREATED_BY=:LINES.CREATED_BY          ,
        LAST_UPDATE_LOGIN=:LINES.LAST_UPDATE_LOGIN   ,
        PRODUCT_ID=:LINES.PRODUCT_ID          ,
        GL_ACCOUNT_CC_ID=:LINES.GL_ACCOUNT_CC_ID    ,
        ORDERED_QUANTITY=:LINES.ORDERED_QUANTITY    ,
        ATTRIBUTE_CATEGORY=:LINES.ATTRIBUTE_CATEGORY ,
        ATTRIBUTE1=:LINES.ATTRIBUTE1          ,
        ATTRIBUTE2=:LINES.ATTRIBUTE2          ,
        ATTRIBUTE3=:LINES.ATTRIBUTE3          ,
        ATTRIBUTE4=:LINES.ATTRIBUTE4          ,
        ATTRIBUTE5=:LINES.ATTRIBUTE5          ,
        ATTRIBUTE6=:LINES.ATTRIBUTE6          ,
        ATTRIBUTE7=:LINES.ATTRIBUTE7          ,
        ATTRIBUTE8=:LINES.ATTRIBUTE8          ,
        ATTRIBUTE9=:LINES.ATTRIBUTE9          ,
        ATTRIBUTE10=:LINES.ATTRIBUTE10               
     WHERE ROWID = :LINES.ROW_ID ;

     IF (SQL%NOTFOUND) THEN
     RAISE NO_DATA_FOUND ;
     END IF ;

END Update_Row ;

PROCEDURE Delete_Row IS  
BEGIN                    
     DELETE DEM_ORDER_LINES
     WHERE   ORDER_ID = :LINES.ORDER_ID AND
     ORDER_LINE_NUM=:LINES.ORDER_LINE_NUM;
                         
     IF (SQL%NOTFOUND) THEN
         RAISE NO_DATA_FOUND ;
     END IF ;

END Delete_Row ;
END;

本文作者:网友 来源: http://blog.csdn.net/vshirleyzhxl/archive/2008/08/01/2753412.aspx
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读