net如何取出CLOB类型字段的数据

net如何取出CLOB类型字段的数据,第1张

最近在做项目中用到Clob这个字段,Clob是存储无限长字符的Oracle字段,用的时候网上找资料找了好久,内容不是很多,大部分都不能用,当然也有可以用的,测试了不同版本,整理了一下,给大家在做项目的时候以参考。

表 *** 作

第一种方案很简单,是数据库表中的某个字段是Clob类型,需要对这个表进行增加修改,网上有很多版本,我试了一种最简单的:

new OracleParameter(":Test", OracleType.Clob,System.Text.Encoding.Unicode.GetByteCount(model.Test)),

就是在创建参数的时候指定一个长度,为什么这样写,不是很清楚,我试过超过4000字符存储和修改是没什么问题的。下面给参数赋值直接赋值就行了,就那么简单!

参数 *** 作

第一种是对表中Clob的 *** 作,还有一种情况是,在Oracle中定义的存储过程和函数,参数的类型是Clob类型,如果用第一种方式的话就会报错,字符超过最大,我想是虽然参数类型是Clob但是传过去的是字符,Oracle默认应该是把传过来的值当做字符看待了,第一种不行,就找了另一种实现方法,我们看下:

public static OracleLob GetOracleClob(string strValue)

{            using (OracleConnection connection = new OracleConnection(connectionString))

{                try

{

connection.Open()                   string str = strValue                   byte[] array = Encoding.Unicode.GetBytes(str)                   if (array.Length % 2 != 0)

{

array = Encoding.Unicode.GetBytes(str + ' ')

}

OracleCommand lobCmd = connection.CreateCommand()                   // 为访问表定义一个游标 clobvar

string cmdSql = "DECLARE clobvar CLOB"

cmdSql += " begin "

cmdSql += " dbms_lob.createtemporary(clobvar, false, 0):tempLob:= clobvar"

cmdSql += " end"

lobCmd.CommandText = cmdSql

lobCmd.Parameters.Add(new OracleParameter("tempLob", OracleType.Clob)).Direction = ParameterDirection.Output

lobCmd.ExecuteNonQuery()                   // 利用事务处理(必须)

OracleTransaction tx = connection.BeginTransaction()

lobCmd.Transaction = tx                   // 定义一个临时变量

OracleLob tempLob = (OracleLob)lobCmd.Parameters["tempLob"].Value

tempLob.BeginBatch(OracleLobOpenMode.ReadWrite)

tempLob.Write(array, 0, array.Length)

tempLob.EndBatch()                   // 提交事务                    tx.Commit()                   return tempLob

}                catch (Exception e)

{                    throw e

}

}

}

调用:

parameters[0].Value = DbHelperOra.GetOracleClob(TestString)

大家看代码可能明白一些,这里我说下自己的理解,先定义一个Byte,然后拼一个输出Clob类型的字符串,在Oracle执行后输出,然后把Byte写入输出的Clob变量,然后提交事务,我觉得得到的这个Clob类型才是真正的Clob类型,是和Oracle那边是一致的。这边有一个重要的是字符的编码,注意下要和Oracle那边要一致!

额。。。clob也就是只不过是个大对象类型,没什么特别的,你就认为是超大容量的varchar类型就行了(最多能存4G):

update 表名 set 为clob的字段名 = 'clob类型没什么特别的' where 所过滤的条件

insert into 表名(为clob的字段名) values('带有clob字段的表不能导出sql文件')

在做数据库开发的时候,有时候会遇到需要读取Oracle数据库中的clob类型的数据的情况。本着代码复用的目的,写了下面的存储过程:读取数据库中clob字段的数据。

CREATE OR REPLACE PROCEDURE prc_read_clob(

table_name IN VARCHAR2,

clob_column_name IN VARCHAR2,

primary_Key_Column_names IN VARCHAR2,

primary_key_values IN VARCHAR2,

offset_i IN NUMBER,

read_length_i IN NUMBER,

RES OUT VARCHAR2,

total_length OUT NUMBER

) AS

