Oracle存取文件
### Oracle存取文件知识点 #### 一、Oracle Blob数据类型简介 在Oracle数据库中,Blob(Binary Large Object)是一种专门用于存储二进制大数据的对象类型,它可以有效地存储诸如图像、音频文件、视频文件以及任何其他类型的二进制数据。Blob类型在数据库设计中非常常见,特别是在需要处理大量非结构化数据的应用场景下。 #### 二、将文件转换为Byte[]并存储到Blob字段 在Java等编程语言中,通常会将文件转换为`Byte[]`数组以便于存储或传输。下面详细介绍如何将一个文件转换为`Byte[]`并存储到Oracle数据库中的Blob字段。 ##### 2.1 文件转换为Byte[] ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; public static byte[] fileToBytes(File file) throws IOException { FileInputStream fis = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fis.read(bytes); fis.close(); return bytes; } ``` ##### 2.2 连接到Oracle数据库并存储Blob ```java // 连接数据库 String connStr = "jdbc:oracle:thin:@hostname:port/servicename"; OracleConnection oraConn = new OracleConnection(connStr); oraConn.Open(); // 创建Oracle命令对象 OracleCommand cmd = oraConn.CreateCommand(); // 创建临时Blob cmd.CommandText = "DECLARE xx BLOB; BEGIN dbms_lob.createTemporary(xx, FALSE, DBMS_LOB.TEMPORARY_SESSION); :tempblob := xx; END;"; cmd.Parameters.Add(new OracleParameter("tempblob", OracleDbType.Blob)); cmd.Parameters[0].Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); // 获取Blob对象 OracleLob tempLob = (OracleLob) cmd.Parameters[0].Value; tempLob.BeginBatch(OracleLobOpenMode.ReadWrite); // 将Byte[]写入Blob byte[] bytes = fileToBytes(new File("path/to/your/file")); tempLob.Write(bytes, 0, bytes.length); tempLob.EndBatch(); // 更新数据库表 cmd.Parameters.Clear(); cmd.CommandText = "UPDATE pdf SET a = :p_attachment WHERE b = :p_count_no"; cmd.Parameters.Add(new OracleParameter("p_attachment", OracleDbType.Blob)).Value = tempLob; cmd.Parameters.Add(new OracleParameter("p_count_no", OracleDbType.NVarchar2)).Value = "your_count_no"; cmd.ExecuteNonQuery(); ``` #### 三、从Blob字段读取文件 从Blob字段读取文件的过程与存储文件的过程相反,主要步骤包括连接数据库、读取Blob中的数据并将其转换为`Byte[]`数组,最后将该数组转换为相应的文件格式。 ##### 3.1 从Blob字段读取Byte[] ```java // 读取Blob中的数据 OracleCommand readCmd = oraConn.CreateCommand(); readCmd.CommandText = "SELECT a FROM pdf WHERE b = :p_count_no"; readCmd.Parameters.Add(new OracleParameter("p_count_no", OracleDbType.NVarchar2)).Value = "your_count_no"; OracleDataReader reader = readCmd.ExecuteReader(); if (reader.Read()) { OracleLob lob = reader.GetOracleLob(0); byte[] data = new byte[(int) lob.Length]; lob.Read(data, 0, data.length); // 使用data数组 } reader.Close(); ``` ##### 3.2 将Byte[]转换为文件 ```java import java.io.FileOutputStream; import java.io.IOException; public static void writeBytesToFile(byte[] data, String filePath) throws IOException { FileOutputStream fos = new FileOutputStream(filePath); fos.write(data); fos.close(); } // 调用方法保存文件 writeBytesToFile(data, "path/to/output/file"); ``` #### 四、注意事项 1. **Blob字段**: 确保数据库表中的字段类型设置为Blob。 2. **权限问题**: 在操作Blob时,需要确保用户有足够的权限进行读写操作。 3. **性能考量**: 处理大文件时需考虑性能问题,如分批次读写等。 通过以上步骤,可以实现文件在Oracle数据库中的有效存取。这种方法广泛应用于需要存储非结构化数据的应用场景,尤其是在企业级应用开发中非常常见。
首先將文件轉化為Byte[],然後
Byte[] bytes=;//將文件轉化成二進制流
string conn="";//連接字符串
OracleConnection oraConn=new OracleConnection(conn);
if (oraConn.State != ConnectionState.Open)
{
oraConn.Open();
}
try
{
OracleCommand cmd = oraConn.CreateCommand();
cmd.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
cmd.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(bytes, 0, bytes.Length);
tempLob.EndBatch();
cmd.Parameters.Clear();
cmd.CommandText = "updatepdf";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("p_count_no", OracleType.NVarChar)).Value = strCountNo;
cmd.Parameters.Add(new OracleParameter("p_attachment", OracleType.Blob)).Value = tempLob;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
- MRLIYUANWEN2013-11-11对我帮助很大
- fuzhanli2013-11-23代码是有参考价值,不过这十几行代码要3分太不厚道
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助