2 Oracle高级部分

1应用

1.1视图:其实就是给你看数据,防止别人看的时候偷改数据不会影响到真正的数据先建表然后再建立视图这个只有查询权限的视图,目的是可以1.选择性的展示2.保证数据的及时统一(1.创建(必须要有dba权限) create 2.查询 )

1.1.1 建表
   create table emp as select * from  scott.emp;
1.1.2 创建只读视图
create view v_emp as select ename from with read only;

1.2索引:在表的列上构建二叉树,提高查询效率(1.单列索引,2.复合索引)

1.1.1.单列索引
create index idx_ename on emp(ename);
1.1.12复合索引
create  index idx_enamejob on emp(ename,job)
select * from emp where ename=' scott' --触发单列索引
select * from emp where ename=' scott'  and job ='xx'--触发复合列索引

1.3 pl/sql编程语言(编程化语言,有逻辑,有存储过程和存储函数)

1.declare
  声明部分 
begin
  赋值
  逻辑语句
end
1.3.1声明部分:
DECLARE
    i number(2) := 10;
    s varchar2(10) := '小明';
    ena emp.ename%TYPE;---引用型变量
    emprow emp%rowtype;---记录型变量(记录一行的数据封装为一个对象)
BEGIN
    dbms_output.put_line(i);---输出方式
    dbms_output.put_line(s);
    SELECT ename INTO ena FROM emp WHERE empno = 7788;---第二种查询语句赋值加上 INTO
    dbms_output.put_line(ena);
    SELECT * INTO emprow FROM emp WHERE empno = 7788;
    dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
END;
1.3.2if结构
 declare
  声明部分 
begin
  赋值
  逻辑语句
   IF  THEN
    
  elsif THEN这里else的省略
  
  ELSE
  
  END IF;
end
例子:
BEGIN
  IF i<18 THEN
    dbms_output.put_line('未成年');
  elsif i<40 THEN
    dbms_output.put_line('中年人');
  ELSE
    dbms_output.put_line('老年人');
  END IF;
  IF i<18 THEN
    
  elsif THEN
  
  ELSE
  
  END IF;
END;

1.4循环(三个循环while循环,exit循环(掌握),for循环)

---while循环
DECLARE
  i number(2) := 1;
BEGIN
  WHILE i<11 LOOP
     dbms_output.put_line(i);
     i := i+1;
  END LOOP;  
END;
---exit循环
DECLARE
  i number(2) := 1;
BEGIN
  LOOP
    EXIT WHEN i>10;
    dbms_output.put_line(i);
    i := i+1;
  END LOOP;
END;
---for循环
DECLARE

BEGIN
  FOR i IN 1..10 LOOP
     dbms_output.put_line(i);  
  END LOOP;
END;

1.5游标:相当于一个集合,可以存放多个对象,多行记录

1.5.1记录型变量
---输出emp表中所有员工的姓名
DECLARE
  CURSOR c1 IS SELECT * FROM emp;
  emprow emp%rowtype;
BEGIN
  OPEN c1;
     LOOP
         FETCH c1 INTO emprow;
         EXIT WHEN c1%notfound;
         dbms_output.put_line(emprow.ename);
     END LOOP;
  CLOSE c1;
END;
1.5.2引用型变量
-----给指定部门员工涨工资
DECLARE
  CURSOR c2(eno emp.deptno%TYPE) 
  IS SELECT empno FROM emp WHERE deptno = eno;
  en emp.empno%TYPE;
BEGIN
  OPEN c2(10);
     LOOP
        FETCH c2 INTO en;
        EXIT WHEN c2%notfound;
        UPDATE emp SET sal=sal+100 WHERE empno=en;
        COMMIT;
     END LOOP;  
  CLOSE c2;
END;

1.6存储过程:在数据库中直接编好的逻辑语句,可以直接调用

 create or replace procedure 存储名(变量名  变量类型)
  is
begin
  plsql语句
end
例子:给指定的员工涨100
   create or replace procedure p1(eno  emp.empno%type)
  is
begin
    update emp set sal = sal+100 where empno = eno
commit;
end
---测试p1
    select * from emp where empno=7788;
   declare
   begin
   p1(7788)
   end;

1.7存储函数

create or replace function 函数名(变量名 变量类型) return 返回类型(不能设置长度)
  is
 设置接受变量名 设置接受变量名类型
begin
  pl/sql 语句
  return 接受返回变量名
end
例子:年薪  
create or replace function f_yearsal(eno emp.empno%type) return number
  is
 s number(10);
begin
  select sal*12+nvl(comm,0) into s from emp where empno = eno;
  return s;
end

declare
s number(10); 
  begin
s:= f_yearsal(7788);
dbms_output.put_line(s);
end

---存储过程和存储函数的区别
---语法区别:关键字不一样,
------------存储函数比存储过程多了两个return。
---本质区别:存储函数有返回值,而存储过程没有返回值。

1.8 out类型参数使用

----in和out类型参数的区别是什么?
---凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰。
意思是有输入然后输出的变量用out,只输入没输出in,默认不用写
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的。 2.排...
    阿休阅读 10,154评论 0 37
  • 分区表 分区表底层是由多个物理子表组成的,实现分区的代码实际上是对一组底层表的句柄对象的封装,对于分区表的请求都是...
    psycho_8302阅读 4,160评论 0 0
  • 一、复习 虚拟字段是不可以放在where后面的,例如where avg(math)其中math是实际字段,但avg...
    EndEvent阅读 7,584评论 3 11
  • 一、复习 虚拟字段是不可以放在where后面的,例如where avg(math)其中math是实际字段,但avg...
    王梓懿_1fbc阅读 3,757评论 0 0
  • 常用函数 函数介绍 ​ 事先提供好的一些功能可以直接使用​ 函数可以用在SELECT语句及...
    我叫吴智斌阅读 4,243评论 0 0

友情链接更多精彩内容