oracle学习(十一)——PLSQL开发

PLSQL是数据库开发过程中的常用技能,本文主要介绍了PLSQL开发过程中的一些常用知识点,包括:块、过程、函数、触发器、变量、包、游标、基本语法、视图以及分页技术,在知识的广度上做了一些总结,另有一些常用的案例。

1、PLSQL基础:

可以用plsql进行过程、函数、触发器的编写等;

提高应用程序的运行性能:

传统的操作数据库的方法是:

Java将sql传给数据库,数据库编译这些语句才会进行查询,这个过程需要花一些时间,结果返回也需要一定的时间;

而用PLSQL开发时,写一个过程,这个过程之前已经编译好了,速度就会提上去;

减少网络传输量:

主要减少网络的交互量,一次传输。

PLSQL的特性:

1)过程、函数、触发器是由PLSQL编写的;

2)过程、函数、触发器是存放在oracle中的;

3)PLSQL是强大的数据库过程语言;

4)通过plsql写的函数、过程可以在java中调用;

他的不足之处在于:

移植性不好,oracle移植到DB2时,过程需要重新写;

举一个简单的案例:

此为最简单的一个过程;

如果过程有重名,则替换,语句为:

那么,如何调用该过程:

1)exec 过程名(参数1, 参数2);

2)call 过程名(参数1, 参数2);

此时在mytest表中就有了上面的内容。

如果用PLSQL开发,则为:

命令窗口下的editer选项卡为:

然后复制在对话框中执行:

基于上面的介绍,可以了解到一些plsql的介绍,对plsql进行一个深度了解:

Plsql编程的基础单位是:块;

编写规范:

2、块的结构:

块的示意图:

块与java程序结构的比较:

实例:

1)只包括执行部分的plsql块:

上面的put_line(“hello”)类似于java中的system.out.print();

2)包含定义部分和执行部分的plsql块:

Select ename into v_ename from emp whereempno=$no;

即将查出的值放入到v_ename中。

将上面的语句复制到对话框:

SQL>Setserveroutput on;

此时就会有输入框跳出来,输入参数后,就会执行上面的过程。

如果要输出多个结果,则可以按照顺序写下面的语句:

3)包含定义部分、执行部分和例外处理部分:

如果异常没有处理,则查找的条件没有结果,则会报错:

此时会报错,我们需要处理为:

3、过程:

上面块的变量放在declare与begin之间,如果构建processdure,则可以将变量定义在is与begin之间。

例如(小雪人上面的例子):

复制到对话框中,过程就会被创建;

对应的调用方式也已经给出。

在java中如何调用过程:

主要是使用{}来包裹过程的调用语句;

4、函数:

输入雇员的姓名,返回该雇员的年薪:

函数写完成后,执行,此时会在数据库中生成一个function,然后调用这个函数即可。

5、包:

实例:

执行这个包,就会提示包已建成。

下一步开始创建包体:

第一行中也可用:create or replace package………

那么,如何调用包的过程和函数:

调用时可以用call,也可以用exec调用函数。

6、触发器:

触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行,不需要人为的去调用,也不能调用;触发器的触发条件其实在你定义的时候就已经设定好了。

触发器可以分为:

语句级触发器:可以在某些语句执行前或执行后被触发

行级触发器:在定义了触发器的表中的行数据改变时就会被触发一次

触发器结构:

1)下面的触发器在更新表tb_emp之前触发,目的是不允许在周末修改表:

2)写一个复杂的触发器:

7、定义并使用变量:

标量(scalar):即类似于java中的变量。

举例说明:

例如:


上面定义的变量都是以固定的样式定义的,这样存在一定的问题,比如,姓名e_name长度为5,当长度超过这个值时,就会产生报错,为解决这个问题,可以将定义方式修改为:

v_ename emp.ename%type;

意思为:定义的类型长度与表emp中ename的字段长度一致;

复合变量:

现在主要用前两种:

1)pl/sql记录:类似于java中的类。

其中:

为一个type记录类型,名称为emp_record_type;

然后在下方定义一个emp_record_type的变量:

下面select中可以一次将三个数据一次放到sp_record字段中。

2)PL/SQL表:

实例:

如果去掉上面的where empno=7788字段,会报错,因为返回的值与sp_table(0)的结果不一致。

此时用到参照变量:

先介绍游标变量:

1)使用plsql编写的块,可以输入部门号,并显示该部门所有员工的姓名和他们的工资:

游标的功能即为,当查询出的数据为多条时,此时查询的结果需要一条条显示,就需要游标逐一遍历,一般会结合循环使用。

8、PLSQL的条件语句:

例如:

执行之后会在数据库中建一个procedure;

调用这个procedure即可:

另外再举一个复杂点的条件语句:

PLSQL的循环结构:

1)loop结构:

例如:

2)while结构:

例如:

3)for循环结构:

顺序控制语句:

1)goto语句:

如果语句有多层循环,此时会用到goto语句,goto语句一般不会用到。

例如:

Goto到end_loop中;

<<end_loop>>为目的地;

2)null语句:

9、总体案例:

1)请写一个过程,可以向book表中添加书,要求可以通过java程序调用该过程:

第一步:建一张book表:

第二步:编写一个过程:

第三步:在java中调用:

2)有输入和输出的存储过程:

传入spno,运行的结果会返回给spName变量。

在java中的调用为:

如果返回是多个值,则修改一下为:

此时java的调用为:

 

如果返回的值是多条记录,即返回一个结果集:

第一步:建包:创建一个包,在该包中,定义一个类型test_cursor,是个游标。

第二步:建立存储过程:

第三步:如何在java中调用:

对结果集的接受是用的:getobject(2),即对象接收。

2)分页技术:

先回顾一下分页语句:

然后我们来看一下分页的过程该怎么写:

Pagesize:一页显示记录数。

接下来查看java中如何使用这个语句:

如果要按照薪水从低到高排序,然后取出6-10个人,只需要修改一个地方:

做上面的修改即可。

10、例外处理:

1)例外处理:

例如:

此时,执行会显示“编号没有!”

2)预定义例外:

Case_not_found:

例如:

如果薪水是3000,就会抛出case_not_found例外。

Cursor_already_open:

当游标被打开两次的时候,就会报错。

Dup_val_on_index:

Invalid_cursor:

Invalid_number:

No_data_found:

Too_many_rows:

Zero_divide:

Value_error:

其他预定义例外:

3)处理自定义例外:

例如:


11、视图:

视图本质上是一个映射关系,没有存储实质的数据。

1)创建视图:

视图之间可以作为两个表,进行联合查询。

2)创建或修改视图:

3)删除视图: