关于ORACLE里由string转成CLOB存入数据库里的问题

本文介绍了一个使用Oracle数据库存储XML文档的过程。此过程首先将XML内容转换为二进制格式,然后利用Oracle的LOB特性创建临时存储区并写入数据,最后调用存储过程将XML数据保存到数据库中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static XmlDocumentEntity CreateXmlDocumentEntity(int DptID, int FlowType, string XmlContent)       

 {            

 #region 要做ORACLE的   

         if (SysConfig.DataBaseType == "Oracle")     

       {                 byte[] tempBuff = System.Text.Encoding.Unicode.GetBytes(XmlContent);            

    OracleParameter TmpContent = new OracleParameter("tempblob", OracleType.Clob);              

  TmpContent.Direction = ParameterDirection.Output;      

          string tmpSql = "DECLARE A clob;BEGIN  DBMS_LOB.CREATETEMPORARY(A, FALSE); " + ":tempblob := A; " + "END;";                // string tmpSql = "declare xx clob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";   

             IDataParameter[] parameters11 ={                         TmpContent,                    };              

  OracleConnection conn = new OracleConnection(SystemConfig.ConnectionString);        

        OracleCommand comm = new OracleCommand(tmpSql, conn);                conn.Open();              

  OracleTransaction tx;          

      tx = conn.BeginTransaction();         

       comm.Transaction = tx;           

     comm.Parameters.Add(TmpContent);       

         comm.ExecuteNonQuery();         

       OracleLob tempLob = (OracleLob)TmpContent.Value;  

              tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);                tempLob.Write(tempBuff, 0, tempBuff.Length);          

      tempLob.EndBatch();         

       tx.Rollback();          

      conn.Close();            

    OracleParameter Content = new OracleParameter("XmlContent", OracleType.Clob);             

   Content.Value = tempLob;       

         IDataParameter[] parameters = new IDataParameter[]                        {                            Factory.CreateParameter("@DptID",DptID),                            Factory.CreateParameter("@FlowType",FlowType),                           Content                        };             

   IDbHelper DBHelper = Factory.CreateDBAccess();    

            DBHelper.ExecuteNonQuery(SystemConfig.ConnectionString, CommandType.StoredProcedure, "PFlow_SetXmlContent", parameters);                XmlDocumentEntity Entity = new XmlDocumentEntity(DptID, FlowType, XmlContent);                return Entity;            }

}

### 使用Java将文本文件作为附件存储Oracle数据库 为了实现这一目标,可以采用BLOB (Binary Large Object) 或 CLOB (Character Large Object) 数据类型来保存大对象数据。对于纯文本文件而言,CLOB 是更合适的选择。 #### 创建表结构 首先,在Oracle数据库中创建一张用于存储文件的表格: ```sql CREATE TABLE DocumentStore ( id NUMBER GENERATED BY DEFAULT AS IDENTITY, filename VARCHAR2(255), content CLOB, PRIMARY KEY(id) ); ``` 此SQL语句定义了一个名为`DocumentStore`的新表,其中包含三个字段:唯一标识符 `id`, 文件名 `filename` 和实际的内容 `content`[^1]。 #### 编写Java程序读取并上传文件至数据库 下面是一个简单的例子展示怎样通过JDBC连接向上述建立好的表插入一条记录: ```java import java.io.*; import java.sql.*; public class StoreFileToDB { public static void main(String[] args){ String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "scott"; String password = "tiger"; try(Connection conn = DriverManager.getConnection(url,user,password)){ PreparedStatement pstmt = null; File inputFile = new File("example.txt"); FileReader fr = new FileReader(inputFile); StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(fr); String line; while ((line=br.readLine())!=null){ sb.append(line).append("\n"); } String sqlInsert="INSERT INTO DocumentStore(filename,content) VALUES (?,?)"; pstmt = conn.prepareStatement(sqlInsert); pstmt.setString(1,inputFile.getName()); pstmt.setCharacterStream(2,new StringReader(sb.toString())); int rowAffected=pstmt.executeUpdate(); System.out.println(rowAffected+" record inserted."); } catch(SQLException | IOException e){ e.printStackTrace(); } } } ``` 这段代码实现了如下功能: - 建立与指定URL地址下的Oracle实例之间的JDBC链接; - 打开本地磁盘上的文本文件,并将其全部内容加载入内存中的字符串缓冲区; - 准备好待执行的SQL命令,设置参数值为当前处理的文件名称以及其内容流形式的数据; - 尝试提交更改给服务器端完成最终持久化操作;如果成功则打印出受影响行数的信息消息[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值