oracle pl/sql学习笔记(四)函数、存储过程、事务

--用户、权限
dba_users 所有用户的基本信息
create user 用户名 identified by 密码 default tablespace 表空间
schema 用户在数据库里拥有的所有对象的集合

dba_sys_privs 系统权限
grant privilege(权限) to grantee(用户或角色)

--函数
create or replace function 函数名(类型 参数,.....) return 返回值类型 as
begin
函数定义
end 函数名;

return 返回值类型之后, as之前添加deterministic关键字,表明函数具有确定性,可缓存提高效率
create or replace function getNewsCount return number as
begin
  declare
    news_count number;
  begin
    select count(1) into news_count from pms_web_news wn where wn.enabled=1;
    return news_count;
  end;
end getNewsCount;

--函数信息
select * from user_objects o where  o.object_type='FUNCTION' and o.object_name=upper('getNewsCount')
--代码信息
select * from user_source s where s.type='FUNCTION' and s.name=upper('getNewsCount')

--调用函数
select getNewsCount() from dual

begin                                                                    
  dbms_output.put_line('表中的记录数据为' || getNewsCount());
end;  

--存储过程
create or replace procedure 过程名(参数名 in/out 参数类型,.....) as
begin
过程定义
end 过程名;

--执行存储过程
begin
过程名;
end;

--程序包
主要用于管理创建的过多的函数和存储过程

--程序包规范
create or replace package 包名 as
变量名 数据类型;
.....
function 函数名(参数) return 数据类型;
.....
procedure 存储过程名(参数)
.....
end 包名;

--程序包主体
create or replace package body 包名 as
.....
end 包名;

共享池是SGA中对性能影响最明显的部分,一条sql语句执行,首先进行语法分析(判断对象是否合法),
共享池是讲预处理过的sql语句进行缓存,缓存标识是sql语句形成的hash池,共享池命中率是影响sql语句执行性能的重要指标

--修改sga
alter system set sga_max_size = 1000m scope=spfile(将该参数的修改反映到数据库启动文件中)

SGA 系统全局区
PGA 进程全局区

--索引
create index 索引名 on 表名(列名)
没有索引就会执行全表扫描遍历表中所有记录,索引开辟一个新的空间存储列值与记录物理地址的对应关系(如同字典添加目录指明所在页码)
索引创建与维护会占用一定的开销,所以对数据的增删改需要维护索引会增加开销,但查询能提高效率
不适合使用场景
1、数据量较小的表
2、频繁数据变更的表

--sql优化
where xx=?之类语句也会被SGA解析置于SGA内存中,使用时只需为其传递实际参数即可
比如java开发想要提高sql命中率,可多使用预编译的PreapareStatement,

exists判断存在性,in判断匹配性
一般情况下exists查询效率优于in,实际in最后也可能被Oracel优化为和exists相同的HASH JOIN RIGHT SEMI连接方式

执行顺序 from>where>group by>聚集函数>having>表达式>select>order by
而对于数据过滤来说越早越好

with子句可作为临时变量存储起来

--Oracle事务属性和隔离级别
read only 只读
read write 可读可写
read commited 默认隔离级别,语句级别的隔离
serializable 串行/可串行读,事务级别的隔离(其他事务中查询语句只能查到本事务开始前的旧数据)

原子性 一致性 隔离性 持久性

--数据库并发操作存在的异常情况
更新丢失:并发的事务造成 回滚或覆盖丢失,第一类丢失更新(回滚丢失),第二类丢失更新(覆盖丢失)
脏读取:当前事务收到外界未提交数据的影响
不可重复读取:A事务查询数据,然后B事务更新该数据并提交,A再次查询发现该数据变化
幻像读:A事务查询数据,B事务插入或者删除数据并提交,A事务再次查询发现,结果集中多了或少了数据

Oracel总是自动检测死锁,并强制其中一个事务放弃原任务

select XX from XX where xx=xx for update 悲观锁定

猜你喜欢

转载自cj2047.iteye.com/blog/1930452