1. 一、存储过程
  2. 不可以在insert,update,delete中直接使用,可以有return但代表的是退出过程
  3. 过程有三种类型:不返回值,可以返回多个值,参数有三种类型,分别如下:
  4. in:只输入,不返回结果,默认为in
  5. out:只返回结果,不输入,要想取出输出变量的值必须通过pl/sql块的变量取出
  6. in out:可输入,又可返回结果,要想取出输出变量的值必须通过pl/sql块的变量取出
  7. --语法
  8. create or replace procedure 名称(a1 in varchar2,a2 out varchar2,a3 in out int)
  9. as
  10.  
  11. begin
  12.  
  13. end;
  14. --测试in
  15. create or replace procedure getSex1(p_customerName in varchar2)
  16. as
  17. v_sex varchar2(20);
  18. begin
  19. select sex into v_sex from customer where customerName=p_customerName;
  20. dbms_output.put_line(v_sex);
  21. end;
  22. --测试out
  23. create or replace procedure getSex2(p_customerName in varchar2,p_sex out varchar2)
  24. as
  25. begin
  26. select sex into p_sex from customer where customerName like p_customerName;
  27. exception
  28. when others then raise_application_error(-20001,'occur error');
  29. end;
  30. --测试in out
  31. create or replace procedure getSex3(p_param1 in out varchar2)
  32. as
  33. begin
  34. select sex into p_param1 from customer where customerName=p_param1;
  35. end;
  36. --在pl/sql块中执行
  37. declare
  38. begin
  39. getSex1('a1');
  40. end;
  41.  
  42. --在pl/sql块中执行
  43. declare
  44. p_sex varchar2(20);
  45. begin
  46. getSex2('a1',p_sex);
  47. dbms_output.put_line(p_sex);
  48. getSex2('a2',p_sex);
  49. dbms_output.put_line(p_sex);
  50. end;
  51.  
  52. declare
  53. p_sex varchar2(20);
  54. begin
  55. p_sex:='a1';
  56. getSex3(p_sex);
  57. dbms_output.put_line(p_sex);
  58. p_sex:='a2';
  59. getSex3(p_sex);
  60. dbms_output.put_line(p_sex);
  61. end;
  62. 二、函数:
  63. 只能返回且必须返回一个结果,可以直接用在insert,update,delele,select
  64. 可以有多个return;
  65. 语法:
  66. create or replace function 函数名(p1 varchar2) return varchar2
  67. as
  68. begin
  69. exception
  70. end;
  71. 实例:根据姓名返回姓别
  72. create or replace function getSex(p_customerName varchar2) return varchar2
  73. as
  74. v_sex customer.sex%type;
  75. begin
  76. select sex into v_sex from customer where customerName=p_customerName;
  77. return v_sex;
  78. end;
  79. 执行函数:
  80. 1、在sql(sqlplus)
  81. select getSex(customerName),sex from customer;
  82. 2、在pl/sql块中
  83.       declare
  84. v_sex customer.sex%type;
  85. begin
  86. v_sex:=getsex('a1');
  87. dbms_output.put_line(v_sex);
  88. end;
  89.  
  90. 存储过程:
  91. 1.声明处没有return,可以返回多个值,用输出变量(out,in out)返回
  92. return代表退出程序,不返回结果.
  93. 2.不可以在insert,update,delete,select
  94. 中直接使用,只能通过exec中用
  95. 函数:
  96. 1.声明处有return,只可以返回一个值,
  97. return代表返回一个值.
  98. 2.可以在insert,update,delete,select
  99. 中直接使用.
  100.  
  101. 三、触发器
  102. set serveroutput on;
  103. create or replace trigger teacher_trigger after insert or update or delete on customer for each row
  104. begin
  105. dbms_output.put_line('the table data already has been modified....');
  106. end;
  107.  
  108. 四、游标
  109. declare
  110. v_customer customer%rowtype;
  111. v_customerName customer.customerName%type;
  112. cursor c1(v_customerName varchar2) is select * from customer where customerName like v_customerName;
  113. begin
  114. v_customerName:='&aa';
  115. open c1(v_customerName);
  116. fetch c1 into v_customer;
  117. while(c1%found) loop
  118. dbms_output.put_line(v_customer.customerName||' '||v_customer.sex);
  119. fetch c1 into v_customer;
  120. end loop;
  121. end;
  122.  
  123. 五、包
  124. 包:包中可以有多个方法,包包括包声明与包主体,包声明中声明的方法名,参数名,类型,个数必须与包主体的方法完全一样。
  125. 包声明中声明的变量是全局变量,大家都可以用
  126. --实现包声明
  127. create or replace package my_p
  128. as
  129. function getReverse(v_name varchar2) return varchar2;
  130. procedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number);
  131. end;
  132.  
  133. create or replace package body my_p
  134. as
  135. procedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number)
  136. is
  137. v_sql varchar2(200);
  138. begin
  139. v_sql:='update teachers set '||column_name||' = '||column_value1||' where teachers.teacher_id = '||teacher_id;
  140. EXECUTE IMMEDIATE v_sql;
  141. end teacher_modify_column;
  142.  
  143. function getReverse(v_name varchar2) return varchar2
  144. as
  145. v_title varchar2(200);
  146. i int:=1;
  147. j int:=0;
  148. begin
  149. j:=length(v_name);
  150. while (j>0) loop
  151. v_title:= substr(v_name,i,1)||v_title;
  152. i:=i+1;
  153. j:=j-1;
  154. end loop;
  155. return v_title;
  156. end;
  157. end;
  158.  
  159. create or replace package MyPackage as
  160. type c_type is ref cursor;
  161. function MyReverse(source varchar2) return varchar2;
  162. procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int);
  163. end;
  164. --实现包主体
  165. create or replace package body MyPackage as
  166. function MyReverse(source varchar2) return varchar2
  167. as
  168. i int;
  169. j int;
  170. result varchar2(2000):='';
  171. begin
  172. j:=length(source);
  173. i:=1;
  174. while(i<=j) loop
  175. result:=substr(source,i,1)||result;
  176. i:=i+1;
  177. end loop;
  178. return result;
  179. end;
  180. // 查询语句 页数
  181. procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int)
  182. as
  183. v_sql varchar2(500);
  184. startPage int;
  185. endPage int;
  186. v_rowCount int;
  187. begin
  188. v_sql:='select count(*) from ('||p_sql||')';
  189. dbms_output.put_line(v_sql);
  190. execute immediate v_sql into v_rowCount;
  191. pageCount:=ceil(v_rowCount/pageSize);
  192. if(page=0) then
  193. raise_application_error(-20001,'申请的页面太小');
  194. end if;
  195. if(page>pageCount) then
  196. raise_application_error(-20001,'申请的页面太大');
  197. end if;
  198. startPage:=(page-1)*pageSize;
  199. endPage:=page*pageSize;
  200. v_sql:='select * from ('||p_sql||') where rowNum<='||to_char(endPage);
  201. v_sql:=v_sql||' minus ';
  202. v_sql:=v_sql||'select * from ('||p_sql||') where rowNum<='||to_char(startPage);
  203. dbms_output.put_line(v_sql);
  204. open result for v_sql;
  205. end;
  206. end;
  207. --调用包中的方法
  208. select MyPackage.MyReverse(sex) from customer;
  209. --在pl/sql块中调用
  210. declare
  211. pageCount int;
  212. c1 mypackage.c_type;
  213. v_customer customer%rowtype;
  214. begin
  215. mypackage.splitPage('select * from customer',1,2,c1,pageCount);
  216. dbms_output.put_line('总页数是'||pageCount);
  217. fetch c1 into v_customer;
  218. while(c1%found) loop
  219. dbms_output.put_line(v_customer.customername||' '||v_customer.sex);
  220. fetch c1 into v_customer;
  221. end loop;
  222. close c1;
  223. mypackage.splitPage('select * from customer',2,2,c1,pageCount);
  224. fetch c1 into v_customer;
  225. while(c1%found) loop
  226. dbms_output.put_line(v_customer.customername||' '||v_customer.sex);
  227. fetch c1 into v_customer;
  228. end loop;
  229. close c1;
  230. mypackage.splitPage('select * from customer',3,2,c1,pageCount);
  231. fetch c1 into v_customer;
  232. while(c1%found) loop
  233. dbms_output.put_line(v_customer.customername||' '||v_customer.sex);
  234. fetch c1 into v_customer;
  235. end loop;
  236. close c1;
  237.  
  238. mypackage.splitPage('select * from customer',4,2,c1,pageCount);
  239. fetch c1 into v_customer;
  240. while(c1%found) loop
  241. dbms_output.put_line(v_customer.customername||' '||v_customer.sex);
  242. fetch c1 into v_customer;
  243. end loop;
  244. close c1;
  245. end;

oracle-游标-存储过程-函数-包的更多相关文章

  1. oracle上课 学习2 oracle 游标 存储过程 有用

    1.1. 训练描述 使用游标,打印emp中20号部门的所有员工的信息 操作步骤答案 declare cursor c_emp  is select * from emp where deptno=10 ...

  2. ArcSDE给Oracle添加SDE函数包

    SDE函数包中包含大量的空间计算分析函数,是我们做空间相关分析的一把利刃(目前好像我们只有这一把),有关SDE函数的使用,请见我空间另外的一篇帖子的附件.按照通常教程,过程是这样的1.找到listen ...

  3. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  4. .Net程序员学用Oracle系列:视图、函数、存储过程、包

    1.视图 在实际操作过程中,本人发现 Oracle 视图定义有一个缺陷,就是不大方便注释,每次写好的注释执行之后再打开视图定义所有注释就全都没了.后来我发现把注释写到末尾就不会被清除,但这样总感觉乖乖 ...

  5. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  6. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  7. 编程开发之--Oracle数据库--存储过程和存储函数(2)

    上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...

  8. [转]SQLServer和Oracle,存储过程区别,常用函数对比

    本文转自:http://www.cnblogs.com/neru/archive/2011/08/18/2144049.html 以前一直用sqlserver,只有很少的一点oracle的经验,现在要 ...

  9. MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法

    在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...

