网友俱乐部 » » Oracle教程 » Oracle中的Merge函数(批量更新/删除)

2008-4-2 08:45 lonjew
Oracle中的Merge函数(批量更新/删除)

Oracle中的Merge函数(批量更新/删除)
  所有的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 语句。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.