oceanbase数据库怎么看bclob类型的字段值

oceanbase数据库怎么看bclob类型的字段值,第1张

oceanbase数据库怎么看bclob类型字段值是一个数据库的编程问题,需要用SQL语句或者工具来实现。bclob类型的字段值是一种二进制大对象(binary large object),用于存储大量的二进制数据,如、视频等。bclob类型的字段值不能直接查看,需要使用一些特殊的方法或函数来转换或截取。

有以下几种常用的方法:

使用dbms_lobsubstr函数:这个函数可以截取bclob类型的字段值的一部分,并转换为raw类型,然后可以使用to_char或者utl_rawcast_to_varchar2等函数将raw类型转换为可读的字符串。例如:

-- 假设有一个表test,包含一个bclob类型的字段data

select dbms_lobsubstr(data, 1000) from test; -- 截取data字段前1000个字节,并转换为raw类型

select utl_rawcast_to_varchar2(dbms_lobsubstr(data, 1000)) from test; -- 将raw类型转换为可读的字符串

使用to_char函数:这个函数可以将bclob类型的字段值转换为可读的字符串,但是有一个限制,就是转换后的字符串长度不能超过4000个字符。如果超过了4000个字符,会报错。例如:

-- 假设有一个表test,包含一个bclob类型的字段data

select to_char(data) from test; -- 将data字段转换为可读的字符串

额。。。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 =tmpPrimaryKeyssplit("}") )

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 arrayPrimaryKeysCOUNT()<>arrayPrimaryKeyValuesCOUNT() THEN --判断键与键值是否能匹配起来

res:='KEY-VALUE NOT MATCH';

RETURN;

END IF;

i := 0;

sqlCon := '';

WHILE i < arrayPrimaryKeysCOUNT() 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_lobcreatetemporary(clobvar, TRUE);

dbms_lobOPEN(clobvar, dbms_loblob_readwrite);

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

IF offset_i <= 1 THEN

total_length:=dbms_lobgetlength(clobvar);

END IF;

IF read_length_i <=0 THEN

tmpReadLength := 4000;

ELSE

tmpReadLength := read_length_i;

END IF;

dbms_lobREAD(clobvar,tmpReadLength,offset_i,res); --读取数据

IF dbms_lobISOPEN(clobvar)=1 THEN

dbms_lobCLOSE(clobvar);

END IF;

END;

EXCEPTION

WHEN OTHERS THEN

res:='';

total_length:=0;

END;

1:首先:写个连接数据库的类,里面有返回mysq, oracle连接的方法

public Connection getConn(String flag){

Connection con=null;

try

{

if(flagequals("1"))

{

ClassforName(“oraclejdbcdriverOracleDriver”);

con = DriverManagergetConnection(“jdbc:oracle:thin:@IP:1521:数据库名字”,"name","password");

}

if(flagequals("2"))

{

ClassforName("orggjtmmmysqlDriver");

con = DriverManagergetConnection("jdbc:mysql://localhost/数据库名user=用户名&password=密码&useUnicode=true&characterEncoding=GBK");

}

}

catch(Exception e)

{

eprintStackTrace();

}

return con;

}

2:执行插入 *** 作

public void setData() {

conn = new Conn();

try {

String sqlfrom = "select pid,pcontent from table p order by pid ";

String sqlinsert = "insert into table values(,)";

con = conngetConn("2");

stmt = concreateStatement(); //从mysql取出大字段

rs = stmtexecuteQuery(sqlfrom);

con = conngetConn("1");

PreparedStatement pstmt = conprepareStatement(sqlinsert); //向oracle中插入大字段

int i = 0;

while (rsnext()) {

pstmtsetInt(1, rsgetInt(1));

pstmtsetClob(2, oraclesqlCLOBempty_lob());

pstmtexecuteUpdate(); //插入时将大字段设为空

thisupdateOne(con,rsgetInt(1),rsgetString(2)); // 这里调用然后更新这个大字段

}

rsclose(); //关闭相关连接

pstmtclose();

stmtclose();

conclose();

} catch (Exception e) {

eprintStackTrace();

try

{

conrollback();

} catch (Exception e1) {

Systemoutprintln("回滚出现异常!");

e1printStackTrace();

}

}

}

3:该方法实现对应大字段记录的更新

public void updateOne(Connection con,int id, String content) {

String str = "select tcontent from table t where tid=" + id+ " for update";

try {

// 注意:存取 *** 作开始前,必须用setAutoCommit(false)取消自动提交,否则Oracle将抛出“读取违反顺序”的错误。

consetAutoCommit(false);

stmt = concreateStatement();

ResultSet rs_clob = stmtexecuteQuery(str);

while ( rs_clob next()) {

/ 取出clob数据/

oraclesqlCLOB clob = (oraclesqlCLOB) rs_clob getClob(1);

/ 向clob中写入数据/

clobputString(1, content);

}

stmtclose();

concommit();

consetAutoCommit(true);

conclose();

} catch (Exception e) {

eprintStackTrace();

try

{

conrollback();

} catch (Exception e1) {

Systemoutprintln("回滚出现异常!");

e1printStackTrace();

}

}

}

