Loading

PLSQL变量和类型,流程控制语句,集合

  1 ---PLSQL     调试授权
  2 GRANT debug any procedure, debug connect session TO scott;
  3 --定义变量
  4 declare
  5   part_number number(6);    --SQL类型  
  6   part_name    varchar2(20);  --SQL类型  
  7   in_stock        boolean;        --plsql类型
  8   part_price      pls_integer;   --plsql类型
  9   part_description varchar2(50);   
 10   hours_worked integer:=40;
 11   employee_count integer not null:=0;
 12   hire_date date default sysdate;   --使用DEFAULT设置初始值
 13  begin
 14    part_number:=38;
 15    part_name:='水管';
 16    in_stock:=True;
 17    hours_worked:=50;
 18    part_price:=100/part_number;
 19    part_description:='镀银软管';
 20  DBMS_OUTPUT.put_line(part_number||CHR(13)||part_name||chr(13)||hire_date||'  '||hours_worked);  
 21  end;
 22 
 23  --使用select into 语句为变量赋值
 24  declare
 25     v_sal emp.sal%type;
 26     v_empno emp.empno%type;
 27     v_deptno emp.deptno%type;
 28   begin
 29     select empno,sal,deptno
 30      into v_sal, v_empno, v_deptno
 31      from emp
 32      where empno =7369;
 33       dbms_output.put_line(v_sal  ||' '||v_empno  ||' '||v_deptno);   
 34   exception
 35      when too_many_rows then
 36        dbms_output.put_line('返回了多行数据');   
 37     end;  
 38 
 39 
 40  --定义常量
 41  declare
 42      credit_limit  constant real:=5000.00;  --指定信用额度
 43  begin
 44    dbms_output.put_line('信用额度'||credit_limit );
 45    end;    
 46 
 47  --if ..elseif
 48  declare
 49       v_sal  number;
 50       v_comm number;
 51       v_ename varchar2(20) :='SCOTT';
 52  begin
 53    select sal,comm into v_sal,v_comm from emp
 54    where ename = v_ename; 
 55    if v_sal+v_comm <3000 then
 56      update emp set sal=sal*1.12 where ename =v_ename;
 57    elsif  v_sal+v_comm>3000 and v_sal+v_comm<4000 then
 58       update emp set sal=sal*1.1 where ename =v_ename;
 59       elsif v_sal+v_comm>4000 and v_sal+v_comm<5000 then
 60         update emp set sal=sal*1.05 where ename =v_ename;
 61       end if;       
 62    exception 
 63       when no_data_found then
 64          dbms_output.put_line('对史密斯调薪的操作失败,错误信息为:'||SQLERRM);
 65         end;   
 66 
 67 
 68 
 69 --case选择器的用例
 70    declare
 71       grade char(1);
 72    begin
 73      grade :='0';
 74      case grade
 75        when 'A' then
 76          dbms_output.put_line('优秀');
 77        when 'B' then
 78          dbms_output.put_line('良好'); 
 79         when 'C' then
 80          dbms_output.put_line(''); 
 81             when 'D' then
 82          dbms_output.put_line('一般');  
 83          else
 84            dbms_output.put_line('无此等级');
 85          end case;        
 86      end;
 87 
 88 select mod(100,13) from dual;
 89 --1简单循环
 90      declare
 91          x number:=0;
 92          y number:=100;
 93      begin
 94        loop
 95          dbms_output.put_line('循环中变量的值:x='|| to_char(x));
 96          x:=x+1;
 97          if x>20 then  --如果x的值大于20, 则使用Exit退出循环
 98            exit;
 99            end if;     
