blogjava's web log

blogjava's web log
...

oracle游标备忘

-- 例六:%NotFound

BEGIN
  
DELETE   FROM  Rs_Employees
    
Where  HeTongId = ' WL-090001 ' ;
  
  
if  sql % Notfound  then
    Dbms_Output.put_line(
' 没有找到要删除的记录 ' );
  
else
    Dbms_Output.put_line(
' 已删除记录 ' );
  
end   if ;

END ;
   
   
   
-- 例七:%RowCount,查询记录行数
Declare
  v_name Rs_Employees.Name
% type;
BEGIN
  
SELECT  Name  Into  v_Name
    
FROM  Rs_Employees
    
Where  HeTongId = ' WL-090010 ' ;
  
  
if  sql % RowCount   > 0   Then
    Dbms_Output.put_line(
' 已从表中选择行,Name为: ' || v_Name);
  
else
    Dbms_Output.put_line(
' 从表中未选择行 ' );
  
end   if ;

END ;
   
-- 再演示以下代码
BEGIN
  
DELETE   FROM  Rs_Employees
    
Where  HeTongId <= ' WL-090010 ' ;
  
  Dbms_Output.put_line(
' 已从表中删除 ' || To_Char(sql % RowCount ) || ' 条记录 ' );
END ;   
   
 
 
-- 例八:显式游标
--
以下示例在所有游标的记录中的Name字段中加一字串
--
同时在此示范了如何使用%NotFound属性
--
set serveroutput on;
Declare
  v_Id    Rs_Employees.Hetongid
% type;
  v_name  Rs_Employees.Name
% type;
  v_Count 
Number : = 0 ;
  
  
Cursor  MyCur  Is
    
SELECT  HetongId,Name  FROM  Rs_Employees
      
Where  HeTongId <= ' WL-090010 ' ;
      
BEGIN
  
-- 打开游标 
   Open  MyCur;
  
-- 进入循环
  Loop
    
Fetch  MyCur  Into  v_id,v_name;
    
Exit   When  MyCur % NotFound;
    
    
Update  Rs_Employees
      
Set  Name  =  Name  ||   ' X '
      
Where  HeTongId = v_Id;
    v_Count :
=  v_Count  +   1 ;
  
End  Loop;
  
  Dbms_Output.put_line(
' 已更新 ' || v_Count || ' ' );
END ;

-- 例10:以下示范%RowCount和%IsOpen,同时示范了%RowType的使用
--
例10:以下示例%RowCount
Declare
  v_Row   Rs_Employees
% RowType;
 
  
Cursor  MyCur  Is
    
SELECT   *   FROM  Rs_Employees
      
Where  HeTongId <= ' WL-090010 ' ;
BEGIN
  
if   Not  MyCur % IsOpen  then
    Dbms_Output.put_line(
' 游标未打开 ' );
    
-- 打开游标 
     Open  MyCur;
  
end   if ;

  
-- 进入循环
  Loop
    
Fetch  MyCur  Into  v_row;
    
Exit   When  MyCur % NotFound;
  
    Dbms_Output.put_line(
' 当前已取得 ' || MyCur % RowCount || ' ' );
    Dbms_Output.put_line(
' 姓名: ' || v_row.Name || '      ' || ' 合同号: ' || v_row.HeTongId);
    Dbms_Output.put_line(
'' );
  
End  Loop;
  
  Dbms_Output.put_line(
' 总共已取得 ' || MyCur % RowCount || ' ' );
  
  
if  MyCur % IsOpen  then
    Dbms_Output.put_line(
' 游标已打开 ' );
    
Close  MyCur;
  
end   if ;

  
if   Not  MyCur % IsOpen  then
    Dbms_Output.put_line(
' 游标已关闭 ' );
  
end   if ;
  
END ;

-- 例12:查询嵌套表中数据的游标
--
1 创建类型
   CREATE   OR   REPLACE  TYPE emp_type  As  Object 
   (eno   
number ,
    ename 
varchar2 ( 20 ),
    esal  
number );
-- 2 使用Table of 子句创建Table类型
   CREATE  TYPE emp_nt  AS   Table   Of  emp_type;
-- 3 使用emp_nt数据类型创建myemp表
   CREATE   TABLE  myemp
   (deptno     
number ,
    edet       emp_nt)
    NESTED 
TABLE  edet Store  As  myemployee;
-- 4 初始化myemp的数据
   Insert   Into  myemp  values
    (
10 ,emp_nt(emp_type( 1000 , ' James ' 10000 ),
               emp_type(
1001 , ' Daniel ' , 20000 )));
  
Commit ;
  
-- 执行下列代码  
Declare
  sal  
number ;
  ena  
varchar2 ( 20 );
  
  
Cursor  MyCur  Is
    
SELECT  a.esal,a.ename
      
FROM  the 
      (
Select  edet  From  myemp
         
Where  deptno = 10 ) a;
BEGIN
  
-- 打开游标 
   Open  MyCur;
  
-- 进入循环
  Loop
    
Fetch  MyCur  Into  sal,ena;
    
Exit   When  MyCur % NotFound;
    Dbms_Output.put_line(ena
|| '      ' || sal);
  
End  Loop;
  
  
Close  MyCur;
END ;




-- 例13:此例改自例10,示范循环游标的用法
Declare
  
Cursor  MyCur  Is
    
SELECT   *   FROM  Rs_Employees
      
Where  HeTongId <= ' WL-090010 ' ;
BEGIN

  
For  tmp_cur  In  MyCur
  Loop
    Dbms_Output.put_line(
' 当前已取得 ' || MyCur % RowCount || ' ' );
    Dbms_Output.put_line(
' 姓名: ' || tmp_cur.Name || '      ' || ' 合同号: ' || tmp_cur.HeTongId);
  
End  Loop;

  
-- 在这种情况下,下面这条语句不能执行
   -- Dbms_Output.put_line('当前已取得'||MyCur%RowCount||'行');
END ;


-- 再示范带参数的游标
Declare
  
Cursor  MyCur(m_HeTongId Rs_Employees.Hetongid % type)  Is
    
SELECT   *   FROM  Rs_Employees
      
Where  HeTongId <= m_HeTongId;
BEGIN

  
For  tmp_cur  In  MyCur( ' WL-090020 ' )
  Loop
    Dbms_Output.put_line(
' 当前已取得 ' || MyCur % RowCount || ' ' );
    Dbms_Output.put_line(
' 姓名: ' || tmp_cur.Name || '      ' || ' 合同号: ' || tmp_cur.HeTongId);
  
End  Loop;

  
-- 在这种情况下,下面这条语句不能执行
   -- Dbms_Output.put_line('当前已取得'||MyCur%RowCount||'行');
END ;


-- 再示范以下写法
--
在循环游标中使用查询
Declare
  v_HeTongId  Rs_Employees.Hetongid
% type;
BEGIN
  v_HeTongId :
=   ' WL-090020 ' ;
  
  
For  tmp_cur  In  ( SELECT   *   FROM  Rs_Employees
                    
Where  HeTongId <= v_HeTongId)
  Loop
    Dbms_Output.put_line(
' 姓名: ' || tmp_cur.Name || '      ' || ' 合同号: ' || tmp_cur.HeTongId);
  
End  Loop;
END ;





-- 例15:示范游标变量
--
此例要在Command window或Sql Plus中示范,结果会有点区别
--
SET SERVEROUTPUT ON;
Declare
  TYPE r1_cur 
IS  REF  CURSOR ;
  var1 r1_cur;
  no     
varchar2 ( 20 );
  
  v_czy  sc_chukudan.czy
% type;
  v_pid  sc_chukudanDetail.Productid
% type;
  
BEGIN
  no :
=   ' &你选择的 ' ;

  
IF   UPPER (no)  =   ' MASTER '   then
    
OPEN  var1  For
      
Select  Czy  FROM  sc_chukudan
        
Where  ChuKuDanId  =   ' SCKD04020001 ' ;
    
FETCH  var1  into  v_Czy;
    Dbms_Output.put_line(
' 操作员是: ' || v_czy);
    
CLOSE  var1;
  
ELSE
    
OPEN  var1  For
      
Select  Productid  FROM  sc_chukudanDetail
        
Where  ChuKuDanId  =   ' SCKD04020001 ' ;
    LOOP
      
FETCH  var1  into  v_pid;
      
EXIT   WHEN  var1 % NotFound;
      Dbms_Output.put_line(
' 生产通知单ID是: ' || v_pid);
    
END  LOOP;
    
CLOSE  var1;
  
END   IF ;    
END ;



-- 例16: 游标中的更新和删除
--
此例改自例8
Declare
  
-- 当打开此游标,将锁住了相关记录
   Cursor  MyCur  Is
    
SELECT  Name  FROM  Rs_Employees
      
Where  HeTongId <= ' WL-090010 '
      
For   Update   OF  Name;
      
BEGIN
  
For  tmp_cur  in  MyCur
  Loop
    
Update  Rs_Employees
      
Set  Name  =  Name  ||   ' X '
      
Where   Current   of  MyCur;
  
End  Loop;
END ;

posted on 2006-04-20 00:32 record java and net 阅读(900) 评论(3)  编辑  收藏 所属分类: Database

评论

# re: oracle游标备忘 2006-04-20 10:32 song

不错。。

多交流.e-mail:
renxianqi2008@126.com

希望能和我联系一下..  回复  更多评论   

# re: oracle游标备忘 2007-09-07 13:32 woodhead

对例七有疑问:

select into 在没有记录返回时是会报错的:ora-01403  回复  更多评论   

# re: oracle游标备忘 2009-02-05 10:05 klemo

很不错的例子  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

常用链接

留言簿(44)

新闻档案

2.动态语言

3.工具箱

9.文档教程

友情链接

搜索

最新评论