Oracle游标、过程与引用类型

0. 常用函数

substr(str,start,length);//可以反向索引。length不指定就到结尾
to_number(str);//str转number
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;//日期转字符
nvl(tt,0);//若是空值则为0

1. 游标

对于集合数据的处理,学会使用带参数的方式。

同一个会话默认最多300个光标

set system set open_cursors=400 scope=

{both;仅更改当前memory;spfile;重启生效}

//属性
//cus1%found cus1%notfound cus1%isopen cus1%rowcount影响行数
SET serveroutput ON;
DECLARE
  CURSOR c1
  IS
    SELECT bookno,booktitle FROM bebook;
  bookno bebook.bookno%type;//引用类型
  booktitle bebook.booktitle%type;
  rowbook bebook%rowtype;//行引用类型
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 INTO bookno,booktitle;
    EXIT
  WHEN c1 %notfound;
    dbms_output.put_line(‘this string breaks here.‘||bookno||booktitle);
  END LOOP;
END;

//带参数的光标
 Cursor
 cemp(dno number) is select ename from emp where deptno = dno;
 Open cemp(10);

2. rowtype

利用这个数据类型增加程序的健壮性。不会受到表结构更改导致程序更改。

记录可以整体赋值

rowtype参考

rowtype参考

//读入数据到rowtype类型中
create table testtable();
r testtable%rowtype;
select * into r from testtable where pno=...;
//rowtype类型数据插入表中
insert into testtable2 values r;
-----------------------------------------------------
-----------------------------------------------------
declare
  v_dept dept%rowtype;
begin
    v_dept.deptno := 60;
    v_dept.dname := ‘sample‘;
    v_dept.loc := ‘chicago‘;
    insert into dept values v_dept;
end;
declare
    v_dept dept%rowtype;
begin
    v_dept.deptno := 60;
    v_dept.dname := ‘sample2‘;
    v_dept.loc := ‘dallas‘;
    update dept set ROW=v_dept where deptno=v_dept.deptno;
end;

declare
  rwEmp  t_mst_employee%rowtype;
begin
  select * into rwEmp from t_mst_employee where emp_no=‘10001‘;
  rwEmp.emp_no := ‘20001‘;

  insert into t_mst_employee values rwEmp;
  update t_mst_employee set ROW=rwEmp where emp_no=‘3900‘;
end;

3. 过程

create or replace PROCEDURE "STATISTICS_ORDERSUMxxx"(
    branchNo BEbranch.branchNo%type,
    reportPerson VARCHAR2,
    ordersum_table_cursor OUT sys_refcursor)
IS
  testcur sys_refcursor;
  v_typegoodNo BEproduct.productClass%TYPE;    --类别编号
  v_pritypegoodNo BEproduct.productClass%TYPE; --上一游标读取的类别编号
  v_branchNo BEbranch.branchNo%TYPE;           --游标读取的分店编号
  v_pribranchNo BEbranch.branchNo%TYPE;        --上一个游标读取的分店编号
  v_branchname BEbranch.branchName%type;       --各分店
  v_branchsum NUMBER;                          --分店总数
  v_typenum   NUMBER;

  ordersum_table odreport1%rowtype;
  --游标定义
  CURSOR ordersum_cur(pno VARCHAR2)
  IS
    SELECT d.typegoodno,
      SUM(b.quantity)
    FROM BDprocureplan a,
      BDplandetail b,
      BEproduct c,
      DTtypegood d
    WHERE a.branchno   =pno
    AND a.planno       = b.planno
    AND b.productno    = c.productno
    AND c.productclass = d.typegoodno
    GROUP BY d.typegoodno;
  CURSOR branch_cur
  IS
    SELECT branchNo,branchName FROM BEbranch;
  maketime DATE;
  mycount  INT:=0;
BEGIN
  SELECT COUNT(*) INTO mycount FROM bebranch;
  OPEN branch_cur;
  LOOP
    FETCH branch_cur INTO v_branchNo,v_branchname;
    EXIT
  WHEN branch_cur%NOTFOUND;
    ordersum_table.branchname := v_branchname;
    ordersum_table.branchno := v_branchno;
    dbms_output.put_line(ordersum_table.branchname);
    OPEN ordersum_cur( v_branchNo );
    LOOP
      FETCH ordersum_cur INTO v_typegoodNo,v_typenum;
      EXIT
    WHEN ordersum_cur%NOTFOUND;
            CASE v_typegoodNo
      WHEN‘001‘THEN
        ordersum_table.clothessum := ordersum_table.clothessum+v_typenum;
      WHEN‘002‘THEN
        ordersum_table.shoesum:=ordersum_table.shoesum+v_typenum;
      WHEN‘003‘THEN
        ordersum_table.foodsum:=ordersum_table.foodsum+v_typenum;
      WHEN‘004‘THEN
        ordersum_table.sourcesum:=ordersum_table.sourcesum+v_typenum;
      WHEN‘005‘THEN
        ordersum_table.drinksum:=ordersum_table.drinksum+v_typenum;
      WHEN‘006‘THEN
        ordersum_table.drinkingsum:=ordersum_table.drinkingsum+v_typenum;
      WHEN‘007‘THEN
        ordersum_table.vegetablesum:=ordersum_table.vegetablesum+v_typenum;
      WHEN‘008‘THEN
        ordersum_table.fruitsum:=ordersum_table.fruitsum+v_typenum;
      WHEN‘009‘THEN
        ordersum_table.moatsum:=ordersum_table.moatsum+v_typenum;
      WHEN‘010‘THEN
        ordersum_table.electricsum:=ordersum_table.electricsum+v_typenum;
      WHEN‘011‘THEN
        ordersum_table.officesum:=ordersum_table.officesum+v_typenum;
      WHEN‘012‘THEN
        ordersum_table.studysum:=ordersum_table.studysum+v_typenum;
      WHEN‘013‘THEN
        ordersum_table.diansum:=ordersum_table.diansum+v_typenum;
      END CASE;
      ordersum_table.allsum := ordersum_table.allsum+v_typenum;
    END LOOP;
    insert into odreport1 values ordersum_table;
    CLOSE ordersum_cur;
  END LOOP;
  CLOSE branch_cur;
  COMMIT;
