oracle基础学习4ppt概要
第四章 PL/SQL语言基础,PL/SQL语言简介,SQL语言只是用来作为对数据库的一种访问语言,而不是程序设计语言。PL/SQL(Procedural Language/SQL)是Oracle在标准的SQL语言上进行过程性扩展后形成的程序设计语言。 在PL/SQL的应用上,可以使用过程、函数、程序包、触发器等,为设计复杂的数据库应用程序提供了可能。,PL/SQL的优点或特征,后端开发工具 更好的性能 过程化 模块化 可移植性和兼容性 可维护性 易用性 可处理运行错误 大量的内置程序包,PL/SQL块,PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分:声明部分、执行部分、异常处理部分。 块的三个部分 声明部分(Declaration section) 声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分。 执行部分(Executable section) 执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 异常处理部分(Exception section) 这一部分是可选的,在这一部分中处理异常或错误。,PL/SQL 块的格式如下: DECLARE BEGIN EXCEPTION END PL/SQL块的书写必须遵循如下规定: (1)PL/SQL块的每一条语句都必须以分号“;”结束; (2)SQL语句可以是多行的,但分号表示该语句的结束。 (3)一行中可以有多条SQL语句,它们之间以分号分隔。 (4)每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。 (5)语句的注释由“-”标示。,PL/SQL块的类型,PL/SQL程序块的种类分为:命名块;匿名块;子程序;触发器。其中子程序包括:函数,过程和程序包。 匿名块可以用在服务器端也可以用在客户端。匿名块是只使用一次PL/SQL程序块,匿名块没有名称,也不被存储在数据库中。 【例】匿名块例子。 SET SERVEROUTPUT ON DECLARE -目前没有变量要定义 BEGIN dbms_output.put_line('hello world!'); END;,块的执行 SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行。 命名的程序与匿名程序的执行不同,执行命名的程序块必须使用execute关键字。 如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要EXECUTE关键字。,常量与变量,1、变量 (1)声明变量 声明变量的语句格式如下: Variable_name CONSTANT datatype NOT NULL:=value_ expression 其中, Variable_name是要声明的变量、常量的名称; datatype是指定的数据类型;:=是赋值运算符; value_ expression是赋予的值;如果有CONSTANT则表明声明的是一个常量;如果有NOT NULL,则表示声明的变量不能为空(即在声明时就必须赋值);如果没有赋值则表示初始化为NULL。,(2)给变量赋值 给变量赋值有两种方式: 直接给变量赋值,使用赋值运算符:= 通过SELECT INTO 或FETCH INTO给变量赋值,2、常量 常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。 为了减少这部分程序的修改,编程时使用%TYPE、%ROWTYPE方式声明变量,使变量声明的类型与表中的保持同步,随表的变化而变化,这样的程序在一定程度上具有更强的通用性。,PL/SQL的数据类型,基本数据类型,属性类型 用于引用数据库列的数据类型,以及表示表中一行的记录类型 属性类型有两种: %TYPE - 引用变量和数据库列的数据类型 %ROWTYPE - 提供表示表中一行的记录类型 使用属性类型的优点: 不需要知道被引用的表列的具体类型 如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变,使用%type定义变量 %type 类型定义的变量是“不知道”的类型变量。这个变量的类型与表中字段的类型是一致。为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 提供了%type定义方法。 语法格式如下: %TYPE; 其中,如果是如下形式: %TYPE; 表明和的类型是相同的。 例如: 例: V_NAME EMP.ENAME%TYPE; 但是当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也自动修改。,一个使用%type的例子:,使用%rowtype定义变量 前面讲过,使用%type可以使变量获得字段的数据类型,但是使用%rowtype可以使变量获得整个记录的数据类型。 二者在定义上也不同,%rowtype的语法格式是: %rowtype; %rowtype的属性如下: (1)与%TYPE作用类似,用于定义不确定的类型。 (2)变量类型将定义为由数据库的表的字段集合构成的RECORD类型。 (3)%rowtype的前缀是数据库的表名,或者另一个已经定义好的RECORD变量。 (4)RECORD中的域,与表的字段的名称和数据类型完全相同。,一个使用%rowtype的例子:,记录类型(RECORD),PL/SQL提供了将几个相关的、分离的基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型。类似于C语言中的STRUCTURE结构体。 如果需要从数据库中读取相应的数据,并进行处理时,需要把读取到的数据存储到指定的变量以方便处理,但如果需要一次把一行记录中的多列的数据读取出来,并用于处理时,应用一般的变量则不能方便地实现,此时需要应用RECORD类型。 记录类型的定义语法格式如下所示: TYPE 记录类型名称 IS RECORD (字段名1 数据类型, 字段名2 数据类型, );,一个使用RECORD的例子:,键盘输入和屏幕输出,键盘输入是通过在变量名前面加一个“&”符号实现的,如:&V_INPUT。如果此变量是数值型(如:number,integer等),在提示输入时直接输入数据;如果此变量是字符型(如:varchar2()等),有两个办法输入: 如果书写时是:&V_INPUT,那么输入时要加单引号“'”把字符串引起来; 如果书写时是:'&V_INPUT',那么输入时不要加单引号,直接输入字符串。 屏幕输出是通过dbms_output.put_line函数输出的。dbms_output.put_line()语句是Oracle 内置的包,它可以使用SQL*Plus 从PL/SQL中输出信息。 如:dbms_output.put_line(VARP)。,条件控制,IFTHEN END IF语句 语法: IF condition THEN END IF,IFTHENELSEEND IF语句 语法: IF condition THEN ELSE END IF 如果条件condition为TRUE,则执行THEN到ELSE之间的语句,否则执行ELSE到END IF之间的语句。,IFTHENELSIFEND IF语句 语法: IF condition1 THEN ELSIF condition2 THEN ELSIF condition3 THEN ELSE END IF;,CASE 语句,CASE语句有两种格式: 第1种形式: CASE WHEN 条件表达式1 THEN 语句段1 WHEN 条件表达式2 THEN 语句段2 ELSE 语句段n END CASE;,第2种形式:CASE语句的基本格式如下: CASE条件表达式 WHEN 条件表达式结果1 THEN 语句1; WHEN条件表达式结果2 THEN 语句2; ELSE 语句n; END CASE; CASE语句的功能:首先设定CASE条件表达式,然后顺序检查表达式,一旦从中找到与条件匹配的表达式的值,就停止CASE语句的处理。,循环控制,1 LOOPEXIT WHENEND LOOP循环控制 循环控制语法格式为: LOOP EXIT WHEN ; END LOOP;,2WHILELOOPEND LOOP循环控制 WHILE循环控制的语法如下: WHILE 条件 LOOP 执行语句段; END LOOP; WHILE循环语句首先执行条件表达式的值,如果其值为TRUE,则执行循环体内的语句段,然后再次循环,直到条件表达式的值为FALSE或NULL时才跳出循环,继续执行该循环体之后的语句。,3FORLOOPEND LOOP循环控制 FORLOOPEND LOOP循环的格式是: FOR counter IN start_rangeend_range LOOP ; END LOOP; 其中: (1)counter是循环变量。 (2)start_range是循环变量的起始值,end_range是循环变量的终止值。 (3)如果要退出FOR循环可以使用EXIT语句。,PL/SQL支持隐含声明循环变量,即用户不需要在PL/SQL的声明部分中声明一个循环变量。隐含声明的循环变量为整数。隐含声明的循环变量只在循环体内生效,循环结束后就释放了。,顺序控制,顺序控制是一种最简单的控制结构。有时为了不再顺序执行程序,将当前的程序跳转到另一个地方继续运行,需要使用顺序控制。 顺序控制中用得到的语句有GOTO语句和NULL语句。 GOTO语句 GOTO语句的语法格式是: GOTO 标签 GOTO语句是一条无条件跳转语句,它能实现语句从一处无条件地跳转到一个用标签指定的语句。GOTO语句一般用在从一个PL/SQL 块中跳转到异常处理语句的前面。,NULL语句 NULL的语法格式是: NULL; NULL语句是一个可执行语句,但它是不执行任何操作的空语句或占位语句,即它什么操作也不做就将控制交给下一个语句。,异常处理,在设计PL/SQL程序时,经常会发生这样或那样的错误。 程序错误: -编译时 -运行时 异常: -处理运行时错误 异常处理就是针对运行时错误进行处理的程序段,Oracle的异常处理分为: 预定义的异常;非预定义的异常;用户自定义异常。,异常处理块中包含了与异常相关的错误发生以及当错误发生时要进行执行和处理的代码。异常部分的语法一般如下: BEGIN EXCEPTION WHEN excep_name1 THEN WHEN excep_name2 THEN WHEN OTHERS THEN END; 其中和都是异常名称。,1 系统预定义异常,2非预定义异常错误 预定义的异常错误是有限的(大约20个),实际上在编写PL/SQL程序时可能会遇到各种各样的错误。Oracle 定义了几千个异常,绝大多数只有错误编号和相关描述,仅仅命名了若干个最常被用到的异常 。 可以使用pragma exception_init(exception_name,oracle_error_code)来将这些只有错误编号和相关描述的异常关联一个名字,然后就可以像对待预定义异常一样对待它了。 pragma _exception_init 是一个编译时运行的函数,它只能出现在代码的声明部分,而异常名字必须在此之前被定义。 也可以在异常处理最后的WHEN OTHERS子句中使用内置异常错误函数SQLCODE和SQLERRM。,3自定义异常 异常不一定必须是Oracle返回的系统错误,用户可以在自