Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
- ---视图
- ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中。
- ---一个由查询语句定义的虚拟表。
- ---查询语句创建表
- create table emp as select * from scott.emp;
- select * from emp;
- ---创建视图【必须有dba权限】
- create view v_emp as select ename, job from emp;
- ---查询视图
- select * from v_emp;
- ---修改视图数据,其实在修改表数据[不推荐]
- update v_emp set job='CLERK' where ename='ALLEN';
- commit;
- -- 删除视图
- drop view v_emp;
- ---创建只读视图
- create view v_emp1 as select ename, job from emp with read only;
- ---视图的作用?
- ---第一:视图可以屏蔽掉一些敏感字段。
- ---第二:保证总部和分部数据及时统一。
- ---索引
- --索引的概念:索引就是在表的列上构建一个二叉树
- ----达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。
- ---单列索引
- ---创建单列索引
- create index idx_ename on emp(ename);
- ---单列索引触发规则,条件必须是索引列中的原始值。
- ---单行函数,模糊查询,都会影响索引的触发。
- select * from emp where ename='SCOTT'
- ---复合索引
- ---创建复合索引
- create index idx_enamejob on emp(ename, job);
- ---复合索引中第一列为优先检索列
- ---如果要触发复合索引,必须包含有优先检索列中的原始值。
- select * from emp where ename='SCOTT' and job ='xx';---触发复合索引
- select * from emp where ename='SCOTT' or job ='xx';---不触发索引
- select * from emp where ename='SCOTT';---触发单列索引。
- ---pl/sql编程语言
- ---pl/sql编程语言是对sql语言的扩展,使得sql语言具有过程化编程的特性。
- ---pl/sql编程语言比一般的过程化编程语言,更加灵活高效。
- ---pl/sql编程语言主要用来编写存储过程和存储函数等。
- ---声明方法
- ---赋值操作可以使用:=也可以使用into查询语句赋值
- 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;
- dbms_output.put_line(ena);
- select * into emprow from emp where empno = 7788;
- dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
- end;
- ---pl/sql中的if判断
- ---输入小于18的数字,输出未成年
- ---输入大于18小于40的数字,输出中年人
- ---输入大于40的数字,输出老年人
- declare
- i number(3) := ⅈ
- begin
- if i<18 then
- dbms_output.put_line('未成年');
- elsif i<40 then
- dbms_output.put_line('中年人');
- else
- dbms_output.put_line('老年人');
- end if;
- end;
- declare
- i number(2) := 28;
- begin
- if i < 18 then
- dbms_output.put_line('child');
- elsif i < 25 then
- dbms_output.put_line('teenager');
- else
- dbms_output.put_line('old');
- end if;
- end;
- ---pl/sql中的loop循环
- ---用三种方式循环打印1到10
- ---while循环
- declare
- i number(2) := 0;
- begin
- while i < 10 loop
- dbms_output.put_line(i + 1);
- 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;
- ---游标:可以存放多个对象,多行记录。
- ---游标:通过游标可以操作存储查询结果集。
- ---游标输出emp表中所有员工的姓名
- declare
- cursor c is select * from emp;
- emprow emp%rowtype;
- begin
- open c;
- loop
- fetch c into emprow;
- exit when c%notfound;
- dbms_output.put_line(emprow.empno || ' ' || emprow.ename);
- end loop;
- close c;
- end;
- -----给指定部门员工涨工资
- declare
- cursor c(dno emp.deptno%type)
- is select * from emp where deptno=dno;
- r emp%rowtype;
- begin
- open c(10);
- loop
- fetch c into r;
- exit when c%notfound;
- update emp set sal = sal + 100 where deptno=r.deptno and ename=r.ename;
- commit;
- end loop;
- close c;
- end;
- ----查询10号部门员工信息
- select * from emp where deptno = 10;
- ---存储过程
- --存储过程:存储过程就是提前已经编译好的一段pl/sql语言,放置在数据库端
- --------可以直接被调用。这一段pl/sql一般都是固定步骤的业务。
- ----给指定员工涨100块钱
- create or replace procedure p1(eno emp.empno%type)
- is
- begin
- update emp set sal=sal+100 where empno = eno;
- commit;
- end;
- select * from emp where empno = 7788;
- ----测试p1
- declare
- begin
- p1(7788);
- 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;
- ----测试f_yearsal
- ----存储函数在调用的时候,返回值需要接收。
- declare
- s number(10);
- begin
- s := f_yearsal(7788);
- dbms_output.put_line(s);
- end;
- ---out类型参数如何使用
- ---使用存储过程来算年薪
- create or replace procedure p_yearsal(eno emp.empno%type, yearsal out number)
- is
- s number(10);
- c emp.comm%type;
- begin
- select sal*12, nvl(comm, 0) into s, c from emp where empno = eno;
- yearsal := s+c;
- end;
- ---测试p_yearsal
- declare
- yearsal number(10);
- begin
- p_yearsal(7788, yearsal);
- dbms_output.put_line(yearsal);
- end;
- ----in和out类型参数的区别是什么?
- ---凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰。
- ---存储过程和存储函数的区别
- ---语法区别:关键字不一样,
- ------------存储函数比存储过程多了两个return。
- ---本质区别:存储函数有返回值,而存储过程没有返回值。
- ----------如果存储过程想实现有返回值的业务,我们就必须使用out类型的参数。
- ----------即便是存储过程使用了out类型的参数,起本质也不是真的有了返回值,
- ----------而是在存储过程内部给out类型参数赋值,在执行完毕后,我们直接拿到输出类型参数的值。
- ----我们可以使用存储函数有返回值的特性,来自定义函数。
- ----而存储过程不能用来自定义函数。
- ----案例需求:查询出员工姓名,员工所在部门名称。
- ----案例准备工作:把scott用户下的dept表复制到当前用户下。
- create table dept as select * from scott.dept;
- ----使用传统方式来实现案例需求
- select e.ename, d.dname
- from emp e, dept d
- where e.deptno=d.deptno;
- ----使用存储函数来实现提供一个部门编号,输出一个部门名称。
- create or replace function fdna(dno dept.deptno%type) return dept.dname%type
- is
- dna dept.dname%type;
- begin
- select dname into dna from dept where deptno = dno;
- return dna;
- end;
- ---使用fdna存储函数来实现案例需求:查询出员工姓名,员工所在部门名称。
- select e.ename, fdna(e.deptno)
- from emp e;
- ---触发器,就是制定一个规则,在我们做增删改操作的时候,
- ----只要满足该规则,自动触发,无需调用。
- ----语句级触发器:不包含有for each row的触发器。
- ----行级触发器:包含有for each row的就是行级触发器。
- -----------加for each row是为了使用:old或者:new对象或者一行记录。
- ---语句级触发器
- ----插入一条记录,输出一个新员工入职
- --应用场景:1.下订单用触发器修改库存 2.帖子评论增删时,修改帖子的评论数。
- create or replace trigger t1
- after
- insert
- on person
- declare
- begin
- dbms_output.put_line('一个新员工入职');
- end;
- ---触发t1
- insert into person values (1, '小红');
- commit;
- select * from person;
- ---行级别触发器
- ---不能给员工降薪
- ---raise_application_error(-20001~-20999之间, '错误提示信息');
- create or replace trigger t2
- before
- update
- on emp
- for each row
- declare
- begin
- if :old.sal>:new.sal then
- raise_application_error(-20001, '不能给员工降薪');
- end if;
- end;
- ----触发t2
- select * from emp where empno = 7788;
- update emp set sal=sal-1 where empno = 7788;
- commit;
- ----触发器实现主键自增。【行级触发器】
- ---分析:在用户做插入操作的之前,拿到即将插入的数据,
- ------给该数据中的主键列赋值。
- create or replace trigger auid
- before
- insert
- on person
- for each row
- declare
- begin
- select s_person.nextval into :new.pid from dual;
- end;
- --查询person表数据
- select * from person;
- ---使用auid实现主键自增
- insert into person (pname) values ('a');
- commit;
- insert into person values (1, 'b');
- commit;
- ----oracle10g ojdbc14.jar
- ----oracle11g ojdbc6.jar
视图 索引 sql编程 游标 存储过程 存储函数 触发器
Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器的更多相关文章
- Oracle数据库游标,序列,存储过程,存储函数,触发器
游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...
- PL/SQL&存储过程||存储函数&触发器
plsql 有点:交互式 非过程化 数据操纵能力强 自动导航语句简单 调试简单 想率高 声明类型的方式 1.基本类型 2.引用变量 3.记录型变量 基本格式 declare 声明 b ...
- Oracle学习笔记之PL/SQL编程
SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言.1976年,IBM公司的Sa ...
- PL/SQL编程(1) - 存储过程,函数以及参数
存储过程 PROCEDURE [schema.]name[( parameter[, parameter...] ) ] [AUTHID DEFINER | CURRENT_USER ] [ACCES ...
- Oracle学习(十二):存储过程/存储函数
1.知识点 --第一个存储过程 /* 打印Hello World create [or replace] PROCEDURE 过程名(參数列表) AS PLSQL子程序体: 调用存储过程: 1. ex ...
- SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数
原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...
- 剑指Offer——常用SQL语句、存储过程和函数
剑指Offer--常用SQL语句.存储过程和函数 常用SQL语句 1.在MySQL数据库建立多对多的数据表关系 2.授权.取消授权 grant.revoke grant select, insert, ...
- SQL Server(六)——索引、视图和SQL编程
1.索引 添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表 创建视图:create view 视图名 as SQL查询语句,分组,排 ...
- Oracle学习DaySix(PL/SQL续)
一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...
随机推荐
- 一.编译nginx
前往nginx.org下载需要的nginx版本,解压之后目录如下: auto : 主要存放辅助configure脚本执行时的文件, 例如判定nginx支持的模块,操作系统可供nginx使用的特性等. ...
- 深入理解JVM - 线程安全与锁优化 - 第十三章
线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对 ...
- JQuery调用iframe子页面函数/对象的方法
父页面有个ID为mainfrm的iframe,iframe连接b.html,该页面有个函数test 在父页面调用b.html的test方法为: $("#mainfrm")[0].c ...
- Listen81
Nut-Cracking Chimps Demonstrate Cultural Differences One family generally dines on Chinese takeout w ...
- 2018.2.27 RF module distance test part I
Last week,we finish 20 pcs EP2 sample for RF module, Fistly,we need to test PCBA performance test ...
- linux cpu占用100%排查
某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警. 问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代 ...
- Seq2SQL :使用强化学习通过自然语言生成SQL
论文: https://einstein.ai/static/images/layouts/research/seq2sql/seq2sql.pdf 数据集:https://github.com/s ...
- static修饰类的作用
Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...
- pod lib lint 报错 Unable to find a specification for `AMap2DMap` depended upon by `DingtalkPod
执行 pod验证 报错如下 ➜ DingtalkPod git:(2.0.0) ✗ pod lib lint --sources='https://github.com/AloneMonkey/Mo ...
- BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...