庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

PL/SQL学习笔记(一)

Posted on 2007-02-11 19:52 dennis 阅读(1001) 评论(0)  编辑  收藏 所属分类: 数据库技术

断断续续学过,这次系统地来读读。

(一)

PL/SQL是oracle在标准SQL语言上的过程性扩展,它不仅允许嵌入SQL语句,而且允许定义变量和常量,允许过程语言结构(条件语句和循环语句),允许使用异常处理oracle错误等。通过使用PL/SQL,可以在一个PL/SQL块中包含多条SQL语句和PL/SQL语句。PL/SQL具有以下优点:

1。提高应用系统的运行性能。

通过使用PL/SQL块包含多条SQL语句,从而减少了SQL语句的发送次数,降低了网络开销,提高了应用程序性能

2。提供模块化的程序设计功能。

将企业规则和商业逻辑集成到PL/SQL子程序当中,提供给客户端调用,简化了客户端应用程序的开发和维护工作,降低了耦合度

3。允许定义标识符,允许定义变量、常量、游标和异常等标识符

4。具有过程语言控制结构,允许使用条件分支语句和循环语句

5。具有良好的兼容性,在允许运行oracle的任何平台上执行,不仅在数据库服务端执行,也可以在oracle提供的工具中开发PL/SQL

6。处理运行错误,使用PL/SQL提供的EXCEPTION,开发人员可以集中处理各种oracle错误和PL/SQL错误,简化了错误处理。

(二)

PL/SQL块的概念:

Block是PL/SQL的基本单元,编写PL/SQL本质上就是编写PL/SQL块,块的嵌套层次没有限制。

1。块的结构:块由3部分组成

 

DECLARE  

  定义部分——定义常量,变量,游标,异常,复杂数据类型等

BEGIN

  执行部分

EXCEPTION

  异常处理部分

END /* 块结束标志 */

 

其中只有执行部分是必须的!

2。分类:

1)匿名块,匿名块是指没有名称的PL/SQL块,可以内嵌到应用程序中,如:

declare
    v_name 
VARCHAR2 ( 10 );

BEGIN
    
select  name  into  v_name  from  test  where  name =& no;
    dbms_output.put_line(
' 名字: ' || v_name);
    EXCEPTION
    
WHEN  NO_DATA_FOUND  THEN
    dbms_output.put_line(
' 找不到该名字 ' );
end ;


2)命名块:与匿名块相似,使用命名块主要是为了区分多级嵌套关系,如:

<< out >>

declare
    v_name 
VARCHAR2 ( 10 );

BEGIN

    
<< inner >>

    
begin

           
null ;

    
end ;

    
-- <<inner>>

    
    
select  name  into  v_name  from  test  where  name =& no;
    dbms_output.put_line(
' 名字: ' || v_name);
    EXCEPTION
    
WHEN  NO_DATA_FOUND  THEN
    dbms_output.put_line(
' 找不到该名字 ' );
end -- <<outer>>


3)子程序,又可以分成3种:过程、函数和包

A。过程用于执行特定操作,当建立过程时既可以指定输入参数,也可以指定输出参数,从而在应用环境和程序间传递数据,使用CREATE PROCEDURE语句,如:

  create   or   replace   PROCEDURE  update_test(id2  NUMBER ,money2  LONG )
 
is
    e_no_row EXCEPTION;
 
begin
    
update  test  set   money = money2  where  id = id2;
    
if  SQL % NOTFOUND  THEN
      RAISE e_no_row;
    
end   if ;
 EXCEPTION
    
WHEN   e_no_row  THEN
      raise_application_error(
- 20004 , ' 该test不存在 ' );
 
end  update_test;


B)函数,与过程主要不同是函数需要返回数据,在函数头和函数体都必须有RETURN语句,如:

 

create   or   replace   FUNCTION  get_long(name2  VARCHAR2 )
RETURN   LONG   IS
  avg_money 
NUMBER ;
begin
  
select   money   into  avg_money  from  test  where  name = name2;
  
RETURN  avg_money;
end ;  

 

C)包,类似JAVA包的概念,包含两部分,包规范和包体,包规范相当于C++中的头文件声明子程序,而包体包含这些子程序的具体实现。调用包中的子程序时,需要 ‘包名.子程序名’ 这样的形式调用

4。触发器是指隐含执行的存储过程,定义触发器需要指定触发事件和触发操作,常见触发事件如insert,update,delete等,使用CREATE TRIGGER命令建立


只有注册用户登录后才能发表评论。


网站导航: