现在的位置: 首页 > 综合 > 正文

用Java实现将本机表数据转到Oracle表中

2013年10月11日 ⁄ 综合 ⁄ 共 11231字 ⁄ 字号 评论关闭

一、Oracle部分

1、在Oracle新建自定义类型,对应要传入oracle的字段,类型不一定一致,因为时间类型不好处理,为了处理方便将date/number类型均对应为varchar2类型

CREATE OR REPLACE TYPE alarm_content_type AS OBJECT
  (
  con_addr varchar2 (10) ,
  acq_no varchar2 (5) ,
  mea_no varchar2 (5) ,
   alarm_day varchar2 (20) ,  
  alarm_value varchar2 (5) ,
  data_type varchar2 (5) ,
  alarm_data varchar2 (15)
  )
其中acq_no对应为number,alarm_day对应为date类型

2、在Oracle新建对应的自定义类型数组

CREATE OR REPLACE TYPE alarm_content_array AS TABLE OF alarm_content_type

3、在Oracle建立package及 package bodies

CREATE OR REPLACE PACKAGE alarm_content_pck AS
  PROCEDURE insert_object(d alarm_content_array, tbname varchar2);
END alarm_content_pck;

 

CREATE OR REPLACE PACKAGE BODY alarm_content_pck AS
  PROCEDURE insert_object (d alarm_content_array, tbname varchar2) AS
  SqlText varchar2 (500);
  BEGIN
    FOR i IN d.FIRST..d.LAST
    LOOP
      SqlText := 'INSERT INTO ' || tbname 
      || ' VALUES(''' || d(i).con_addr
      || ''', ' || d(i).acq_no || ', ' || d(i).mea_no
      || ', decode(' || d(i).alarm_day || ', null , null, to_date(''' ||d(i).alarm_day || ''', ''yyyy-mm-dd''' || '))'
      || ', ''' || d(i).alarm_value  || ''', ''' || d(i).data_type  
      || ''', ' || d(i).alarm_data   
      || ')';  
      EXECUTE IMMEDIATE SqlText;  
    END LOOP;      
   END insert_object;
END alarm_content_pck;

其中参数d 为传入的数据, tbname 为插入Oracle的表名
二、Java部分

1、Oracle的链接、关闭等

  1. package com.techen.database;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement; 
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import oracle.jdbc.OracleCallableStatement;
  10. import oracle.sql.ARRAY;
  11. import oracle.sql.ArrayDescriptor;
  12. import oracle.sql.STRUCT;
  13. import oracle.sql.StructDescriptor;
  14. import com.techen.database.DataDb;
  15. import com.techen.database.ProcedureParam;
  16. /**
  17.  * Oracle接口类
  18.  *
  19.  */
  20. public class OracleDb
  21. {
  22.     public static Connection connection = null// 连接到数据库的对象
  23.     private static Statement state = null// Statement对象
  24.     private static String URL = null;
  25.     private static String userName;
  26.     private static String passWord;
  27.     
  28.     /**
  29.      * 建立到内存数据库的连接
  30.      * 
  31.      * @return 成功与否
  32.      */
  33.     public OracleDb(String aURL, String aUserName, String aPassWord)
  34.     {
  35.         URL = aURL;
  36.         userName = aUserName;
  37.         passWord = aPassWord;
  38.     }
  39.     
  40.     /**
  41.      * 建立与Oracle数据库的连接
  42.      * 
  43.      * @return 成功与否
  44.      */
  45.     public boolean createConnection()
  46.     {
  47.         boolean bFlag = false;
  48.         if (connection != null)
  49.             closeConnection();
  50.         if (connection == null)
  51.         {
  52.             try
  53.             {
  54.                 // 加载Oracle数据库JDBC驱动
  55.                 Class.forName("oracle.jdbc.driver.OracleDriver");               
  56.                 connection = DriverManager.getConnection(
  57.                         URL, userName, passWord);
  58.                 state = connection.createStatement();
  59.                 bFlag = true;
  60.             } catch (SQLException e)
  61.             {
  62.                 e.printStackTrace();
  63.             } catch (ClassNotFoundException e)
  64.             {
  65.                 e.printStackTrace();
  66.             }
  67.         }
  68.         return bFlag;
  69.     }
  70.     
  71.     /**
  72.      * 释放到Oracle数据库的连接
  73.      */
  74.     public void closeConnection()
  75.     {
  76.         if (connection != null)
  77.             try
  78.             {
  79.                 connection.close();
  80.                 if (state != null)
  81.                 {
  82.                     try
  83.                     {
  84.                         state.close();
  85.                     } catch (SQLException e)
  86.                     {
  87.                         e.printStackTrace();
  88.                     }
  89.                     state = null;
  90.                 }
  91.             } catch (SQLException e)
  92.             {
  93.                 e.printStackTrace();
  94.             }
  95.         connection = null;
  96.     }
  97.     
  98.     
  99.     /**
  100.      * 查询
  101.      * @param sql 查询sql语句
  102.      * @return 数据集
  103.      */
  104.     public ResultSet executeQuery(String sql)
  105.     {
  106.         ResultSet rs = null;
  107.         try
  108.         {
  109.             rs = state.executeQuery(sql);
  110.         } catch (SQLException e)
  111.         {
  112.             e.printStackTrace();
  113.         }
  114.         return rs;
  115.     }
  116.     
  117.     /**
  118.      * 除查询外的其他Sql语句操作
  119.      * 
  120.      * @param sql 查询sql语句
  121.      * @return 成功与否
  122.      */
  123.     public boolean executeUpdate(String sql)
  124.     {
  125.         boolean bFlag = false;
  126.         try
  127.         {
  128.             state.executeUpdate(sql);
  129.             bFlag = true;
  130.         } catch (SQLException e)
  131.         {
  132.             e.printStackTrace();
  133.         }
  134.         return bFlag;
  135.     }

2、调用Oracle建立的package处理

 

    1.     /**
    2.      * 将内存数据库各表数据转到Oracle
    3.      * 
    4.      * @return 成功与否
    5.      */
    6.     @SuppressWarnings({ "unchecked""unchecked" })
    7.     public boolean hsqlToOracle()
    8.     {
    9.         boolean bFlag = false;
    10.         if (connection != null)
    11.         {
    12.             try
    13.             {
    14.                 List lTb = new ArrayList();
    15.                 //获取内存中所有的主站数据表
    16.                 lTb = DataDb.getTable();
    17.                 if ((lTb != null) && (lTb.size() > 0))
    18.                 {
    19.                     //循环对各表操作
    20.                     for (int iTbCount = 0; iTbCount < lTb.size(); iTbCount++)   
    21.                     {
    22.                         //当前表名
    23.                         String curTb = (String)lTb.get(iTbCount);           
    24.                         //调用存储过程
    25.                         if (callProcedure(curTb, 1))
    26.                         {
    27.                             //如果添加成功则删除HSQLDB中对应的表数据
    28.                             String sqlText = "delete from " + curTb;
    29.                             DataDb.createConnection();
    30.                             DataDb.executeUpdate(sqlText);
    31.                             //DataDb.closeConnection();
    32.                         }
    33.                     }
    34.                     bFlag = true;
    35.                 }
    36.                 
    37.             } catch (Exception e)
    38.             {
    39.                 e.printStackTrace();
    40.             }
    41.         }
    42.         return bFlag;
    43.     }   

        /**

  1.      * 调用Oracle存储过程
  2.      * @param tbName 表名
  3.      * @param kind 类型: 1 取内存表数据;2 取XML数据
  4.      * @return 成功与否
  5.      */ 
  6.     @SuppressWarnings("unchecked")
  7.     public boolean callProcedure(String tbName, int kind)
  8.     {
  9.         boolean bFlag = false;
  10.         //获取当前表的记录集
  11.         List theTbDatas = null;
  12.         if (kind == 1)
  13.         {
  14.             theTbDatas = DataDb.GetRecsFromHsql(tbName);
  15.         }
  16.         else
  17.         {
  18.             theTbDatas = XmlFile.GetRecsFromXml(tbName);
  19.         }
  20.         if (theTbDatas.size() > 0)
  21.         {
  22.             StructDescriptor st;
  23.             //根据表名获取存储过程参数
  24.             ProcedureParam thePro = new ProcedureParam(tbName);
  25.             try
  26.             {
  27.                 st = new StructDescriptor(
  28.                         thePro.data_type, connection);
  29.                 STRUCT[] dataArray = new STRUCT[theTbDatas.size()];
  30.                 //将表中记录转换为Oracle中自定义类型
  31.                 for (int i = 0; i < theTbDatas.size(); i++)
  32.                 {
  33.                     STRUCT s = new STRUCT(st, connection,
  34.                             (Object[]) theTbDatas.get(i));
  35.                     dataArray[i] = s;
  36.                 }   
  37.                 //转换为数组形式
  38.                 ArrayDescriptor arrayData = ArrayDescriptor
  39.                         .createDescriptor(thePro.type_array, connection);
  40.                 ARRAY dataArrayObject = new ARRAY(arrayData,
  41.                         connection, dataArray);
  42.                 //调用Oracle包中存储过程
  43.                 OracleCallableStatement callStatement = null;
  44.                 callStatement = (OracleCallableStatement) connection
  45.                         .prepareCall(thePro.call_Statement);
  46.                 //参数1:数据
  47.                 ((OracleCallableStatement) callStatement).setArray(
  48.                         1, dataArrayObject);
  49.                 //参数2:表名
  50.                 ((OracleCallableStatement) callStatement)
  51.                         .setString(2, tbName);
  52.                 callStatement.executeUpdate();
  53.                 connection.commit();
  54.                 callStatement.close();  
  55.                 bFlag = true;
  56.             } catch (SQLException e)
  57.             {
  58.                 // TODO Auto-generated catch block
  59.                 e.printStackTrace();
  60.             }
  61.         }
  62.         return bFlag;
  63.     }       
  64.     

  1. /**
  2.  * Oracle存储过程各类型表所对应的参数
  3.  * 
  4.  * @author GavinPan
  5.  * 
  6.  */
  7. public class ProcedureParam
  8. {
  9.     public String data_type; // 数据类型
  10.     public String type_array; // 相应类型的数组
  11.     public String call_Statement; // 调用包内过程的字符串
  12.     /**
  13.      * 构造函数 根据表名初始化各成员
  14.      * 
  15.      * @param tableName 表名
  16.      */
  17.     public ProcedureParam(String tableName)
  18.     {
  19.         int iTb = OracleDb.getTableType(tableName);
  20.         switch (iTb)
  21.         {
  22.         case 1:
  23.         {
  24.             data_type = "MSTDATA_TYPE";
  25.             type_array = "MSTDATA_ARRAY";
  26.             call_Statement = "{call mst_pck.INSERT_OBJECT(?,?)}";
  27.             break;
  28.         }
  29.         case 2:
  30.         {
  31.             data_type = "MAXNEED_TYPE";
  32.             type_array = "MAXNEED_ARRAY";
  33.             call_Statement = "{call maxneed_pck.INSERT_OBJECT(?,?)}";
  34.             break;
  35.         }
  36.         case 3:
  37.         {
  38.             data_type = "ENERGY_TYPE";
  39.             type_array = "ENERGY_ARRAY";
  40.             call_Statement = "{call energy_pck.INSERT_OBJECT(?,?)}";
  41.             break;
  42.         }
  43.         case 4:
  44.         {
  45.             data_type = "VOLTAGE_ELIGIBILITY_TYPE";
  46.             type_array = "VOLTAGE_ELIGIBILITY_ARRAY";
  47.             call_Statement = "{call voltage_eligibility_pck.INSERT_OBJECT(?,?)}";
  48.             break;
  49.         }
  50.         case 5:
  51.         {
  52.             data_type = "ALARM_DATA_TYPE";
  53.             type_array = "ALARM_DATA_ARRAY";
  54.             call_Statement = "{call alarm_data_pck.INSERT_OBJECT(?,?)}";
  55.             break;
  56.         }
  57.         case 6:
  58.         {
  59.             data_type = "ALARM_CONTENT_TYPE";
  60.             type_array = "ALARM_CONTENT_ARRAY";
  61.             call_Statement = "{call alarm_content_pck.INSERT_OBJECT(?,?)}";
  62.             break;
  63.         }   
  64.         }
  65.     }
  66. }
  1.     /**
  2.      * 将内存中的相应表的电表数据记录读出
  3.      * @param tableName 表名 
  4.      * @return 记录的List列表
  5.      */
  6.     @SuppressWarnings("unchecked")
  7.     public static List GetRecsFromHsql(String tableName)
  8.     {
  9.         List rtndata = new ArrayList();
  10.         try
  11.         {
  12.             // 加载HSQLDB数据库JDBC驱动
  13.             Class.forName("org.hsqldb.jdbcDriver");
  14.             // 在内存中建立临时数据库score,用户名为sa,密码为空
  15.             @SuppressWarnings("unused")
  16.             Connection connect = DriverManager.getConnection(
  17.                     "jdbc:hsqldb:mem:MstDataDb""sa""");
  18.             Statement state = connect.createStatement();
  19.             String ssqltext = "select * from " + tableName;         
  20.             ResultSet rs = state.executeQuery(ssqltext);            
  21.             while (rs.next())
  22.             {               
  23.                 ResultSetMetaData rsmd = rs.getMetaData(); // 获取字段名
  24.                 Object[] tmpl = new Object[rsmd.getColumnCount()];  
  25.                 for (int i = 1; i <= rsmd.getColumnCount(); i++)
  26.                 {   
  27.                     tmpl[i-1] = rs.getString(i); //获取数据赋值
  28.                     if (tmpl[i-1] == null)
  29.                         tmpl[i-1] = "null";
  30.                 }
  31.                 rtndata.add(tmpl);
  32.             }
  33.         } catch (SQLException e1)
  34.         {
  35.             e1.printStackTrace();
  36.         } catch (Exception e2)
  37.         {
  38.             e2.printStackTrace();
  39.         }
  40.         return rtndata;
  41.     }       
  42.     

3、测试

  1.                 OracleDb TechenDb = new OracleDb(
  2.                         "jdbc:oracle:thin:@192.168.1.200:1521:techen",
  3.                         "techen""techen");
  4.                 if (TechenDb.createConnection())
  5.                 {       
  6.                     if (TechenDb.hsqlToOracle())
  7.                         MessageDialog.openInformation(null"title""OK!");
  8.                 }

 

抱歉!评论已关闭.