熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle中的Merge函數(批量更新/刪除)

2022-06-13   來源: Oracle 

  所有的MIS系統都存在一個同樣的需求就是對於特定的數據在一次批量操作過程中如果數據已經存在則對存在的數據按照現有情況進行更新如果不存在則需要加入數據庫這時我們就可以考慮采用 Oracle 的 MERGE 函數其具體用法如下

  MERGE INTO [your tablename] [rename your table here]

  USING

  (

  [write your query here]

  )[rename your querysql and using just like a table]

  ON

  ([conditional expression here] AND [])

  WHEN

  MATHED

  THEN

  [here you can execute some update sql or something else ]

  WHEN

  NOT MATHED

  THEN

  [execute something else here ! ]

  下面我再進行詳細的說明

  上述代碼格式中的加粗字體表示為 Oracle 關鍵字[]以及其中的文字均是說明在實際使用中不應有 [ words ] 出現要注意()[圓括號]也是程序的組成部分

  為了能夠使問題與實際問題更加貼切不妨假設我們現在要給計算機系某個班的學生批量錄入學生成績但是錄入時如果學生的成績已經存在時老師只想對成績進行修改而如果成績不存在則直接添加到庫中我們就老師的這些需求來構造一個執行語句

  DEFINE TABLE :

  SCORE :  using for save the students score informations

  STUDENTS : the base information of students

  DEFINE COLUMNS :

  STUNO : the students ID in the University

  STUNAME : students name

  COURSENAME : course name

  COURSESCORE : the studyresults of the reference course

  CLASSNAME : where the students study in

  STUGRADE : the students grade

  TERMNAME : the term which the reference course studied

  NOW BEAGIN TO WRITE DOWN THE STATEMENT HERE BLOW THIS LINE !

  

  MERGE INTO SCORE S

  USING

  (

  SELECT A*B*? MYSCORE FROM SCORE ASTUDENT B

  WHERE

  ACLASSNO=? AND AGRADE=?

  AND ATERMNAME=? AND ACOURSENAME=?

  ASTUNO=BSTUNO(+)

  )X

  ON

  (SSTUNO=XSTUNO)

  WHEN

  MATHED

  THEN

  UPDATE SET COURSESCORE=XMYSCORE

  WHEN

  NOT MATHED

  THEN

  INSERT

  (

  STUNOSTUNAMECOURSENAMECOURSESCORE

  CLASSNAMESTUGRADETERMNAME

  )

  VALUES

  (

  XSTUNOXSTUNAMEXCOURSENAMEXMYSCORE

  XCLASSNAMEXSTUGRADEXTERMNAME

  );

  注意到 MERGE 語句在最後的(分號)這僅僅帶到 MERGE 為一條完整的 SQL 語句

  

  這時如果你需要在你的 Java 程序中使用上述方法執行相應操作則僅需要將其放入一個 for 循環中即可由於是批量更新數據因此如果你不想對中間出現異常的數據進行提交導致數據的不完整則可以考慮使用 Java 的事務回滾機制具體示例代碼如下

  public yourMethod(statement){

  try{

  Connection conn=;

  PreparedStatement ps=;

  Resultset rs=;

  connsetAutoCommit(false);

  for(int i=;i<;i++){

  //add your code here !

  

  psaddBatch();

  }

  psexecuteBatch();

  mit();

  }catch(Exception e){

  try{

  connrollback();

  }catch(Exception el){}

  }

  這時你會發現在代碼中直接使用 Merge 時代碼會變的非常復雜首先是 SQL 的拼接變得非常復雜接下來便是程序寫完後的查錯因此自然而然就會想到使用存儲過程接下來我們來看看如何使用存儲過程實現 Merge 調用過程

  

  Oracle 存儲過程定義格式如下

  CREATE OR REPLACE PROCEDURE PRO_YOUR_PROCEDURE (

  ELEMENT_     IN      ELEMENT_TYPE  COMMENTS

                            

  ELEMENT_S     OUT     ELEMENT_TYPE  COMMENTS

                              

  )

  AS

  ARGUMENT_    ARGUMENT_TYPE(ARGUMENT_RANGE);

  

  BEGIN

  MERGE INTO YOUR_TABLE_NAEM [RENAEM_YOUR_TABLE_HERE]

  AND YOUR CODE HERE !

  END;

  EXCEPTION

  WHEN

  OTHERS

  THEN

  RAISE_APPLICATION_ERROR([YOUR EXCEPITON MESSAGE HERE !]);

  

  END;

  COMMIT;IF YOUR WANT JUST DO SO !

  END PRO_YOUR_PROCEDURE;

  其中[RAISE_APPLICATION_ERROR([YOUR EXCEPITON MESSAGE HERE !]);]中的是 Oracle 提供的用於用戶進行錯誤自定義的擴充代碼其值可以隨便定義但是也有范圍 的負整數

  

  接下來就是如何來在 Java 程序中調用你的存儲過程Oracle為了方便開發人員調用其存儲過程開發了一個 [ OracleCallableStatement ]  位於 oraclejdbc 包內

  

  核心代碼如下

  OracleCallableStatement cal = null;

  cal=(OracleCallableStatement)conngetMetaData()getConnection()prepareCall(call PRO_);

  

  

  

  for(………………){

  …………

  calsetDouble(iARGUMENTS);

  …………

  calexecuteUpdate();

  }


From:http://tw.wingwit.com/Article/program/Oracle/201311/18149.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.