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;     

原文地址:https://www.cnblogs.com/Remedy/p/8747599.html

时间: 2024-11-05 12:36:14

PLSQL变量和类型,流程控制语句,集合的相关文章

C#基础之流程控制语句详解

C#程序的执行都是一行接一行.自上而下地进行,不遗漏任何代码.为了让程序能按照开发者所设计的流程进行执行,必然需要进行条件判断.循环和跳转等过程,这就需要实现流程控制.C#中的流程控制包含了条件语句.循环语句.跳转语句和异常处理四个方面.一.跳转语句break语句:终止并跳出循环体. continue语句:终止当前循环,重新开始一个新的循环. goto语句:跳转到指定位置.C#允许给代码行加上标签,这样就可以使用goto语句直接跳转到这些代码行上.goto语句的用法如下:goto<labelNa

JavaScript基础——变量-运算符-流程控制语句

JavaScript组成 一个完整的 JavaScript 实现是由以下 3 个不同部分组成的: ECMAScript:描述了该语言的语法和基本对象: 文档对象模型(Document Object Model,简称DOM)):描述处理网页内容的方法和接口: 浏览器对象模型(Browser Object Model,简称BOM)):描述与浏览器进行交互的方法和接口. 变量 变量类型:object string function boolean undefined null number JavaS

什么是javascript语言,它的历史、作用、基本语法(变量、表达式、作用域、各种关键字和流程控制语句)、数组处理、json、闭包(closure)。

JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 历史: 它最初由Netscape的Brendan Eich设计.JavaScript是甲骨文公司的注册商标.Ecma国际以JavaScript为基础制定了ECMAScript标准.JavaScript也可以用于其他场合,如服务器端编程.完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型.Netscape在最初将其脚本语言命名LiveScript,后来Nets

Python基础一: 计算机基础,Python相关介绍,变量,常量,注释,基础数据类型(int,str,bool),用户交互input,流程控制语句if

1.CPU 内存 硬盘 操作系统 CPU:计算机的运算和控制中心,相当于人类的大脑. 内存:用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据.(暂时存储数据,临时加载数据及应用程序) 4G,8G,16G,32G 速度快,效率高,造价高 断电数据丢失 硬盘:磁盘,长期存储数据,存放文件,视频,音频等等.500G,1T 造价相对低 操作系统:是一个连接计算机硬件与所有软件的一个软件. 2.Python的发展与应用 Python的创始人为吉多·范罗苏姆(Guido van Rossum

固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符串型(string)Convert.ToDateTime() 转换为日期型(datetime)Convert.ToDouble() 转换为双精度浮点型(double)Conert.ToSingle() 转换为单精度浮点型(float) 二.运算符算术运算符 + - * / %逻辑运算符 & | ^

PHP变量和魔术变量以及流程控制语句

变量 PHP常量是一个简单值的标识符.该值在脚本中不能改变.一个常量由英文字母.下划线.和数字组成,但数字不能作为首字母出现. (常量名不需要加 $ 修饰符). 设置常量,使用 define() 函数 格式:bool define ( string $name , mixed $value [, bool $case_insensitive = false ] ) name:必选参数,常量名称,即标志符 value:必选参数,常量的值. case_insensitive :可选参数,如果设置为

字符类型和控制语句、函数、懒汉、饿汉式

1. 小数默认为double类型. 2. 逻辑运算符:&&,||,!,&,|,^ 3. 位运算:      & ,|,^,~,<<,>>,>>> a^b^b = a(得到本身) 位运算是最快的运算方法 两个数值的调换位置的方法: 1.设置一个变量 int a = 1,b  = 2,c; c = a; a = b; b = c; 2.直接通过相加减我完成 int a  = 1,b = 2; a = a + b; b = a - b;

JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)

Java流程控制语句 本博文将对JAVA中组成各种结构的控制语句进行重点介绍,主要内容是区别于C/C++中的流程控制语句的重点解析. 1.顺序语句 顺序结构中的语句可分为:表达式语句.空语句和复合语句三大类. 注: (1).空语句主要用来作为空循环体,其语法格式如下: : //其实就是一个分号 执行一个空语句,就是将控制转到该语句的结束点.这样,如果空语句是可以到达的,则空语句的结束点也是可以到达的. (2).复合语句又称为语句块,若语句块是空的,则控制转到语句块的结束点. 2.if条件语句 J

第三章:流程控制语句

第三章:流程控制语句 程序结构 顺序结构 分支结构 if结构if....else结构if...else if....else if...else结构switch结构 循环结构 while循环do....while循环for循环 分支结构 if结构 if结构语法: if(布尔表达式){ //语句;} 执行过程:如果布尔表达式为true执行其下语句,布尔表达式为false时不执行其下语句.{}可以省略,如果省略将执行第一个语句块.为了程序的可读性推荐不要省略{} if...else结构 语法:if(