本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Oracle存储过程案例详解
我是陈晓 · 264浏览 · 发布于2021-08-13 +关注

这篇文章主要介绍了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;


相关推荐

使用SELECT语句检索数据

奔跑的男人 · 793浏览 · 2019-06-03 09:33:43
部署MySQL延迟从库的几个好处

吴振华 · 657浏览 · 2019-05-14 21:57:51
MongoDB凭什么跻身数据库排行前五?

iamitnan · 716浏览 · 2019-06-18 10:04:56
Oracle开启和关闭的几种模式

qq2360248666 · 738浏览 · 2019-06-04 10:18:47
加载中

0评论

评论
我是一名在上海一家互联网公司上班,专注技术开发工作等。
小鸟云服务器
扫码进入手机网页