玩转 oracle 实战教程 (第六天)
内容介绍
1.上节回顾
2.pl/sql 的介绍 √
3.pl/sql 的基础 √
期望目标
1.理解 oracle 的 pl/sql 概念
2.掌握 pl/sql 编程技术 (包括编写过程、函数、触发器...)
pl/sql 的介绍
pl/sql 是什么
pl/sql(procedural language/sql)是 oracle 在标准的sql 语言上的扩展。
pl/sql 不仅允许嵌入 sql 语言,还可以定义变量和常量,允许使用条件语句和
循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加
大。
看图:
为什么学 pl/sql
学习必要性ν
1.提高应用程序的运行性能
2.模块化的设计思想 【分页的过程,订单的过程,转账的过程。。】
3.减少网络传输量
4.提高安全性 (sql 会包括表名,有时还可能有密码,传输的时候会泄露。PL/SQL
就不会)
为什么 PL/SQL 会快呢?看图:
不好的地方:
移植性不好 (换数据库就用不了),
用什么编写 pl/sql
sqlplus 开发工具ν
sqlplus 是 oracle公司提供的一个工具,这个因为我们在以前介绍过的:
举一个简单的案例:
编写一个存储过程,该过程可以向某表中添加记录。
1.创建一个简单的表
Sql 代码
1. create table mytest(name varchar2(30),passwd varchar2(30));
----------------------- Page 66-----------------------
2.创建过程
Sql 代码
1. create or replace procedure sp_pro1 is
2. begin--执行部分
3. insert into mytest values('韩顺平','m1234');
4. end;
5. /
replace:表示如果 有sp_pro1,就替换
如何查看错误信息:show error;
如何调用该过程:
1)exec 过程名 (参数值 1,参数值 2...);
2)call 过程名 (参数值 1,参数值 2...);
pl/sqlν developer开发工具
pl/sql developer 是用于开发 pl/sql 块的集成开发环境(ide),它是一个独立
的产品,而不是oracle 的一个附带品。
举一个简单案例:
编写一个存储过程,该过程可以删除某表记录。
Sql 代码
1. create or replace procedure sp_pro2 is
2. begin--执行部分
3. delete from mytest where name='韩顺平';
4. end;
pl/sql 基础
pl/sql 介绍
介绍ν
开发人员使用pl/sql 编写应用模块时,不仅需要掌握 sql 语句的编写方法,
还要掌握 pl/sql 语句及语法规则。pl/sql 编程可以使用变量和逻辑控制语句,
从而可以编写非常有用的功能模块。比如:分页存储过程模块、订单处理存储过
程模块、转账存储过程模块。而且如果使用pl/sql 编程,我们可以轻松地完成
非常复杂的查询要求。
pl/sql 可以做什么
简单分类ν
|————过程 (存储过程)
|
|————函数
----------------------- Page 67-----------------------
块 (编程)————— |
|————触发器
|
|————包
编写规范
编写规范ν
1.注释
单行注释 --
Sql 代码
1. select * from emp where empno=7788; --取得员工信息
多行注释 /*...*/来划分
2.标志符号的命名规范
1).当定义变量时,建议用 v_作为前缀 v_sal
2).当定义常量时,建议用 c_作为前缀 c_rate
3).当定义游标时,建议用_cursor 作为后缀 emp_cursor
4).当定义例外时,建议用 e_作为前缀 e_error
pl/sql 块介绍
介绍ν
块 (block)是 pl/sql 的基本程序单元,编写 pl/sql 程序实际上就是编写
pl/sql 块,要完成相对简单的应用功能,可能只需要编写一个pl/sql 块,但是
如果想要实现复杂的功能,可能需要在一个pl/sql 块中嵌套其它的 pl/sql块。
块ν结构示意图
pl/sql 块 由三个部分构成:定义部分,执行部分,例外处理部分。
如下所示:
declare
/*定义部分——定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分——要执行的pl/sql 语句和 sql 语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
定义部分是从 declare 开始的,该部分是可选的;
执行部分是从 begin 开始的,该部分是必须的;
例外处理部分是从 exception 开始的,该部分是可选的。
可以和 java 编程结构做一个简单的比较。
pl/sql 块的实例(1)
实例 1-只包括执行部分的pl/sql 块ν
----------------------- Page 68-----------------------
Sql 代码
1. set serveroutput on --打开输出选项
2. begin
3. dbms_output.put_line('hello');
4. end;
相关说明:
dbms_output 是 oracle所提供的包 (类似 java 的开发包),该包包含一些过程,
put_line 就是 dbms_output包的一个过程。
pl/sql 块的实例(2)
实例 2-包含定义部分和执行部分的pl/sql 块ν
Sql 代码
1. declare
2. v_ename varchar2(5); --定义字符串变量
3. begin
4. select ename into v_ename from emp where empno=&aa;
5. dbms_output.put_line('雇员名:'||v_ename);
6. end;
7. /
如果要把薪 也显示出来,那么执行部分就应该这么写:
Sql 代码
1. select ename,sal into v_ename,v_sal from emp where empno=&aa;
相关说明:
& 表示要接收从控制台输入的变量。看图:
pl/sql 块的实例(3)
实例 3-包含定义部分,执行部分和例外处理部分ν
为了避免 pl/sql 程序的运行错误,提高pl/sql 的健壮性,应该对可能的错误
进行处理,这个很有必要。
1.比如在实例 2 中,如果输入了不存在的雇员号,应当做例外处理。
2.有时出现异常,希望用另外的逻辑处理,[网示]
我们看看如何完成 1 的要求。
相关说明:
oracle事先预定义了一些例外,no_data_found 就是找不到数据的例外。
Sql 代码
----------------------- Page 69-----------------------
1. declare
2. --定义变量
3. v_ename varchar2(5);
4. v_sal number(7,2);
5. begin
6. --执行部分
7. select ename,sal into v_ename,v_sal from emp where empno=&a
a;
8. --在控制台显示用户名
9. dbms_output.put_line('用户名是:'||v_ename||' 工资:'||v_sal);
10. --异常处理
11.exception
12.when no_data_found then
13. dbms_output.put_line('朋友,你的编号输入 误 !');
14.end;
15./
----------------------- Page 70-----------------------
17.pl/sql 分类分类 -- 过程过程,函数,函数,包,包,,触发器触发器
分类分类 过程过程,,函数函数,,包包,,触发器触发器
过程ν
过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指
定输出参数(out), 通过在过程中使用输入参数,可以将数据传递到执行部分;
通过使用输出参数,可以将执行部分的数据传递到应用环境。在 sqlplus 中可以
使用 create procedure 命令来建立过程。
实例如下:
1.请考虑编写一个过程,可以输入雇员名,新工资,可修改雇员的工资
2.如何调用过程有两种方法; exec call
3.如何在 java程序中调用一个存储过程
问题:如何使用过程返回值?
特别说明:
对于过程我们会在以后给大家详细具体的介绍,现在请大家先有一个概念。
create procedure sp_pro3(spName varchar2, newSal number) is
--不要写成number(3,2),表明类型就可以了,不需要大小。就好像 Java 写方法
时的参数一样
Sql 代码
1. begin
2. --执行部分,根据用户名去修改工资
3. update emp set sal=newSal where ename=spName;
4. end;
5. /