`

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

阅读更多

 

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

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、时间戳变更介绍:

       在用存储过程导数据时,一般都要用时间字段(时间戳)来判断是否需要update。但是oracle中的如果把存储过程的变量定义成DATE的,那么oracle会自动将数据表中的时间字段转换为日期型,而把时间信息截取掉了。但是我们要导入的数据一天可能会更新多次,而且实时性要求较高,故,必须精确到秒。此时就用到了oracle的timestamp变量,此变量产生的值为:15-3月 -14 12.31.59.000000 上午,这个日期精确足够我们使用了。

 

2、oarcle异常处理介绍:

       在使用存储过程导数据时,异常处理是必不可少的,因为我们需要知道在哪些操作上发生了错误,造成数据没有正确插入。如果只是某一条数据出现了问题,那么我们还要继续处理其他没有问题的数据,待所有数据都处理完成后,我们需要到日志表里面查看一下,到底是哪些数据出了问题,出了什么问题,再经过分析解决掉出现问题的数据。

具体如下:

       一般我们要用游标对一组数据进行处理,所以我们就要在游标的循环体中加入一个代码块,来处理整个游标周期中可能出现的问题:

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循环中的begin ... exception ... end ;是必不可少的。

 

SQLCODE :oracle中的关键字,意思为错误代码。

SQLERRM :oracle中的关键字,意思为错误描述。有的时候可能会很长,可以用substr截取一下。一般截取前200位就可以,我们只需要了解一些简单的信息即可 。

dbms_utility.format_error_backtrace() :在oracle 10g才引入的一个函数,意为找到出现错误的行。

 

 

 

 

0
4
分享到:
评论
2 楼 ysj5125094 2014-03-16  
xiaojie921 写道
aaaaaa

????
1 楼 xiaojie921 2014-03-15  
aaaaaa

相关推荐

    Oracle存储过程读写文件[文].pdf

    Oracle存储过程是数据库管理系统Oracle中的一种功能强大的编程工具,它允许开发者在数据库内部编写和执行复杂的业务逻辑。在Oracle中,存储过程可以用于读取和写入文件,从而实现数据库与文件系统的交互。这种功能...

    oracle存储过程+触发器.docx

    Oracle存储过程和触发器是数据库管理系统中用于执行特定任务的预编译代码块,它们在Oracle数据库中扮演着重要角色。下面将详细解释这些概念及其使用方法。 1. **创建存储过程** 创建存储过程的基本语法是: ```...

    Oracle PLSQL程序设计

    - **异常处理部分**:处理程序执行过程中可能发生的异常情况。 #### 五、变量和常量 - **声明与使用**:变量和常量必须在声明部分进行声明,并指定其数据类型;在可执行部分使用这些变量和常量。 - **赋值方式**...

    Oracle实用教程_04章_Oracle数据类型和函数[整理].pdf

    Oracle 数据类型的使用和研究是早于计算机技术的出现的,使用不同的数据类型是为了保存和处理现实生活中不同性质信息的需要。例如统计人数可以用整型数据、计算有整有零的工资和利息使用浮点数、而要记录人的姓名就...

    oracle-自动备份及拷贝到ftp或者共享

    1. 设置Oracle环境变量,确保RMAN可以正确识别数据库实例。 2. 创建备份策略,包括备份类型(完整备份、增量备份)、保留周期、备份频率等。 3. 使用RMAN命令定义作业,如`RUN { BACKUP DATABASE PLUS ARCHIVELOG; }...

    Oracle 表定义到 DB2 数据类型

    - 对于时间戳,Oracle的`TIMESTAMP`类型在DB2中可以映射为`TIMESTAMP`,C程序中可能需要自定义结构体来存储包含日期和时间信息。 在使用这些数据类型进行转换时,开发者需要确保C程序中的宿主变量在预编译时被正确...

    Oracle-data-type.rar_oracle

    Oracle数据库是世界上最流行的关系型数据库管理系统之一,其强大的功能和高效的数据处理能力使其在企业级应用中占据主导地位。在Oracle数据库中,数据类型扮演着至关重要的角色,它定义了可以存储在表列中的数据类型...

    Oracle_10.2.0.3.zip

    9. **PL/SQL Enhancements**:增加了新的PL/SQL特性,如游标变量的自动关闭、异常处理的改进、新的内置函数等。 10. **Backup and Recovery**:改进的备份恢复机制,如RMAN(Recovery Manager)的增强,使得数据库...

    Oracle PPT

    OOP在Oracle中的实现包括对象类型、对象变量、对象函数和过程、继承、封装和多态性等概念。了解这些可以让你编写更高效、可维护的存储过程和触发器。 Oracle入门部分会介绍数据库的基本操作,如创建数据库用户、...

    Mysql Oracle 数据库开发设计及使用规范

    避免使用时间戳类型存储日期时间信息。 - 字段名称应与所存储的数据类型相匹配,如`DATE`类型的字段只存储日期,而`TIME`类型的字段则可以存储更精确的时间信息。 #### 命名规范 **1. 数据库命名约定** - **MySQL...

    Oracle数据类型详解

    在Oracle 10g中,对这些数据类型的支持和使用方式与之前的版本有所不同,例如增加了对Unicode字符集的更好支持,改进了LOB处理,以及对XML数据的内置支持。了解并熟练运用这些数据类型可以帮助开发者更有效地管理和...

    oracle定时执行存储过程.pdf

    ### Oracle定时执行存储过程...通过上述步骤,我们可以成功地在Oracle数据库中设置定时执行存储过程,以实现自动化任务处理。这种方式不仅可以提高工作效率,还可以减少人为错误,是数据库管理中不可或缺的一项技能。

    oracle练习题关于触发器的作业

    触发器可以看作是存储过程的一种特殊形式,当满足预定义条件时,它们会自动触发并运行。这使得数据库能够响应用户未直接调用的事件,从而增强数据完整性和业务规则的实施。 在Oracle中,触发器有以下几种类型: 1....

    oracle 视图,函数,过程,触发器自动编译脚本

    由于Oracle中的视图、函数(Function)、存储过程(Procedure)等对象之间存在着复杂的依赖关系,因此当某个对象被修改后,可能会导致与其相关的其他对象变得无效(Invalid)。在实际操作中,虽然我们会关注所修改的...

    Oracle PL/SQL编程详解

    声明部分用于声明变量、常量、游标、异常和子程序(过程和函数)。执行部分包含了PL/SQL程序的实际执行逻辑,而异常处理部分则是处理程序执行过程中可能遇到的异常情况。 PL/SQL流程控制语句部分讲解了如何在PL/SQL...

    ORACLE PLSQL实例精解(第4版) 中文版

    - **异常处理**:通过`EXCEPTION`块来捕获和处理错误。 #### 二、PL/SQL高级特性 **2.1 存储过程与函数** - **存储过程**:预编译的代码块,可以接受输入参数,并可返回输出参数或结果集。 - **函数**:类似于存储...

    Oracle SQL基础培训

    在Oracle SQL中,数据类型用于定义表中的列以及变量的数据格式。数据类型的选择对于确保数据的正确存储与处理至关重要。 ##### 1. 字符型数据类型 - **CHAR(size[BYTE|CHAR])**:固定长度的字符数据类型,长度为`...

    oracle数据类型

    在Oracle中,数据类型是定义数据库中存储数据类型的规则,它决定了数据的格式、大小和允许的值。理解Oracle的数据类型是设计高效、健壮的数据库的基础。 在Oracle中,数据类型大致可以分为以下几类: 1. **数值型...

Global site tag (gtag.js) - Google Analytics