PL/SQL编程学习笔记
显示执行结果
1 | set serveroutput on; |
INSERT
1 | DECLARE v_dept dept%ROWTYPE; |
UPDATE
1 | DECLARE v_dept dept%ROWTYPE; |
DELECT
1 | DECLARE v_emp emp%ROWTYPE; |
基础语句(SELECT)
1 | DECLARE --声明部分 |
- dbms_output == System.out
- put_line == println
- || == +
- := 赋值符号
- 执行结果:
%TYPE的使用
自动匹配对应行的数据类型以及长度
1
2
3
4
5
6
7
8
9DECLARE
v_name emp.ename%TYPE; --自动给v_name匹配ename的类型
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno=7788;
dbms_output.put_line('员工的名字:'||v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('找不到这个员工');
END;执行结果:
%ROWTYPE的使用
- TYPE只能一行一行地匹配类型,当我们查找多个数据时要写很多,不是很方便,所以这里我们使用%ROWTYPE来一次性匹配表里所有的行地类型
1 | DECLARE |
- 执行结果:
游标(类似java中的迭代器)
- 游标的作用:游标通常用于处理多行记录的事务
- 游标里面存储了查询到的结果集,相当于一个工作区域
- 游标的分类:显式游标、隐式游标、REF游标
隐式游标
在PL/SQL中执行DML SQL时会自动创建隐式游标
显式游标
显式游标可用于处理返回多行数据的查询
REF游标
用于在处理运行时才能确定的动态SQL查询的结果
使用游标的步骤
- 声明游标
- CURSOR cur_emp IS SELECT * FROM emp;
- 打开游标
- OPEN cur_emp;
- 提取游标数据
- FETCH cur_emp INTO v_emp;
- 关闭游标
- CLOSE cur_emp;
游标(简单循环)
游标的作用:可以用于处理多行事务
1
2
3
4
5
6
7
8
9
10
11
12DECLARE
CURSOR cur_emp IS SELECT * FROM emp; --声明游标
v_emp emp%ROWTYPE;
BEGIN
OPEN cur_emp; --执行游标
LOOP -- 简单循环
FETCH cur_emp INTO v_emp; --提取游标中的数据放到变量中
EXIT WHEN cur_emp%NOTFOUND; --%NOTFOUND游标地属性,循环推出的条件
dbms_output.put_line('员工名字:'||v_emp.ename||',薪水:'||v_emp.sal);
END LOOP; --循环停止
CLOSE cur_emp; --关闭游标
END;执行结果:
WHILE循环
1 | DECLARE |
- 执行结果:
FOR循环
1 | DECLARE |
- 执行结果:
函数(命名块)
- 函数可以重复使用
- 函数实际上是封装在服务器上一段PLSQL代码片段。
- 当函数没有参数时,可以不用加函数名后面的括号。
函数的语法
1 | CREATE [OR REPLACE] FUNCTION function_name |
函数的定义
1 | CREATE OR REPLACE FUNCTION f1(v_count NUMBER) --定义函数的名称以及数据类型 |
函数的使用
1 | SELECT f1('数据') from 表名; |
通过这种方式可以简单多次使用函数中所封装的内容
异常处理
实例
1 | DECLARE |
- 执行结果:
预定义异常(有名称有编号的异常)
- oracle官方已经写好的异常,在出现异常时我们可以直接使用,如:
- NO_DATA_FOUND :没有找到数据
- TOO_MANY_ROWS:一个SELECT INTO语句匹配了多行数据
- ZERO_DIVIDE:除数为0
非预定义异常(有编号没有名称的异常)
- 有一些异常,官方给他们分配了编号,但是没有为他们关联处理的方法,所以这是我们就需要自己定义一个异常,并与他的编号进行关联,才可以进行异常的处理。
用户定义异常(啥都没有的异常)
- 用户定义异常编号范围:-20999~-20000
- 用户定义异常是指,有些操作并不会产生Oracle错误,但是从业务规则角度考虑,认为是一
种错误。例如,执行UPDATE操作没有更新任何行时,不会引发Oracle错误,也不会产生异
常,但是,有时需要开发人员为此操作产生一个异常,以便进行处理,即用户定义异常。 - 用户自定义异常要对异常进行捕捉并抛出(RAISE)
检验字符串是否可以转换成数值型(函数+异常处理)
- to_number函数:类型转换函数可以将字符串转换成数字
1 | CREATE OR REPLACE FUNCTION f1(v_num VARCHAR2) --定义函数 |
存储过程(命名块)
- 存储过程的语法与函数类似
- 创建存储过程可以理解为相当于函数中的FUNCTION function_name 更换成PROCEDURE procedure_name
- 两者其他部分都差不多
存储过程的语法
- 定义:
1 | CREATE [OR REPLACE] PROCEDURE procedure_name |
- 调用
1 | BEGIN |
例子
1 | CREATE OR REPLACE PROCEDURE proc_transfer(v_empno NUMBER) |
定义一个存储过程,用于查询员工的工资
使用:
1 | BEGIN |
结果:
分页查询(SQL)
实例
1 | SELECT * |
分页存储过程
1 | CREATE OR REPLACE PROCEDURE proc_page( |