oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构,

发布时间:2023-05-06 09:50:17

[color=red]分支结构[//color] 由IF语句实现的分支结构是最基本的程序结构。 根据条件,使用IF语句可以改变程序的逻辑过程。IF语句有以下形式: IF 条件1 THEN 语句序列1; [ELSIF 条件2 THEN 语句序列2; ELSE 语句序列n;] END IF; 其中: 条件部分是逻辑表达式,值只能是真的(TRUE)、假(FALSE)或空(NULL)。 句子序列为多个可执行的句子。 根据具体情况,分支结构可以有以下形式: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-ELSE-END IF 1.IF-THEN-END IF形式 这是最简单的IF结构,练习如下: 【训练1】 若温度大于30℃,显示“高温”。 输入并执行以下程序:

SET SERVEROUTPUT ONDECLARE  V_tempratureNUMBER(5):=32;  V_result         BOOLEAN:=false; BEGIN  V_result:= v_temprature >30;  IF V_result THEN     DBMS_OUTPUT.PUT_LINE(温度|| V_temprature ||'度,偏高');  END IF; END;

执行结果如下:

PL/SQL过程已成功完成,温度为32度。

说明:布尔变量用于该程序,初始值为false,表示温度低于30℃。表达式v_temprature >30返回值为布尔型,赋予逻辑变量V_result。如果变量v_temprature的值大于30,则返回值为真,否则为假。V_result值真的执行IF到 END IF之间的输出语句,否则没有输出结果。

试修改温度的初值为25℃,重新执行,观察结果。

2.IF-THEN-ELSE-END IF形式

这种形式的练习如下:

【训练2】 尊称根据性别显示。

输入并执行以下程序:

SET SERVEROUTPUT ONDECLARE v_sexVARCHAR2(2);  v_titil  VARCHAR2(10);BEGIN  v_sex:='男';  IF v_sex ='男' THEN    v_titil:='先生';  ELSE    v_titil:='女士';  END IF;   DBMS_OUTPUT.PUT_LINE(v_titil||你好!');END;

执行结果如下:

先生您好!PL/SQL 该过程已成功完成。

注:根据性别显示尊称和问候,无论性别值是什么,总会有显示结果输出。如果V_sex的值不是“男性”和“女性”,那么输出结果是什么呢?

【练习1】补充修改上述程序,并在ELSE部分嵌入IF结构。如果V_sex的值不是“女性”,则显示“你好,朋友”。

3.IF-THEN-ELSIF-ELSE-END IF形式

这种形式的练习如下:

【训练3】 税收按员工工资分级显示。

输入并操作以下程序:

SET SERVEROUTPUT ONDECLARE  v_sal  NUMBER(5);  v_tax  NUMBER(5,2);BEGIN  SELECT sal INTO v_sal  FROM emp  WHERE empno=7788;IF v_sal >=3000 THEN    V_tax:= v_sal*0.08;--税率8%  ELSIF v_sal>=1500 THEN   V_tax:= v_sal*0.06; --税率6%  ELSE   V_tax:= v_sal*0.04; --税率4%  END IF;  DBMS_OUTPUT.PUT_LINE(|||V_应缴税款tax);END;

执行结果如下:

应缴税款:240PL/SQL 该过程已成功完成。

说明:7788号员工应缴税款按工资计算,不同工资水平的税率不同。

[color=red]选择结构[//color]

CASE语句适用于多分支处理,可用于以下三种用法。

1.基本CASE结构

语句语法如下:

CASE 选择变量名

WHEN 表达式1 THEN

语句序列1

WHEN 表达式2 THEN

语句序列2

WHEN 表达式n THEN

语句序列n

ELSE

n+1语句序列

END CASE;

在整个结构中,变量值与表达值相匹配。如果相等,则执行相应的句子序列。如果不等,则执行ELSE部分的句子序列。

以下是使用CASE选择结构的练习。

【训练1】 使用CASE结构实现职务转换。

输入并执行程序:

SET SERVEROUTPUT ONDECLAREv_job  VARCHAR2(10);BEGINSELECT job INTO v_jobFROM empWHERE empno=7788;CASE v_jobWHEN 'PRESIDENT' THEN  DBMS_OUTPUT.PUT_LINE(员工职务:总裁');WHEN 'MANAGER' THEN   DBMS_OUTPUT.PUT_LINE员工职务:经理”;WHEN 'SALESMAN' THEN   DBMS_OUTPUT.PUT_LINE员工职位:推销员”;WHEN 'ANALYST' THEN   DBMS_OUTPUT.PUT_LINE(员工职位:系统分析师);WHEN 'CLERK' THEN   DBMS_OUTPUT.PUT_LINE员工职位:员工”;ELSE   DBMS_OUTPUT.PUT_LINE(员工职位:未知');END CASE;END;

执行结果:

员工职位:PL//系统分析师SQL 该过程已成功完成。

说明:以上例子检索员工7788的职位,通过CASE结构转换为中文输出。

【练习1】将员工号修改为其他已知员工号,重新执行。

2.CASE语句表达式结构

在Oracle中,CASE结构也可以以赋值表达式的形式出现,根据选择的变量值得到不同的结果。

其基本结构如下:

变量=CASE 选择变量名

WHEN 表达式1 THEN 值1

WHEN 表达式2 THEN 值2

WHEN 表达式n THEN 值n

ELSE值n+1

END;

【训练2】 采用CASE的表达式结构。

SET SERVEROUTPUT ONDECLARE  v_gradeVARCHAR2(10);  v_resultVARCHAR2(10);BEGIN  v_grade:='B';  v_result:=CASE v_grade  WHEN 'A' THEN '优'WHEN 'B' THEN '良'  WHEN 'C' THEN '中'  WHEN 'D' THEN '差'ELSE '未知'END; DBMS_OUTPUT.PUT_LINE(评价等级:||V_result);END;

执行结果如下:

评价等级:良PL//SQL 该过程已成功完成。

注:CASE表达式通过判断变量v_grade的值,将变量v_result赋予不同的值。

3.搜索CASE结构

Oracle还提供了一种搜索CASE结构,它不选择变量,直接判断条件表达值,并根据条件表达决定转向。

CASE

WHEN 条件表达式1 THEN

语句序列1

WHEN 条件表达式2 THEN

语句序列2

WHEN 条件表达n THEN

语句序列n

ELSE

n+1语句序列

END CASE;

【训练3】 使用CASE的搜索结构。

SET SERVEROUTPUT ONDECLARE   v_salNUMBER(5);BEGIN   SELECT sal INTO v_sal FROM emp    WHERE empno=7788;CASE    WHEN v_sal>=3000 THEN    DBMS_OUTPUT.PUT_LINE(工资等级:高');   WHEN v_sal>=1500 THENDBMS_OUTPUT.PUT_LINE(工资等级:中等);   ELSE   DBMS_OUTPUT.PUT_LINE(工资等级:低);END CASE;END;

执行结果如下:

工资水平:高PL/SQL 该过程已成功完成。

说明:这种结构类似于IF-THEN-ELSIF-ELSE-END IF结构。本次培训判断7788名员工的工资水平。

[color=red]循环结构[////color]

循环结构是控制重复执行程序的最重要的程序控制结构。例如,如果我们想积累,我们可以通过适当的循环程序来实现。PL/SQL循环结构可分为以下三种:

* 基本的LOOP循环。

* FOR LOOP循环。

* WHILE LOOP循环。

1.基本的LOOP循环

基本循环结构如下:

LOOP --循环起始标识

语句1;

语句2;

EXIT [WHEN 条件];

END LOOP; --循环结束标志

该循环的作用是反复执行LOOP和END LOOP之间的句子。

EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。如果没有WHEN条件,遇到EXIT语句,则无条件退出循环。

【训练1】 求:12+32+52+...+152 的值。

输入并执行以下程序:

SET SERVEROUTPUT ONDECLARE  v_totalNUMBER(5):=0;  v_countNUMBER(5):=1;BEGINLOOP    v_total:=v_total+v_count**2;    EXIT WHEN v_count=15;--条件退出v__条件退出v__count:=v_count+2;  END LOOP;  DBMS_OUTPUT.PUT_LINE(v_total);END;

输出结果为:

680PL/SQL 该过程已成功完成。

说明:EXIT必须退出基本循环,否则会成为死循环。

【练习1】求1*2*3*4*...*10的值。

2.FOR LOOP循环

FOR循环是一个固定的次数循环,格式如下:

FOR 控制变量 in [REVERSE] 下限..上限

LOOP

语句1;

语句2;

END LOOP;

无需声明,循环控制变量是隐含定义的。

下限和上限用于指示循环次数。正常情况下,循环控制变量的值从下限增加到上限,REVERSE关键词表示循环控制变量的值从上限减少到下限。

以下是FOR循环结构的练习。

【训练2】 使用FOR循环输出图形。

SET SERVEROUTPUT ONBEGINFOR I IN 1..8 LOOP    DBMS_OUTPUT.PUT_LINE(to_char(i)|rpadI,'*'));END LOOP;END;

输出结果为:

*****************************************************************************************************************************************************************PL/SQL 该过程已成功完成。

注:该程序在循环中使用循环控制变量I,该变量隐含定义。在每个循环中,根据循环控制变量I的值,RPAD函数控制显示相应数量的“*”。

【练习2】为上述程序添加REVERSE关键字,观察执行结果。

【训练3】 输出空心三角形。

BEGIN FOR I IN 1..9LOOP  IF I=1 OR I=9 THEN  DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad ',12-I,' ')||rpad*',2*i-1,'*')); ELSE  DBMS_OUTPUT.PUT_LINE(to_char(I)||rpad ',12-I,' ')||'*'||rpad ',I*2-3,' ||"""";  END IF;END LOOP; END;

输出结果为:

1           *2          * *3         *   *4        *     *5       *       *6      *         *7     *           *8    *             *9   *****************PL/SQL 该过程已成功完成。

说明:本例采用循环与IF结构相结合,第一行与第九行相结合(I=1 OR I=9)执行相同的输出语句,其他行执行其他输出语句。

【练习3】修改程序,输出实心三角形。

3.WHILE LOOP循环

WHILE循环是一个有条件的循环,其格式如下:

WHILE 条件

LOOP

语句1;

语句2;

END LOOP;

当条件满足时,执行循环体;当条件不满足时,循环结束。如果第一个判断条件是假的,则不执行循环体。

以下是WHILE循环结构的实践。

【训练3】 使用WHILE 将5个记录连续插入emp表。

步骤1:执行以下程序:

SET SERVEROUTPUT ONDECLAREv_countNUMBER(2) := 1;BEGIN  WHILE v_count <6 LOOP    INSERT INTO emp(empno, ename)    VALUES (5000+v_count, '临时');v_count := v_count + 1;  END LOOP;  COMMIT;END;

输出结果为:

PL/SQL 该过程已成功完成。

步骤2:显示插入记录:

SELECT empno,ename FROM emp WHERE ename='临时';

输出结果为:

EMPNO ENAME------------------ ----------      5001 临时      5002 临时      5003 临时      5004 临时      5005 5行已暂时选择。

步骤3:删除插入记录:

DELETE FROM emp WHERE ename='临时';COMMIT;

输出结果为:

已删除5行。提交完成。

注:将5个新记录插入WHILE循环到EMP表(根据循环变量生成员工编号),并通过查询句显示新插入的记录,然后删除。

4.多重循环

循环可以嵌套,以下是二重循环练习。

【训练4】 用二重循环求1!+2!+...+10!的值。

步骤1:第1种算法:

SET SERVEROUTPUT ONDECLARE  v_totalNUMBER(8):=0;  v_niNUMBER(8):=0;  JNUMBER(5);BEGINFOR I IN 1..10  LOOP    J:=1;  v_ni:=1;    WHILE J<=I    LOOP      v_ni:= v_ni*J;      J:=J+1;    END LOOP;--内循环求n!v_total:=v_total+v_ni;  END LOOP;--外循环总和  DBMS_OUTPUT.PUT_LINE(v_total);END;

输出结果为:

4037913PL/SQL 过程已成功完成。

步骤2:第2种算法:

SET SERVEROUTPUT ONDECLARE  v_totalNUMBER(8):=0;  v_niNUMBER(8):=1;BEGIN  FOR I IN 1..10  LOOP    v_ni:= v_ni*I;--求n!    v_total:= v_total+v_ni;  END LOOP;--循环求总和  DBMS_OUTPUT.PUT_LINE(v_total);END;

输出结果为:

409114PL/SQL 该过程已成功完成。

说明:WHILE循环求阶级在第一种算法程序中回收,FOR循环求总和在外循环中回收。第二种算法是简化算法,基于:n!=n*(n?1)!。

 

上一篇 JAVA多学校Saas模式校园管理系统功能实现
下一篇 Access的BOM开发(3)BOM展开

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题