plsql 流程控制语句

PL/SQL的流程控制语句包括如下三类:

控制语句: IF 语句

循环语句: LOOP语句, EXIT语句

顺序语句: GOTO语句, NULL语句


条件语句 

注意:elsif不是elseif. 它与python中的if ...else的区别

python:

if <表达式>:
    .......
elif <表达式>:
    ......
else:
    ......

plsql: 

1. if <表达式> then 它没有“:”

2. 它是elsif,不是elif

3. 每个if..都要以endif结尾

复杂的if/else语句格式:
IF <布尔表达式> THEN
  PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
  其它语句
ELSIF < 其它布尔表达式> THEN
  其它语句
ELSE
  其它语句
END IF;
例1:
Declare
	v_empno employee.employee_id%TYPE :=&empno;
	v_salary employee.salary%TYPE;
	v_comment VARCHAR2(35);
Begin
	select salary INTO v_salary from employees
	where employee_id=v_empno;
	if v_salary <1500 then
		v_comment:='太少了,加点吧~!'
	elsif v_salary<3000 then
		v_comment:='多了点,少点吧~!'
	else
		v_comment:='没有薪水~!'
	end if;
	DBMS_OUTPUT.PUT_LINE(v_comment);
	exception
		when no_data_found then
			DBMS_OUTPUT.PUT_LINE('没有数据~!');
		when others then
			DBMS_OUTPUT.PUT_LINE(saqlcode||'——'||sqlerrm);
END;
注:Oracle内置函数sqlcode和sqlerrm主要用在others处理器中,分别用来返回oracle的错误代码和错误消息。
例2:
Declare
	v_first_name VARCHAR2(20);
	v_salary NUMBER(7,2);
BEGIN
	SELECT first_name,salary INTO v_first_name,v_salary 
	from employees 
	where employee_id=&emp_id;
	DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的工资是'||v_salary);
	if v_salary <10000 then
		DBMS_OUTPUT.PUT_LINE('工资低于10000');
	else
		if 10000
例3:
Declare
	v_first_name VARCHAR2(20);
	v_hire_date DATE;
	v_bonus NUMBER(6,2);
BEGIN
	SELECT first_name,hire_date INTO v_first_name,v_hire_date
	from employees
	where empolyee_id=&emp_id;
	if v_hive_date > to_date('01-1月-2015') then
		v_bonus:=800;
	elsif v_hive_date > to_date('01-1月-2013') then
		v_bonus:=1600;
	else
		v_bonus:=2400;
	end if;
	DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的雇佣日期是:'||
		v_hire_date||'、'||v_bonus);
END;

CASE 表达式

——-格式一———
CASE  条件表达式
  
WHEN  条件表达式结果1  THEN  
     语句段1
  
WHEN  条件表达式结果2  THEN
     语句段2
  ……
  
WHEN  条件表达式结果n  THEN
     语句段n
  
[ ELSE 条件表达式结果 ]

END;

——-格式二———
CASE 
  
WHEN 条件表达式1 THEN
     语句段1
  
WHEN 条件表达式2 THEN
     语句段2
  ……
  
WHEN 条件表达式n THEN 
     语句段n
  
[ELSE 语句段]

END;

注:python中没有case语句,C中有switch,case语句

例1:
Declare
	v_grade char(1):=UPPER('&p_grade');
	v_appraisal VARCHAR2(20);
BEGIN
	v_appraisal:=
	CASE v_grade
		WHEN 'A' THEN 'Excellent'
		WHEN 'B' THEN 'Very Good'
		WHEN 'C' THEN 'Good'
		ELSE 'No such grade'
	END;
	DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'Appraisal:'||v_appraisal);
END;
例2:
Declare
	v_first_name employees.first_name%TYPE;
	v_job_id employees.job_id%TYPE;
	v_salary employees.salary%TYPE;
	v_sal_raise NUMBER(3,2);
BEGIN
	SELECT first_name,job_id,salary INTO
		v_first_name,v_job,v_salary
	from employees where employee_id=&emp_id;
	CASE
		WHEN v_job_id='PU_CLECK' THEN
			IF v_salary <3000 THEN v_sal_raise:=.08;
			ELSE v_sal_raise:=.07;
			END IF;
		WHEN v_job_id='SH_CLECK' THEN
			IF v_salary <4000 THEN v_sal_raise:=.04;
			ELSE v_sal_raise:=.03;
			END IF;
		ELSE
			DBMS_OUTPUT.PUT_LINE('该岗位工资不涨:'||v_job_id);
	END CASE;
	DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id
			||'、的工资是'||v_salary
			||'、工资的涨幅是'||v_sal_raise);
END;

循环

    python只支持while,for循环,没有Loop,do-while等。C中有while,do-while,for三种循环

 1.  简单循环 

  LOOP
      要执行的语句;
      
EXIT   WHEN   < 条件语句 >   条件满足,退出循环语句
   END  LOOP;
例:
Declare
    int NUMBER(2):=0;
BEGIN
    LOOP
	int :=int+1
	DBMS_OUTPUT.PUT_LINE('int的当前值:'||int);
	EXIT WHEN int=10;
    END LOOP;
END;
c语言中没有Loop,它有goto,下例中的loop只是一个标志位
for(i=1;i<=100;i++) 
	{if(i==51) goto loop; /*如果i等于51,则跳出循环*/ sn+=i; /*1+2+……+50*/ } 
    loop: 
	printf(%d\n,sn); 

2.  WHILE 循环

while循环,python/c中都有,但是它们都没有LOOP关键字,python格式(while<表达式>:),C的格式(while<表达式>{循环语句})

