第五章 PL/SQL编程

1、什么是PL/SQLPL/SQL的语法格式是什么?源码见“参考文献”

答:PL/SQL是一种过程化语言,在PL/SQL中可以通过IF语句或者LOOP语句实现控制程序的执行流程,甚至可以定义变量,以便在语句之间传递数据信息,这样PL/SQL语言就可以实现操控程序处理的细节过程。

整个PL/SQL块分为三部分:声明部分(用declare开头),执行部分(用BEGIN开头以END结尾),异常处理部分(以EXCEPTION开头)。语法格式如下:

     [DECLARE]

     --声明部分,可选

     BEGIN

     --执行部分,必须

     [EXCEPTION]

     --异常处理部分,可选

     END

示例是一个存储过程。


2PL/SQL语言如何进行注释?

答:单行注释:单行注释由连个连接字符“--”开始,后面紧跟着注释内容。

多行注释:多行注释由/*开头,由*/结尾,这个大多数编程语言是相同的。

PL/SQL字符集

所有的PL/SQL程序元素(比如,关键字、变量名、常量名等)都是由一些字符序列组合而成的,而这些字符序列中的字符都必须取自PL/SQL语言所允许使用的字符集,那么这些合法的字符集主要包括以下内容:

大写和小写字母:A-Z或a-z。

数字:0-9。

非显示的字符:制表符、空格和回车。

数学符号:+,-,*,/,>,<,=等。

间隔符:包括(),{},[],?,!,;,:,@,#,%,$,&等。

3、数值类型有哪些,如何定义变量

数据类型实际上是一种用于描述数据存储的内存结构,用它来决定变量中所存储数据的类型。

1).数值类型

     数值类型主要包括NUMBER、PLS_INTEGER和BINARY_INTEGER三种基本类型

2).字符类型

     字符类型主要包括VARCHAR2CHAR、LONG、NCHAR和NVARCHAR2等。这些类型的变量用来存储字符串或字符数据。

     注意:VARCHAR2存储32767个字节的数据,而char存储2000个字节

3).日期类型

     日期类型只有一个种——即DATE类型,用来存储日期和时间信息,DATE类型的存储空间是7个字节,分别使用一个字节存储世纪、年、月、天、小时、分钟和秒。DATE类型的存储空间只有7个字节。

4).布尔类型

     布尔类型也只有一种——即BOOLEAN,主要用于程序的流程控制和业务逻辑判断,其变量值可以是TRUE、FALSE或NULL中的一种。

以下为特殊字符类型:

5).%TYPE类型

     使用%TYPE关键字可以声明一个与指定列名称相同的数据类型,它通常紧跟在指定列名的后面。

示例:

declare

number_salemp.sal%type;

var_name emp.ename%type;

6).RECORD类型,单词record有“记录”之意,因此record类型也称为“记录类型”,使用该类型变量可以存储由多个列值组成的一行数据,其语法如下:

     type record_type is record

     (

        var_member1 data_type [not null] [:=default_value],

        …

        var_membern data_type [not null] [:=default_value])


7).%ROWTYPE类型,%rowtype类型的变量结合了%type类型和record类型变量的优点,它可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据。语法如下:

     rowVar_name table_name%rowtype;、

8) 定量和常量

  var_countryName varchar2(100):='中国';   --变量,初始化值为‘中国’

  var_day constantinteger :=365;          --常量,关键字为constant

4、流程控制语句有哪些?并举例说明。

答:

选择语句其语法为:

1).if…then语句

2).If…then…else语句

3).if…then…elsif语句

4).case语句

 

循环语句其语法为:

1.loop语句

loop

 plsql_sentence;

exit when end_condition_ exp

end loop;

2.while语句

while condition_expression loop

plsql_sentence;

end loop;

3.for语句

for variable_ counter_name in [reverse]lower_limit..upper_limit loop

plsql_sentence;

end loop;

  

5PL/SQL游标是什么?有什么用?如何使用?并举例说明

答:游标提供了一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发给服务器端的SQL语句,或是批处理、存储过程、触发器的数据处理请求。游标的作用相当于指针,通过游标PL/SQL程序可以一次处理查询结果集中的一行,并可以对该数据执行特定操作,从而为用户在处理数据的过程中提供很大的方便。通过游标操作数据主要使用的是显性游标和隐形游标。

