老师oracle讲义第五天

视图

什么是视图?
视图(VIEW)也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示。
视图对应一个select语句,结果集被赋予一个名字,就是视图的名字。
视图本省不包含任何数据,它只是包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。

视图创建后,可以像操作表一样操作视图,主要是查询。
根据视图所对应的子查询种类分为几种类型:
select语句是基于单表建立,并且不包含任何函数运算、表达式或者分组函数,叫做简单视图,此时视图是基表的子集。
select语句是基于单表建立,但是包含了单行函数、表达式、分组函数或者group by 子句,叫做复杂视图
select语句是基于多个表的,叫做连接视图

视图的作用
如果需要经常执行某种复杂查询,可以基于这个复杂查询建立视图,以后查询此时图即可,可以简化复杂查询
视图本质上就是一条select语句,所以当访问视图时,只能访问到对应的select语句中涉及到的列,对基表中的其它列起到安全和保密的作用,限制数据的访问


创建视图的用户必须要获得创建视图的权限
在sysdba角色下为指定用户授权
conn sys/a as sysdba ;
show user ;
grant create view to scott ;
conn scott/a ;
show user ;

创建视图
create or replace view v_emp
as
select empno , ename , sal from emp ;

desc v_emp ;

drop view v_emp ;

select * from v_emp ;

create or replace view v_emp_2
as
select empno no ,ename name, job job, sal sal from emp ;

SQL> select * from v_emp_2 where no = 7499;

NO NAME JOB SAL
---------- -------------------- ------------------ ----------
7499 ALLEN SALESMAN 1600


SQL> select * from v_emp_2 where empno = 7499;
select * from v_emp_2 where empno = 7499
*
第 1 行出现错误:
ORA-00904: "EMPNO": 标识符无效

 


-------------------------------------------------------------------------------------------
序列 (sequence)
用在哪里
在mysql数据库中,可以设置id字段以自动增长的方式,实现数据的插入
create table mysql_tbl (
id int primary key auto_increment ,
name varchar(100)
)

在oracle中如何实现mysql表中的id字段自动增长。
使用序列 序列是oracle中的一种对象
create sequence seq_user --创建序列的关键字和序列名称
increment by 1 --自动增加的步长 默认 1
start with 1 --开始的大小值 默认 1
maxvalue | minvalue num --最大值和最小值 默认 nomaxvalue 10的26次方
nomaxvalue --默认的 不限制
cycle | nocycle --是否轮回 默认 nocycle
cache num | nocache --缓存区大小 默认20

使用序列
select seq_user.nextval from dual ;

select seq_user.currval from dual ;

建表
create table t_user (id number , username varchar2(100) , password varchar2(48) , regtime date , constraint pk_user primary key (id)) ;

insert into t_user values (seq_user.nextval , 'jack' , '123123' , sysdate) ;

drop sequence seq_user ;

 


需要一张表 t_product
编号 主键 自动增长
产品名称 非空
产品销量 非空 默认0
产品库存 非空 默认0
产品初始化销量

创建表
插入5条数据
建立视图 (视图中不显示 产品初始化销量 )
查询视图

从视图插入一条数据

-------------------------------------------------
存储过程
存储过程适合做更新操作,特别是大数据量的更新

创建存储过程
create or replace procedure proc1
as | is 相当于 declare 声明的意思
abc varchar2(100) ; --定义该存储过程的变量 作用域就是本存储过程中
begin
update t_user set username = 'lucy' where id = 3 ;
end ;

例如:
create or replace procedure proc1
as
begin
update t_user set username = 'lucy' where id = 4 ;
commit ;
end ;

调用存储过程
exec proc1 ;

---------------------------
带输入参数的存储过程
创建
create or replace procedure proc2 (
param1 varchar2 , param2 varchar2 default '888888' --存储过程的参数 类型不需要指定宽度(范围)
)
as
begin
insert into t_user values (seq_user.nextval , param1 , param2 , sysdate) ;
commit ;
end ;

执行
exec proc2('tom');
call proc2('mary');

 

-------------------------
带输出参数的存储过程
create or replace procedure proc3(
param1 in varchar2 , param2 out varchar2 --in 代表输入参数 out代表输出参数 param0 in out number
)
as
begin
select password into param2 from t_user where username = param1 ;
dbms_output.put_line(param2);
end ;

set serverout on ;
var pp varchar2(100) ;
exec proc3('tom',:pp) ;

 

---------------------------------------
查询结果返回多个字段值的存储过程

create or replace procedure proc4(
param1 in varchar2 , param2 out varchar2 , param3 out varchar2 --in 代表输入参数 out代表输出参数 param0 in out number
)
as
param varchar2(100) ;
begin --注意:这里只能处理返回的是一条记录的结果集 如果结果集含有多条记录,oracle没有提供直接处理的方式,
--必须间接的借助游标,但是游标本身的效率很差,所以,实际开发中基本不适用
select id , password into param2 , param3 from t_user where username = param1 ;
param := 'who am I ? ' ;
dbms_output.put_line('查询的结果数据是:id= ' || param2 || ',password = ' || param3 );
dbms_output.put_line(param);
end ;

set serverout on ;
var pp1 varchar2(100) ;
var pp2 varchar2(100) ;
exec proc4('tom',:pp1,:pp2) ;

---------------------------------
定义变量
param1 varchar2(100) ; -- 变量的类型 可以是oracle系统所有合法的数据类型
param2 number ;

给变量赋值
param1 := 'who am i !' ;
param2 := 123 ;


判断
if t_value = 1 then
begin
do ...
end ;
end if ;
--------------
create or replace procedure proc_if(pp in number)
as
total number ;
begin
total := pp ;
if total > 4 then
begin
insert into t_user values (seq_user.nextval , '苏乞儿' , '666666' , sysdate) ;
commit ;
end ;
end if ;
end ;

call proc_if(3);


-------------------------------------
while循环
while t_value = 1 loop
begin
do ...
end ;
end loop ;

i :=1;
while i<=5 loop
insert into tb_zhaozhenlong(rpt_date ,dept_id,item,qty) values(to_date('2007-01-02','yyyy-MM-dd'),'D'||i,'I'||i,round(i*200/3,3));
i :=i+1;
end loop;


CREATE OR REPLACE PROCEDURE TEST
is
i int := 1;
BEGIN
while i < 100 LOOP
DBMS_OUTPUT.put_line(i);
i:=i+1;
end LOOP;
END TEST;
注:这里的i需要申明,并且循环体中,要对i进行改变


---------------------------------------------

for y in 1..100 loop
i :=x*y;
exit when i =300;
end loop;

-----------------
CREATE OR REPLACE PROCEDURE TEST
is
BEGIN
for i in 1..100 LOOP
DBMS_OUTPUT.put_line(i);
end LOOP;
END TEST;
注:这里的i可以不用申明,并且在循环体中,i会自增

posted @ 2015-10-12 19:01  冷蓝翔  阅读(142)  评论(0编辑  收藏  举报