夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

              今天做郵件群發系統開發,遇到這樣一個問題:更改數據庫一條記錄并返回它的id.
              下面記錄我的思維過程:
          方法一:
              1.先select ...for update的方式找出這條記錄,同時將它鎖定;
              2.再根據id update 該條記錄;
              3.最后返回該條記錄的id;
              這種方法的存儲過程如下:

          CREATE OR REPLACE PROCEDURE backtrack_task_Id
              (in_status_will_sending 
          IN NUMBER,
               in_status_now_sending 
          IN NUMBER,
               in_fixed_sending 
          IN NUMBER,
               out_taskId OUT 
          NUMBER)
               
          AS
                   temp_task_id 
          NUMBER;
                   update_number 
          NUMBER;
               
          BEGIN 
                   
          IF in_fixed_sending = 1 THEN
                       
          SELECT id 
                         
          INTO temp_task_id 
                       
          FROM tasks 
                       
          WHERE status = in_status_will_sending 
                         
          AND SYSDATE >= send_date 
                         
          AND ROWNUM < 2 FOR UPDATE;
                    
          ELSE
                      
          SELECT id 
                        
          INTO temp_task_id 
                      
          FROM tasks 
                      
          WHERE status = in_status_will_sending 
                        
          AND ROWNUM < 2 FOR UPDATE;
                    
          END IF;
                    
          IF temp_task_id IS NOT NULL THEN
                        
          UPDATE tasks 
                          
          SET status = in_status_now_sending 
                        
          WHERE id = temp_task_id 
                          
          AND status = in_status_will_sending;
                        update_number :
          = SQL % ROWCOUNT;
                    
          END IF;
                    
          IF update_number = 1 THEN
                        out_taskId :
          = temp_task_id;
                    
          ELSE
                    out_taskId :
          = -1;
                    
          END IF;
                   EXCEPTION 
                        
          WHEN NO_DATA_FOUND THEN
                          out_taskId :
          = -1;
                  
          END backtrack_task_Id;

          方法二:
              update的同時返回該條記錄的信息(id)
              這種方法的存儲過程如下:

          CREATE OR REPLACE PROCEDURE backtrack_taskId
            (in_status_will_sending 
          IN NUMBER,
             in_status_now_sending 
          IN NUMBER,
             in_fixed_sending 
          IN NUMBER,
             out_taskId OUT 
          NUMBER)
              
          AS
                  temp_task_id 
          NUMBER;
              
          BEGIN
                  
          IF in_fixed_sending = 1 THEN
                      
          UPDATE tasks
                         
          SET status = in_status_now_sending
                       
          WHERE status = in_status_will_sending
                         
          AND SYSDATE >= send_date
                         
          AND ROWNUM < 2
                      RETURNING id 
          INTO temp_task_id;
                  
          ELSE
                      
          UPDATE tasks
                         
          SET status = in_status_now_sending
                       
          WHERE status = in_status_will_sending
                         
          AND ROWNUM < 2
                          RETURNING id INTO temp_task_id;
                  
          END IF;
                  out_taskId :
          = temp_task_id;
              
          END backtrack_taskId;

          希望對自己和與我有一樣需求的朋友,都有所幫助,在此作下符號.
           

          posted on 2007-12-18 19:54 HUIKK 閱讀(1444) 評論(1)  編輯  收藏 所屬分類: DataBase

          評論

          # re: 存儲過程 Update 返回改更后的 結果 2014-06-10 10:56 6
          @5你說的啥啊
            回復  更多評論
            

          主站蜘蛛池模板: 界首市| 景宁| 石城县| 五原县| 拉萨市| 池州市| 蒲城县| 柳林县| 玛多县| 闽侯县| 南安市| 石门县| 荔浦县| 八宿县| 万盛区| 新疆| 麦盖提县| 临汾市| 佛学| 台东县| 都匀市| 天全县| 湘阴县| 肥东县| 两当县| 仪陇县| 舞钢市| 环江| 寿宁县| 应用必备| 白河县| 额济纳旗| 区。| 葫芦岛市| 石河子市| 竹山县| 开阳县| 灵寿县| 扬中市| 邹平县| 永顺县|