Oracle:pl/sql 异常处理[转]

Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 文章目录PL/SQL入门教程目录一、PL/SQL简介1.PL/SQL简介2.PL/SQL要点3.PL/SQL 块二、 PL/SQL 语法和格式:1.语法格式:2.声明变量3.声明变量时赋值4.PL/SQL中的输出函数5.PL/SQL格式举例:6.图1:输出操作结果显示7.结合SQL语句使用into为变量赋值三、两个特殊的字段类型1.%type指定的字段的类型2.%rowtype 代表表中的 阅读详情

 

pl/sql 提供了强大而灵活的手段来捕捉和处理程序产生的异常,从而使 oracle 的用户远离一些令人烦恼的 bug 。

 

pl/sql 异常处理的概念和术语

 

在 oracle 中所有的错误都被认为是不应该发生的异常。一个异常可能是以下 3 种情况的一种:

u       由系统产生的错误(“ out of memory ”或“ duplicate value in index ”)

u       用户行为导致的错误

u       应用程序给用户的一个警告

pl/sql 用一种异常句柄的结构来捕捉和响应错误。正是有了异常句柄的存在,我们能很方便的分离异常处理代码与可执行代码。与线性的代码相比,为了处理异常,异常句柄提供了一种类似事件驱动的模式;换句话说,就是不管一种特定的错误在何时何地发生,它都将被同一个代码处理。

当一个错误出现后,无论它是系统还是程序产生的,都将导致一个异常。之后,可执行程序被中断,控制权转移给异常处理代码。处理完异常后,程序将不会回到先前被中断的位置,相反的,控制权被交给了当前程序的外围模块(可能是程序,也可能是系统)。

       procedure jimmy

       is

              new_value varchar(35)

       begin

|--------new_value:=old_value || ‘-new’;

|          if new_value like ‘like%’

|          then

|                 …..

|          end if;

|   exception

|----- à        when value_error

              then

                     …..

       end;

因为 old_value 是一个未被定义的变量,所以将产生一个错误,并将给异常处理模块处理。

 

从异常的可应用范围出发,可将异常分为两类:

系统异常:

由 oracle 定义并由 pl/sql runtime 引擎在检测到错误时产生的异常。一些系统异常有名字,比如 NO_DATA_FOUND ,然而大多数的异常仅仅只有数字编号和描述。这些异常无论在哪个 pl/sql 中程序都能被应用。

共有 21 个命名的系统异常:

命名的系统异常

产生原因

ACCESS_INTO_NULL

未定义对象

CASE_NOT_FOUND

CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时

COLLECTION_IS_NULL

集合元素未初始化

CURSER_ALREADY_OPEN

游标已经打开

DUP_VAL_ON_INDEX

唯一索引对应的列上有重复的值

INVALID_CURSOR

在不合法的游标上进行操作

INVALID_NUMBER

内嵌的 sql 语句不能将字符转换为数字

NO_DATA_FOUND

使用 select into 未返回行,或应用索引表未初始化的元素时

TOO_MANY_ROWS

执行 select iotn 时,返回超过一行

ZERO_DIVIDE

除数为 0

SUBSCRIPT_BEYOND_COUNT

元素下标超过嵌套表或 VARRAY 的最大值

SUBSCRIPT_OUTSIDE_LIMIT

使用嵌套表或 VARRAY 时,将下标指定为负数

VALUE_ERROR

赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED

Pl/sql 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码

NOT_LOGGED_ON

Pl/sql 应用程序在没有连接 oralce 数据库的情况下访问数据

PROGRAM_ERROR

Pl/sql 内部问题,可能需要重装数据字典& pl./sql 系统包

ROWTYPE_MISMATCH

宿主游标变量与 pl/sql 游标变量的返回类型不兼容

SELF_IS_NULL

使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR

运行 pl/sql 时,超出内存空间

SYS_INVALID_ID

无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE

Oracle 在等待资源时超时

 

由程序员定义的异常:

程序员在程序中定义的异常,它只是在特定的程序种有效。可以使用 EXCEPTION_INT 这个 pragma 将一个无名字的系统异常与一个程序员定义的名字相关联。或者用 RAISE_APPLICATION_ERROE 来自己定义一个异常的数字编号和描述。

 