END "STATISTICS_ORDERSUMxxx";

Java中调用

//获取
CallableStatement cstmt = null;
String sAutoNo = null;
String sSql = "{call AUTO_No(?,?)}";
try {
    cstmt = connDB.getConn().prepareCall(sSql);
    cstmt.setString(1, tableName);
    cstmt.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //注册字符变量
    cstmt.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);//注册游标变量
    cstmt.execute();
    sAutoNo = cstmt.getString(2);//cstmt.getInt(2);
    ResultSet rs =  ((OracleCallableStatement)call).getCursor(2);
while(rs.next()){
    //do something
}
时间: 2024-10-09 18:25:48

Oracle游标、过程与引用类型的相关文章

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

Duang!危险的oracle游标

1.引言 SQL是面向集合的语言,其结果一般是集合量(含多条记录),而pl/sql的变量是标量,一组变量一次只能存放一条记录.很多时候查询结果的记录数是不确定的,无法提前声明足够的变量.于是引入了游标的概念,游标使得数据库操作更灵活,但同时也给黑客入侵数据库带来了机会.安华金和数据库安全实验室(DBSec Labs)基于游标的应用原理,本文讨论游标可能带来什么安全隐患以及如何应对这些安全隐患. 2.游标的分类 oracle数据库游标是Pl/sql执行DQL.DML等语句的时候,oracle在内存

oracle 游标 学习

1,什么是游标? ①从表中检索出结果集,从中每次指向一条记录进行交互的机制. ②关系数据库中的操作是在完整的行集合上执行的.  由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.  应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的. 这些应用程序需要一种机制来一次处理一行或连续的几行.而游标是对提供这一机制的结果集的扩展. 游标是通过游标库来实现的.游标库是常常作为数据库系统或数据访问 API

ORACLE游标概念讲解

1,什么是游标? ①从表中检索出结果集,从中每次指向一条记录进行交互的机制. ②关系数据库中的操作是在完整的行集合上执行的.   由 SELECT 语句返回的行集合包括满足该语句的 WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些应用程序需要一种机制来一次处理一行或连续的几行.而游标是对提供这一机制的结果集的扩展.      游标是通过游标库来实现的.游标库是常常作

Oracle游标和游标变量的区别

oracle游标我们经常用到,下面介绍oracle游标和游标变量的区别. oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的,它永远指向一个相同的查询工作区. 游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区. oracle游标和游标变量是不能相互代替的. 如何定义游标类型: type ref_type_name is ref cursor [RETURN return_typ

Linux下安装Oracle的过程和涉及的知识点-系列5

12.命令行启动 由于我是用VM进行安装的,所以首先需要修改默认启动为命令行的方式. 使用root登录,编辑/etc/inittab文件,将d:5:initdefault:改为d:3:initdefault: 知识点6:Linux的运行级别 # 0 - 停机(千万不能把initdefault 设置为0) # 1 - 单用户模式 # s init s = init 1 # 2 - 多用户,没有 NFS # 3 - 完全多用户模式(标准的运行级) # 4 - 没有用到 # 5 - X11 多用户图形

oracle安装过程中遇到的问题

今天遭遇ORA-12560: TNS: 协议适配器错误的问题,经过一番努力问题已经解决,与大家共享. 造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序---管理工具---服务,打开服务面板, 启动oraclehome92TNSlistener服务. 2.database instance没有起起来.windows平台如下操作:开始---程序---管理工具---服务,打开服务 面板,启动oracleser

oracle 游标例子

CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) /*********************************************************** * 功能:WAP指标--活跃用户统计(分批提交) * 参数:RETCODE(返回编码:0000成功) * 作者: * 创建时间:2013-01-16 * 版本:1.0 * 修改人: * 修改时间: ********************

【翻译】Oracle游标详细说明

这篇文章是选取官方文档的部分章节翻译过来的,去除了原文中的例子,并在结尾补充了几个例子.有兴趣的朋友可以点击文章末尾的连接去阅读官方文档. 一.游标的定义 游标是指向专用SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息.本章解释的游标是会话游标.会话游标存在于会话中直到会话结束.由PL/SQL创建和管理的游标称为隐式游标,由用户创建和管理的游标称为显式游标.你可以通过游标的属性获取任意会话游标的相关信息.通过查询动态性能视图V$OPEN_CURSOR,可以列出当前已经打开和

Oracle游标—for、loop、if结合应用

一.需求 什么时候会用到Oracle游标,以及其中的for.loop.if呢? 先看这样一个需求: 有一张学生授课表T_TEACHING,每个学生都有数门课程: 主键ID(自增) 课程号COURSE_ID 学号USER_ID 1 01 201501 2 02 201501 3 03 201501 4 01 201502 5 01 201503 6 01 201504 7 02 201504 ... ... ... 但是因为某些原因,导致有的学生课程不全(本应该每个学生都有3门课),应该如何把不全