PL/SQL 002—PL/SQL的基本能概念
2.1功能特点
2.1.1 结构化程序设计
3种基本控制结构:顺序结构、分支结构、循环结构
1. 顺序结构
顺序结构也可称为现行代码执行,控制从一个语句从上到下依序进行执行。顺序结构流程如图2.1所示。
列如
DECLARE --定义变量
v_chinese NUMBER;
v_math NUMBER;
v_english NUMBER;
v_total NUMBER;
BEGIN
---1.查询语文成绩
SELECT
score INTO v_chinese
FROM
student_score
WHERE
name = &stuname
AND subject = '语文';
--2.查询数学成绩
SELECT
score INTO v_math
FROM
student_score
WHERE
name = &stuname
AND subject = '数学';
--3.查询英语成绩
SELECT
score INTO v_english
FROM
student_score
WHERE
name = &stuname
AND subject = '英语';
--求和
v_total := v_chinese + v_math + v_english;
--输出
DBMS_OUTPUT.PUT_LINE ( '张三的语文成绩为:'
|| v_chinese
|| '数学成绩为:'
|| v_math || '英语成绩为:'
|| v_english
|| '总成绩为:'
|| v_total );
end;
计算学生的总成绩使用了四个步骤,后一个步骤紧随前一个步骤,从上到下依次执行,最终在输出区域中显示了三门成绩机总成绩。
2.分支结构
分支结构是根据一定的条件去选择执行路径,而不是线性的地执行。分支的出现使得程序具有了一定的智能特性。分支结构适用于带有逻辑关系比较的等条件判断的计算。
根据某学生的语文成绩判断其绩点
declare
v_score number;
begin
select score
into v_score
from student_score
where name = &stuname
and subject = '语文';
if v_score > 90 then
update student_score
set mark = 'A'
where name = &stuname
and subject = '语文';
elsif v_score > 80 then
update student_score
set mark = 'B'
where name = &stuname
and subject = '语文';
elsif v_score > 70 then
update student_score
set mark = 'C'
where name = &stuname
and subject = '语文';
elsif v_score >= 60 then
update student_score
set mark = 'D'
where name = &stuname
and subject = '语文';
elsif v_score < 60 then
update student_score
set mark = 'F'
where name = &stuname
and subject = '语文';
end if;
commit;
dbms_output.put_line(&stuname || '的语文绩点更新完毕');
exception
when no_data_found then
dbms_output.put_line('有找到' || &stuname || '的数据');
end;
上述sql中处咨询某学生的语文成绩,将语文成绩保存至v_score变量中,很久其成绩范围判断几点,更新其成绩的绩点,因此使用了SQL的IF-ELSEIF-END IF的条件语句。
3.循环结构
循环结构允许某个指定的条件重复执行某段程序代码,循环结构是机构化程序设计非常重要的组成部分,可以看成是条件判断语句和回转语句的结合。
PL/SQL提供了LOOP、WHILE-LOOP和FOR-LOOP 语句来执行循环。
这次给所有的人的科目个更新绩点。
declare
--姓名
v_name varchar(20);
--科目
v_subject varchar2(20);
--成绩
v_score number;
--绩点
v_mark varchar(2);
cursor c_emp is
select name, subject, score from student_score for update;
begin
open c_emp; --打开游标
Loop
--循环游标
--提取游标数据
fetch c_emp
into v_name, v_subject, v_score;
--如果没有数据 则退出游标
exit when c_emp%notfound;
if v_score > 90 then
v_mark := 'A';
elsif v_score > 80 then
v_mark := 'B';
elsif v_score > 70 then
v_mark := 'C';
elsif v_score >= 60 then
v_mark := 'D';
else
v_mark := 'F';
end if;
--更新
update student_score set mark = v_mark where name = v_name and subject= v_subject;
dbms_output.put_line(v_name || V_subject || ':' || v_score || '绩点' || v_mark);
end loop;
close c_emp;--关闭游标
end;
代码的执行流程如下步骤所示:
(1)定义一个名为c_emp的游标,PL/SQL中的游标常用来处理SELECT语句返回的多行数据。
(2)为了提取游标指向多行数据,在代码中是用了LOOP-END LOOP语法,循环调用FETCH语句提取数据,EXIT WHEN语句在无数据提取后将推出循环。
(3)在提取到数据后,通过分支结构根据学成的成绩判断其绩点赋值给v_mark变量,最后通过update更新该学生科目的绩点,并通过DBMS_OUTPUT进行输出。