1. ---视图
  2. ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中。
  3. ---一个由查询语句定义的虚拟表。
  4.  
  5. ---查询语句创建表
  6. create table emp as select * from scott.emp;
  7. select * from emp;
  8. ---创建视图【必须有dba权限】
  9. create view v_emp as select ename, job from emp;
  10. ---查询视图
  11. select * from v_emp;
  12. ---修改视图数据,其实在修改表数据[不推荐]
  13. update v_emp set job='CLERK' where ename='ALLEN';
  14. commit;
  15. -- 删除视图
  16. drop view v_emp;
  17. ---创建只读视图
  18. create view v_emp1 as select ename, job from emp with read only;
  19. ---视图的作用?
  20. ---第一:视图可以屏蔽掉一些敏感字段。
  21. ---第二:保证总部和分部数据及时统一。
  22.  
  23. ---索引
  24. --索引的概念:索引就是在表的列上构建一个二叉树
  25. ----达到大幅度提高查询效率的目的,但是索引会影响增删改的效率。
  26. ---单列索引
  27. ---创建单列索引
  28. create index idx_ename on emp(ename);
  29. ---单列索引触发规则,条件必须是索引列中的原始值。
  30. ---单行函数,模糊查询,都会影响索引的触发。
  31. select * from emp where ename='SCOTT'
  32. ---复合索引
  33. ---创建复合索引
  34. create index idx_enamejob on emp(ename, job);
  35. ---复合索引中第一列为优先检索列
  36. ---如果要触发复合索引,必须包含有优先检索列中的原始值。
  37. select * from emp where ename='SCOTT' and job ='xx';---触发复合索引
  38. select * from emp where ename='SCOTT' or job ='xx';---不触发索引
  39. select * from emp where ename='SCOTT';---触发单列索引。
  40.  
  41. ---pl/sql编程语言
  42. ---pl/sql编程语言是对sql语言的扩展,使得sql语言具有过程化编程的特性。
  43. ---pl/sql编程语言比一般的过程化编程语言,更加灵活高效。
  44. ---pl/sql编程语言主要用来编写存储过程和存储函数等。
  45.  
  46. ---声明方法
  47. ---赋值操作可以使用:=也可以使用into查询语句赋值
  48. declare
  49. i number(2) := 10;
  50. s varchar2(10) := '小明';
  51. ena emp.ename%type;---引用型变量
  52. emprow emp%rowtype;---记录型变量
  53. begin
  54. dbms_output.put_line(i);
  55. dbms_output.put_line(s);
  56. select ename into ena from emp where empno = 7788;
  57. dbms_output.put_line(ena);
  58. select * into emprow from emp where empno = 7788;
  59. dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
  60. end;
  61.  
  62. ---pl/sql中的if判断
  63. ---输入小于18的数字,输出未成年
  64. ---输入大于18小于40的数字,输出中年人
  65. ---输入大于40的数字,输出老年人
  66. declare
  67. i number(3) := ⅈ
  68. begin
  69. if i<18 then
  70. dbms_output.put_line('未成年');
  71. elsif i<40 then
  72. dbms_output.put_line('中年人');
  73. else
  74. dbms_output.put_line('老年人');
  75. end if;
  76. end;
  77.  
  78. declare
  79. i number(2) := 28;
  80. begin
  81. if i < 18 then
  82. dbms_output.put_line('child');
  83. elsif i < 25 then
  84. dbms_output.put_line('teenager');
  85. else
  86. dbms_output.put_line('old');
  87. end if;
  88. end;
  89. ---pl/sql中的loop循环
  90. ---用三种方式循环打印110
  91. ---while循环
  92. declare
  93. i number(2) := 0;
  94. begin
  95. while i < 10 loop
  96. dbms_output.put_line(i + 1);
  97. i := i + 1;
  98. end loop;
  99. end;
  100. ---exit循环
  101. declare
  102. i number(2) := 1;
  103. begin
  104. loop
  105. exit when i>10;
  106. dbms_output.put_line(i);
  107. i := i+1;
  108. end loop;
  109. end;
  110. ---for循环
  111. declare
  112.  
  113. begin
  114. for i in 1..10 loop
  115. dbms_output.put_line(i);
  116. end loop;
  117. end;
  118.  
  119. ---游标:可以存放多个对象,多行记录。
  120. ---游标:通过游标可以操作存储查询结果集。
  121. ---游标输出emp表中所有员工的姓名
  122. declare
  123. cursor c is select * from emp;
  124. emprow emp%rowtype;
  125. begin
  126. open c;
  127. loop
  128. fetch c into emprow;
  129. exit when c%notfound;
  130. dbms_output.put_line(emprow.empno || ' ' || emprow.ename);
  131. end loop;
  132. close c;
  133. end;
  134.  
  135. -----给指定部门员工涨工资
  136. declare
  137. cursor c(dno emp.deptno%type)
  138. is select * from emp where deptno=dno;
  139. r emp%rowtype;
  140. begin
  141. open c(10);
  142. loop
  143. fetch c into r;
  144. exit when c%notfound;
  145. update emp set sal = sal + 100 where deptno=r.deptno and ename=r.ename;
  146. commit;
  147. end loop;
  148. close c;
  149. end;
  150. ----查询10号部门员工信息
  151. select * from emp where deptno = 10;
  152.  
  153. ---存储过程
  154. --存储过程:存储过程就是提前已经编译好的一段pl/sql语言,放置在数据库端
  155. --------可以直接被调用。这一段pl/sql一般都是固定步骤的业务。
  156. ----给指定员工涨100块钱
  157. create or replace procedure p1(eno emp.empno%type)
  158. is
  159.  
  160. begin
  161. update emp set sal=sal+100 where empno = eno;
  162. commit;
  163. end;
  164.  
  165. select * from emp where empno = 7788;
  166. ----测试p1
  167. declare
  168.  
  169. begin
  170. p1(7788);
  171. end;
  172.  
  173. ----通过存储函数实现计算指定员工的年薪
  174. ----存储过程和存储函数的参数都不能带长度
  175. ----存储函数的返回值类型不能带长度
  176. create or replace function f_yearsal(eno emp.empno%type) return number
  177. is
  178. s number(10);
  179. begin
  180. select sal*12+nvl(comm, 0) into s from emp where empno = eno;
  181. return s;
  182. end;
  183.  
  184. ----测试f_yearsal
  185. ----存储函数在调用的时候,返回值需要接收。
  186. declare
  187. s number(10);
  188. begin
  189. s := f_yearsal(7788);
  190. dbms_output.put_line(s);
  191. end;
  192.  
  193. ---out类型参数如何使用
  194. ---使用存储过程来算年薪
  195. create or replace procedure p_yearsal(eno emp.empno%type, yearsal out number)
  196. is
  197. s number(10);
  198. c emp.comm%type;
  199. begin
  200. select sal*12, nvl(comm, 0) into s, c from emp where empno = eno;
  201. yearsal := s+c;
  202. end;
  203.  
  204. ---测试p_yearsal
  205. declare
  206. yearsal number(10);
  207. begin
  208. p_yearsal(7788, yearsal);
  209. dbms_output.put_line(yearsal);
  210. end;
  211.  
  212. ----inout类型参数的区别是什么?
  213. ---凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰。
  214.  
  215. ---存储过程和存储函数的区别
  216. ---语法区别:关键字不一样,
  217. ------------存储函数比存储过程多了两个return
  218. ---本质区别:存储函数有返回值,而存储过程没有返回值。
  219. ----------如果存储过程想实现有返回值的业务,我们就必须使用out类型的参数。
  220. ----------即便是存储过程使用了out类型的参数,起本质也不是真的有了返回值,
  221. ----------而是在存储过程内部给out类型参数赋值,在执行完毕后,我们直接拿到输出类型参数的值。
  222.  
  223. ----我们可以使用存储函数有返回值的特性,来自定义函数。
  224. ----而存储过程不能用来自定义函数。
  225. ----案例需求:查询出员工姓名,员工所在部门名称。
  226. ----案例准备工作:把scott用户下的dept表复制到当前用户下。
  227. create table dept as select * from scott.dept;
  228. ----使用传统方式来实现案例需求
  229. select e.ename, d.dname
  230. from emp e, dept d
  231. where e.deptno=d.deptno;
  232. ----使用存储函数来实现提供一个部门编号,输出一个部门名称。
  233. create or replace function fdna(dno dept.deptno%type) return dept.dname%type
  234. is
  235. dna dept.dname%type;
  236. begin
  237. select dname into dna from dept where deptno = dno;
  238. return dna;
  239. end;
  240. ---使用fdna存储函数来实现案例需求:查询出员工姓名,员工所在部门名称。
  241. select e.ename, fdna(e.deptno)
  242. from emp e;
  243.  
  244. ---触发器,就是制定一个规则,在我们做增删改操作的时候,
  245. ----只要满足该规则,自动触发,无需调用。
  246. ----语句级触发器:不包含有for each row的触发器。
  247. ----行级触发器:包含有for each row的就是行级触发器。
  248. -----------加for each row是为了使用:old或者:new对象或者一行记录。
  249.  
  250. ---语句级触发器
  251. ----插入一条记录,输出一个新员工入职
  252.  
  253. --应用场景:1.下订单用触发器修改库存 2.帖子评论增删时,修改帖子的评论数。
  254. create or replace trigger t1
  255. after
  256. insert
  257. on person
  258. declare
  259.  
  260. begin
  261. dbms_output.put_line('一个新员工入职');
  262. end;
  263. ---触发t1
  264. insert into person values (1, '小红');
  265. commit;
  266. select * from person;
  267.  
  268. ---行级别触发器
  269. ---不能给员工降薪
  270. ---raise_application_error(-20001~-20999之间, '错误提示信息');
  271. create or replace trigger t2
  272. before
  273. update
  274. on emp
  275. for each row
  276. declare
  277.  
  278. begin
  279. if :old.sal>:new.sal then
  280. raise_application_error(-20001, '不能给员工降薪');
  281. end if;
  282. end;
  283. ----触发t2
  284. select * from emp where empno = 7788;
  285. update emp set sal=sal-1 where empno = 7788;
  286. commit;
  287.  
  288. ----触发器实现主键自增。【行级触发器】
  289. ---分析:在用户做插入操作的之前,拿到即将插入的数据,
  290. ------给该数据中的主键列赋值。
  291. create or replace trigger auid
  292. before
  293. insert
  294. on person
  295. for each row
  296. declare
  297.  
  298. begin
  299. select s_person.nextval into :new.pid from dual;
  300. end;
  301. --查询person表数据
  302. select * from person;
  303. ---使用auid实现主键自增
  304. insert into person (pname) values ('a');
  305. commit;
  306. insert into person values (1, 'b');
  307. commit;
  308.  
  309. ----oracle10g ojdbc14.jar
  310. ----oracle11g ojdbc6.jar

