106---oracle的PL/SQL,异常处理, 游标(CURSOR), 子程序,存储过程

一、     PL/SQL

 

PL/SQL是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言

PL/SQL的工作原理

PL/SQL引擎接受 PL/SQL 块并对其进行编译执行

该引擎执行所有过程语句

将SQL语句发送给Oracle的SQL语句执行器

 

PL/SQL引擎负责进行语句的传递

Oracle服务器执行SQL指令

 

 

 

二、     PL/SQL块简介

 

声明部分定义变量、游标和自定义异常

包含 SQL 和 PL/SQL语句的可执行部分

指定出现错误时需要执行的操作

 

DECLARE

        qty_on_hand NUMBER(5);

BEGIN

        SELECT quantity INTO qty_on_hand

           FROM Products

        WHERE product = '芭比娃娃';

        IF qty_on_hand > 0 THEN

             UPDATE Products SET quantity =quantity + 1

              WHERE product = '芭比娃娃';

             INSERT INTO purchase_record

                     VALUES ('已购买芭比娃娃', SYSDATE);

        END IF;

        COMMIT;

EXCEPTION  /* 异常处理语句 */

        WHEN OTHERS THEN

                 DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM); 

END;

 

 

 

三、     PL/SQL的优点

 

与 SQL 紧密集成,简化数据处理。

支持SQL,在 PL/SQL 中可以使用:

数据操纵命令

事务控制命令

游标控制

SQL 函数和 SQL 运算符

支持所有 SQL 数据类型

支持 NULL 值

支持 %TYPE 和 %ROWTYPE 属性类型

更佳的性能,PL/SQL 经过编译执行

支持面向对象编程 (OOP)

     安全性,可以通过存储过程限制用户对数据的访问

 

四、     PL/SQL编码规则

/*

|| 在注释开始的首行只放斜线星号,标志注释开始,

|| 然后注释块的每一行以双垂直线开头,突出注释后面

|| 的内容是注释部分,最后,将星号斜线单置于一行

*/

DECLARE

       v_enameVARCHAR2(20);

       v_rateNUMBER(7,2);

       c_rate_incrCONSTANT NUMBER(7,2):=1.10;

BEGIN

       --方法一:通过SELECT INTO给变量赋值

       SELECT ename, sal* c_rate_incr 

             INTO   v_ename, v_rate

          FROM  employee

       WHERE empno='7788';

      --方法二:通过赋值操作符“:=”给变量赋值

      v_ename:='SCOTT';

END;

 

五、        声明:使用declare关键字

1)       用于定义变量或者常量

DECLAREvariable_name [CONSTANT] type [NOT NULL] [:=value];

 

 

 

BEGIN

       过程及SQL语句;

EXCEPTION

        WHEN 异常名称THEN

                 过程及SQL语句;

        WHEN OTHERS THEN

                过程及SQL语句;

END;

 

 

 

2)       命名规则

变量名首字母必须是英文字母,其后可以是字母、数字或者特殊字符$、#和下划线

变量名长度不超过30个字符

变量名中不能有空格

不能是SQL保留字

标  识  符

命名规则

例   

程序变量

v_name

v_student_name

程序常量

c_name

c_company_name

游标变量

cursor_name

cursor_emp

异常标志

e_name

e_too_many

表类型

name_table_type

emp_record_type

name_table

emp_table

记录类型

name_record

emp_record

绑定变量

g_name

g_year_sal

 

 

 

控制结构

六、     PL/SQL支持的流程控制结构:

条件控制

     IF 语句

     CASE 语句

循环控制

     LOOP 循环

     WHILE 循环

     FOR 循环

顺序控制

     GOTO 语句

     NULL 语句

 

--方法二

DECLARE

       grade NUMBER:=70;

       remark varchar2(20);

BEGIN

       CASE

            WHEN grade=100 THEN remark:='isExcellent';

            WHEN grade>=80  THEN remark:='is Good';

            WHEN grade>=60  THEN remark:='is Normal';

            WHEN grade>=50 THEN remark:='isBad';

            ELSE remark:='big Problem';

       END CASE;

END;

 

--方法一

DECLARE

       grade char:='A';

       remark varchar2(20);

BEGIN

       CASE grade

            WHEN 'A' THEN remark:='is Excellent';

            WHEN 'B' THEN remark:='is Good';

            WHEN 'C' THEN remark:='is Normal';

            WHEN 'D' THEN remark:='is Bad';

            ELSE remark:='big Problem';

       END CASE;

END;

 

七、     异常处理

     在运行程序时出现的错误叫做异常

     发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分

     异常有两种类型:

     预定义异常 -  当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发

     用户定义异常 -  用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

 

 

异常处理

     预定义异常

            说  明

ACCESS_INTO_NULL

视图给一个没有初始化的对象赋值

DUP_VAL_ON_INDEX

