Oracle存储过程案例详解
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
创建简单存储过程(Hello World)
为了方便读者简单易懂,我将下面使用到的表复制给大家。
具体表中的数据,请大家自己填写
1 2 3 4 5 6 7 8 9 10 11 12 | -- Create table create table EMP ( empno NUMBER(4) not null , ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE , sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) ) |
1 2 3 4 5 6 7 8 | create or replace procedure firstP( name in varchar2) is /*这里 name 为的参数, in 为输入,varchar2为类型*/ begin /* dbms_output.put_line(); 相当输出到控制台上,这样我们一个简单的存储过程就完成啦 记住一句话的结束使用分号结束,存储过程写完一定要执行 将它保存到数据库中 (F8)快捷键,或者点击左上角执行*/ dbms_output.put_line( '我的名字叫' || name );/*dbms_output.put_line相当于JAVA中的System. out .println( "我的名字叫" + name );*/ end firstP; |
下面我们要对刚刚写过的存储过程进行测试,我们开启Test Window这个窗口
1 2 3 4 5 6 7 8 9 | -- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here /*测试名称 名称类型 使用 := 给参数赋值,在多说一句,分号结束本句*/ name2 varchar2(64):= '数据库' ; begin -- Test statements here firstp(name2); end ; |
我们打开DBMS Output就可以看到执行的存储过程啦。
存储过程IF判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | create or replace procedure isifp(age in number) is /*存储过程if判断以 then 开始,以 end if; 结束*/ begin if (age > 30) then dbms_output.put_line( '我已经超过30岁了' ); else if (age < 10) then dbms_output.put_line( '我还是个儿童' ); else dbms_output.put_line( '我正在奋斗时期' ); end if; end if; end ; |
存储过程输出
1 2 3 4 5 | create or replace procedure inandout( name in varchar2, age in number,outp out varchar2) is /* in 代表输入, out 代表输出*/ begin outp:= 'my name is ' || name || ',my age is ' ||age;/*相当于JAVA中的 return outp,但是请注意,存储过程中可以 return 多个值*/ end inandout; |
测试输出代码
1 2 3 4 5 6 7 8 9 10 11 | -- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here name varchar2(64):= '数据库' ; age number:=06; out_p varchar2(64); begin -- Test statements here inandout( name ,age,outp=>:out_p); /*这里的outp是存储过程中的输出参数,out_p是在测试中使用的别名*/ end ; |
返回游标
1 2 3 4 5 6 | create or replace procedure sysrefcursor(id in number, columnss out sys_refcursor) as /*columnss out sys_refcursor 为输出游标*/ begin open columnss for select * from emp where empno=id; end ; |
测试游标
第一种测试方法
1 2 3 4 5 6 7 8 9 10 | -- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where empno=7934; begin -- Test statements here for e in ee loop dbms_output.put_line( 'deptno:' ||e.deptno); end loop; end ; |
输出结果如下:
第二种测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where empno=7934; cur ee % rowtype; begin -- Test statements here open ee; loop fetch ee into cur; exit when ee%notfound; dbms_output.put_line( 'name:' ||cur.ename); end loop; close ee; end ; |
上面测试结果仅仅返回一条数据。下面我来演示返回多条数据的情况。
首先请看我表中的数据
有两个job中内容为CLERK的数据。
1 2 3 4 5 6 7 8 9 10 | -- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where job= 'CLERK' ; begin -- Test statements here for e in ee loop dbms_output.put_line( 'deptno:' ||e.deptno); end loop; end ; |
游标返回多条数据。
由于对于初学者来说,游标可能不是很容易理解,下面我用JAVA语言来描述一下。
我们在java程序中写条件查询的时候,返回出来的数据是List<泛型>。这个操作相当于游标,说白了就是个查询而已(大家不要误认为就这么一句简单的SQL为什么要用游标,因为只是方便读者学习游标罢了,具体业务具体分析,请不要抬杠哦)
当我们要使用list中的数据时,我们使用循环调用某一条数据时,是不是就要用实体类对象点get字段。可以理解为for e in ee loop dbms_output.put_line('deptno:'||e.deptno); end loop;
这里面的e.deptno。
获取table中的column
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | create or replace procedure intop(id in number, print2 out varchar2) as e_name varchar2(64); begin select ename into e_name from emp where empno = id; if e_name = 'ALLEN' then dbms_output.put_line(e_name); print2:= 'my name is ' ||e_name; else if e_name = 'SMITH' then print2:= '打印sql' ||e_name; else print2:= '打印其他' ; end if; end if; end intop; |
稍微复杂一点存储过程
由于朋友这里有个需求需要用存储过程,进而更新一下博客。
首先我们先创建一张表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | -- Create table create table CLASSES ( id NUMBER not null , name VARCHAR2(14), classesc VARCHAR2(10), seq NUMBER(5) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table CLASSES add constraint PK_CLASSES primary key (ID) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); |
下面我们创建一个序列
1 2 3 4 5 6 7 | -- Create sequence create sequence SEQ_CLASSES minvalue 1 maxvalue 9999999999999999999999999999 start with 2 increment by 1 cache 20; |
下面创建存储过程,写的乱一些,希望不要介意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | create or replace procedure proclasses(Names in varchar2, classescs in varchar ) as /*在我们创建存储过程的时候 as 其实是 is */ id number;/*设置变量名称*/ c number; seq number; begin select SEQ_CLASSES.nextval into id from dual;/*获取下一个序列,使用 into 赋值给id这个变量名称*/ dbms_output.put_line( 'classescs=' || classescs);/*打印而已*/ select count (*) into c from Classes where classesc = classescs;/*条件判断,classesc=进来的变量*/ if (c > 0) then /*当数量大于0时*/ select max (seq) + 1 into seq from Classes where classesc = classescs; dbms_output.put_line( '第一个seq' || seq); else if (c = 0) then seq := 0;/*如果查询出来的数量为0的时候,我们赋值seq变量为0*/ dbms_output.put_line( 'c=0的时候seq' || seq); end if; end if; insert into classes (id, name , classesc, seq) values (id, names, classescs, seq); /* insert 插入这个不用多说了,大家都明白;注意的是我们 insert 之后一定要提交。 不然数据没有持久化到数据库,这个 insert 没有任何意义了*/ end proclasses; |
下面我们来调用这个存储过程
1 2 3 4 5 6 7 8 9 | -- Created on 2019/1/7 星期一 by ADMINISTRATOR declare -- Local variables here names varchar2(32):= '晓明' ; classescs varchar2(32):= '一班' ; begin -- Test statements here proclasses(names,classescs); end ; |
到此这篇关于Oracle存储过程案例详解的文章就介绍到这了,更多相关Oracle存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Windows系统下Oracle 11g完全卸载教程(推荐!)
安装软件是首要,虽然不是特别重要,但是错误的安装也是相当费劲和抓狂的,所以这篇文章主要给大家介绍了关于Windows系统下Oracle 11g完全卸载的相关资料,文中通过图文介绍的非常详细,要的朋友可以参考下2024-06-06Orcle的package中访问其它Schema的表报错ORA-00942解决方法
package要访问其它Schema的表,但编译报错ORA-00942,经过搜索了一下找到了解决方法下面与大家分享下2013-05-05Oracle数据的插入insert、更新update、删除delete、truncate举例详解
SQL语法是所有操作的基础,包括创建、查询、更新和删除数据,下面这篇文章主要给大家介绍了关于Oracle数据的插入insert、更新update、删除delete、truncate的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下2024-07-07
最新评论