按异常生成方式可分为:

预定义异常:

       就是上面表中的 21 种有名字的系统异常。

非预定义异常:

       没名字的系统异常,可以用 pragma exception_int 给它关联一个名字。

自定义异常:

       需要用 RAISE 或 RAISE_APPLICATION_ERROR 生成的异常。

 

下面是一些要用到的属于 ;

Exception section (异常处理模块)

它是 pl/sql 语句块种包含一个或多个异常句柄的部分。 Exception section 的结构基本上与 case 相似。

Raise (产生)

通过通知 pl/sql runtime 引擎有错误来中止当前程序的运行。也可通过显式的请求,如: RAISE 或 RAISE_APPLICATION_ERROR 来 RAISE 一个异常。

Handle (句柄,某一个异常处理的代码)

在 exception section 中捕捉错误。可以在 handle 中编写程序来处理异常,比如将错误记入 log 中,显示一个错误信息,将异常传出当前程序快。

Scope (作用范围 )

       一个异常从产生、被捕捉到处理整个过程所处的程序部分。

Propagation (传递)

如果一个异常没有被处理,那么它将被传递到但前块的上一级,它有可能是另一个代码快,也可能是系统。

Unhandled exception (未被处理的异常)

如果一个异常没有被处理,并一直被传递道理系统中,那么它被称为 unhandled exception 。

Un-named or anonymous excepttion (匿名异常)

       (在异常类型中有介绍)

Named exception (命名异常)

       包括系统异常中有名字的那部分和用户定义的名字。

 

异常定义

 

在一个异常产生、被捕获并处理之前,它必须被定义。 Oracle 定义了几千个异常,绝大多数只有错误编号和相关描述,仅仅命名了若干个最常被用到的异常。这些名字被储存在 STANDARD , UTL_FILE , DBMS_SQL 这几个系统包中,详情请见 oracle:pl/sql 异常处理( 1 )。

出自之外的绝大多数异常需要程序员命名。有 2 种命名异常的方法:

 

1 :声明一个自定义异常

在 STANDARD 中的命名了的异常基本山是与系统的错误相关的(当然那些只有 errorcode 的异常也是这样),但在实际的应用中我们经常需要与特定的应用程序相关的异常,由程序员声明的异常就是用于处理这种情况的。

Oracle 异常处理模块的方便的地方在于,它并没有区别对待自定义的与预定义的异常。这使得我们可以像对待预定义异常一样,捕捉和处理自定义异常,只是在此之前需要声明它;同时对于一个自定义的异常,我们需要用 RAISE 来手动产生。

下面是一个声明的例子:

       procedure calc_ammul_sales

              (company_id_in in company.company_id%tye)

       is

              invalid_company_id exception;

              negative_balance excrption;

              duplicate_company Boolean;

       begin

              /*body of executable statement*/

       exception

              when invalid_company_id

              then /*handle exception*/

              when no_data_found

              then /*handle exception*/

              /*…..*/

       end;

需要注意的是处理定义的时候,只有两个地方会出现自定义的异常:

ü         raise exception ;

ü         when exception then

 

2 :为非预定义异常关联一个名字

仅仅 21 个预定义异常对我们来说实在是太少了,还有几千个异常只有 errorcode 和描述。另外,程序员也可以用 RAISE_APPLICATION_ERROR 定义一个含 errorcode 和描述的异常。

当然,只用 errorcode 也可以很好地完成工作,只要你不担心会忘了那串数字代表的意思就行。比方说 ;

       exception

              when others

              then

                     if sqlcode=-1843 then  /*sqlcode 是内建的用于返回最近一次错误编号的函数 */

                     …..

这的确是一段让人感到晦涩的代码,还是给它关联个名字吧。

我们要用到的是 pragma exception_init(exception,integer) ,然后就可以像对待预定义异常一样对待它了,我是说没必要像上面的那种一样用 raise 。 Exception_init 是一个编译时运行的函数,它只能出现在代码的声明部分,而异常名字必须在此之前被定义。下面用一个匿名过程举个例子:

       declare

              invalid_company_id exception;

              pragma exception_init(invalid_company_id, -1834);

