首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>oracle>正文

Oracle中的Merge函数

http://www.oklinux.cn  2006-08-11  来源: oklinux收集整理  Rstuosd      会员收藏  游客收藏  【 】 
  所有的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 的事务回滚机制。具体示例代码如下:


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

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();
}


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


  从中可以看出,OracleCallableStatement对象事实上承担了PreparedStatement对象的使命,当然如果需要的话,能够支持事务回滚是个不错的主意,关于这个问题,可以参考上面直接使用 Merge 函数的 Java 代码。

上一篇:详细介绍 Oracle 9i 的各个技术特征   下一篇:oracle监听不能启动的问题


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·oracle监听不能启动的问题
·详细介绍 Oracle 9i 的各个技术特征
·ORACLE FOR LINUX 安装指南
·用Oracle的解析函数发现序列间隙
·在Oracle 9i isqlplus中使用替换变量
·ORACLE UNDO表空间释放过度占用的空间
·oracle中的sql语句
·WebLogic与ORACLE数据库的连接配置
·Oracle中Decode()函数使用技巧
·Oracle:如何对CLOB行字段执行全文检索
·Oracle初学者入门指南-什么是DUL
·裸设备和Oracle问答20例
·您知道SQLServer2005的10个高级特性吗
·Oracle PL/SQL语言基础
·从黑客角度检验Oracle数据库的安全性
·SQL Server 专家访谈:过去现在与未来
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·教你快速掌握一个简单的Oracle定时任务
·详细讲解"Oracle"服务器的常用命令行
·深入讲解"alert log"过大时的处理方法
·解决启动数据库时发生的ORA-12528错误
·用存储过程实现删除数据表的部分记录
·改变优化参数来适应库缓冲区中SQL的变
·在Oracle中重新编译所有无效的存储过程
·讲解用于描述数据库中需要存储的实体语
·基于已被证实的Oracle高可用性技术MAA
·实例讲解如何查找某个对象的定义情况
·讲解Oracle中JOB与存储过程的接合用法
·深入讲解"database link"的设置和使用
  阅读排行
·如何修改遗失的MySQL的ROOT用户密码
·详解远程SHELL下安装配置RedHat ES 5的
·教你如何将MySQL数据库的密码恢复
·教你在MySQL从口令恢复设置的密码
·在 Oracle Enterprise Linux 上升级到
·oracle9i installation on fedora core
·Oracle Instant client介绍
·Oracle高级复制(同步复制)配置步骤详细
·用Oracle归档日志进行恢复的方法
·Linux下的Oracle数据库编程详解
·Linux下Oracle9i RMAN备份及恢复步骤介
·带你轻松接触一些比较常用的sql*plus命
·Oracle的快照复制
·Oracle 数据库存储结构简介
·Oracle HA 在Unix上双机环境的安装指南
网摘收藏: