玩转 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.  /   

 

posted on 2011-08-23 17:17  cnby  阅读(6116)  评论(0编辑  收藏  举报