100            exit when y mod x>5; --y除以x的余数大于5,则退出循环
101            dbms_output.put_line('结果'|| y mod x);
102           end loop; 
103          dbms_output.put_line('循环结束变量的值:x='||to_char(x));  
104         end;
105 
106    --2 continue when使用实例
107    declare
108      x number:=0;
109      begin
110        loop
111          dbms_output.put_line('循环计数变量:x='||to_char(x));
112          x:=x+1;
113          continue  when x=4;
114          dbms_output.put_line('循环计数变量,在continue之后');
115          exit when x=5;
116          dbms_output.put_line('退出本循环变量的值:x='||to_char(x));
117          end loop;
118        end;
119 
120    --简单的数字式For循环使用示例
121    create table books(bookid number(10),bname varchar2(40),price number(4));
122    alter table books modify bname varchar2(40);
123    begin
124    for  i in 1..3 loop
125         insert into books values(1020+i,'矛盾文学第'||to_char(i)||'',3);
126         dbms_output.put_line('插入了矛盾文学第'||to_char(i)||'');
127      end loop;
128      end;
129   select * from books;   
130 
131   --反向for循环
132   begin
133      for i in reverse 1..5 loop
134        dbms_output.put_line('循环计数器为'||to_char(i));
135       end loop;   
136     end;   
137 
138  --wile loop循环
139  declare
140         v_count pls_integer:=1;
141  begin
142         while v_count<=10 loop
143           dbms_output.put_line('当前循环计数器的值为:'||v_count);
144           v_count:=v_count+1;
145         end loop;  
146    end;       
147 
148  select round(sqrt(37)) from dual;
149 
150  declare
151    p varchar2(30);
152    n pls_integer:=37;
153    begin      
154      for j in 2..round(sqrt(n)) loop
155        if n mod j=0 then
156          p:='不是一个素数';
157          goto print_now;
158          end if;
159          end loop;
160          p:='是一个素数';
161          <<print_now>>
162          dbms_output.put_line(to_char(n)||p);
163      end;
164 
165  1.goto语句不能跳转到嵌套块内部的命名标记位置
166  2.不能在if子句的内部使用goto语句跳转到另一个if,case和loop语句内部
167  的命名标签
168  3.不能从一个exception块中使用goto跳转到块的其他区域
169  4.不能在exception外部使用goto语句跳转到exception内部;
170 
171  --null  表示创建一个什么也不做的
172  declare
173      done boolean:=true;
174   begin 
175     for i in 1..50 loop
176       if done then
177         goto end_loop;
178       end  if;
179       <<end_loop>>
180        null;
181       end loop;
182    end;   
183 
184 
185  --集合
186  --定义关联数组
187  declare
188  --雇佣日期索引集合
189  type hiredate_idxt is table of date index by pls_integer;
190  --部门编号集合
191  type deotno_idsxt is table of dept.deptno%type not null
192  index by pls_integer;
193  --记录类型的索引表, 这个结构允许在PL/SQL程序中创建一个本地副本
194  type emp_idxt is table of emp%rowtype     
195       index by natural;
196  type deptname_idxt is table of dept%rowtype
197    index by dept.dname%type;
198 
199  type private_collection_tt is table of deptname_idxt
200  index by varchar2(100);          
201  begin
202    null;
203 end;  
204 --定义与使用关联数组
205 Declare
206   --定义关联数组,元素类型varchar2(12),下标为PLS_INTEGER
207    type idx_table is table of varchar2(12)
208         index by pls_integer;
209         v_emp idx_table;  --定义关联数组变量
210         v_idx PLS_INTEGER;
211 begin
212   v_emp (1):='史密斯';
213   v_emp (20):='克拉克';
214   v_emp (-10):='杰瑞';
215   v_idx:=v_emp.first;   --获取关联数组中第一个元素的下标
216   while v_idx is not null
217   loop
218         dbms_output.put_line('关联数组'|| v_idx||'所在的值是'||v_emp(v_idx));
219         v_idx:=v_emp.next(v_idx);     
220     end loop;
221   end;        
222 
223   --使用字符串下标的关联数组
224   declare
225    --定义以varchar2作为索引键的关联数组
226     type idx_empsal_table is table of number(8)
227        index by varchar2(20);
228     v_empsal idx_empsal_table;
229 begin                      
230   v_empsal('史密斯'):=5000;
231   v_empsal('李维二'):=8000;
232   v_empsal('张大千'):=3000;
233   dbms_output.put_line('工资为:'|| v_empsal('李维二'));
234   end;    
235 
236 
237   嵌套表是对关联数组的扩展,
238   1 可以在方案级别创建,可以直接 存储在数据库表中作为表的一个字段
239   2 需要调用构造函数进行初始化
240 
241   --使用嵌套表 
242   declare
243     type emp_name_table is table of varchar2 (20);
244     type deptno_table is table of number(2);
245     deptno_info deptno_table;
246     emp_name_info    emp_name_table:=emp_name_table('张老三','李斯特');
247   begin
248     dbms_output.put_line('员工1:'||emp_name_info(1));
249     dbms_output.put_line('员工2:'||emp_name_info(2));
250     if deptno_info is null
251     then 
252         deptno_info:=deptno_table();
253      end if;
254      deptno_info.extend(5);    --扩充元素的个数
255      for i in 1..5                --循环遍历元素个数
256        loop
257            deptno_info(i):=i*10;
258          end loop;   
259          dbms_output.put_line('部门个数:'||deptno_info.count);
260     end;  
261 
262 
263 --定义一个方案级别的嵌套表
264 create  or replace type t_deptno_type is table of number;                 
265 /
266 create or replace procedure print_deptno(nt t_deptno_type) 
267 is i number;
268 begin 
269   i:=nt.first;   --获取第1个元素的下标,如果不存在则返回null
270   if i is null then
271     dbms_output.put_line('嵌套表中未分配任何元素');
272    else
273      while i is not null loop    
274            dbms_output.put('下标.('||i||')的部门编号是:');
275            dbms_output.put_line(nt(i));
276            i:=nt.next(i);       
277        end loop;
278     end if;
279     dbms_output.put_line('---');
280     end print_deptno;    
281 /
282 declare
283    nt t_deptno_type:=t_deptno_type();  --初始化一个空的嵌套表
284 begin
285   print_deptno(nt);              --输出嵌套表的信息
286   nt:=t_deptno_type(90,9,29,58); --重新初始化嵌套表,使之具有4个元素
287   print_deptno(nt);
288   nt.delete(1);       --删除嵌套表中下标为1的元素
289   --dbms_output.put_line(nt(1));  --01403异常
290   nt(1):=10;
291   end;   
292 
293   select * from dept_add_emp
294   --创建嵌套表列
295   create  or replace type tbl_emp_name as table of varchar2(20);
296   create table dept_add_emp(
297        deptno number(2) primary key,
298        dname varchar2(14),
299        loc varchar2(13),
300        emp tbl_emp_name    --object
301   )
302   nested table emp store as emps_nt;  --嵌套表存储位置
303 
304 
305   --对包含嵌套表列的表执行DML语句
306   declare
307          emp_list  tbl_emp_name
308          :=tbl_emp_name('史密斯','杰克','马丁','斯大林','*');
309    begin
310      insert into dept_add_emp
311            values (10,'行政部','北京',emp_list);
312      insert into dept_add_emp 
313             values(20,'财务部','上海',tbl_emp_name('李林','张杰','蔡文'));  
314        --对嵌套表进行更新,然后使用update语句将嵌套表更新回数据库       
315       emp_list(1):='张三';
316       emp_list(2):='李四';
317       emp_list(3):='王五';                        
318       update dept_add_emp set emp=emp_list
319       where deptno=10;
320       --从数据库表中查询出嵌套表的实例
321      select emp into emp_list from dept_add_emp where deptno=10;  
322      for v_index in 1..emp_list.count loop
323          dbms_output.put_line(emp_list(v_index));
324        end loop;   
325        dbms_output.put_line('演示如何从其他表中插入嵌套表列的值');
326        --清除表中的数据
327        delete from dept_add_emp;
328        --使用inert select语句,将插入dept表中所有的记录,使用cast和multiset强转
329        --把emp表中的ename作为嵌套表的元素
330        insert into dept_add_emp
331               select dept.*,cast(multiset
332              (select ename from emp where emp.deptno=dept.deptno) 
333              as tbl_emp_name) from dept;
334         select emp into emp_list from dept_add_emp where deptno=10;
335 
336         for v_index in 1..emp_list.count loop
337           dbms_output.put_line(emp_list(v_index));
338          end loop;      
339        end;        
340 
341    select * from dept_add_emp where deptno=20;  
342 
343    --取消集合嵌套,把它当做一个表来处理
344    select d.deptno,d.dname,emp.* from dept_add_emp d,
345    table(d.emp) emp where d.deptno=10;  
346 
347 --操作变长数组
348 declare
349    --定义变长数组类型
350    type t_dept_name is varray(10) of varchar2(20);
351    type t_dept_no is varray(8) of number;
352    --声明变长数组类型
353    varray_deptname_tab  t_dept_name:=t_dept_name('行政部','管理部');
354    varray_deptno_tab t_dept_no;
355 begin
356      if varray_deptno_tab is null then
357        varray_deptno_tab:=t_dept_no(10,20,30,null,null,null);       
358      end if;  
359      varray_deptname_tab.extend(3); --在原有的基础上扩充三个元素
360      dbms_output.put_line('当前varray_deptname_tab个数:'||varray_deptname_tab.count);
361      varray_deptname_tab.trim;   --删除一个
362      dbms_output.put_line('当前varray_deptname_tab个数:'||varray_deptname_tab.count);
363 
364      varray_deptname_tab.extend;
365      varray_deptname_tab(5):='发展部';
366      dbms_output.put_line(varray_deptname_tab(5)); 
367      --这行代码超过了变长数组最大长度,抛出06533异常
368      --varray_deptno_tab.extend(5)
369   end;    
370 
371 
372 --数据库中的变长数组
373  create  or replace type empname_varray_type is varray (10) of varchar2 (20);
374  create table dept_varray(
375      deptno number(2),
376      dname varchar2(20),
377      emplist empname_varray_type
378  );
379 
380 declare
381    emp_list empname_varray_type:=
382         empname_varray_type('诸葛亮','司马懿','郭嘉','庞统','许攸');
383 begin
384    insert into dept_varray
385           values(20,'军师',emp_list);
386    insert into dept_varray
387           values(30,'武将',
388            empname_varray_type('关羽','张飞','赵云','魏延','黄忠'));
389        --从表中取出变长数组的数据    
390      select emplist into emp_list from dept_varray where deptno=20; 
391      emp_list(1):='姜维';
392      update dept_varray
393             set emplist=emp_list
394       where deptno =20;
395       --删除记录同时删除变长数组
396      --delete from dept_varray where deptno=30;       
397     end;                        
398 
399 select * from dept_varray;
400 
401 
402 --布尔类型使用示例
403 declare
404   v_condition boolean;
405   begin  
406     v_condition:=true;
407     if v_condition then
408       dbms_output.put_line('值为True');
409     else
410        dbms_output.put_line('值为false');
411      end if;
412     end;    
413 --子类型定义,数值检查
414 declare
415     type empnamelist is table of varchar2(20);
416     subtype namelist is empnamelist;  --定义表类型的子类型
417     type emprec is record(
418          empno number(4),
419          ename varchar(20)
420     );
421     subtype emprecord is emprec;   --定义员工记录子类型
422     subtype numtype is number(1,0);
423     x_value numtype;
424     y_value numtype;
425  begin
426    x_value:=3;
427    y_value:=9;
428  end;  
429 --数据类型转换 
430 --显示转换示例
431 declare
432   v_startdate date;
433   v_enddate date;
434   v_resultdate number;
435 begin
436   v_startdate :=to_date('2007-10-11','yyyy-mm-dd');
437   v_enddate:=trunc(sysdate);
438   v_resultdate:=v_enddate-v_startdate;
439   dbms_output.put_line( ' 起始'||v_startdate||'日期: '||
440   to_char(v_startdate,'yyyy-mm-dd')
441   ||chr(13)||chr(10)||'结束'||v_enddate||'日期: '||
442   to_char(v_enddate,'yyyy-MM-dd')
443   ||chr(13)
444   ||chr(10)
445   ||' 相差天数: '
446   || to_char(v_resultdate));
447 end;  
448 
449 --隐式转换示例
450 declare
451    v_startdate char(10);
452    v_enddate  char(10);
453    v_result   number(5);
454 begin
455   select min(hiredate) into v_startdate from emp;
456   select trunc(sysdate) into v_enddate from dual;
457   dbms_output.put_line( ' 起始日期: '
458   || v_startdate||chr(13)||chr(10)             ---chr(10)换行chr(13)回车
459   ||' 结束日期: '||v_enddate );
460 
461   dbms_output.put('chr'||chr(13));
462   v_startdate:='200';
463   v_enddate:='400';
464   v_result:=v_enddate-v_startdate;
465   end;    
466 
467 
468 
469 
470  --检索case语句
471  declare 
472     v_sal number(10,2);
473     v_empno number(10) :=&empno;
474   begin
475     select sal into v_sal from emp
476     where empno=v_empno;
477     case
478       when v_sal between 1000 and 1500
479         then 
480           dbms_output.put_line('员工级别:初级职员');
481       when v_sal between 1500 and 3000
482         then 
483           dbms_output.put_line('员工级别:中级管理');
484          when v_sal between 3000 and 5000
485         then 
486           dbms_output.put_line('员工级别:高级管理');
487         else
488           dbms_output.put_line('不在级别范围之内');
489           end case;   
490     end;  
491 
492 --case语句后面的值是可选的 True和 False ,默认值为True
493 --使用continue重新开始循环
494 declare
495    x number:=0;
496    begin
497      loop
498        dbms_output.put_line('内部循环值:x+'||to_char(x));
499        x:=x+1;
500        if x<3
501          then
502               continue;
503            end if;
504            dbms_output.put_line('countiue之后的值:x='|| to_char(x));
505            exit when x=5;
506        end loop;
507        dbms_output.put_line('循环体结束后的值:x='||to_char(x));
508         end;
509 
510  loop-end-loop循环有一个特色, 无论循环退出条件是否满足
511  先进入循环体,再执行代码,直到遇上exit或exit when子句才
512  判断并退出循环 代码至少有机会被执行一次称为
513  出口值守循环,  见图1 
514    while-loop循环在执行体中代码之前先判断一个条件,如果
515    一开始就为假, 那么一次也不执行代码,这种类型的循环称为
516    入口值守循环
517 
518    循环的功能特性与使用时机 图2
519 
520    --GOTO语句模拟循环语句
521    declare
522        v_counter int:=0;
523    begin
524      <<outer>>
525      DBMS_OUTPUT.put_line('循环计数器:'|| v_counter);
526      if v_counter<5
527        then
528          v_counter:=v_counter+1;
529           goto outer;  --向上跳转到标签位置
530          end if;
531      end;    
532 
533     --NULL 语句
534     declare
535            v_counter INT:=&counter;
536      begin
537        if v_counter>5
538        then
539           dbms_output.put_line('v_counter>5');
540          else
541              null;
542           end if;    
543        end;       
544 
545    --在异常语句块中使用null
546    declare
547        v_result int:=0;
548     begin
549       v_result :=16/0;
550       dbms_output.put_line('现在时间是:'||
551          to_char(sysdate,'yyyy-MM-dd HH24:MI:SS'));
552     exception
553       when others
554         then
555           null;
556       end;   
557 
558 1 有时候希望代码在遇到异常时继续执行,
559 并不处理异常,此时可以使用NUll语句
560 2  使用NULL来创建存根代码,有需要的时候再使用
561 创建一个存根过程,不包含任何程序代码,以便处理程序调试
562 create or replace procedure getleveledbom(bomlevel INT)
563 AS
564 BEGIN
565    NULL;
566 END;   
567 
568 
569 --count方法示例
570 declare
571   type emp_name_table is table of varchar2(20);
572   type deptno_table is table of number(2);
573   deptno_info deptno_table;
574   emp_name_info emp_name_table :=emp_name_table('张三','李斯特');
575   begin
576     deptno_info:=deptno_table();
577     deptno_info.extend(5);    --扩充5个元素
578     dbms_output.put_line('deptno_info的元素个数为:'||deptno_info.count);
579     dbms_output.put_line('emp_name_info的元素个数为:'||emp_name_info.count);
580     end;  
581 --LIMIT方法示例
582 declare
583     type projectlist is varray(50) of varchar2(16);
584     project_list projectlist:=projectlist('网站','ERP','CRM','CMS');
585     begin
586       dbms_output.put_line('变长数组的上限值为:' || project_list.LIMIT);
587       project_list.extend(8);
588       dbms_output.put_line('变长数组的当前个数为:' || project_list.count);
589       end;
590 
591 --first和last示例
592 declare
593       type projectlist is varray (50) of varchar2(16);
594       project_list projectlist :=projectlist('网站','ERP','CRM','CMS');
595  begin
596    dbms_output.put_line('project_list的第一个元素:'||project_list.first);
597    project_list.extend(8);
598    dbms_output.put_line('project_list的最后一个元素的下标:'||project_list.last);
599    end;      
600 
601 --prior和next示例
602 declare
603    type idx_table is table of varchar(12) index by pls_integer;
604    v_emp idx_table;
605    i pls_integer;
606 begin
607   v_emp(1) :='史密斯1';
608   v_emp(20) :='克拉克2';
609   v_emp(40):='史瑞克3';
610   v_emp(-10):='杰瑞4';
611   dbms_output.put_line('第-10个元素的下一个值:'||v_emp(v_emp.next(-10)));
612    dbms_output.put_line('第40个元素的上一个值:'||v_emp(v_emp.PRiOR(40)));
613    i :=v_emp.FIRST;
614    while i is not null 
615    loop
616       dbms_output.put_line('v_emp('||i||')='||v_emp(i));
617       i :=v_emp.next(i);     --遍历
618      end loop;
619   end;      
620 
621 --extend使用示例
622 declare
623    type courselist is table of varchar2(10);
624    courses courselist;
625    i pls_integer;
626 begin
627   courses:= courselist('生物','物理','化学');
628   courses.delete(3);   --删除第三个元素
629   courses.extend;    --追加一个空元素
630   courses(4):='英语';
631   courses.extend(5,1); --把第一个元素复制5份加到末尾
632   i:=courses.First;
633   while i is not null loop
634     dbms_output.put_line('courses('||i||')=' ||courses(i));
635     i:=courses.next(i);
636     end loop;
637   end;   
638 --TRIM示例
639 declare
640   type courselist is table of varchar2(10);
641   courses courselist;
642   i PLS_INTEGER;
643 begin
644   courses := courselist('生物','物理','化学','音乐','数学','地理');
645   courses.trim(2);            --删除集合末尾的两个元素
646   dbms_output.put_line('当前的元素个数:'||courses.count);
647   courses.extend;
648   courses(courses.count):='语文';
649   courses.trim;--删除最后一个  (语文)
650   i:=courses.first;
651   while i is not null loop
652     dbms_output.put_line('courses('||i||')='||courses(i));
653      i:=courses.next(i);
654     end loop;
655   end;  
656 
657 --delete使用示例
658 declare
659   type courselist is table of varchar2(10);
660   courses courselist;
661   i pls_integer;
662 begin
663   courses :=courselist('生物','物理','化学','音乐','数学','地理');
664   courses.delete(2);  --删除第二个元素
665   dbms_output.put_line('当前的元素个数:'||courses.count);
666   courses.extend;
667   dbms_output.put_line('当前的元素个数:'||courses.count);
668   courses(courses.last):='语文';               --为最后一个元素赋值
669   courses.delete(4);    
670   i:=courses.FIRST;
671   while i is not null loop
672     dbms_output.put_line('courses('||i||')='||courses(i));
673     i:=courses.next(i);
674     end loop;
675   end;  
676 
677 使用批量绑定
678  编写PLSQL代码,PLSQL引擎与SQL引擎频繁交互会大大降低效率
679  --forall语句示例
680  --将集合中所有元素批量地绑定,以便一次性将多个绑定到SQL语句的变量发给SQL引擎
681  一次性发送给SQL引擎.
682  declare
683   type dept_type is varray (20) of number;
684   depts dept_type :=dept_type(10,30,70);
685   begin
686     forall i in depts.first..depts.last
687       delete from emp where deptno=depts(i);
688     for i in 1..depts.count loop
689       dbms_output.put_line('部门编号'||depts(i)
690       ||'的删除操作受影响的行: '||sql%bulk_rowcount(i));
691       end loop;  
692     end;
693 
694 -bulk collect关键字可以批量从SQL引擎中批量接受数据到一个集合
695 declare
696        type numtab is table of emp.empno%type;
697        type nametab is table of emp.ename%type;
698        nums numtab;
699        names nametab;
700 begin
701   select empno,ename
702   bulk collect into nums,names from emp;
703   for i in 1..nums.count
704     loop
705       dbms_output.put('num('||i||')='||nums(i)||' ');
706       dbms_output.put_line('names('||i||')='||names(i));
707       end loop;
708   end;       
709 --使用游标的属性isopen
710 declare
711   cursor emp_cursor(p_deptno in number)
712   is select * from emp where deptno =p_deptno;
713 begin
714   if not emp_cursor%isopen then
715      open emp_cursor (20); 
716    end if;
717    if emp_cursor%isopen then
718      dbms_output.put_line('游标已经被打开!');
719      else
720      dbms_output.put_line('游标还没有被打开!');
721     end if;
722     close emp_cursor; 
723   end;
724 
725 --%not found
726 declare
727    emp_row  emp%rowtype;
728    cursor emp_cursor(p_deptno in number)
729    is select * from emp where deptno=p_deptno;
730    begin
731      open emp_cursor(20);--给一个游标传递参数
732      if emp_cursor%notfound is null
733        then
734          dbms_output.put_line('%notfound属性为null');
735         end if;
736         loop
737           fetch emp_cursor
738              into emp_row;
739              --每循环一次判断%found属性值,如果该值为False,表示提取完成将退出循环
740              exit when emp_cursor%notfound;
741           end loop; 
742           close emp_cursor;
743      end;  
744 
745 --%rowcount 属性   
746 declare
747        emp_row emp%rowtype;
748        cursor emp_cursor(p_deptno in number)
749        is select * from emp where deptno=p_deptno;
750   begin
751     open emp_cursor(20);
752     loop
753       fetch emp_cursor into emp_row;
754       exit when emp_cursor%notfound;
755       dbms_output.put_line('当前提取的的行数为: '||emp_cursor%rowcount
756       ||'行!');
757       end loop;
758     end;     

 

posted @ 2018-04-08 21:26  火柴天堂  阅读(604)  评论(0编辑  收藏  举报