WHILE   < 布尔表达式 >  LOOP
            要执行的语句;
        END  LOOP;
例:
Declare
    x NUMBER(1):=1;
BEGIN
    WHILE x<10 LOOP
	DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x);
	x:=x+1;
    END LOOP;
END;

3.  数字式循环,For循环

python/C都有For循环,但是没有LOOP关键字,python格式是for i in range(n) ,C格式是 { int i; for(i=1;i<4;i++) { printf("括号里放待循环的语句"); }} 


[ <<循环标签>> ]
FOR  循环计数器  IN   [  REVERSE  ]  下限 .. 上限 LOOP
          要执行的语句;
END  LOOP  [ 循环标签 ] ;
注:每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。
例1:
BEGIN
    FOR int in 1..10 LOOP
	DBMS_OUTPUT.PUT_LINE('int的当前值为:'||int);
    END LOOP;
END;
例2:
create table temp_table(num_col NUMBER);
DECLARE
	V_counter NUMBER:=10;
BEGIN
	INSERT INTO temp_table(num_col) VALUES (v_counter);
	FOR v_counter in 20..25 LOOP
		INSERT INTO temp_table(num_col) VALUES (v_counter);
	END LOOP;
	INSERT INTO temp_table(num_col) VALUES (v_counter);
	FOR v_counter IN REVERSE 20..25 LOOP
		INSERT INTO temp_table(num_col) VALUES (v_counter);
	END LOOP;
END;

DROP TABLE temp_table;
例3:
DECLARE
   TYPE jobids_varray IS VARRAY(12) OF VARCHAR2(10); —定义一个VARRAY数据类型
   v_jobids JOBIDS_VARRAY; —声明一个具有JOBIDS_VARRAY数据类型的变量
   v_howmany NUMBER; —声明一个变量来保存雇员的数量
BEGIN
   —用某些job_id值初始化数组
   v_jobids := jobids_varray(‘FI_ACCOUNT‘, ‘FI_MGR‘, ‘ST_CLERK‘, ‘ST_MAN‘);
   —用FOR…LOOP…END LOOP循环使用每个数组成员的值
   FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP
   —针对数组中的每个岗位,决定该岗位的雇员的数量
      SELECT count(*) INTO v_howmany FROM employees WHERE job_id = v_jobids(i);
      DBMS_OUTPUT.PUT_LINE ( ‘岗位‘||v_jobids(i)||
                       ‘总共有‘|| TO_CHAR(v_howmany) || ‘个雇员‘);
   END LOOP;
END;
例4: 在While循环中嵌套loop循环

/*求100至110之间的素数*/
DECLARE
   v_m NUMBER := 101;
   v_i NUMBER;
   v_n NUMBER := 0;
BEGIN
   WHILE v_m < 110 LOOP
      v_i := 2;
      LOOP
         IF mod(v_m, v_i) = 0 THEN
            v_i := 0;
            EXIT;
         END IF;
    
         v_i := v_i + 1;
         EXIT WHEN v_i > v_m – 1; 
      END LOOP;
      
      IF v_i > 0 THEN
         v_n := v_n + 1;
         DBMS_OUTPUT.PUT_LINE(‘第‘|| v_n || ‘个素数是‘ || v_m);
      END IF;
      v_m := v_m + 2;
   END LOOP;
END;

3.4  标号和GOTO 

python中没有goto,C语言中有,但不用下面的《LABel》

PL/SQLGOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO  label;
……
<< label >>   /* 标号是用<< >>括起来的标识符  */

 

 注意在以下地方使用是不合法的,编译时会出错误。

跳转到非执行语句前面。

跳转到子块中。

跳转到循环语句中。

跳转到条件语句中。

从异常处理部分跳转到执行。

从条件语句的一部分跳转到另一部分。


DECLARE
   V_counter NUMBER := 1;
BEGIN
   LOOP 
     DBMS_OUTPUT.PUT_LINE(‘V_counter的当前值为:‘||V_counter);
     V_counter := v_counter + 1;
   IF v_counter > 10 THEN
       GOTO labelOffLOOP;
   END IF;
   END LOOP;
   <>
     DBMS_OUTPUT.PUT_LINE(‘V_counter的当前值为:‘||V_counter);
END;
DECLARE
   v_i NUMBER := 0;
   v_s NUMBER := 0;
BEGIN
   <>
   v_i := v_i + 1;
   IF v_i <= 1000 THEN
      v_s := v_s + v_i;
      GOTO label_1;
   END IF;
   DBMS_OUTPUT.PUT_LINE(v_s);
END;

3.5  NULL 语句 

Null只有在plsql中有,python/c中都没有

在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明不用做任何事情的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

例1:
DECLARE
    …
BEGIN
    …
    IF v_num IS NULL THEN
    GOTO labelPrint;
    END IF;
  …
  <>
  NULL; —不需要处理任何数据。
END;
例2:
DECLARE
   v_emp_id employees.employee_id%TYPE;
   v_first_name employees.first_name%TYPE;
   v_salary employees.salary%TYPE;
   v_sal_raise NUMBER(3,2);
BEGIN
   v_emp_id := &emp_id;
   SELECT first_name, salary INTO v_first_name, v_salary
   FROM employees WHERE employee_id = v_emp_id;
   IF v_salary <= 3000 THEN
      v_sal_raise := .10;
      DBMS_OUTPUT.PUT_LINE(v_first_name||‘的工资是‘||v_salary
                                       ||‘、工资涨幅是‘||v_sal_raise);
   ELSE
      NULL;
   END IF;
END;




















你可能感兴趣的:(数据库)