视图 索引 sql编程 游标 存储过程 存储函数 触发器

Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器的更多相关文章

  1. Oracle数据库游标,序列,存储过程,存储函数,触发器

    游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...

  2. PL/SQL&存储过程||存储函数&触发器

    plsql 有点:交互式  非过程化   数据操纵能力强   自动导航语句简单   调试简单   想率高 声明类型的方式 1.基本类型 2.引用变量 3.记录型变量 基本格式 declare 声明 b ...

  3. Oracle学习笔记之PL/SQL编程

           SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言.1976年,IBM公司的Sa ...

  4. PL/SQL编程(1) - 存储过程,函数以及参数

    存储过程 PROCEDURE [schema.]name[( parameter[, parameter...] ) ] [AUTHID DEFINER | CURRENT_USER ] [ACCES ...

  5. Oracle学习(十二):存储过程/存储函数

    1.知识点 --第一个存储过程 /* 打印Hello World create [or replace] PROCEDURE 过程名(參数列表) AS PLSQL子程序体: 调用存储过程: 1. ex ...

  6. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  7. 剑指Offer——常用SQL语句、存储过程和函数

    剑指Offer--常用SQL语句.存储过程和函数 常用SQL语句 1.在MySQL数据库建立多对多的数据表关系 2.授权.取消授权 grant.revoke grant select, insert, ...

  8. SQL Server(六)——索引、视图和SQL编程

    1.索引 添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表 创建视图:create view 视图名 as SQL查询语句,分组,排 ...

  9. Oracle学习DaySix(PL/SQL续)

    一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...

随机推荐

  1. 一.编译nginx

    前往nginx.org下载需要的nginx版本,解压之后目录如下: auto : 主要存放辅助configure脚本执行时的文件, 例如判定nginx支持的模块,操作系统可供nginx使用的特性等. ...

  2. 深入理解JVM - 线程安全与锁优化 - 第十三章

    线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对 ...

  3. JQuery调用iframe子页面函数/对象的方法

    父页面有个ID为mainfrm的iframe,iframe连接b.html,该页面有个函数test 在父页面调用b.html的test方法为: $("#mainfrm")[0].c ...

  4. Listen81

    Nut-Cracking Chimps Demonstrate Cultural Differences One family generally dines on Chinese takeout w ...

  5. 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 ...

  6. linux cpu占用100%排查

    某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警. 问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代 ...

  7. Seq2SQL :使用强化学习通过自然语言生成SQL

    论文: https://einstein.ai/static/images/layouts/research/seq2sql/seq2sql.pdf  数据集:https://github.com/s ...

  8. static修饰类的作用

    Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...

  9. 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 ...

  10. BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组

    Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...