zoukankan      html  css  js  c++  java
  • 不使用存储过程获取Oracle自增序列(sequence)

    本文是以.Net的编码方式演示如何不使用存储过程获取Oracle的序列值,方便开发者在插入数据库记录时间获取当前ID等关键字段。

    声明

    • 为了简化使用了OracleHeper类;
    • CALENDAR是日程表,只有一个CALENDAR_ID字段;
    • SEQ_CALENDAR_ID为序列(sequence);

    方法一,先获取序列,然后把序列当做值插入数据库 

    1. 优点:代码简单直观,易懂;
    2. 缺点:需要两次交互,性能不佳;  
    3. 注意事项:记得关闭Reader;
    public int AddCalendar_First() {
        int calendarId = 0;
        try {
            string sql = "SELECT SEQ_CALENDAR_ID.NEXTVAL FROM DUAL";
            IDataReader idr = OracleHelper.ExecuteReader(CommandType.Text, sql);
            if (idr.Read()) {
                calendarId = int.Parse(idr[0].ToString());
            }
            idr.Close();
    
            sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(:PARME_CALENDAR_ID)";
            OracleParameter[] parmes = { new OracleParameter("PARME_CALENDAR_ID", OracleDbType.Int32) };
            OracleHelper.ExecuteNonQuery(CommandType.Text, sql, parmes);
        } catch (Exception ex) {
            //记录日志
        }
        return calendarId;
    }


    方法二 先插入数据,再获取序列值

    1. 优点:适用于后期不易改造程序的妥协;
    2. 缺点:需要两次交互,性能不佳;
    3. 注意事项:虽然声称序列是使用的回话隔离,但如果多个应用并发访问一个库,将长生混乱;
    public int AddCalendar_Second() {
        int calendarId = 0;
        try {
            string sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(SEQ_CALENDAR_ID.NEXTVAL)";
            OracleHelper.ExecuteNonQuery(CommandType.Text, sql, null);
    
            IDataReader idr = OracleHelper.ExecuteReader(CommandType.Text, "SELECT SEQ_CALENDAR_ID.CURRVAL FROM DUAL");
            if (idr.Read()) {
                calendarId = int.Parse(idr[0].ToString());
            }
            idr.Close();
        } catch (Exception ex) {
            //记录日志
        }
        return calendarId;
    }


    方法三 使用returning into语法

    1. 优点:性能最好;
    2. 缺点:目前没发现;
    3. 注意事项:记得设置Direction类型;
    public int AddCalendar_Third() {
        int calendarId = 0;
        try {
            string sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(SEQ_CALENDAR_ID.NEXTVAL) RETURNING CALENDAR_ID INTO :ID";
    
            OracleParameter[] parmes = {
                new OracleParameter("ID",OracleDbType.Int32)
            };
            parmes[0].Direction = ParameterDirection.ReturnValue;
            OracleHelper.ExecuteNonQuery(CommandType.Text, sql, parmes);
            calendarId = int.Parse(parmes[0].Value.ToString());
        } catch (Exception ex) {
            //记录日志
        }
        return calendarId;
    }

    三种方法中方法三最佳,可考虑使用。


    出处:http://www.zhaiqianfeng.com    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    spark代码的提交
    单位局域网内的vmware的网络配置
    hive安装配置
    sparkshell中执行wordcount
    解决 在IDEA中使用Maven和Scala新建项目没有自动产生src 以及spark的编译运行配置
    IIS环境下MHT文件预览时弹出下载框的问题解决
    MySql解压版使用
    Oracle 11g OEM登录后提示“出现内部错误”
    如何杀掉(kill)Oracle中的会话(Session)
    IIS发布后出现“如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”错误
  • 原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4617812.html
Copyright © 2011-2022 走看看