Oracle(三)存储过程与游标

1、程序包头
 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<MyRole> getAllRoles(String rname) throws Exception{
 3   List<MyRole> 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

原文地址:https://www.cnblogs.com/in-the-game-of-thrones/p/11366782.html

时间: 2024-10-01 08:50:37

Oracle(三)存储过程与游标的相关文章

Oracle基础 存储过程和游标

一.带游标的存储过程 游标作为参数有两种类型: 1.声明系统游标类型 SYS_REFCURSOR 1)游标作为存储过程的参数: --带游标的存储过程 CREATE OR REPLACE PROCEDURE PRO_EMP_IN(EMP_CUR SYS_REFCURSOR) AS V_NAME EMP.ENAME%TYPE; V_SAL EMP.SAL%TYPE; BEGIN LOOP FETCH EMP_CUR INTO V_NAME, V_SAL; DBMS_OUTPUT.PUT_LINE('

Oracle调用存储过程返回游标结果

/** 调用Oracle存储过程 */ public ResultSet queryForAllJSD_NEWEST(final String hpCode, final String id) { System.out.println("hpCode:"+hpCode+",id:"+id); ResultSet rs = (ResultSet)this.jdbctemplate.execute("{call pro_querybcb_newest(? ,

懵懂oracle之存储过程

/* 作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中, 经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象." 其实就似我们经过一系列的

oracle的存储过程

用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. 1. 建立一个存储过程 create or replace PROCEDURE firstPro IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; 其中IS关键字替换为AS关键字结果不会出现任何变化,大多认为他们是等同的,但也有一种说法解释为:一般PACKAGE 或

qlserver、Mysql、Oracle三种数据库的优缺点总结

这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下 一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应

懵懂oracle之存储过程2

上篇<懵懂oracle之存储过程>已经给大家介绍了很多关于开发存储过程相关的基础知识,笔者尽最大的努力总结了所有接触到的关于存储过程的知识,分享给大家和大家一起学习进步.本篇文章既是完成上篇文章中未来得及总结的关于存储过程的调用.测试等知识的汇总分享,也是对上篇文章的存储过程的一个调试改错过程(由于知识的局限性和书写时的疏忽等,之前的存储过程有误之处难免,正在不断更改中,如果能得到大家的指正将使这个工作进行地更快更好,助人为快乐之本!). 下面步入正题,介绍本篇知识汇总和分享: 一.存储过程的

java下实现调用oracle的存储过程和函数

目录(?)[-] 创建表STOCK_PRICES 插入测试数据 建立一个返回游标 创建和存储过程P_GET_PRICE 创建函数 JAVA调用存储过程返回结果集 开发JAVA调用函数返回结果集 在oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES [cpp] view plaincopy --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED D

oracle 分页存储过程

--创建表declare num number; begin select count(1) into num from user_tables where table_name='SRCT';   --判断当前要创建的表在数据库中是否存在.if num>0 then execute immediate 'drop table '||'SRCT'; --表名要大写end if; execute immediate 'CREATE TABLE SRCT(    SN  char(11),   XM

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR -- 包里面方法名 ) is str_sql varchar2(8000) := ''; begin str_sql