Oracle数据库基本概念
1. PL/SQL( Procedural Language/SQL )是Oracle公司对关系型数据库的标准语言SQL的过程化语言扩展。
PL/SQL拥有而SQL没有的特征:①变量定义;
②控制结构;
③自定义的子程序;
④对象类型;
2. PL/SQL块是组成PL/SQL程序的最基本单元。
块:匿名块;
命名块:子程序、 包、触发器(使用命名块可以实现模块化编程, 优化应用程序性能)。
匿名块代码放在客户端,命名块代码放在服务器端。
3. PL/SQL块的编译过程:每一个匿名PL/SQL块执行时,代码被送到服务器上的PL/SQL引擎,这里PL/SQL块被编译。而命名PL/SQL块只在块创建或修改时被编译。
编译过程包括语法检查、绑定、伪代码产生。命名PL/SQL块的成功编译并不保证代码将来能被成功执行。
使用PL/SQL的好处:
①提高应用程序性能;
②提供模块化程序开发能力;
③具有良好的兼容性;
④允许定义标识符;
⑤提供了程序控制结构;
⑥提供了异常处理。
4. Oracle内存结构
Oracle内存结构主要可以分为共享内存区和非共享内存区,共享内存区主要由SGA( System Global Area )组成,非共享内存区主要由PGA( Program Global Area )组成。
Oracle数据库运行时会现在内存内规划一个固定区域,用来存储每个用户所需存取的数据,以及Oracle运行时必备的系统信息。我们称此区域为系统全局区,简称SGA。SGA包括几个重要的区域:数据库缓存区、重做日志缓冲区、共享池、其他区域(如 Large Pool等)。
PGA用户存放服务器进程的数据和控制信息,它是独立于SGA的一块内存区域。当用户进程连接到Oracle服务器时,Oracle服务器会为每个服务器进程分配相应的PGA,当服务器进程时,Oracle会自动释放PGA所占用的内存空间。PGA由排序区、会话信息、游标状态、堆栈空间等4部分组成。
5.
视图是从一个或多个表中通过查询语句生成的一种虚表,创建视图的语法:
1 create or replace view view_name as sql语句;
同义词就是数据库对象的别名,创建同义词的语法:
1 create public synonym 同义词名称 for 数据库对象名; -- 公有同义词
1 create public 同义词名称 for 数据库对象名; -- 私有同义词
序列是Oracle中的一种特殊对象,用于实现数据库表的主键列的自动增长,创建序列的语法:
1 create sequence 序列名 increment by 增量种子数 start with 起始数字 maxvalue 最大值;
PL/SQL编程基础
1. PL/SQL块简介
块是PL/SQL的基本程序单元,块的嵌套没有限制。PL/SQL由3个部分组成:定义部分、执行部分、异常处理部分。
create /* 定义部分——定义常量、变量、复杂数据类型、游标、用户自定义异常 */ begin /* 执行部分——PL/SQL语句和SQL语句 */ exception /* 异常处理部分——处理运行错误 */ end;
2. PL/SQL块的类型
根据需要实现的应用模块功能,可以将PL/SQL块分为匿名块、子程序、触发器。
匿名块:动态构造,可以直接执行的块,匿名块既可以内嵌到应用程序,也可以在交互环境中直接使用。
子程序:包括存储过程、函数、包。可以简化客户端程序的开发和维护,并且提高应用程序性能。
过程:用于执行特定操作,既可以指定数据参数,也可以指定输出参数。
函数:用于返回特定数据,在函数头部必须包含return语句。
包:用于逻辑组合相关的过程和函数,它由包体和包规范2部分组成。
包规范:只包含了过程和函数的说明,而没有过程的函数的实现代码。
包:体用于实现包规范中的过程和函数。
触发器:是指隐含执行的存储过程。当定义触发器是必须指定触发事件以及触发操作。
程序控制结构
条件控制:
if语句 eg:
if 条件1 then sql 语句 elsif 条件2 then sql语句 else sql语句 end if;
case语句 eg:
1 case selector 2 when expression1 then sequence_of_statement1; 3 when expression2 then sequence_of_statement2; 4 when expression3 then sequence_of_statement3; 5 ... 6 when expressionN then sequence_of_statementN; 7 end case;
1 case v_deptNo 2 when 10 then sequence_of_statement1; 3 when 20 then sequence_of_statement2; 4 when 30 then sequence_of_statement3; 5 end case;
循环控制:
基本循环:
1 loop 2 statement1; 3 exit[when condition]; 4 end loop;
while循环:
1 while condition loop 2 statement1; 3 statement2; 4 ... 5 end loop;
for循环:
1 for counter in [reverse] lower_bound..upper.bound loop 2 statement1; 3 ... 4 end loop;
异常处理:
常见预定义异常:
ACCESS_INTO_NULL 未定义对象
CASE_NOT_FOUND CASE中若未包含相应的WHEN ,并且没有设置ELSE 时
CURSER_ALREADY_OPEN 游标已经打开
DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
INVALID_NUMBER 内嵌的SQL语句不能将字符转换为数字
TOO_MANY_ROWS 执行select into 时,结果集超过一行
ZERO_DIVIDE 除数为0
LOGIN_DENIED PL/SQL 应用程序连接到oracle 数据库时,提供了不正确的用户名或密码
NOT_LOGGED_ON PL/SQL 应用程序在没有连接oralce 数据库的情况下访问数据
在PL/SQl中更改数据和和管理事务
forall语句的语法:
1 forall index in lower.bound..upper.bound sql语句;
Oracle 将一组sql语句组成的一个逻辑工作单元看作是一个数据库事务。一个逻辑工作单元必须有四个属性,成为ACID(原子性、一致性、隔离性、持久性):
基本事务处理包含如下几个方面:
① 开始事务;
② 执行SQL语句;
③ 提交事务;
④ 回滚事务(执行rollback语句)。
事务的隔离级别:
为提交读:最低的最危险的隔离级别,事务容易受脏读的影响
脏读:是数据一致性问题中的一种,当一个事务读被其他事务更改但还没有提交数据时,就发生了脏读。
提交读隔离级别:不会发生脏读,但不能防止不可重复读;
可重复读隔离级别:同时防止脏读和不可重复读;,但可能发生幻读;
幻读:是数据一致性问题中的一种,与可重复读类似但它考虑的是当前事务作用于某个表时,其他事务向该表中添加新纪录的情况。
可串行化隔离级别:防止脏读、不可重复读、幻读,但性能低。
在PL/SQL使用游标获取
游标的状态可以由游标的属性来获取,游标属性以“%属性名”的形式加在游标名之后。
6个游标属性:
%found、%notfound、%rowcount、%isopen、%bulk_rowcount、%bulk_exception
使用隐式游标: 1 select 列表列名 [bulk collection] into PL/SQL变量列表 2 ...select语句的其他部分...
使用显式游标:步骤:声明、打开、提取记录、关闭
1)声明:
1 cursor 游标名[ (游标参数列表) ] [ return 返回值规范 ] 2 is select 语句 3 [ for update [ of [列名列表] ] ];
2) 打开游标:open 显示游标名(参数列表);
3) 提取记录:fetch 游标名 into 记录或变量列表;
4) 关闭显示游标:close 游标名;
开发PL/SQl子程序和包
子程序:是已命名的Pl/SQl块,可带参数并可在需要时随时调用。
子程序的优点:模块化、可重用性、可维护性。
类型:过程:用于执行特定操作;
函数:用于返回特定数据。
开发存储过程:
1 create or replace procedure procedure_name(argument1 [ model ] datatype1,argument2[ model datatype2, ...)
2 is [as]
3 PL/SQL语句;
开发函数:
1 create or replace function function_name(argument1 [ model ] datatype1,argument2[ model datatype2, ...)
2 return datatype
3 is | as
4 PL/SQl语句;
建立包规范:
1 create or replace package package_name 2 is | as 3 public type and item declarations 4 subprogram specifications 5 end package_name;
建立包体:
1 create or replace package body package_name 2 is | as 3 public type and item declarations 4 subprogram body 5 end package_name;
调用包组件:包名.组件名;
子程序重载:包名相同,参数列表不同
包的优点:
① 模块化;
② 更轻松的应用程序设计;
③ 信息隐藏;
④ 性能更佳。