随机推荐

  1. CodeForces 822C Hacker, pack your bags!

    题意 给出一些闭区间(始末+代价),选取两段不重合区间使长度之和恰为x且代价最低 思路 相同持续时间的放在一个vector中,内部再对起始时间排序,从后向前扫获取对应起始时间的最优代价,存在minn中 ...

  2. powerlink的Windows-DEMO生成笔记

    资料准备: 1.Visual studio 2010 2.Cmake 3.Powerlink 2.7.1源码 具体下载请到相关页面去获取. 新版的powerlink分为两个部分: 1.协议栈 2.应用 ...

  3. NUC970 Linux CAN 驱动问题及解决办法之一

    开发平台介绍: NUC970 + 内置CAN控制器(双通道CAN1\CAN2) + 官方Linux_Kernel(少量修改) 名词: 版本A,问题及修改涉及两个版本,其中最旧版本称为版本A 版本B,问 ...

  4. NLP传统基础(1)---BM25算法---计算文档和query相关性

    一.简介:TF-IDF 的改进算法 https://blog.csdn.net/weixin_41090915/article/details/79053584 bm25 是一种用来评价搜索词和文档之 ...

  5. Java并发包--线程池框架

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者 ...

  6. RHEL7-RHCE培训系列教程,让您零基础入门Linux运维

    本教程是旨在帮助那些刚入门IT行业或计划从事IT行业的初学者(包括开发人员和运维人员,以及想要在Linux系统维护上提升自己的网络管理员),0基础入门Linux运维,完整学习完成本系列课程相当于培训机 ...

  7. vue1 class style

  8. express框架封装前戏

    一.开启一文件,这里暂且命名为aexpressclass.js 声明一个app类,用来模仿http模块中的回调函数 //var route = require('http-route'); var u ...

  9. 关于pageHelper无法查到总数踩到的坑

    问题代码 PageHelper.startPage(pageNum,pageSize); List<pojoVo> pojoVo=robotService.getPageList(); P ...

  10. mongod破解版的安装

    navicat for mongodb 12,又叫做navicat 12 for mongodb,是针对mongodb软件而开发的一款管理软件,拥有高效图形用户界面,能够连接本地或远程的MongoDB ...