oceanbase数据库怎么看bclob类型的字段值是一个数据库的编程问题,需要用SQL语句或者工具来实现。bclob类型的字段值是一种二进制大对象(binary large object),用于存储大量的二进制数据,如、视频等。bclob类型的字段值不能直接查看,需要使用一些特殊的方法或函数来转换或截取。
有以下几种常用的方法:
使用dbms_lobsubstr函数:这个函数可以截取bclob类型的字段值的一部分,并转换为raw类型,然后可以使用to_char或者utl_rawcast_to_varchar2等函数将raw类型转换为可读的字符串。例如:
-- 假设有一个表test,包含一个bclob类型的字段dataselect 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类型的字段dataselect 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数据类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)