update long raw类型

[复制链接]
查看11 | 回复6 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
需求:将table1的数据insert到table2中,table1和table2表结构一样一样的,但是其中有个字段是long raw类型的。
因为是已经运行多年的生产库,所以表结构是没有办法改变的。
问题:这个long raw类型的字段insert不到table2中,会报错

实现的方式:先将table1中其他类型的字段insert到table2中

然后update table2中该long raw类型的字段

如果这个long raw类型的值是个文本文档,没问题,可以update到table2中

但是如果这个long raw类型的值是个word文档,对不起,报错:ora-06502

l/sql:numeric or value error
我就纳了闷了,同样都是二进制的,为什么差距这么大呢?
哪位兄弟姐妹给解释解释啊 ,有没有碰到过类似的问题啊?
[ 本帖最后由 hlleng1226 于 2009-9-4 10:43 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
怎么没有人呢?


回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
我update blob没有问题
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
raw的限制,您查查手册,估计是这方面的
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
查到了问题出在了哪里了。
long raw字段值的文件类型如果小于32k,就可以操作成功,如果大于32k 就失败了
可是我不明白的是,long raw类型不是可以存2g的数据吗,为什么32k就限制了呢?
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
恩 又弄明白了一个问题。
long raw作为表的字段类型,最大可以存储2G,但是如果是在pl/sql中作为变量类型,那么最大只能存储32K。
现在只能是走曲线救国方案了。
建一个blob字段的中间表,把该字段转换成blob类型存入中间表,然后再从中间表转换成long raw类型的存入到目标表中。
现在从原表到中间表的类型转换(long raw——blob)没有问题,使用函数 to_lob就可以转换
但是从中间表到目标表的类型转换(blob---long raw)就碰到点儿问题了,本来是想用dbms_lob.read这个包来进行处理,但是还有个问题不明白
就是读出来之后,怎么写进去呢?
下面是从中间表(blob)写入目标表(long raw)部分代码。
DECLARE
l_blob BLOB;
l_buffer VARCHAR2(32767);
l_amount BINARY_INTEGER := 2000;
l_pos NUMBER := 1;
l_blob_len INTEGER;
BEGIN
select name INTO l_blob from lhl_blob where id=1; --读blob类型的name
l_blob_len := DBMS_LOB.GETLENGTH(l_blob); --该blob类型值的长度
WHILE l_pos <= l_blob_len LOOP
DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer); --分段读出该值
l_pos := l_pos + l_amount;
END LOOP;
insert into lhl_long(name) values(l_buffer);
---写入目标表中,貌似有问题,这个values的值应该是多少?
END;
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
有始有终
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行