oracle存储过程if多个条件_oracle存储过程(适合初学者)

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

为了方便读者简单易懂,我将下面使用到的表复制给大家。
具体表中的数据,请大家自己填写

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

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

50b0efc2354c2404fb172c28a57b075c.png
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare   -- Local variables here  /*测试名称 名称类型 使用 := 给参数赋值,在多说一句,分号结束本句*/  name2 varchar2(64):='数据库';begin  -- Test statements here  firstp(name2);end;123456789

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

fa881691944c0c3b14dd253a9674edbb.png
33df49f31090a36dfc2a11b5258c7c67.png

存储过程IF判断

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;123456789101112131415

存储过程输出

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;12345

测试输出代码

-- 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;1234567891011
4dbf3d2528a93c949e2111b21745dbf1.png

返回游标

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;1234567

测试游标

第一种测试方法

-- 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;12345678910

输出结果如下:

de2d51abc6ad0a81e1606616aa71b08c.png

第二种测试方法

-- 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;123456789101112131415
4624a7bd85374db7eb4b8814c7b3352f.png

上面测试结果仅仅返回一条数据。下面我来演示返回多条数据的情况。
首先请看我表中的数据

b53bd6cb5b8fcf62a36357a0e5c793e1.png


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

-- 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;12345678910
f7dac808316c23b43506cf7a0c6251c2.png


游标返回多条数据。

由于对于初学者来说,游标可能不是很容易理解,下面我用JAVA语言来描述一下。
我们在java程序中写条件查询的时候,返回出来的数据是List。这个操作相当于游标,说白了就是个查询而已(大家不要误认为就这么一句简单的SQL为什么要用游标,因为只是方便读者学习游标罢了,具体业务具体分析,请不要抬杠哦)
当我们要使用list中的数据时,我们使用循环调用某一条数据时,是不是就要用实体类对象点get字段。可以理解为for e in ee loop dbms_output.put_line('deptno:'||e.deptno); end loop;
这里面的e.deptno。

获取table中的column

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;123456789101112131415

稍微复杂一点存储过程

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

-- Create tablecreate 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  );1234567891011121314151617181920212223242526272829303132333435

下面我们创建一个序列

-- Create sequence create sequence SEQ_CLASSESminvalue 1maxvalue 9999999999999999999999999999start with 2increment by 1cache 20;12345678

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

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;123456789101112131415161718192021222324252627

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

-- 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;123456789

好了,如果我写的东西读者不理解,欢迎读者指出来(我会更加完善,以便读者理解记忆)。谢谢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值