PL/SQL基础学习
PL/SQL基础学习
PL/SQL(Procedure Language/SQL)是一种程序语言,是Oracle数据库对SQL语句的过程化扩展,目前只有Oracle数据库支持。
(一)PL/SQL基础语法
PL/SQL程序结构:
1、PL/SQL基本变量类型:char、varchar2、date、number、boolean、long
2、引用型变量和记录型变量
引用型变量:
记录型变量:
3、if语句
4、循环语句
(二)PL/SQL光标
光标就是一个结果集。举例如下:
1、光标属性与光标数的限制
光标属性:
光标数限制:默认情况下,oracle只允许在同一个会话中,打开300个光标
2、带参数的光标
(三)例外
例外分为系统例外和自定义例外。
1、系统例外
No_data_found |
没有找到数据 |
Too_many_rows |
select...into...语句匹配多行 |
Zero_Divide |
被零除 |
Value_error |
算术或转换错误 |
Timeout_on_resource |
等待资源时发生超时 |
2、自定义例外
(四)存储过程与存储函数
存储过程和存储函数是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
不同点:存储函数有返回值(return),而存储过程没有
1、无参存储过程
2、带参数存储过程
3、带参数存储函数
4、out参数
存储过程和存储函数都可以有一个或多个out参数,因此存储过程可通过out参数实现返回值。
原则:如果只有一个返回值,则使用存储函数,否则就用存储过程(无返回或返回多个时)。
5、web应用访问存储过程
举例1(访问上述例子):
举例2:
(五)oracle触发器
1、触发器类型
语句级触发器(没有for each row,针对的是表):在指定的操作语句操作之前或之后执行一次,不管该语句影响了多少行。
行级触发器(有for each row,针对的是行):触发语句作用的每一条记录都被触发,使用:old和:new伪记录变量来识别值的状态。
2、触发器语法
举例:
(五)常用函数
1、字符函数
2、日期函数
3、转换函数
(六)oracle高级查询(归纳)
1、group by使用
group by 是和聚合函数配合使用,它有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面;包含group by 子句中的列不必包含在select列表中。
如:select A,B,count(C) from table group by A ,B
2、having设置分组条件
having作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
如:select A count(B) from table group by A having count(B)>2
3、笛卡尔集
笛卡尔集的列数为每个表的列数之和,笛卡尔集的行数为每个表的行数相乘。实际中,应避免使用笛卡尔全集
4、等值连接
select e.empno, e.ename, e.sal, d.dname from emp e, dept d where e.depno=d.depno
5、外练接
把对于连接条件不成立的记录,仍然包含在最后记录中
左外练接:当连接条件不成立的时候,等号左边的表仍被包含;右外连接相反!
select d.depeno 部门号, d.dname 部门名称, count(e.empno) 人数 from emp e, dept d where e.deptno(+)=d.deptno group by d.deptno, d.dname;(右外连接)
6、自连接
通过表的别名,将同一张表视为多张表
注意:自连接不适合于操作大表,所产生笛卡尔集是原表大小的平方,推荐使用层次查询
7、子查询
子查询类型:单行子查询(只返回一条记录)、多行子查询(返回多条记录)
可以使用子查询的位置:where、select、having、from;不可使用位置:group by
where:select * from emp where sal > (select sal from emp where ename='SCOTT')
select(必须是单行子查询):select empno, ename, sal, (select job from emp where empno=11) 第四列 from emp;
having:select deptno, avg(sal) from emp group by deptno having avg(sal) > (select max(sal) from emp where deptno=30);
from:select * from (select empno, ename, sal from emp);