下面通过一个简单的存储过程代码段说明了该问题:
CREATE OR REPLACE PROCEDURE load_error IS
V_td1 test1.td1%TYPE;
v_td1xh test1.td1xh%TYPE;
v_gxsj timestamp ; -- 时间戳变量
v_zhxgsj timestamp ;
V_COUNT NUMBER ; --用于临时存放查询结果数量,如果数量大于2时,以便循环取出处理
V_STR VARCHAR(100) ; --用于存放临时变量
v_errorCode load_ajxx_error.errorcode%TYPE ;
v_errorText load_ajxx_error.errortext%TYPE ;
v_errorline load_ajxx_error.errorline%TYPE ;
-- 定义游标类型(用做动态游标)
TYPE CURSOR_TYPE IS REF CURSOR;
CURSOR_DYNAMIC CURSOR_TYPE;
CURSOR test2_CURSOR IS
SELECT td2xh,td21,td22,td23,td24 FROM test2 ;
BEGIN
-- 循环变更游标
FOR test2_RECORD IN test2_CURSOR LOOP
BEGIN
v_td1xh := test2_RECORD.td2xh ;
V_td1 := test2_RECORD.td21 ; -- 此处可能报缓冲区不足的错误
--dbms_output.put_line(v_zhxgsj || ',' || v_gxsj) ;
-- 截获抛出的异常
EXCEPTION
WHEN OTHERS THEN
v_errorcode := SQLCODE ; -- 异常代码
v_errorText := Sqlerrm ; -- 异常代码描述
v_errorline := dbms_utility.format_error_backtrace() ; -- 异常所在行(只在oracle 10g才能使用)
INSERT INTO load_ajxx_error(xh,errorline, errorcode, errortext, tbsj) VALUES(v_td1xh,v_errorline,v_errorcode,v_errorText,SYSDATE) ;
END ;
COMMIT;
END LOOP ;
END load_error;
1. 时间戳更改简介:
使用存储过程引导数据时,通常使用时间字段(时间戳)来确定是否需要更新. 但是,如果在Oracle中将存储过程中的变量定义为DATE,则Oracle将自动将数据表中的时间字段转换为日期类型,并截取时间信息. 但是,我们要导入的数据可能一天要更新多次,并且实时性要求较高,因此必须精确到秒. 此时,使用Oracle的timestamp变量. 此变量产生的值是: 14年3月15日至12月31日,该日期足够准确,可供我们使用.
2. 人工骨异常处理简介:
使用存储过程引导数据时,异常处理是必不可少的oracle 过程 异常处理,因为我们需要知道在哪个操作中发生了错误,从而导致数据无法正确插入. 如果只有一个数据有问题,那么我们必须继续处理其他数据而不会出现问题. 在处理完所有数据之后,我们需要转到日志表以检查哪些数据错误以及哪些数据错误. ,然后通过分析解决问题数据.
具体如下:
通常,我们使用游标处理一组数据,因此我们将代码块添加到游标的循环主体中,以处理整个游标周期中可能出现的问题:
BEGIN
-- 循环变更游标
FOR test2_RECORD IN test2_CURSOR LOOP
BEGIN
v_td1xh := test2_RECORD.td2xh ;
V_td1 := test2_RECORD.td21 ; -- 此处可能报缓冲区不足的错误
--dbms_output.put_line(v_zhxgsj || ',' || v_gxsj) ;
-- 截获抛出的异常
EXCEPTION
WHEN OTHERS THEN
v_errorcode := SQLCODE ; -- 异常代码
v_errorText := Sqlerrm ; -- 异常代码描述
v_errorline := dbms_utility.format_error_backtrace() ; -- 异常所在行(只在oracle 10g才能使用)
INSERT INTO load_ajxx_error(xh,errorline, errorcode, errortext, tbsj) VALUES(v_td1xh,v_errorline,v_errorcode,v_errorText,SYSDATE) ;
END ;
COMMIT;
END LOOP ;
END ;
开始...异常...结束;在FOR循环中至关重要.
SQLCODE: oracle中的关键字,表示错误代码.
SQLERRM: oracle中的关键字,表示错误描述. 有时可能很长,您可以使用substr对其进行拦截. 通常oracle 过程 异常处理,只需要排名前200名就足够了. 我们只需要知道一些简单的信息即可.
dbms_utility.format_error_backtrace(): 仅在Oracle 10g中引入的功能,这意味着找到发生错误的行
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-168999-1.html