热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle(三)存储过程与游标

Oracle(三)存储过程与游标:1createorreplacepackagepck_demo--声明一个程序包头,注意:包头与包体的名称一样2as--语法34typemycur

1 create or replace package pck_demo --声明一个程序包头,注意:包头与包体的名称一样 2 as -- 语法 3 4   type mycursoris ref cursor;-- 声明一个(引用)游标类型 5   -- 第一个存储过程,查询所有的角色(根据关键字),需要先执行一个存储过程完成后,在去添加新的存储过程 6   procedure get_all_role( 7     cname in varchar2,-- 输入参数 8     vresult out mycursor --输出参数,为上面定义的游标类型。 9   ); 10 11   -- 第二个存储过程,添加一个角色 12   procedure add_role( 13     cname in varchar2,-- 输入参数,角色名称 14     vresult out varchar2--输出参数,提示结果。 15   ); 16 17 end pck_demo ;--结束这个程序包头

2、程序包体

1 create or replace package body pck_demo --声明一个程序包体,注意:包头与包体的名称要一模一样 2 as -- 语法 3 -- 第一个存储过程,查询所有的角色(根据关键字) 4   procedure get_all_role( -- 在包体中实现包头中定义的存储过程 5     cname in varchar2,-- 输入参数 6     vresult out mycursor --输出参数,为上面定义的游标类型。 7   ) as --这里的as也可以写成is 8 9   begin 10     open vresult -- 打开引用游标 11       for select * from t_role where rname like %||cname||%;--将查询的结果放入到游标中 12   end get_all_role;--程序的end 13 14 15 16   -- 第二个存储过程,添加一个角色 17   procedure add_role( 18     cname in varchar2,-- 输入参数,角色名称 19     vresult out varchar2--输出参数,提示结果。 20   ) as 21   v_count number := 0;--声明变量,赋予初始值 22   begin 23     insert into t_role (rid,rname) values(seq_uid.nextval,cname); 24     v_count := sql%rowcount; -- 受影响的行数,给到v_count中 25     commit; 26     if v_count > 0 then 27       vresult :=插入成功; 28     else 29       vresult :=插入失败; 30     end if; -- 结束if判断 31   end add_role ; 32 end pck_demo ;--包的结束

在IDEA中调用存储过程
  使用C3P0数据源

1 方法一、查询所有的角色 2 public List getAllRoles(String rname) throws Exception{ 3   List list = new ArrayList<>(); 4   //得到连接 5   Connection con = MyC3P0Oracle.getConnection(); 6   String sql = "call pck_demo.get_all_role(?,?)";//用包头名 点 存储过程名;第一个是输入参数,第二个是返回的参数 7   //定义一个数据集,用来接收数据 8   ResultSet rs = null; 9   //CallableStatement 专门用来处理存储过程的 10   CallableStatement cs = con.prepareCall(sql); 11   cs.setString(1,rname);//给参数赋值 12   //注册输出参数赋值,类型是存储过程中定义的 游标 类型 13   cs.registerOutParameter(2,OracleTypes.CURSOR); 14   //执行存储过程 15   cs.execute(); 16   //返回数据集 17   ts = cs.getObject(2); 18   while(ts.next()){ 19     MyRole myrole = new MyRole( 20       ts.getInt(1), 21       ts.getString(2); 22       list.add(myrole); 23     ) 24   } 25   //关闭资源的方法,三个对象需要关闭,这里省略 26   return list; 27 } 28 方法二、新增一个角色 29 public String insertRoles(MyRole role) throws Exception{ 30    //得到连接   31   Connection con = MyC3P0Oracle.getConnection(); 32   String sql = "call pck_demo.add_rolee(?,?)";//用包头名 点 存储过程名;第一个是输入参数,第二个是返回的参数 33   MyRole role = new MyRole(); 34   role.setRname("老师"); 35   //CallableStatement 专门用来处理存储过程的 36   CallableStatement cs = con.prepareCall(sql); 37   cs.setString(1,role.getRname());//给参数赋值 38   //注册输出参数赋值,类型是存储过程中定义的 游标 类型 39   cs.registerOutParameter(2,OracleTypes.VARCHAR); 40   //执行存储过程 41   cs.execute(); 42   //关闭资源的方法,两个对象需要关闭,这里省略 43   return cs.getString(2);//得到返回的参数 44 }

 




--创建或修改存储过程,存储过程名为findclass,输入参数为classId,输出className create or replace procedure findclass(classId in int,classStudents out sys_refcursor,className out varchar2) as --定义一个游标的方式有多种,可以显示定义CURSOR cursor_name is select * from table,也可以定义动态游标,游标关键词CURSOR TYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标 students ref_cursor_type; --定义班级集合为一个游标类型 student_row student%rowtype; --定义班级类型,类型为student表行类型 --存储过程开始 begin --把查询出来的class_name 赋值给输出变量className,查询条件为classId select class_name into className from class where id = classId; --打开游标并赋值 open students for select * from student where fk_class =classId; --把查询结果赋值给输出变量,实际上可以直接open classStudents for select * from student where fk_class =classId; classStudents := students; --循环输出游标,循环有三种方式,for in循环,fetch循环,while循环 --fetch循环 loop fetch classStudents into student_row; --当循环到空跳出循环 EXIT WHEN classStudents%NOTFOUND; DBMS_OUTPUT.put_line(‘学生名:‘||student_row.student_name); end loop; DBMS_OUTPUT.put_line(‘班级名:‘||className); --存储过程结束 end findclass;

into前面写table列名,后面写需要赋值的变量名,顺序要对 select student_name,class_name into studentName,className from class;

转载自https://www.jianshu.com/p/159f3f41f4cc

Oracle(三)存储过程与游标


推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Ihaveapolynomial(generatedfromthecharacteristicpolynomialofamatrix)andIdliketosolve ... [详细]
author-avatar
飞儿gxj_505
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有