要注意的时:

ü         不可以用 -1403 ( no_data_found ),用 100 ,事实上 exception_init 中的 integer 对应的是 sqlcode 返回的值。

ü         不能为 0 ,不能大于 100 ,不能小于 -1000000

一个例子:

       procedure delete_company(company_id_in in number)

       is

              still_have_emplyee exception;

              pragma exception(still_have_employee, -2293);

       begin

              delete from compamy

              where company_id=company_id_in;

       exception

              when still_have_employee

              then dbms_output.put_line(‘delete employees for company first’);

       end;

在一下两种情况下,我们有必要使用 exception_init :

ü         一个非预定义异常是经常要被用到的。

ü         我们将用 raise_applocation_error 产生了一个自定义的 errorcode 时。

一种简便的方法是将以上两种情况中的异常定义在一个包中,这样我们就没有必要每次都重复定义了。

       Create or replace package dynsql

       Is

              Invalid_table_name exception;

              Pragma exception_init(invalid_table_name, -903);

              Invalid_column_name exception;

              Pragma exception_init(invalid_column_name, -904);

              En_too_young const number:=-200001;

              Exc_too_young exception;

              Pragma exception_init(exc_too_young, -20001);

       End;

有了上面这个包,就可以方便的处理异常了 ;

       procedure validate_emp(birthdate in date)

       is

              min_tear const pls_integer:=18;

       begin

              if add_month(sysdate,min_year*12*-1)<birthdate_in

              then

raise_application_error(dynsql.en_too_young, ‘employee must be’ || min_year ||‘old’);

              end if;

       end;

除了 standard 包中的 21 个预定义异常外,还有一些包也定义了一些异常。但与 standard 包中异常不同的是,在使用这些异常时,需要带上包的名字。如:

       when dbms_lob.invalid_argval then ……

 

非常有用的一点是,可以在最外层的 pl/sql 块的异常处理模块中加入 others ,这样就可以把从内部传递出来的未被处理的剩余异常全部处理掉了。

       Exception

       When others

              Then ….

 

处理 oracle 系统自动生成系统异常外,可以使用 raise 来手动生成错误。

l         Raise exception;

l         Raise package.exception;

l         Raise;

以上是 raise 的三种使用方法。第一种用于生成当前程序中定义的异常或在 standard 中的系统异常。

       Declare

              Invalid_id exception;

              Id_values varchar(2);

       Begin

              Id_value:=id_for(‘smith’);

              If substr(id_value,1,1)!=’x’

              Then

                     Raise invalid_id;

              End if;

       Exception

              When invalid_id

              Then

                     Dbms_output.put_line(‘this is an invalid id!’);

       End;

这是一个生成自定义异常的例子,当然也可以生成系统异常:

       declare

              employee_id_in number;

       Begin

Select employee_id into employee_id_in from employ_list where employee_name=&n;

If employee_id_in=0

Then

       Raise zero_devided;

End if;

       Exception

              When zero_devided

              Then

                     Dbms_output.put_line(‘wrong!’);

       End;

有一些异常是定义在非标准包中的,如 UTL_FILE , DBMS_SQL 以及程序员创建的包中异常。可以使用 raise 的第二种用法来生成异常。

       If day_overdue(isbn_in, browser_in) > 365

       Then

              Raise overdue_pkg.book_is_lost

       End if;

在最后一种 raise 的形式中,不带任何参数。这种情况只出现在希望将当前的异常传到外部程序时。

       Exception

              When no_data_found

              Then

                     Raise;

       End;

 

Pl.sql 使用 raise_application_error 过程来生成一个有具体描述的异常。当使用这个过程时,当前程序被中止,输入输出参数被置为原先的值,但任何 DML 对数据库所做的改动将被保留,可以在之后用 rollback 命令回滚。下面是该过程的原型:

       Procedure raise_application_error(

       Num binary_integer;

       Msg varchar2;

       Keeperrorstack Boolean default false

)