a)      显示游标是由用户声明和操作的一种游标,通常用于操作查询结果集(即由SELECT语句返回的查询结果),使用它处理数据的步骤包括:声明游标、打开游标、读取游标和关闭游标4个步骤。


无论是显式游标还是隐式游标,都具有%found、%notfound、%isopen和%rowcount四个属性,通过这4个属性可以获知SQL语句的执行结果以及该游标的状态信息。下面对这4个属性的功能进行讲解。

(1)%found:布尔型属性,如果SQL语句至少影响到一行数据,则该属性为true,否则为fasle。

(2)%notfound:布尔型属性,与%found属性的功能相反。

(3)%rowcount:数字型属性,返回受SQL语句影响的行数。

(4)%isopen:布尔型属性,当游标已经打开时返回true,游标关闭时则为false。

--下面这个例子用于联系游标的使用,其中还包括record类型和%type类型的示例

declare

  cursor cursor_emp (var_jobinvarchar2:='SALESMAN')

  isselecte.empno,e.ename,e.jobfrom emp e where e.job=var_job;

  type record_empisrecord

  (

       var_empno emp.empno%type,

       var_empname emp.ename%type,

       var_job emp.job%type

  );

  emp_rows record_emp; 

begin

   open cursor_emp('MANAGER');

   fetch cursor_empintoemp_rows;

   while cursor_emp%foundloop

     dbms_output.put_line('员工名字'||emp_rows.var_empname||'员工职位:'||emp_rows.var_job);

     fetch cursor_empintoemp_rows;

   endloop;

   close cursor_emp;

end;

/

隐式游标:在执行一个SQL语句时,Oracle会自动创建一个隐式游标。这个游标是内存中处理该语句的工作区域。隐式游标主要是处理数据操纵语句(如,UPDATE、DELETE语句)的执行结果,当然特殊情况下,也可以处理SELECT语句的查询结果。由于隐式游标也有属性,当使用隐式游标的属性时,需要在属性前面加上隐式游标的默认名称——SQL。

--该示例用于隐式游标的测试

declare

begin

  update emp eset e.mgr=9527where e.empno=9527;

  ifsql%notfoundthen

     dbms_output.put_line('更新失败!');

  else

    dbms_output.put_line('更新成功!');

  endif;

end;

/

通过for语句循环游标:

1)在for语句中遍历隐式游标中的数据时,通常在关键字‘IN’的后面提供由select语句检索的结果集,在检索结果集的过程中,Oracle系统会自动提供一个隐式的游标SQL;

begin

  for emp_record in (selecte.empno,e.ename,e.job from emp e where e.deptno=30)

  loop

    dbms_output.put_line('员工名字'||emp_record.empno||'员工职位:'||emp_record.job);

  end loop;

end;

/

declare

  cursor cur_temp is

  select * from emp e where e.deptno=30;

begin

  for emp_record in cur_temp

  loop

    dbms_output.put_line('员工名字'||emp_record.ename||'员工职位:'||emp_record.job);

  end loop;

end;

/

6、异常处理

答:当PL/SQL程序违反了Oracle系统内部规定的设计规范时,就会自动引发一个预定义的异常,例如,当除数为零时,就会引发“ZERO_DIVIED”异常。

自定义异常:

1.错误编号异常

    错误号异常是指在Oracle系统发生错误时,系统会显示错误号和相关描述信息的异常,虽然直接使用错误编号也可以完成异常处理,但错误编号较为抽象,不易于用户理解和记忆,对于这种异常,首先在PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用语句PRAGMAEXCEPTION_INIT“错误编号”关联“这个异常变量名”,接下来就可以像对待系统预定义异常一样处理了。

2.业务逻辑异常

    在实际的应用中,程序开发人员可以根据具体的业务罗规则自定义一个异常。这样,当用户操作违反业务逻辑规则时,就引发一个自定义异常,从而中断程序的正常执行并转到自定义的异常处理部分。



参考文献:

1、《Oracle从入门到精通》 明日科技著。

2、源码资料:http://download.csdn.net/download/m0_37824308/9959545

3、PPT资料:http://download.csdn.net/download/m0_37824308/9959539




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值