PL/SQL2009.4.22

本文详细介绍Oracle数据库中SQL查询技巧及触发器的应用方法。包括表结构查询、视图创建与使用、聚合函数应用,以及如何通过触发器实现自动记录操作日志、限制表修改等功能。

//author 满晨晨
//time 2009 4 22上午
conn scott/tiger@STUF1DB
查询表结构和表空间
SHOW USER
DESC USER_TABLES查询表的结构 不显示内容
select        查询表的内容
SELECT TABLE_NAME,TABLESPACE_NAME FROM USER_TABLES
table 不能用or replace 只能先删除再给重新建个表
视图
view
1 查询速度快 只做一次编译
2 调用简单

虚表 不占物理内存空间
视图名称以vi开头
create view vi_depttemp
as
select e.empno,e.name,d.dname from emo e join dept d
on
e.deptno=d.deptno;

建立了view 虚表 只是建立
查询view虚表 只存在内存里 一关机就没了
select* from vi_deptemp 查询具体内容
更新视图
update vi_demptemp set ename='张学友'where empno='7788'
commit 提交 对视图有影响 对实际数据也更改
delete from vi_的皮特名片where empno=7788
commit 提交 对视图有影响 对实际数据也更改

复制别人的表
create table t_emp
as
select * from scott.emp where 1=1  或者1!=1

create table t_dept
as
select * from scott.dept

update 更新视图时候 视图来源多个表时候 无法更新 必须使用触发器instead of 类型触发器
而视图只有一个单表时候 可以更新
select job,sum(sal) as totalsal from t_emp group by job having job='clerk'
视图查询时候 聚合函数要给它重新命名;
where
group by
having
order by

group by  having 分组查询是将查询结果按照字段分组 HAVING相当与WHERE的限制条件查询
select empno,ename,job,sal
from scott.emp
group by  job,empno,ename,sal  ---按字段分组
having sal<=2000 --分组后是否符合条件

where 检查每条记录是否符合条件
having检查分组后的各组是否满足条件
having 只能配合group by 使用
在使用join ,group by时候 要使用视图结构

 

触发器
使特定事件出现的时候 自动执行的代码块 类似于存储过程 但是用户不能直接调用他们


当insert emp时候 记录此操作过程到emp_log中 业务逻辑  自动执行

功能
1 允许/限制对表的修改
2 自动生成派生列 比如自增字段
3 提供审计和日志记录
4防止无效的事务处理
5 启用复杂的业务逻辑
触发器不会通知用户 便改变了用户的输入值】
语法
create or replace trigger name tri_前缀_emp表明_insert事件 tri_emp_insert

after /before /instead of(视图时候多表) 执行时机 insert/update/delete 表 之前之后 替换 视图 什么事件
on 表明 视图名
declare
begin
dml语句要commit,ddl语句
end 触发器名称(也可以不写)


create table t_emp_log
(
who varchar2(10) not null,
action varchar2(10) not null,
actime date


);
create or replace trigger tri_emp_insert
before insert
on t_emp
begin
insert into t_emp_log(who,action,actime)values(user,'insert',sysdate);
end;


raise_application_error(-20001,'你不能访问或修改这个表')

ora-20001:你不能访问或修改这个表

往里面插入东西 如果是你这个用户的话 可以操作 如果不是弹出一个错误

create or replace trigger tri_emp_insert1
before insert
on t_emp
begin
if user!='scott' then
raise_application_error(-20001,'你不能访问或修改这个表');
end if;

 


删除两条记录

 

删除t_emp表中的数据同时把删除的数据保存到新的表a_emp中去
 create table a_emp
as
select * from t_emp where 1!=1;
CREATE OR REPLACE TRIGGER TRI_t_emp
before delete ON T_emp
REFERENCING NEW AS NEWROW
FOR EACH ROW
declare

BEGIN        
INSERT INTO a_emp
VALUEE
(:NEWROW.empno,:NEWROW.ename,:NEWROW.job,:NEWROW.MGR,:NEWROW.HIREDATE,:NEWROW.Sal,:NEWROW.COMM,:NEWROW.deptno);
END TRI_t_emp;

 

触发器;
statement tr
row tr


end;

delete 删除段
drop删除表 视图 触发器

行级触发器
new -insert oid 无效
old-delete new 无效
dne row

new old -update
for each row  循环遍历每一行
带业务逻辑的触发器
如插入T_DEMO3数据同时插入T_DEMO2,条件是工资要大于4500rmb的记录
CREATE OR REPLACE TRIGGER TRI_TDEMO3
AFTER INSERT ON T_DEMO3
REFERENCING NEW AS NEWROW
FOR EACH ROW
WHEN(NEWROW.SALARY>=4500)
BEGIN
INSERT INTO T_DEMO2
VALUEE
(:NEWROW.ID,:NEWROW.TYPE,:REWROW.NAME,:NEWROW.SALARY,:NEWROW.C_DATE);
END TRI_TDEMO3;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值