标签:
视图
什么是视图? 
视图(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会自增
标签:
原文地址:http://www.cnblogs.com/zy19930408/p/4872532.html