国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

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

2024-08-29 13:32:53
字體:
來源:轉載
供稿:網友

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

------------------------

MERGE INTO [your table-name] [rename your table here]

    USING

        (

            [write your query here]

        )[rename your query-sql 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 study-results 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 A,STUDENT B

            WHERE

                A.CLASSNO=? AND A.GRADE=?

                AND A.TERMNAME=? AND A.COURSENAME=?

                A.STUNO=B.STUNO(+)

        )X

    ON

        (S.STUNO=X.STUNO)

    WHEN

        MATHED

    THEN

        UPDATE SET COURSESCORE=X.MYSCORE

    WHEN

        NOT MATHED

    THEN

        INSERT

            (

                STUNO,STUNAME,COURSENAME,COURSESCORE,

                CLASSNAME,STUGRADE,TERMNAME

            )

        VALUES

            (

                X.STUNO,X.STUNAME,X.COURSENAME,X.MYSCORE,

                X.CLASSNAME,X.STUGRADE,X.TERMNAME

            );

 


--------------------------------------------------------------------------------

 

注意到 MERGE 語句在最后的“;”(分號),這僅僅帶到 MERGE 為一條完整的 SQL 語句。

 

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

public yourMethod(statement,...){

    try{

        Connection conn=...;

        PreparedStatement ps=...;

        Resultset rs=...;

        conn.setAutoCommit(false);

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

            //add your code here !

            ......

            ps.addBatch();

        }

        ps.executeBatch();

        conn.commit();

    }catch(Exception e){

        try{

            conn.rollback();

        }catch(Exception el){}

    }

}

 


--------------------------------------------------------------------------------

 

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

 

Oracle 存儲過程定義格式如下:

 


--------------------------------------------------------------------------------

 

CREATE OR REPLACE PROCEDURE PRO_YOUR_PROCEDURE (

    ELEMENT_01     IN      ELEMENT_TYPE,  --COMMENTS

     .......       ....        .....            ....

    ELEMENT_0S     OUT     ELEMENT_TYPE,  --COMMENTS

      ....         ...         ...           ....

)

AS

    ARGUMENT_01    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(-20003,[YOUR EXCEPITON MESSAGE HERE !]);

 

END;

COMMIT;--IF YOUR WANT , JUST DO SO !

END PRO_YOUR_PROCEDURE;

 


--------------------------------------------------------------------------------
 

其中,[RAISE_APPLICATION_ERROR(-20003,[YOUR EXCEPITON MESSAGE HERE !]);]中的“-20003”是 Oracle 提供的用于用戶進行錯誤自定義的擴充代碼。其值可以隨便定義,但是也有范圍: -20000 到-20999的負整數。

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

 

核心代碼如下:


--------------------------------------------------------------------------------


OracleCallableStatement cal = null;

cal=(OracleCallableStatement)conn.getMetaData().getConnection().prepareCall("call PRO_......");

........

.............

.......

for(………………){

       …………

    cal.setDouble(i,ARGUMENTS);

    …………

  cal.executeUpdate();

}
http://blog.csdn.net/xymyeah/archive/2007/02/10/1507197.aspx


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东兰县| 胶州市| 黄大仙区| 体育| 抚松县| 奉化市| 贵定县| 建瓯市| 赤城县| 扎赉特旗| 偃师市| 达孜县| 松江区| 潼南县| 容城县| 通榆县| 金门县| 贵溪市| 泰来县| 阿坝| 肇庆市| 文化| 斗六市| 宁明县| 塔城市| 龙口市| 奉化市| 嘉祥县| 洛隆县| 南京市| 镇平县| 雷山县| 麻栗坡县| 乐平市| 蒙山县| 平原县| 和顺县| 罗山县| 尖扎县| 社会| 宣威市|