中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
使用oralce Cursor
作者:未知 时间:2004-08-25 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

使用Cursor:

  declare

RoomID       Room.RoomID%Type;

RoomName     Room.RoomName%Type;

cursor crRoom  is

  select RoomID,RoomName

     from Room;

  begin

open crRoom;

loop;

fetch crRoom into RoomID,RoomName;

exit when crRoom%notFound;

  end loop;

close crRoom;

end;

 

3.1在游标使用入口参数

SQL语句的Where 子句中恰当使用 相关语句简化逻辑,本来需要使用两个游标,把相关入口参数放入到SQL语句的Where 子句中,一个就搞定了:

cursor    crRoom    is
      select 
        distinct  楼层,房屋用途
        from      TT_没有处理的房屋  t
        where     数据级别>=
0
            and   房屋处理类别=
3
            and   产权编号=p_产权编号
            and   拆迁房屋类别=p_拆迁房屋类别
            and   面积>
0
            and   (not p_房屋用途 is null
                   and 房屋用途=p_房屋用途
                   or p_房屋用途 is null); 

另外一个例子:

CREATE OR REPLACE PROCEDURE PrintStudents(
  p_Major IN students.major%TYPE) AS
  CURSOR c_Students IS
    SELECT first_name, last_name
      FROM students
      WHERE major = p_Major;
BEGIN
  FOR v_StudentRec IN c_Students LOOP
    DBMS_OUTPUT.PUT_LINE(v_StudentRec.first_name ||
' ' ||
                         v_StudentRec.last_name);
  END LOOP;
END;

 

Oracle带的例子examp6.sql

DECLARE
    CURSOR bin_cur(part_number NUMBER) IS SELECT amt_in_bin
        FROM bins
        WHERE part_num = part_number AND
            amt_in_bin >
0
            ORDER BY bin_num
            FOR UPDATE OF amt_in_bin;
    bin_amt         bins.amt_in_bin%TYPE;
    total_so_far    NUMBER(
5) := 0;
    amount_needed   CONSTANT NUMBER(
5) := 1000;
    bins_looked_at  NUMBER(
3) := 0;
BEGIN
    OPEN bin_cur(
5469);
    WHILE total_so_far < amount_needed LOOP
        FETCH bin_cur INTO bin_amt;
        EXIT WHEN bin_cur%NOTFOUND;
            
/* If we exit, there's not enough to *
              * satisfy the order.                */

        bins_looked_at := bins_looked_at +
1;
        IF total_so_far + bin_amt < amount_needed THEN
            UPDATE bins SET amt_in_bin =
0
                WHERE CURRENT OF bin_cur; 
                   
-- take everything in the bin
            total_so_far := total_so_far + bin_amt;
        ELSE       
-- we finally have enough
            UPDATE bins SET amt_in_bin = amt_in_bin
                - (amount_needed - total_so_far)
                WHERE CURRENT OF bin_cur;
            total_so_far := amount_needed;
        END IF;
    END LOOP;
    CLOSE bin_cur;
    INSERT INTO temp VALUES (NULL, bins_looked_at,
'<- bins looked at');
    COMMIT;
END;

 

 

-- Created on 2004-8-9 by ADMINISTRATOR
declare
 
--带有变量的Cursor

cursor crBooks(c_bookTitle varchar2) is
     select *
       from books  a
       where a.title like  c_bookTitle||
'%';
begin
  for v_Books in crBooks(
'Oracle8') loop
    dbms_output.put_line(v_Books.author1);
  end loop;
end;

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有