结构化程序设计详解程序员

结构化程序设计的三种基本结构是:
顺序结构
选择结构循环结构

顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后
顺序执行的。

例如,要计算两个员工的薪资总数,就可以用一个简单的顺序结果来实现,代码如下:

DECLARE 
  --define variable 
  v_sal1 NUMBER; 
  v_sal2 NUMBER; 
  v_sumsal NUMBER; 
BEGIN 
  --1.query employee number is 1 
  SELECT sal 
  INTO v_sal1 
  FROM emp 
  WHERE empno = &empno1; 
  --2.query emplouee number is 2 
  SELECT sal 
  INTO v_sal2 
  FROM emp 
  WHERE empno = &empno2; 
  --3.total salary 
  v_sumsal := v_sal1 + v_sal2; 
  --4.output 
  DBMS_OUTPUT.put_line( '员工编号为 ' 
                        || &empno1 
                        || '的工资和员工编号为 ' 
                        || &empno2 
                        || '的工资总和为 ' 
                        || v_sumsal 
                       ); 
END; 

选择结构

选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。

DECLARE  
  --define constant 
  c_manager CONSTANT NUMBER := 0.15; 
  c_salesman CONSTANT NUMBER := 0.12; 
  c_clerk CONSTANT NUMBER := 0.10; 
  --define variable 
  v_job VARCHAR2(100); 
BEGIN 
  SELECT job 
  INTO v_job 
  FROM emp 
  WHERE empno = &empno1; 
   
  IF v_job = 'CLERK' 
    THEN  
      UPDATE emp 
        SET sal = sal * (1 + c_clerk) 
      WHERE empno = &empno1; 
  ELSIF v_job = 'SALESMAN' 
    THEN  
      UPDATE emp 
        SET sal = sal * (1 + c_salesman) 
      WHERE empno = &empno1; 
  ELSIF v_job = 'MANAGER' 
    THEN  
      UPDATE emp 
        SET sal = sal * (1 + c_manager) 
      WHERE empno = &empno1; 
  END IF; 
  DBMS_OUTPUT.put_line('已经为员工 ' || &empno1 || '成功加薪!!'); 
EXCEPTION  
  WHEN NO_DATA_FOUND 
    THEN  
      DBMS_OUTPUT.put_line('没有找到员工数据'); 
END;

循环结构

循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。在
循环结构中最主要的是:什么情况下执行循环?哪些操作需要循环执行?

--循环结构示例,演示循环为所有员工加薪 
DECLARE 
 --定义加薪比率常量 
 c_Manager CONSTANT NUMBER:=0.15; 
 c_SalesMan CONSTANT NUMBER:=0.12; 
 c_Clerk CONSTANT NUMBER:=0.10; 
 v_Job VARCHAR(100);                         --定义职位变量 
 v_EmpNo VARCHAR(20);                        --定义员工编号变量 
 v_Ename VARCHAR(60);                        --定义员工名称变量 
 CURSOR c_Emp IS SELECT job,empno,ename from Scott.emp FOR UPDATE; 
BEGIN 
 OPEN c_Emp;   --打开游标 
 LOOP          --循环游标 
   FETCH c_Emp INTO v_Job,v_EmpNo,v_Ename;   --提取游标数据 
   EXIT WHEN c_Emp%NOTFOUND;                 --如果无数据可提取退出游标 
 IF v_Job='CLERK' THEN                       --如果为职员,加薪10% 
   UPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE CURRENT OF c_Emp; 
 ELSIF v_Job='SALESMAN' THEN                 --如果为销售职员,加薪12% 
   UPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE CURRENT OF c_Emp;  
 ELSIF v_Job='MANAGER' THEN                  --如果为经理,加薪15% 
   UPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE CURRENT OF c_Emp;   
 END IF; 
 --显示完成信息 
 DBMS_OUTPUT.PUT_LINE('已经为员工'||v_EmpNo||':'||v_Ename||'成功加薪!');  
 END LOOP; 
 CLOSE c_Emp;                --关闭游标  
 EXCEPTION 
 WHEN NO_DATA_FOUND THEN     --处理PL/SQL预定义异常 
   DBMS_OUTPUT.PUT_LINE('没有找到员工数据'); 
END;  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/7271.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论