Capture bulk fetch error

[复制链接]
查看11 | 回复9 | 2010-3-1 16:08:22 | 显示全部楼层 |阅读模式
小弟最近遇到一个问题,如下描述:
有两个表,一个是数据表 start_tbl(有几千行数据),一个是最终表final_tbl(可能有数据)。
现在想把start_tbl表中得数据插入到final_tbl表中。但是start_tbl和final_tbl结构有一定得差距,比如start_tbl中列得大小比final_tbl中得大。假设start_tbl表中有id和name两列。
我采用得方法是:
produre SW_IN_FINAL
is
type t_id is table of final_tbl.id&type index by binary_integer;
v_id t_id;
type t_name is table of final_tbl.id&type index by binary_integer;
v_name v_name;
type T_SEL_CURis ref cursor;
CUR_GET_RECORDST_SEL_CUR;
v_sql long;
begin
v_sql = 'select id, name from start_tbl';
open CUR_GET_RECORDS for v_sql;
fetch CUR_GET_RECORDS bulk collect into

v_id,

v_name
limit 100;
。。。。。。
(以下省略插入语句)
end SW_IN_FINAL;
问题是在fetch数据进v_id和v_name得时候可能产生错误,如何获取这种错误,并让程序继续进行而不因错误而终止。
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
http://asktom.oracle.com/pls/ask ... ON_ID:8784259916366
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
forall...save exceptions
只能与insert,update,delete结合使用吧
楼主是想在FETCH,也就是给RECORD赋值时实现类似功能.
表中字段很多,而且表定义有可能变更时,接收值的数组必须定义成final_tbl.id&type这样的类型,
所以等不到FORALL ..INSERT,赋值时就出错了, 这时候用不了批处理save exceptions的功能,我也很为此苦恼,
newkid有好办法吗?
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
我看错了,FETCH时没有办法save exceptions.
赋值可能出现什么错误?如果用%TYPE就不会出现类型不匹配了。给个错误例子。
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
比如说想把表A的数据查出来导给表B,就像楼主这种,AB字段基本一致,但A的不少字段比B定义得长很多.
这时候如果把接收表A中数据的数组ARR定义成B%ROWTYPE,
那么给ARR赋值时就出类型不匹配的错误了
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
如果你把变量全部按A的%TYPE来设计,那么FETCH就不会出错,FORALL INSERT才报错,那时候就可以SAVE EXCEPTIONS了。
如果设计的时候忘记考虑这个情况,那就在发现后及时修改,大不了一个事务被回滚。
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
其实从表A中把数据导到表B这种情况只是一种特例,
一般来说都是从BAT文件了什么中导数据.
既想生成逐条数据的错误日志,又想避免循环INSERT,
所以会想要采用先把数据读到数组中,再用FORALL一次性INSERT的方法.
但是问题就是把数据读到数组中时就出错了,想要利用SQL%BULK_EXCEPTIONS捕获错误的方法就行不通了.
我现在一般采用在读数据到数组时,自己控制捕获错误到一个索引表(ERR_LIST)中,
然后FORALLINSERT后,
再把之前类型不匹配产生的ERR_LIST与INSERT产生SQL%BULK_EXCEPTIONS的加起来生成错误日志.
这样顾全了效率,但是写起来很罗嗦.
有改进的方法吗?
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
“我现在一般采用在读数据到数组时,自己控制捕获错误到一个索引表(ERR_LIST)中,”你是怎么捕获的?FETCH出错你只能捕获第一个。
fetch ... bulk collect into 只能来自表,不能来自文件。我能想象到的错误就是类型不匹配,这是很容易解决的,定义的时候小心一点就可以了。
你如果想得到其他错误例子请举出来。
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
我是逐条FETCH的,用不了BULK
确实是只有类型不匹配的问题,但是读文件时不一定能读到什么数据,所以定义再小心也没用
更正:
>>>>>但是读文件时不一定能读到什么数据,所以定义再小心也没用
表定义不能跟着文件定义走,毕竟表是主
[ 本帖最后由 paupausea 于 2009-8-12 23:34 编辑 ]
回复

使用道具 举报

千问 | 2010-3-1 16:08:22 | 显示全部楼层
原帖由 paupausea 于 2009-8-12 23:29 发表
我是逐条FETCH的,用不了BULK
确实是只有类型不匹配的问题,但是读文件时不一定能读到什么数据,所以定义再小心也没用
更正:
>>>>>但是读文件时不一定能读到什么数据,所以定义再小心也没用
表定义不能跟着文件定义走,毕竟表是主

那你这个问题和楼主的就有本质区别了,楼主想要知道如何在BULK FETCH中精确捕捉错误,而你是逐行捕捉,没有任何问题。
你在#7的办法已经没什么可改进的了。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行