/**

Autor:Hanks_gao.

Create Date:2008/12/10

Description:This procedure is to read clob value by conditions

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

-----------------Parameters descritption----------------------

table_name : The table that contains clob/blob columns(表名)

clob_column_name : Clob/blob column name of table_name(类型为clob的字段名)

primary_key_column_names : The columns seperated by '}' that can fix only one row data (that is primary key) (主键名,以'}'分隔的字符串)

primary_key_values : The primary keyes values that seperated by '}'(主键键值,以'}'分隔的字符串)

offset_i : The offset of reading clob data(要读取的位移量)

read_length_i : The length of reading clob data per times(要读取的长度)

res : Return value that can be referenced by application(读取的结果)

total_length : The total length of readed clob data(数据库查询到的clob数据的总长度)

-----------------End Parameters descritption------------------

*/

tmpPrimaryKeys VARCHAR2(2000) --To save primary_Key_Column_names temporarily(暂存主键,主键是以'}'分隔的字符串)

tmpPrimaryKeyValues VARCHAR2(2000) --To save primary_key_values temporarily(暂存主键键值,以'}'分隔的字符串)

i NUMBER --循环控制变量

tmpReadLength NUMBER--暂存要读取的长度

sqlStr VARCHAR2(6000) --Query string(查询字符串)

sqlCon VARCHAR2(5000) --Query condition(查询条件)

TYPE tmparray IS TABLE OF VARCHAR2(5000) INDEX BY BINARY_INTEGER

arrayPrimaryKeys tmparray --To save the analyse result of primary_Key_Column_names (暂存分析后得到的主键名)

arrayPrimaryKeyValues tmparray --To save the analyse result of primary_key_values(暂存分析后得到的主键键值)

BEGIN

total_length := 0

RES := ''

DECLARE

clobvar CLOB := EMPTY_CLOB

BEGIN

tmpPrimaryKeys:=primary_Key_Column_names

tmpPrimaryKeyValues:=primary_key_values

i:=0

WHILE INSTR(tmpPrimaryKeys,'}')>0 LOOP --Analyse the column names of primary key(将主键分开,相当于arrayPrimaryKeys =tmpPrimaryKeys.split("}") )

arrayPrimaryKeys(i):=subSTR(tmpPrimaryKeys,1,(INSTR(tmpPrimaryKeys,'}')-1))

tmpPrimaryKeys:=subSTR(tmpPrimaryKeys,(INSTR(tmpPrimaryKeys,'}')+1))

i:=i+1

END LOOP

i:=0

WHILE INSTR(tmpPrimaryKeyValues,'}')>0 LOOP --Analyse the values of primary key

arrayPrimaryKeyValues(i):=subSTR(tmpPrimaryKeyValues,1,(INSTR(tmpPrimaryKeyValues,'}')-1))

tmpPrimaryKeyValues:=subSTR(tmpPrimaryKeyValues,(INSTR(tmpPrimaryKeyValues,'}')+1))

i:=i+1

END LOOP

IF arrayPrimaryKeys.COUNT()<>arrayPrimaryKeyValues.COUNT() THEN --判断键与键值是否能匹配起来

res:='KEY-VALUE NOT MATCH'

RETURN

END IF

i := 0

sqlCon := ''

WHILE i <arrayPrimaryKeys.COUNT() LOOP

sqlCon := sqlCon || ' AND ' || arrayPrimaryKeys(i) || '='''

|| replace(arrayPrimaryKeyValues(i),'''','''''') || ''''

i := i + 1

END LOOP

sqlStr := 'SELECT ' || clob_column_name || ' FROM ' || table_name

|| ' WHERE 1=1 ' || sqlCon || ' AND ROWNUM = 1' --组查询字符串

dbms_lob.createtemporary(clobvar, TRUE)

dbms_lob.OPEN(clobvar, dbms_lob.lob_readwrite)

EXECUTE IMMEDIATE TRIM(sqlStr) INTO clobvar --执行查询

IF offset_i <= 1 THEN

total_length:=dbms_lob.getlength(clobvar)

END IF

IF read_length_i <=0 THEN

tmpReadLength := 4000

ELSE

tmpReadLength := read_length_i

END IF

dbms_lob.READ(clobvar,tmpReadLength,offset_i,res) --读取数据

IF dbms_lob.ISOPEN(clobvar)=1 THEN

dbms_lob.CLOSE(clobvar)

END IF

END

EXCEPTION

WHEN OTHERS THEN

res:=''

total_length:=0

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6847872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-29
下一篇 2023-03-29

发表评论

登录后才能评论

评论列表(0条)

保存