现在就完成了一行记录的更新。

4:读clob字段以String 的形式返回(当然也可以将读到的内容写入文件,大家改一下就可以了)

/

读clob字段

@param con

@param id

@return

/

public String readClob(Connection con,int id)

{

String content="";

try

{

consetAutoCommit(false);

stmt=concreateStatement();

ResultSet rs_clob=stmtexecuteQuery("select tcontent from table t where tid="+id);

oraclesqlCLOB contents=null;

while (rs_clobnext())

{ // 取出CLOB对象

contents= (oraclesqlCLOB) rs_clobgetClob(1);

}

BufferedReader a = new BufferedReader(contentsgetCharacterStream()); //以字符流的方式读入BufferedReader

String str = "";

while ((str = areadLine()) != null) {

content = contentconcat(str); //最后以String的形式得到

}

concommit();

/

BufferedWriter out = new BufferedWriter(new FileWriter("e:/testtxt"));

outwrite(content); //写入文件

outclose(); /

consetAutoCommit(true);

conclose();

}catch(Exception e)

{

Systemoutprintln("出现异常");

eprintStackTrace();

try

{

conrollback();

}

catch (Exception e1)

{

Systemoutprintln("回滚出现异常!");

e1printStackTrace();

}

}

return content;

}

empty_LOB::=

Description of the illustration empty_lobgif

Purpose

EMPTY_BLOB and EMPTY_CLOB return an empty LOB locator that can be used to initialize a LOB variable or, in an INSERT or UPDATE statement, to initialize a LOB column or attribute to EMPTY EMPTY means that the LOB is initialized, but not populated with data

上面的文章来自ORACLE官方文档 : lob对象在使用前需要用empty_blob/empty_clob来初始化 就比如 往杂物箱里面放一个新东西 你得先腾出一个空间再来放东西进去

不一定是别个藏着吧,估计是太基础了,不想说而已 或者 他们也不知道具体为什么要先这样后那样,只知道用法是那样…哈哈哈哈… 如果你用的是oracle的话 建议你看下 oracle 官方文档里面的sql language reference 和 sql developer guide

>

例:假设给oracle数据库导入blob类型的,放在目录G:\images下。1先创建一个目录directory,命名为IMAGES;CREATE OR REPLACE DIRE,TORYIMAGES AS 'G:\test';或者直接在PlSql Directories目录下新建目录;2创建一个存储过程,批量导入blobcreate or replace procedure img_insert asbeginDECLAREf_lob bfile;--文件类型b_lobblob;--用来存储的名称filenamevarchar2(400);begin--循环的初始值for i in 1 100 loop--找出每一列的文件名,因为文件名和名称是一样的select tflnm into filename from ZS_GC_SNIMDT t where tid =i;--查找到之后,执行update *** 作,插入空的blob (注意IMAGES一定要大写)update ZS_GC_SNIMDT set brfl = empty_blob()whereid = i return brfl into b_lob;--获取指定目录下的文件f_lob := bfilename('IMAGES', filename);-- 以只读的方式打开文件dbms_lobfileopen(f_lob, dbms_lobfile_readonly);--传递对象dbms_lobloadfromfile(b_lob, f_lob,dbms_lobgetlength(f_lob));--关闭原始文件

常规方式:

1、写入

[java] view plain copy

//value 为长文本,将写入到CLOB字段中

else if (dataType == TypesCLOB){

if (StringUtilsisNotBlank(value)) {

pstsetCharacterStream(1, new InputStreamReader(<span style="white-space:pre"> </span>//以流的方式写入

new ByteArrayInputStream(valuegetBytes())), valuelength());

} else {

pstsetNull(1, javasqlTypesCLOB);

}

}

2、读取:

[java] view plain copy

//省略基础部分

ps = connprepareStatement(sql);

pssetString(1, templateId);

rs = psexecuteQuery();

if (rsnext()) {

Clob clob = rsgetClob(1);

if (clob != null) {

String config = clobgetSubString(1, (int) cloblength()); //config为读取到的clob信息

}

//

本次的简易方式(以纯脚本的方式写入):

[sql] view plain copy

insert tablename(varcharcolumn,clobcolumn)

values('string part',to_clob('clob chars part1 ')||to_clob('clob chars part2'));

小结:

纯脚本的方式即显式的通过TO_CLOB将字符转为clob类型,每个转换的参数不能超过2000个字符,多个部分通过连接符 || 连接,测试通过,数据已入库,感谢牛人指点。

以上就是关于oceanbase数据库怎么看bclob类型的字段值全部的内容,包括:oceanbase数据库怎么看bclob类型的字段值、oracle 10G数据库如何插入clob字段的值的简单语句sql语句、oracle如何 *** 作clob数据类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存