判断语句、循环语句、复合数据类型

    xiaoxiao2022-07-14  176

    一。if语句

    if-then-end if if-then-else-end if if-then-elsif-end if

    语法:

    IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END IF;

    例子:假如雇员的名字是Alice,则他的经理号设为22,佣金设为薪水的20%.

    if v_name='Alice' then v_mgr:=22; v_comm:=sal*20%; end if;

    例子:给定一个值,根据不同条件计算不同的值。

    if v_start>100 then v_start :=2*v_start; elsif v_start>=50 then v_start :=0.5*v_start; else v_start :=0.1*v_start; end if;

    二。循环语句

    是一个语句或者一组语句能够执行多次。 三种循环结构: loop、for循环、while循环

    1.loop

    不管条件符合不符合,先执行一次。 语法:

    loop statement; ... exit [when condition]; end loop;

    例子:

    declare v_ordid item.ordid%type :=600; v_counter number(2) :=1; begin loop insert into item(ordid, itemid) values(v_ordid, v_counter); v_counter:=v_counter+1; exit when v_counter>10; end loop; end;

    2.for

    不管条件符合不符合,先执行一次。

    declare v_ordid item.ordid%type :=601; begin for i in 1..10 loop insert into item(ordid, itemid) values(v_ordid, i); end loop; end;

    3.while

    只有条件符合,才会执行。

    语法:

    WHILE condition LOOP statement1; statement2; END LOOP;

    4.嵌套循环和标记

    BEGIN <<Outer Loop>> LOOP .... <<Inner loop>> LOOP .... END LOOP Inner loop; ... END LOOP Outer LOOP; END;

    5.练习

    写一个pl/sql块,向dept表中循环插入5条记录。要求:每条记录的deptno值比表中最大的值增加1,dname的值分别为education1,education2,…education5, loc值为空。

    declare v_max_deptno number(3); begin select max(deptno) into v_max_deptno from dept2; for i in 1..5 loop v_max_deptno :=v_max_deptno +1; insert into dept2(deptno, dname) values(v_max_deptno ,'education' || i); end loop; end;

    写一个pl/sql块,删除dept表中所有loc字段为空的记录,如果删除的行数为0,则输出:没有行数被删除;若不为零,则输出删除的记录数。

    begin delete from dept2 where loc is null; if sql%rowcount=0 then dbms_output.put_line('没有行数被删除'); else dbms_output.put_line(sql%rowcount || '行被删除'); end if; end;

    三。复合数据类型

    1.pl/sql记录

    可以把记录理解为一个复杂一点的变量,这个变量包含表里面的好多列。 也可以把记录理解为Java的类,表中的列理解为类中的属性,记录就是把表中列封装起来。

    创建:

    TYPE type_name IS RECORD (field_declaration[,field_declaration]); identifier type_name;

    例子:创建一个记录,来保存一个雇员的name、job、salary信息。

    TYPE emp_record_type IS RECORD (ename varchar2(10), job varchar2(9), sal number(7,2)); emp_cord emp_record_type ;

    比如:

    declare type emp_record_type is record (ename varchar2(10), job varchar2(9), sal number(7,2)); emp_record emp_record_type; begin select ename, job, sal into emp_record from emp where empno=7788; dbms_output.put_line(emp_record.ename || ', ' || emp_record.job || ', ' ||emp_record.sal ); end;

    2.%rowtype

    作用:把表或视图的好多列声明一个变量。

    例子: 声明一个变量,来保存一个雇员的信息,就像保存在emp表中的一行数据一样。

    emp_record emp%rowtype;

    比如:

    declare emp_type emp%rowtype; begin select * into emp_type from emp where empno=7788; dbms_output.put_line(emp_type.ename || ', '|| emp_type.job || ', '|| emp_type.sal); end;

    3.pl/sql表

    ①组成: 每个pl/sql表中包括两个组成部分。 类型为binary_integer的主键 一个类型为标量、或者record数据类型的列

    ②语法:

    TYPE ename_table_type IS TYPE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type ;

    比如:

    declare type ename_table_type is table of emp.ename%type index by binary_integer; type hiredate_table_type is table of date index by binary_integer; ename_table ename_table_type ; hiredate_table hiredate_table_type ; begin ename_table (1):='AAA'; ename_table (2):='BBB'; ename_table (3):='CCC'; hiredate_table (8):=sysdate+7; dbms_output.put_line(ename_table (1) || ename_table (2) || ename_table (3) ||hiredate_table (8) ); end;

    ③方法:

    方法描述exists(n)用于判断表中指定位置元素是否存在count返回pl/sql表中包含元素的数量first/last返回表中第一个/最后一个元素的索引数字prior(n)在pl/sql表中返回索引n之前的编号next(n)在pl/sql表中返回索引n之后的编号extend向pl/sql表后添加一个null元素extend(n)向pl/sql表后面添加n个元素extend(n,i)向pl/sql表后添加n个i元素的副本trim把一个元素从pl/sql表的最后移开trim(n)把元素n从pl/sql表的最后移开delete把所有元素从pl/sql表中删除delete(n)把第n个元素从pl/sql表中删除delete(m,n)把从m到n之间的元素从pl/sql表中删除 declare type tabletype1 is table of varchar2(9) index by binary_integer; table1 tabletype1; begin table1(1):='成都市'; table1(2):='北京市'; table1(3):='青岛市'; dbms_output.put_line('总记录数:'||to_char(table1.count)); dbms_output.put_line('第一条记录:'||table1.first); dbms_output.put_line('最后条记录:'||table1.last); dbms_output.put_line('第二条的前一条记录:'||table1.prior(2)); dbms_output.put_line('第二条的后一条记录:'||table1.next(2)); end;

    输出: 总记录数:3 第一条记录:1 最后条记录:3 第二条的前一条记录:1 第二条的后一条记录:3

    4.pl/sql表记录

    声明一个pl/sql表变量来保存部门信息。

    declare type ename_table_type is table of emp.ename%type index by binary_integer; e_tab ename_table_type; begin e_tab(1):='Smith'; update emp set sal = 1.1*sal where ename=e_tab(1); commit; end;
    最新回复(0)