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)删除视图: