请选择 进入手机版 | 继续访问电脑版

[oracle] Oracle存储过程案例详解

[复制链接]
查看141 | 回复15 | 2021-9-13 22:35:04 | 显示全部楼层 |阅读模式

创建简单存储过程(Hello World)

为了方便读者简单易懂,我将下面利用 到的表复制给大家。
详细 表中的数据,请大家本身 填写

  1. -- Create table
  2. create table EMP
  3. (
  4. empno NUMBER(4) not null,
  5. ename VARCHAR2(10),
  6. job VARCHAR2(9),
  7. mgr NUMBER(4),
  8. hiredate DATE,
  9. sal NUMBER(7,2),
  10. comm NUMBER(7,2),
  11. deptno NUMBER(2)
  12. )
复制代码

在这里插入图片形貌

在这里插入图片形貌

  1. create or replace procedure firstP(name in varchar2) is
  2. /*这里name为的参数,in为输入,varchar2为类型*/
  3. begin
  4. /* dbms_output.put_line(); 相当输出到控制台上,这样我们一个简单的存储过程就完成啦
  5. 记住一句话的结束使用分号结束,存储过程写完一定要执行
  6. 将它保存到数据库中 (F8)快捷键,或者点击左上角执行*/
  7. dbms_output.put_line('我的名字叫'||name);/*dbms_output.put_line相当于JAVA中的System.out.println("我的名字叫"+name);*/
  8. end firstP;
复制代码

下面我们要对刚刚写过的存储过程举行 测试,我们开启Test Window这个窗口

在这里插入图片形貌

  1. -- Created on 2018/12/30 星期日 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. /*测试名称 名称类型 使用 := 给参数赋值,在多说一句,分号结束本句*/
  5. name2 varchar2(64):='数据库';
  6. begin
  7. -- Test statements here
  8. firstp(name2);
  9. end;
复制代码

我们打开DBMS Output就可以看到实验 的存储过程啦。

在这里插入图片形貌

在这里插入图片形貌

存储过程IF判断

  1. create or replace procedure isifp(age in number) is
  2. /*存储过程if判断以then开始,以end if; 结束*/
  3. begin
  4. if (age > 30) then
  5. dbms_output.put_line('我已经超过30岁了');
  6. else
  7. if (age < 10) then
  8. dbms_output.put_line('我还是个儿童');
  9. else
  10. dbms_output.put_line('我正在奋斗时期');
  11. end if;
  12. end if;
  13. end;
复制代码

存储过程输出

  1. create or replace procedure inandout(name in varchar2, age in number,outp out varchar2) is
  2. /*in 代表输入,out 代表输出*/
  3. begin
  4. outp:='my name is '|| name ||',my age is '||age;/*相当于JAVA中的return outp,但是请注意,存储过程中可以return多个值*/
  5. end inandout;
复制代码

测试输出代码

  1. -- Created on 2018/12/30 星期日 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. name varchar2(64):='数据库';
  5. age number:=06;
  6. out_p varchar2(64);
  7. begin
  8. -- Test statements here
  9. inandout(name,age,outp=>:out_p);
  10. /*这里的outp是存储过程中的输出参数,out_p是在测试中使用的别名*/
  11. end;
复制代码

在这里插入图片形貌

返回游标

  1. create or replace procedure sysrefcursor(id in number, columnss out sys_refcursor) as
  2. /*columnss out sys_refcursor 为输出游标*/
  3. begin
  4. open columnss for
  5. select * from emp where empno=id;
  6. end;
复制代码

测试游标

第一种测试方法

  1. -- Created on 2018/12/30 星期日 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. cursor ee is select * from emp where empno=7934;
  5. begin
  6. -- Test statements here
  7. for e in ee loop
  8. dbms_output.put_line('deptno:'||e.deptno);
  9. end loop;
  10. end;
复制代码

输出效果 如下:

在这里插入图片形貌

第二种测试方法

  1. -- Created on 2018/12/30 星期日 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. cursor ee is select * from emp where empno=7934;
  5. cur ee % rowtype;
  6. begin
  7. -- Test statements here
  8. open ee;
  9. loop
  10. fetch ee into cur;
  11. exit when ee%notfound;
  12. dbms_output.put_line('name:'||cur.ename);
  13. end loop;
  14. close ee;
  15. end;
复制代码

在这里插入图片形貌

上面测试效果 仅仅返回一条数据。下面我来演示返回多条数据的环境 。
起首 请看我表中的数据

在这里插入图片形貌

有两个job中内容为CLERK的数据。

  1. -- Created on 2018/12/30 星期日 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. cursor ee is select * from emp where job='CLERK';
  5. begin
  6. -- Test statements here
  7. for e in ee loop
  8. dbms_output.put_line('deptno:'||e.deptno);
  9. end loop;
  10. 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. create or replace procedure intop(id in number, print2 out varchar2) as
  2. e_name varchar2(64);
  3. begin
  4. select ename into e_name from emp where empno = id;
  5. if e_name ='ALLEN' then
  6. dbms_output.put_line(e_name);
  7. print2:='my name is '||e_name;
  8. else if e_name ='SMITH' then
  9. print2:='打印sql'||e_name;
  10. else
  11. print2:='打印其他';
  12. end if;
  13. end if;
  14. end intop;
复制代码

轻微 复杂一点存储过程

由于朋侪 这里有个需求必要 用存储过程,进而更新一下博客。
起首 我们先创建一张表

  1. -- Create table
  2. create table CLASSES
  3. (
  4. id NUMBER not null,
  5. name VARCHAR2(14),
  6. classesc VARCHAR2(10),
  7. seq NUMBER(5)
  8. )
  9. tablespace USERS
  10. pctfree 10
  11. initrans 1
  12. maxtrans 255
  13. storage
  14. (
  15. initial 64K
  16. next 1M
  17. minextents 1
  18. maxextents unlimited
  19. );
  20. -- Create/Recreate primary, unique and foreign key constraints
  21. alter table CLASSES
  22. add constraint PK_CLASSES primary key (ID)
  23. using index
  24. tablespace USERS
  25. pctfree 10
  26. initrans 2
  27. maxtrans 255
  28. storage
  29. (
  30. initial 64K
  31. next 1M
  32. minextents 1
  33. maxextents unlimited
  34. );
复制代码

下面我们创建一个序列

  1. -- Create sequence
  2. create sequence SEQ_CLASSES
  3. minvalue 1
  4. maxvalue 9999999999999999999999999999
  5. start with 2
  6. increment by 1
  7. cache 20;
复制代码

下面创建存储过程,写的乱一些,盼望 不要介怀

  1. create or replace procedure proclasses(Names in varchar2,
  2. classescs in varchar) as
  3. /*在我们创建存储过程的时候as其实是is*/
  4. id number;/*设置变量名称*/
  5. c number;
  6. seq number;
  7. begin
  8. select SEQ_CLASSES.nextval into id from dual;/*获取下一个序列,使用into赋值给id这个变量名称*/
  9. dbms_output.put_line('classescs=' || classescs);/*打印而已*/
  10. select count(*) into c from Classes where classesc = classescs;/*条件判断,classesc=进来的变量*/
  11. if (c > 0) then/*当数量大于0时*/
  12. select max(seq) + 1 into seq from Classes where classesc = classescs;
  13. dbms_output.put_line('第一个seq' || seq);
  14. else
  15. if (c = 0) then
  16. seq := 0;/*如果查询出来的数量为0的时候,我们赋值seq变量为0*/
  17. dbms_output.put_line('c=0的时候seq' || seq);
  18. end if;
  19. end if;
  20. insert into classes
  21. (id, name, classesc, seq)
  22. values
  23. (id, names, classescs, seq);
  24. /*insert插入这个不用多说了,大家都明白;注意的是我们insert之后一定要提交。
  25. 不然数据没有持久化到数据库,这个insert没有任何意义了*/
  26. end proclasses;
复制代码

下面我们来调用这个存储过程

  1. -- Created on 2019/1/7 星期一 by ADMINISTRATOR
  2. declare
  3. -- Local variables here
  4. names varchar2(32):='晓明';
  5. classescs varchar2(32):='一班';
  6. begin
  7. -- Test statements here
  8. proclasses(names,classescs);
  9. end;
复制代码

到此这篇关于Oracle存储过程案例详解的文章就先容 到这了,更多相干 Oracle存储过程内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 哗中 | 2021-10-3 07:22:03 | 显示全部楼层
很有品味!
回复

使用道具 举报

avatar 碧雲居士 | 2021-10-4 09:59:17 | 显示全部楼层
看帖、回帖、拿分、走人
回复

使用道具 举报

avatar 囝囝刚 | 2021-10-4 16:16:40 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar yfyffuuy | 2021-10-5 10:12:22 | 显示全部楼层
admin楼主最近很消极啊!
回复

使用道具 举报

avatar 执着等待等wc | 2021-10-6 00:25:01 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 麦子971 | 2021-10-11 14:25:27 | 显示全部楼层
十分赞同admin楼主!
回复

使用道具 举报

avatar V刘晨曦 | 2021-10-14 03:40:36 | 显示全部楼层
收藏了,以后可能会用到!
回复

使用道具 举报

林子大了,什么鸟都有了啊!
回复

使用道具 举报

今天不想骂人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则