PL/SQL 基础---匿名块

本文介绍了PL/SQL的基础知识,特别是匿名块的定义格式,包括DECLARE部分的变量声明,BEGIN部分的程序逻辑,以及EXCEPTION部分的异常处理。匿名块在PL/SQL中用于定义局部变量,执行逻辑操作,并处理可能出现的异常情况。文章详细讲解了变量声明、程序段执行以及预定义、非预定义和自定义异常的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PL/SQL 基础—匿名块


PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言。 PLSQL提供了典型的高级语言特
性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具
集中。


定义格式
PLSQL是一种类PASCAL语言,每一段程序都是由Block 组成的,其中BEGIN--END--程序块是不可或缺的;

[DECLARE]
--变量声明
BEGIN
--程序语句
[EXCEPTION]
--异常处理
END;
DECLARE –变量声明部分
变量名  [CONSTANT] 类型  := 初始值 [DEFAULT N];

类型声明包括:NUMBER(6)   TABLE.COLUMN%TYPE 两种方式
            CONSTANT  常量
            DEFAULT   默认值

注:

  1. 每一个变量声明以分号结束

  2. NUMBER(n),VARCHAR2(n)需要明确指出大小,这和后面输入、输出参数的定义不一样

  3. VARRAY 、RECORD、 TABLE、 CURSOR等复杂数据类型和自定义类型

BEGIN – 程序段
    BEGIN
        SQL语句
        函数(to_char、to_number、nvl...)

--------条件语句--------------------------------------
        IF conditions THEN
            ...
        ELSIF conditions THEN
            ...
        ELSE
            ...
        END IF;


        CASE [selector]
            WHEN conditions THEN 
            WHEN conditions THEN
            ELSE ...
            END;

--------循环语句--------------------------------------
        LOOP
            ...
            EXIST [WHEN conditions]; 

        END LOOP;



        WHERE conditions LOOP
            ...
        END LOOP;


        FOR i IN start...end LOOP
            ...
        END LOOP;



--------PL/SQL工具包--------------------------------------

        DBMS_OUTPUT、DBMS_SQL、另外还有EXECUTE IMMEDIATE等

注:

  1. SUM()、AVG()、COUNT()等聚合函数补课直接使用;

  2. CASE 是否有 selector 存在两种不同用法;

  3. 几种循环方式对第一趟循环的处理略有不同,且EXIST可退出最靠近的一层循环;

EXCEPTION – 异常处理
EXCEPTION
    WHEN 异常名 THEN
        ...
    ...

    WHEN OTHERS THEN -- 捕获任意异常

* 根据异常的分类:处理方式不同 *

1 .预定义异常

Oracle 都已经预定义好了,使用时无需预先声明,常见的有:

NO_DATA_FOUND 查询结果为空(游标FETCH等)

TOO_MANY_ROWS 查询结果包含多行记录

INVALID_CURSOR 游标使用异常

ZERO_DIVIDE 被除数为0

DUP_VAL_ON_INDEX 违反主键或唯一索引异常

* Oracle 提供了两个内置函数 SQLCODE 和 SQLERRM 分别用来返回Oracle 错误号和错误描述 *

    WHEN OTHERS THEN
    ROLLBACK;
    v_error_code := SQLCODE ;
    v_error_message := SQLERRM ;
    INSERT INTO errors
    VALUES(v_error_code, v_error_message);

2 .错误

处理非预定义的Oracle错误:此类错误属于Oracle错误,有编号,但无错误名称定义,使用时需要先声明,并进行错误初始化:

DECLARE
    e_emps_remaining EXCEPTION;
    PRAGMA EXCEPTION_INIT
    (e_emps_remaining, -2292);
BEGIN
    ...
EXCEPTION
    WHEN e_emps_remaining THEN

注:Oracle内部错误号很多,想了解全部的Ora错误号,请参考: http://www.ora-code.com/

3 .自定义异常

处理用户自定义的错误: 这种错误一般是程序员根据具体的业务逻辑定义的应用类错误,需要先声明后使用:

DECLARE
    custom_exception EXCEPTION;
BEGIN
    ...
    RAISE custom_exception;
    ...
EXCEPTION
    WHEN custom_exception THEN
        DBMS_OUTPUT.PUT_LINE('...');
END;

4 .RAISE_APPLICATION_ERROR() 函数

它可以无需预先定义错误,而在需要抛出错误的地方直接使用此函数抛出例外,例外可以包含用户自定义的错误吗和错误描述;

注:

异常传递:当前块中不处理,传递到外层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值