存储过程:比较复杂的逻辑,需要放在一个事务里的,可能包括select,insert,update等一系列操作
存储在数据库中供所有用户程序调用的子程序叫做存储过程和存储函数
区别:存储函数可以通过return 语句来返回一个值,如果有一个返回值就用存储函数,么有返回值或者有多个返回值用存储过程。
语法
create or replace procedure hello
as
begin
dbms_output.put_line('Hello World!');
end;
存储过程语法:
create [or replace] procedure 过程名(参数列表)
as
PLSql 子程序体(在plsql子程序体中不能包含 1declare关键字)
调用存储过程
A:exec hello();
B: begin
raisesalary(1);
raisesalary(2);
commit;
end;
2带参数的存储过程
create or replace procedure raisesalary(enid in number) //in 表示输入
as
--定义一个变量保存涨前工资
psal s_emp.salary%type;
begin
select salary into psal from s_emp where id = enid;
update emp set salary = salary + 1000 where id = enid;
--一般不再存储过程和存储函数中 commit 数据 因为 给两个人加工资 就不能保证在同一个恶事务上
dbms_output.put_line('涨前:' || psal || '涨后:' ||(psal + 1000));
end;
// 授予soctt 权限
grent debug connect session, degug any procedure to scott;
3存储函数
存储函数和存储过程结构类似,但是必须有一个 return 子句
用于返回函数值
语法:
create [ or replace] function 函数名(参数列表)
return 函数值类型
AS
PLSql 子程序体
create or replace function queryempincome(enid in number)
return number
as
--定义一个变量保存涨前工资
psal t_employee.salary%type;
pcomm t_employee.comm%type;
begin
select salary,comm into psal,pcomm from t_employee where id = enid;
return psal*12+nvl(pcomm,0);
end;
4out参数
存储过程和存储函数都可以有 out参数(可以有多个)
存储过程 可以通过out 来实现返回值
如果就一个返回值 就用存储函数 么有返回值 和 有多个返回值就用存储过程
create or replace procedure queryraisesalary(enid in number,
psalary out number,
pcomm out number)
as
begin
select salary,comm into psalary,pcomm from t_employee where id = enid;
end;
数据库中的视图是一个虚拟表,但它同真实表一样,包含一系列带有名称的行和列数据。行和列数据来自由定义视图查询所引用的表,并且在应用视图时动态生成。另外,视图还可以在已经存在的视图的基础上定义。
视图一经定义变存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存储在基本表中的数据。对视图的操作与对标的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表中的数据也会发生变化;同时,若是基本表的数据发生变化,则这种变化也会自动地反映在视图上。
(1)简单化
看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而用户不必为以后的每一次操作指定全部的条件。
(2)安全性
通过视图用户只能查询和修改他们所能看到的数据。数据库中的其他数据则既看不见也娶不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能限制到特定行和特定列上。但通过视图,用户可以被限制到数据库的行列级别的子集上。
(3)逻辑数据独立性
视图可以帮助用户屏蔽真实表结构变化带来的影响。
(1)基于单个数据表建立视图
create view view_01 as select empno , ename , job , hiredate , sal from emp;
select * from view_01 ; 查询结果和单表的查询结果一模一样
// 多表
create view view_03 as select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming,
d.dname bumenmingchen, d.loc bumenweizhi
from emp e1 , emp e2 , dept d
where e1.mgr=e2.empno and e1.deptno=d.deptno ;
describe view_03
经常用到的查询,或较复杂的联合查询应当创立视图,这是会优化性能的,还有就是涉及到权限管理方面,比如某表中的部分字段含有机密信息,不应当让低权限的用户访问到的情况,这时候给这些用户提供一个适合他们权限的视图,供他们阅读自己的数据就行了。