oracle存储过程时间变量,oracle存储过程和时间戳变量类型的异常处理

63d16153b11226349d9963dbacbb88aa.png

下面通过一个简单的存储过程代码段说明了该问题:

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;

25b11b5a6fe31a746a710368725f49b6.png

1. 时间戳更改简介:

使用存储过程引导数据时,通常使用时间字段(时间戳)来确定是否需要更新. 但是,如果在Oracle中将存储过程中的变量定义为DATE,则Oracle将自动将数据表中的时间字段转换为日期类型,并截取时间信息. 但是,我们要导入的数据可能一天要更新多次,并且实时性要求较高,因此必须精确到秒. 此时,使用Oracle的timestamp变量. 此变量产生的值是: 14年3月15日至12月31日,该日期足够准确,可供我们使用.

a8671a1e70e0f9b158d9a9d083539842.png

2. 人工骨异常处理简介:

使用存储过程引导数据时,异常处理是必不可少的oracle 过程 异常处理,因为我们需要知道在哪个操作中发生了错误,从而导致数据无法正确插入. 如果只有一个数据有问题,那么我们必须继续处理其他数据而不会出现问题. 在处理完所有数据之后,我们需要转到日志表以检查哪些数据错误以及哪些数据错误. ,然后通过分析解决问题数据.

img_2_2409648583D3163582901_27.jpg

具体如下:

通常,我们使用游标处理一组数据,因此我们将代码块添加到游标的循环主体中,以处理整个游标周期中可能出现的问题:

115ad8fc74d3bcbcd367230119ed3a11.jpg

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

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值