重复的值存储在使用唯一索引的数据库列中

INVALID_NUMBER

视图将一个非有效的字符串转换成数字

LOGIN_DENIED

使用无效的用户名和口令登录Oracle

NO_DATA_FOUND

语句无返回数据

TOO_MANY_ROWS

在执行SELECT INTO语句后返回多行时出现

 

 

八、     游标(CURSOR)

用来处理使用select语句从数据库中检索到的多行记录的工具

游标的分类

显示游标

返回多条记录时,使用显示游标逐行读取

隐式游标

PL/SQL自动为DML语句创建隐式游标,包含一条返回记录

 

 

游标的属性

 

属性名称

说  明

%found

用于检验游标是否成功,通常在FETCH语句前使用,当游标按照条件查询出一条记录时,返回true

%isopen

判断游标是否处于打开状态,视图打开一个已经打开或者已经关闭的游标,将会出现错误

%notfound

与%found的作用相反,当按照条件无法查询到记录时,返回true

%rowcount

循环执行游标读取数据时,返回检索出的记录数据的行数

 

游标的声明

CURSOR:用于声明一个游标

parameter:可选参数,用于指定参数类型、模式等

return:可选,指定游标的返回类型

selectsql:需要处理的select语句,不能含INTO子句

 

CURSORcursor_name [ ( parameter [ , parameter]……)]

[RETURN return_type ] IS selectsql

 

 

打开游标

 

使用OPEN语句开启一个游标:open cursor_name

提取游标:FETCH cursor_name INTO variable_list

使用FETCH语句实现对游标内容的读取

variable_list必须与从游标提取的结果集类型相同

 

关闭游标:close cursor_name

使用CLOSE语句关闭一个游标

关闭游标后,所有资源都将被释放

 

使用显式游标更新行

允许使用游标删除或更新活动集中的行

声明游标时必须使用 SELECT … FOR UPDATE语句

              CURSOR <cursor_name> IS

             SELECT statement FOR UPDATE;

然后可以使用以下语法更新行

            UPDATE <table_name>

                    SET <set_clause>

            WHERE CURRENT OF <cursor_name>

也可以使用以下语句删除行

DELETEFROM <table_name>

WHERECURRENT OF <cursor_name>

 

 

 

九、     子程序

命名的 PL/SQL 块,编译并存储在数据库中。

子程序的各个部分:

声明部分

可执行部分

异常处理部分(可选)

子程序的分类:

过程 - 执行某些操作

函数 - 执行操作并返回值

 

 

 

十、     创建存储过程

CREATE[OR REPLACE] PROCEDURE

   <procedure name> [(<parameterlist>)]

IS|AS

   <local variable declaration>

BEGIN

   <executable statements>

[EXCEPTION

   <exception handlers>]

END;

 

调用存储过程

EXEC[UTE]procedure_name(parameters_list);

参数传递的三种方式?

按位置传递参数

按名称传递参数

混合方式传递参数

 

 

存储过程传递参数有哪三种模式?

IN

用于接受调用程序的值

默认的参数模式

OUT

用于向调用程序返回值

IN OUT

用于接受调用程序的值,并向调用程序返回更新的值

 

 

存储过程的访问权限和删除存储过程

如何将过程的执行权限授予其他用户?

SQL>GRANT EXECUTE ON find_emp TO MARTIN;

SQL>GRANT EXECUTE ON swap TO PUBLIC;

删除存储过程的语法是什么?

DROPPROCEDURE procedure_name;

 

十一、        学员操作——使用存储过程技术完善需求

需求说明

1 .根据输入的员工编号,解雇相应的员工

2.创建输出参数为薪水集合的存储过程,调用并显示所有员工薪水

                      要求:存储过程输出参数为薪水集合

使用游标作为输出参数

        SYS_REFCURSOR类型是Oracle提供的系统游标类型

                关键代码:

CREATEOR REPLACE PROCEDURE get_sals

           (cur_salary OUT SYS_REFCURSOR)

AS

BEGIN

       OPEN cur_salary FOR

             SELECT empno,sal FROM emp;

END;

 

PL/SQL是过程语言与结构化查询语言结合而成的编程语言

PL/SQL块由声明部分、可执行部分和异常处理部分组成

PL/SQL数据类型包括标量数据类型、LOB 数据类型和属性类型

控制结构包括条件控制、循环控制和顺序控制

运行时出现的错误叫做异常

异常可以分为预定义异常和用户定义的异常

 

 

游标用于处理查询结果集中的数据

显式游标用于处理返回多行的查询

显式游标可以删除和更新活动集中的行

要处理结果集中所有记录时,可使用循环游标

子程序是命名的 PL/SQL 块,可带参数并可在需要时随时调用

有两种类型的PL/SQL子程序,即过程和函数

过程用户执行特定的任务

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值