oracle数据库----笔记1---PL/SQL基础2---控制结构
在PL/SQL块中,可执行部分是由一系列语句组成,由对数据 库进行操作的SQL语句,PL/SQL语言的各种流程控制语句。 在块中对数据库查询,增、删、改等对数据的操作是由SQL命 令完成的 举例1: SQL> set serveroutput on SQL> declare dno1 number:=10; dname1 varchar2(40); begin select dname into dname1 from dept where deptno=dno1; dbms_output.put_line( ‘deptno=’||to-char(dno1)||’dname=’||dname1); end; 在PL/SQL块中使用SELECT语句时注意几点: (1)SELECT 语句必须含有INTO子句。 (2)INTO子句后的变量个数和位置及数据类型必须和 SELECT命令后的字段名表相同。 (3)INTO子句后可以是简单类型变量或组合类型变量。 (4)SELECT语句中的WHERE条件可以包含PL/SQL块中定义的变量及表达式,但变量名不要同库表列 名相同。 (5)在未使用显示光标的情况下,使用SELECT语句必 须保证只有一条记录返回,否则会产生异常情况。 ey: 向EMP表中插入一新雇员 DECLARE v_empno emp.empno%TYPE NOT NULL:=8000; v_ename emp.ename%TYPE:=‘Bill’; v_job emp.job%TYPE:=‘MANAGER’; v_sal emp.sal%TYPE:=2000; v_comm emp.comm%TYPE:=1000; v_hiredate emp.hiredate%TYPE:=SYSDATE; v_deptno emp.deptno%TYPE:=10; BEGIN INSERT INTO emp(empno,enamae,job,sal,comm,hiredate,deptno) VALUES (v_empno,v_ename,v_job,v_sal,v_comm,v_hiredate,v_deptno); COMMIT WORK; END; ey: 修改职工号为8000雇员的工资,加 工资1000 DECLARE v_empno emp.empno%TYPE:=8000; v_addsal emp.sal%TYPE; BEGIN v_addsal:=1000; UPDATE EMP SET sal=sal+v_addsal WHERE empno=v_empno; COMMIT WORK; END; PL/SQL流程控制: 流程控制语句使PL/SQL程序象高级语言程序一样,具由三种基本结构:顺序、分支、循环 提供结构化程序设计的三种流程控制语句有: 条件控制语句; 循环控制语句; GOTO 语句; 1. 条件控制语句:(IF 语句) 三种语句形式: a.IF 条件 THEN 语句序列; END IF; b.IF 条件 THEN 语句序列1; ELSE 语句序列2; END IF; c. IF 条件1 THEN 语句序列1; ELSIF 条件2 THEN 语句序列2; … [ELSE 语句序列n;] END IF; 其中,条件可以是逻辑变量或用逻辑运算符 AND,OR,NOT 连接的逻辑表达式,或关系表达式。其值只能TRUE, FALSE或NULL。 当条件为真时,执行THEN子句中的语句序列; 当条件为假或空时,执行ELSE子句中的语句序列 在THEN和ELSE子句中可包含IF语句 注意: ①.每个IF 语句都有自己的THEN,以IF开始的语句行 不跟语句结束符(;)。 ②.每个IF 语句块以相应的END IF 结束。 例: if not (var1<=10) then var2:=var1+20; end if; ey: if var1>10 then if var2< var1 then var2:=var1+20; end if; end if; ③.每条IF 语句有且只有一个ELSE 子句; ④.ELSE子句行不跟语句结束符(;) ⑤.ELSIF无匹配的END IF 在IF语句中可以包含任意数目的elsif子句,这种结构用于替代嵌套的 if-then-else 结构。 最后ELSE子句是可选项,在此种情况下,每一个条件对应一个语句 序列,条件由顶向底计算. 任何一个条件为真(TRUE)时,执行相对应的语 句序列 。若各条件均为FALSE或NULL则执行ELSE子句中语句序列。 ey: if var1> 10 then var2:=var1+20; else if var1 between 7 and 8 then var2:=var1*var1; else var2:=2*var1 ; end if; end if; 可写成: if var1>10 then var2:=var1+20; elsif var1 between 7 and 8 then var2:=var1*var1; else var2:=2*var1; end if; 2.循环控制语句(三种形式) 1). LOOP 语句序列; [EXIT [WHEN 条件;] ] END LOOP; 语句中,若无EXIT语句,则进行无限循环; 若不选EXIT中 WHEN项,则执行完语句序列后当执行到EXIT时,立即退出 循环,只执行一遍 有WHEN选项,每执行到EXIT语句,PL\SQL就计算作 为条件的表达式值,是 TRUE 则 退出循环,否则继续执行该循 环语句序列. 例: cnt:=1; loop cnt:=cnt+1; exit when cnt>100; end loop; 可改写成: cnt:=1; loop cnt:=cnt+1; if cnt>100 then exit; endif; end loop; 给十号部门增加新雇员,只确定雇员号,其它信息忽略。 DECLRE v_empno emp.empno%TYPE:=8000; BEGIN LOOP INSERT INTO emp(deptno,empno) VALUES(10,v_empno); v_empno:=v_empno+100; EXIT WHEN v_empno>=9000; END LOOP; END; 2)FOR循环(或数值FOR 循环) FOR 计数器 IN [REVERSE] 下界..上界 LOOP 语句序列; END LOOP; 1.计数器是控制循环次数的变量,不用说明,系统默认为是整型 2.数值FOR循环语句在一指定整数范围中循环, 由下界,上界两整数型表达式值确定循环次数,故循环次数是已知的 3.第一次进入FOR循环时计算范围,求两表达式 值,此后不再重新计算 4.可选项REVERSE若选用,则计数器从上界递减到下界,否则由下界递增到上界,以控制循环体循环. DECLARE TYPE array is table of number index by binary_integer; my_array array; BEGIN FOR i IN 1 .. 10 LOOP my_array(i):=2*i; END LOOP; FOR i IN 1 .. 10 LOOP dbms_output.put_Line(to_char(my_array(i))); END LOOP; END; 3) WHILE循环 WHILE 条件 LOOP 语句序列; END LOOP; 1. 由条件控制循环次数,先判断后执行,当条件为真,则执行 一次循环体 2.然后再判断条件,当条件为假或空时(计算 条件表达式的值是FALSE或NULL)结束循环; WHILE total<=2500 LOOP select sal INTO salary from emp where … ; total:=total +salary; END LOOP; 4)GOTO语句 (无条件转移) 该语句执行,可无条件转移到某一标号(为PL/SQL标识符)标示 的语句,改变原执 行顺序 形式1: <<标号>> ............ GOTO 标号; 形式2: GOTO 标号; ............ <<标号>> 该语句标号是在它的范围内唯一,必须位于可执行语句或一 PL/SQL块之前。 注意:一个GOTO语句可以在同一个块中的语句之间进行转移, 但不能转移到IF语句、循环语句或子块中, 可以从一个结 构内部转移到其外部 在程序设计中一般不用GOTO语句或尽量少用。