PL/SQL编程及Oracle体系结构

一、什么是PL/SQL?

1、PL/SQL的概念

PL/SQL(Procedural Language/SQL、过程语言/SQL)是结合了Oracle过程语言结构化查询语言(SQL)的一种扩展语言。具体地讲,PL/SQL就是在普通SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。

2、PL/SQL体系结构

PL/SQL引擎用来编译和执行PL/SQL块或子程序,该引擎驻留在Oracle服务器中。PL/SQL引擎执行过程语句,而将SQL语句发送给Oracle服务器上的SQL语句执行器,由SQL语句执行器执行这些SQL语句。PL/SQL体系结构如下:

3、PL/SQL块简介

PL/SQL 是一种块结构的语言,它将一组语句放在一个块中。PL/SQL程序由3个块组成:声明部分、执行部分、异常处理部分。

PL/SQL块的结构:

DECLARE
  --声明部分:在此声明PL/SQL的变量、类型及游标,以及局部的存储过程和函数。
BEGIN
  --执行部分:过程及SQL语句,是程序的主要部分,不可省略
[EXCEPTION]
  --执行异常处理部分:错误处理,可选
END;

(1)PL/SQL块分类

(2)PL/SQL编码标准

(3)常量和变量(constant)的声明

PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同,要求和限制如下:

①标识符名不能超过30个字符

②第一个字符必须为字母

③不分大小写

④不能用减号(-)

⑤不能是SQL保留字

命名——建议的命名方法如下:

给变量和常量声明赋值:

方法一:通过select...into...给变量赋值

DECLARE
  v_name VARCHAR2(10);
BEGIN
  SELECT stuName INTO v_name FROM Student WHERE stuNo=1001;
  dbms_output.put_line(v_name);
END;

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

二、数据类型及其用法

1、标量数据类型

标量数据类型包含单个值,没有内部组件。变量数据类型包括数字、字符、布尔值和日期时间值4类数据类型

2、LOB数据类型

Oracle提供了LOB(Large Object)类型,用于存储大的数据对象的类型。Oracle目前主要支持BFILE、BLOB、CLOB及NCLOB。

3、属性类型

属性用于引用变量数据库列的数据类型,以及表示表中一行的记录类型。PL/SQL支持一下两种属性类型:

①%type

②%rowtype

③复合类型。

4、注释

就像其他的高级开发语言一样,为了使PL/SQL程序具有良好的可读性和可维护性,我们在写程序的时候应该注意向程序中添加注释。注释有以下两种形式:

(1)行注释

--    作用范围是一行。

(2)块注释

/*     */     注释一行或多行。

三、控制语句

PL/SQL程序可通过控制结构来控制命令执行的流程。标准的SQL没有流程控制的概念,PL/SQL提供了丰富的流程控制语句。包括:条件控制、循环控制、顺序控制。

1、条件控制

用于根据条件执行一系列语句。条件控制包括IF语句和CASE语句。

IF语句用法:

CASE语句用法:

2、循环控制

用于重复执行一系列语句。循环控制包括LOOP和EXIT语句,使用EXIT语句可以立即退出循环,使用EXIT WHEN语句可以根据条件结束循环。

在FOR循环中,每循环一次,循环变量自动加1:使用关键字REVERSE,循环变量自动减1,跟在IN REVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。

3、顺序控制

DECLARE
  v_number NUMBER(2):=1;
BEGIN
  LOOP
      dbms_output.put_line('v_number的值现在为:'||v_number);
      v_number:=v_number+1;
      IF (v_number>10)THEN 
        GOTO LabelOffLoop;--跳转到标签为LabelOffLoop的行
      ELSE
        NULL;--为了使语法有意义,去掉null会报语法错误
      END IF;
  
  END LOOP;
  
  <<LabelOffLoop>>--标签
      dbms_output.put_line('循环跳转到此处结束!');
END;

四、错误处理

1、预定义错误

Oracle预定义的异常情况大约有24个。对于这种异常情况的处理,无需在程序中定义,由Oracle自动将其引发。参照下表:

DECLARE
  v_number NUMBER(2):=1;
BEGIN
  v_number:=1/0;
EXCEPTION 
 -- WHEN zero_divide THEN
 --   dbms_output.put_line('0被作为除数了!');
  WHEN OTHERS THEN 
     dbms_output.put_line('发生了异常!');
END;
/*
其中OTHERS确保不会漏过任何异常,如果没有在前面的异常处理部分显示获取命名异常,它就可以获取其余的异常。
PL/SQL块只能有一个OTHERS异常处理程序。
*/

可以使用函数SQLCODE和SQLERRM来返回错误代码和错误文本信息。

DECLARE
  v_number NUMBER(2):=1;
BEGIN
  v_number:=1/0;
EXCEPTION 
  WHEN OTHERS THEN 
     dbms_output.put_line('错误代码:'||sqlcode);
     dbms_output.put_line('错误文本:'||SQLERRM);
END;

2、非预定义错误

3、用户自定义错误

DECLARE
  v_number NUMBER(2):=1;
  out_of_index EXCEPTION;--定义异常类型
BEGIN
  LOOP
      dbms_output.put_line('v_number的值现在为:'||v_number);
      v_number:=v_number+1;
      IF (v_number>10)THEN 
        RAISE out_of_index;--抛出异常情况
      ELSE
        NULL;
      END IF;
  
  END LOOP;
EXCEPTION
  WHEN out_of_index THEN 
  dbms_output.put_line('你已经越界了!!!');
END;

raise_application_error(error_number,error_message)的语法:

error_number表示用户为异常指定的编号。该编号必须是介于20000~20999之间的负整数。

error_message表示用户为异常指定的消息文本。消息长度可长达2048字节。错误消息是与error_number表示关联的文本。

DECLARE
  v_number NUMBER(2):=1;
BEGIN
  LOOP
      dbms_output.put_line('v_number的值现在为:'||v_number);
      v_number:=v_number+1;
      IF (v_number>10)THEN 
        raise_application_error(-20001,'你已经越界了!!!');
      ELSE
        NULL;
      END IF;
  END LOOP;
END;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值