其中 num 是在 -20999 到 -20000 之间的任何数字(但事实上, DBMS_OUPUT 和 DBMS_DESCRIBLE 包使用了 -20005 到 -20000 的数字); msg 是小于 2K 个字符的描述语,任何大于 2K 的字符都将被自动丢弃; keeperrorstack 默认为 false ,是指清空异常栈,再将当前异常入栈,如果指定 true 的话就直接将当前异常压入栈中。

    CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER)

    IS

       l_message error_table.error_string%TYPE;

    BEGIN

       SELECT error_string

         INTO l_message

         FROM error_table, v$nls_parameters v

        WHERE error_number = code_in

          AND string_language  = v.VALUE

          AND v.parameter = 'NLS_LANGUAGE';

 

       RAISE_APPLICATION_ERROR (code_in, l_message);

    END;

 

异常处理

 

当异常生成之后,程序被中止,控制权交给异常处理模块,异常处理模块捕获当前异常句柄,并交由相应的程序处理;如果,异常促里模块没有捕捉到异常句柄,那么它将被传输到当前程序的外围。

 

除非由一些特殊的要求,一般情况下异常将再当前程序的异常处理模块中被处理。异常处理模块以 EXCEPTION 开始 END; 结尾。

       Declare

              /*…………*/

       begin

              /*…………*/

       exception

              when /* 异常名称 */

              then /* 异常处理 */

              when other

              then /* 异常处理 */

       end;

异常处理模块的语法基本上以 CASE 一致,凡是在 when 中有定义的异常都将被处理,而没有的则被传输。一个特殊的异常处理语句是 WHEN OTHERS 。就想在( 3 )中所说的,它会处理所有为被处理的异常,因此必须小心使用它,最好是在最外层的程序中。当然如果喜欢偷懒的,大可以在异常处理模块中只放一个 OTHERS 。注意,无论哪种情况, OTHERS 只能这只在异常处理的最后一位。

 

有趣的是,可以在一个 when 中处理多个异常句柄。

       Exception

              When no_data_found or invalid_employee_id or dbms_ldap.invalid session

              Then /*………..*/

       End;

       /

在这个例子里,有标准包的异常、自定义异常和非标准包中的异常。这些异常只能用 or 连接,不可以用 and ,因为只有一个异常能够生成。

 

非 raise_application_error 生成的异常,如果没有被处理而一直传递到系统环境中,那么环境将视情况作出相应的反映。在 sqlplus 中, oracle 将回滚所有 DML 对数据所做的修改。在 sqlplus 环境中,因为有自动回滚的存在,我们可以保留出现未被处理的异常的可能性;而在另外的一些环境中,则需要仔细设计最外层程序。

ü         捕捉任何有可能传出的异常。

ü         记录错误以便于分析。

ü         给外部环境一个信息,以便于其作出相应的处理。

 

对于自定义异常,因为 sqlcode 值永远是 1 ,所以当它被传出时,如果外围程序中没有定义相同名称的异常,我们将不知道是什么异常产生了。因此,不要将自定义异常传递出去。

 

在程序中处理几个互相独立的操作时,为了避免出现因为一个操作产生异常而使整个程序被中断的情况,有必要将这些独立的操作放在各自的虚拟块中。

       Procedure change_data is

       Begin

              Begin

                     Delete from employee where …..

              Exception

                     When others then null;

              End;

 

              Begin

                     Update company set …….

              Exception

When others then null;

              End;

 

              Begin

                     Insert into company_history select * from company where ….

              Exception

                     When others then null;

              End;

       End;

       /

 

 

Pl/sql 提供了一些内建的函数来帮助我们确定、分析异常。

 

SQLCODE

这个函数在前面有提到过,它是一个用于返回当前模块中最近一次异常值的函数,或者说是非入栈程序的异常值。打个比方:如果在当前程序的异常模块中调用了另一个程序, oracle 将当前程序及相应的环境变量(包括异常值)压入系统栈;在被调用程序中生成了一个值为 1 的异常,那么 sqlcode 将返回 1 ;之后刚才的程序出栈, sqlcode 返回当前异常值。需要注意的是,不要在异常模块之外使用它,这样不会有任何意义。当没有异常或在异常模块之外使用时, SQLCODE 返回 0 ;返回值 1 是指自定义异常。

 

SQLERRM

接收异常值,返回相应的长度不超过 512 字节的描述语。如果没有传入异常值,则返回当前异常描述。

       Begin

              Dbms_output.put_line( sqlerrm(-1403);

       End;

Sql>/

Ora-1403: no data found

在需要体构长度超过 512 字节的描述时, oracle 建议使用 dbms_utility.format_error_stack 。显然,用这个函数来判断一个异常是否为系统异常是很有用的,如果不是的话,将返回以下两种情况的一种。

如果是一个负数:

       ora-nnnnn: message not found,; product=rdbms; facility=ora

如果是一个正数:

       -nnnnn: non-oracle exception

 

DBMS_UTILITY.FORMAT_ERROR_STACK

返回当前异常相应的描述,没有字符长度限制。与 SQLCODE 相同的是,必须在异常处理模块中使用。虽然名称中有一个 stack 在,但通过它并不能知道异常的最初生成处,需要的话就必须使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 。

 

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个函数使用这个栈,然后返回该异常的整个传递过程。这个函数对错误的定位和实施下一步处理起着至关重要的作用。

       Create or replace procedure procl is

       Begin

              Dbms_output.put_line(‘running proc1’);

              Raise no_data_found;

       End;

       /

       create or replace procedure proc2 is

       begin

              dbms_output.put_line(‘calling proc1’);

              proc1;

       end;

       /

       create or replace procedure proc3 is

       begin

              dbms_output.put_line(‘calling proc2’);

              proc2;

       exception

              when no_data_found

              then

                     dbms_output.put_line(‘error stack at top level’);

                     dbms_output.put_line(dbms_utility.format_error_backtrace);

       end;

       /

现在可以运行 proc3 来看看结果。

Sql>set serveroutput on;

Sql>begin

2                         dbms_output.put_line(‘proc3->proc2->proc1 backtrace’);

3                         proc3;

4     end;

5     /

    Proc3 -> Proc2 -> Proc1 backtrace

    calling proc2

    calling proc1

    running proc1

    Error stack at top level:

    ORA-06512: at "SCOTT.PROC1", line 4

    ORA-06512: at "SCOTT.PROC2", line 5

ORA-06512: at "SCOTT.PROC3", line 4

事实上,每次异常的产生都将重置这个异常栈,只是最后一次从系统栈出栈的是最外层的程序块,所以可以清楚地看到异常生成的整个过程。上面这个程序的执行过程是这样的:首先用 put_line 打印 Proc3 -> Proc2 -> Proc1 backtrace , 调用 proc3 ,当前程序入栈 => 打印 calling proc2 ,调用 proc2 , proc3 入栈 => 打印 calling proc1 ,调用 proc1 , proc2 入栈 => 打印 running proc1 ,生成 no_data_found 异常,该异常被压入异常栈中 =>  proc2 出栈,并检测到来自第 5 行调用传递过来的异常,将它在此压入异常栈 => proc3 出栈,并检测到来自第 4 行调用传递过来的异常,将它在此压入异常栈, dbms_utility.format_error_backtrace 将异常栈中信息反相打印出来 =>  最外层程序出栈, end 。

以下是正确使用这个函数的一些注意事项:

ü         在当前程序的异常处理模块中调用这个函数。

ü         避免在中间程序中使用异常处理模块。

这样异常就能被正确地传输到最外层程序中,并打印出这个过程了。

 

 

本文出处:http://www.cppblog.com/ivenher/articles/14133.html

Oracle PL/SQL 异常处理与 MySQL 本文将详细介绍 Oracle PL/SQL 异常处理和 MySQL 异常处理的相似之处和区别,并提供相应的代码示例。然后,在异常块中,我们检查一个条件并使用 SIGNAL 语句抛出自定义异常。通过上述代码示例和讨论,我们了解了 Oracle PL/SQL 和 MySQL 中的异常处理机制及其相似之处和区别。这些异常处理机制对于编写健壮的数据库应用程序非常重要,可以帮助我们捕获和处理潜在的错误和异常情况,提高程序的可靠性和容错性。然后,在主体部分的异常块中,我们检查一个条件并抛出自定义异常。 阅读详情

相关推荐

Oracle--PL/SQL编程

本文主要介绍了 PL/SQL 编程的相关知识。PL/SQL 是 Oracle 数据库中的一种过程化编程语言,以块为基本单位,分为声明、执行和异常处理三部分。文中阐述了其基本语法、数据类型,包括数组、字符、日期、布尔类型等,以及特殊的 %TYPE、RECORD、%ROWTYPE 类型。 同时,详细讲解了流程控制语句,如 IF、CASE、LOOP、WHILE、FOR 和 GOTO 等,并对游标的基本原理、显式游标、隐式游标及其属性进行了说明。此外,还介绍了异常处理的方法,包括预定义异常、用户自定义异常、错误编

恐龙让Lee的博客 1601

第七章 控制PL/SQL错误

/* banner */#banner { position:static; top: 0px; left: 0px; width: 100%; height: 98px; background-repeat:no-repeat; background-image: url(../images/banner.gif); background-positi

KNIGHTRCOM(rcom10002的专栏) 4565

3.6KW储能双向逆变器(原理图PCB源码)

通过百度网盘分享的文件:优快云 3.6KW储能双向逆变器 链接:https://pan.baidu.com/s/18NN6KnpywFUIDtAQ4b1LTg?pwd=csdn 提取码:csdn

2401_86562087的博客 2182

Linux-BShell中调用sqlplus执行sql文件,如何取得返回值

有时候会想在Shell中调用一个存储过程啊等等,做法一般就是把这个存储过程给放在一个sql文件中,然后调用sqlplus来执行该sql文件。 但是问题是,如果存储过程出错,该怎么返回错误代码呢? 答案就是在sql文件中定义全局变量。参考代码如下: <<shell--Test.sh>> sqlplus -s S001/PASSWORD@TEST_1 @/home/s001/S001.sql << EOF exit $? EOF EXCODE=$? i..

shi_ly的专栏 2745

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1104

欧姆龙PLC EIP通讯配置方法

欧姆龙EIP通讯配置方法

weixin_59671695的博客 6135

返回码127报错记录-第一篇

远程执行命令,返回码为127,其可能是对应的命令没在环境变量中,应该改为全路径或加入环境变量。

Jamesaonier的博客 2436

【实战指南】Green Hills MULTI-IDE 从零安装到工程创建全流程

本文详细介绍了Green Hills MULTI-IDE从零安装到工程创建的全流程,包括系统要求检查、安装步骤、工程配置及调试技巧。特别适合嵌入式开发新手快速上手这款专业IDE工具,提升开发效率。

weixin_28740299的博客 474

Centos执行shell命令返回127错误

Centos执行shell命令返回127错误 在终端可以正常运行 web执行shell 返回127错误 解决方法 应该是运行环境和登录用户的运行环境存在差异造成的 在脚本执行之前,添加. /etc/profile,加载环境变量,问题解决 #!/bin/bash . /etc/profile #脚本执行之前 #PHP $cmd="sudo /www/wwwroot/uiw/shell/...

qq_21098479的博客 1万+

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

sqlcode返回值说明

sqlcode  返回值 0 -1 100对于select  execute  存储过程 执行成功时返回 0或100 (0 有数据返回,100无数据返回)-1 表示执行sql 语句失败(包括存储过程)具体错误信息:sqldbcode   sqlerrtext另外 : DELETE, FETCH, and UPDATE   返回0时,需求确认 sqlnrows 返回0只能说明语句执行成功sqldbc

MakeToday的专栏 3865

Python与CAD系列基础篇(十)图形复制、移动、删除

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。进行图形复制、移动、删除的方法。pyautocad方式。pyautocad方式。

weixin_43894929的博客 2209

oracle pl sql 异常,Oracle:pl/sql 异常处理[转]

Oracle:pl/sql 异常处理[转]pl/sql 提供了强大而灵活的手段来捕捉和处理程序产生的异常,从而使 oracle 的用户远离一些令人烦恼的 bug 。pl/sql 异常处理的概念和术语在 oracle 中所有的错误都被认为是不应该发生的异常。一个异常可能是以下 3 种情况的一种:u 由系统产生的错误(“ out of memory ”或“ duplicate value ...

weixin_39817215的博客 305

华为ensp、思科eve、华为ensp pro中通过cloud桥接本地网络和联通互联网的方法

华为ensp、思科eve中通过cloud桥接本地网络和联通互联网的方法

suofen9703的博客 413

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Oracle系列十一:PL/SQL

PL/SQL是一种程序设计语言,用于编写Oracle数据库的存储过程、触发器、函数等对象。PL/SQL结合了SQL语句和通用程序设计语言的特性,具有更强大的数据处理功能和更高的执行效率。

聚集机器学习、信息安全 3229

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Oracle PL/SQL编程详解

Oracle PL/SQL编程详解 - 古立 - 博客园 《我的网络摘抄本》 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅

TDY的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

PL/SQL 异常处理

自定义异常是程序员根据业务逻辑需求,在PL/SQL程序中显示声明的异常。当程序中出现特定条件时,程序员可以显式地抛出这些自定义异常,并在异常处理部分(EXCEPTION)进行捕获和处理。定义异常:在块声明部分,使用DECLARE关键字声明异常DECLARE抛出异常:在程序执行部分,使用RAISE语句抛出自定义异常。BEGINEND IF捕获异常:在EXCEPTION块中,使用WHEN...TEHN语句捕获并处理自定义异常。EXCEPTION。

tffovever的博客 1546

Oracle --- PL/SQL

Oracle PL/SQL编程详解   博文转载自:http://www.cnblogs.com/defias/p/3334098.html   本文目录: 1. PL/SQL 程序设计简介 2. PL/SQL块结构和组成元素 3. PL/SQL流程控制语句 4. 把游标说透 5. 异常错误处理 6. 把过程与函数说透 7. 程序包的创建与应用 8. 把触发器说透   ...

__静禅__ 5270

Oracle PL/SQL语言初级教程之异常处理

Oracle PL/SQL语言初级教程之异常处理 PL/SQL处理异常不同于其他程式语言的错误管理方法,PL/SQL的异常处理机制和ADA很相似,有一个处理错误的全包含方法。当发生错误时,程式无条件转到异常处理部分,这就需要代码要很干净并把错误处理部分和程式的其他部分分开。oracle允许声明其他异常条件类型以扩展错误/异常处理。这种扩展使PL/SQL的异常处理很灵活。   当一个

YuanGao 946

Oracle之 第三篇 PL/SQL基础

Oracle之 第三篇 PL/SQL基础

m0_63064861的博客 1793

ORACLE PL/SQL异常处理(Exception)学习笔记

1、PL/SQL错误类型错误类型报告者处理方法编译时错误PL/SQL编译器交互式地处理:编译器报告错误,你必须更正这些错误运行时错误PL/SQL运行时引擎程序化地处理:异常由异常处理子程序引发并进行捕获  2、异常的声明有两种异

朝着梦想 渐行前进 2万+

Oracle异常处理

即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。任何ORACLE错误(报告为ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误)都可以。当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前。 ORACLE提供异常情况...

CX的博客 3128

Oracle基础之PL/SQL程序块

PL/SQL程序块 PL/SQL块由三个部分组成:说明部分、执行部分和异常处理部分。 一段完整的PL/SQL程序块结构如下所示: DECLARE 说明部分; BEGIN /* 块开始标记 */ 执行部分; EXCEPTION 异常处理部分; END; /* 块结束标记 */ 说明: (1)说明部分:说明部分是可选的。由关键字DECLARE引出,用于定义常量...

qq_44838668的博客 3990

Oracle中的PL/SQL异常处理是如何工作的?

当查询没有返回任何行时触发。:当查询返回超过一行时触发。:当试图除以零时触发。:当转换字符串到数字失败时触发。:当尝试访问空对象时触发。除了预定义的异常,用户还可以自定义异常,以便更好地描述和处理特定的错误情况。DECLARE-- 定义一个自定义异常BEGIN-- 检查员工ID是否有效-- 手动引发自定义异常END IF;-- 查询员工薪水EXCEPTIONEND;

qq_33240556的博客 516
上一篇: 全面解析Oracle developer的异常处理机制
下一篇: 收集的一些经典搞笑的话(转载)
ORHCLE
博客等级 码龄17年 30粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值