相关文章推荐
深沉的大白菜  ·  angular6 ...·  3 月前    · 
气势凌人的可乐  ·  Error: cannot ...·  1 年前    · 
行走的剪刀  ·  Android ...·  1 年前    · 
老实的雪糕  ·  GetObject 函数 (Visual ...·  1 年前    · 
坚韧的红薯  ·  reactjs - React: ...·  1 年前    · 



目录

  • 六、条件分支控制
  • 1、IF - ELSE
  • 2、IF - ELSIF - ELSE
  • 3、示例
  • 4、IF - ELSE IF - ELSE
  • 七、循环分支控制
  • 1、LOOP循环
  • 2、FOR LOOP循环
  • 3、WHILE循环
  • 4、循环名称
  • 八、游标
  • 附录


六、条件分支控制

1、IF - ELSE

Oracle数据库支持使用 “IF - ELSE” 进行简单的分支判断,语法结构和MSSQL Server的语法类似:

IF { condition_1 } THEN 
	{ PL-SQL blocks A }
	{ PL-SQL blocks B }
END IF;

条件语句放在 IF 和 THEN 之间,条件语句成立时执行语句块A,否则执行语句块B。在 IF 结束后,要用 END 关闭整个 IF 程序段。
注意,对于 IF- ELSE 字段而言,ELSE 并不是必须的,你可以只用 IF - THEN ,然后用 END 关闭 IF。

2、IF - ELSIF - ELSE

多条件分支使用 “IF - ELSIF - ELSE” 进行判断,语法上比简单的 IF - ELSE 多了一小段:

IF { condition_1 } THEN
	{ PLSQL_BLOCKS_1 }
ELSIF [ condition_2 ] THEN
	{ PLSQL_BLOCKS_2 }
ELSIF [ condition_3 ] THEN
	{ PLSQL_BLOCKS_3 }
		.....
	{ PLSQL_BLOCKS_n } 
END IF;

注意 “ELSIF” 的写法,只要条件成立,系统就会执行其对应的程序段,同样要用 END 结束 IF。

3、示例

以下是一个简单的示范,我们通过几个存储过程的配合获取教师们的平均薪资,并判断编号为“1002”的老师的工资是否大于该平均数:

create or replace procedure calculate(
    input_no IN teacher.tno%type,
    result OUT varchar2
    avgs teacher.tsalary%type;
    salary teacher.tsalary%type;
begin
    select avg(tsalary) into avgs from teacher;
    select tsalary into salary from teacher
    where tno = 1002;
    IF salary > avgs THEN
        result := 'More than the avg,';
    ELSIF salary = avgs THEN 
        result := 'Equal to the avg,';
        result := 'Less than the avg,';
    END IF;
end calculate;

以下是运行结果:

mysql存储过程if else语句if满足条件结束执行 存储过程中if else的用法_SQL


注意,在 “BEGIN - END” 字段中使用存储过程的时候不需要加 call 或是 exec ,否则会抛出异常ORA-06550。

4、IF - ELSE IF - ELSE

有时候我们用惯了JAVA、C++等语言,可能会习惯于用 “IF - ELSE IF - ELSE” 这种结果,尽管严格来讲这并不是Oracle鼓励使用的语法,但它并不是不能使用,你可以看成在 ELSE 的程序段里面又塞进去了一个 IF - ELSE 程序段:

IF { condition_1 } THEN
	{ PL-SQL block 1 }
ELSE IF { condition_2 } THEN
		{ PL-SQL block 2 }
		{ PL-SQL block 3 }
	END IF; -- 同样,你写了几个IF,你就得用 END 关闭几个
END IF;

七、循环分支控制

1、LOOP循环

LOOP循环以 “LOOP” 标记为始,以 “END” 标记为程序段的结尾,要想结束循环则需使用 “EXIT” 字段。LOOP 循环的语法如下:

LOOP 
	[  PL-SQL blocks  ]
	EXIT WHEN { exit_condition }
	-- IF { exit_condition } THEN EXIT;
	[  PL-SQL blocks  ] 
END LOOP;

执行 EXIT 字段就意味着循环的结束,程序段会从 END LOOP 的下一行开始执行。下面是一个示例,我们通过存储过程 “createScore” 向 stu_score 表中添加多条随机生成的成绩信息:

create or replace procedure createScore(
    num_of_stu IN number
    score number := 0;		-- 成绩
    i number := 1001;		-- 循环标记
begin
    delete from stu_score;	-- 为了方便看到调用后的效果,每次执行前先清空一下表格
        select trunc(dbms_random.value(0, 100))
        into score from dual;
        -- trunc(number num):对数字 num 进行截尾取整
        -- dbms_random.value(min, max):随机生成 [min, max] 范围内的一个小数
        -- 上述两个方法都是系统自带的方法,有兴趣的同志可以去查查看
        insert into stu_score values(i, score);
        dbms_output.put_line(i || ', ' || score);
        EXIT WHEN (i - 1000) = num_of_stu;
        -- 下面是另一种结束循环的写法
        -- IF (i - 1000) = num_of_stu THEN EXIT;
        i := i + 1;
    END LOOP;
declare counts number := 20;
begin
    createScore(counts);
/

LOOP 的操作简单易懂,上述代码执行完毕后会在表中添加20条随机生成的成绩信息。除了直接使用 LOOP 以外,我们还可以把把 FOR 与 LOOP 结合起来使用。

2、FOR LOOP循环

在Oracle中 FOR 与 LOOP 配合使用进行遍历操作,由 FOR 字段指定循环的范围,在 LOOP 中完成循环的主程序段:

FOR { index } IN [ REVERSE ] { range_set }
	{ PL-SQL blocks }
END LOOP;

其中,{ index } 表示遍历时的计数器;{ range_set } 是 FOR 循环的遍历范围,index 的类型将与该范围的子集相同;[ REVERSE ] 字段表示是否逆序遍历范围集合。
在这里,我之所以把 index 称为计数器而非 JAVA 里所说的迭代变量,是因为在执行循环主体的时候,我们不能对 index 的值进行任何修改,我们可以通过变量获得 index 的拷贝,但不能改变 index 并最终影响循环的进程。FOR 循环必然要跑完整个遍历范围。下面是一个简单示例,遍历表格 teacher 并输出所有的名字信息:

SQL> set serveroutput on;
SQL> begin
  2      FOR item IN ( select * from teacher )
  3      LOOP
  4          dbms_output.put_line(' -> Name: ' || item.tname);
  5      END LOOP;
  6  end;
-> Name: Tom
-> Name: Sam
-> Name: Tim
-> Name: Allen
-> Name: Lily
PL/SQL 过程已成功完成

另一个是遍历数字集合的示例,我们通过系统方法获得10个随机数,然后求他们的平均值:

declare
    counts number := 10;
    sum_num number := 0;
    r_num number := 0;
    result number := 0;
begin
    dbms_output.put('Random number: ');
    for i in 0..counts loop
        select trunc(dbms_random.value(0, 100))
        into r_num from dual;
        -- 利用 IF - ELSE 控制输出格式
        if i <> 10 then
            dbms_output.put(r_num || ', ');
            dbms_output.put(r_num);
        end if;
        sum_num := sum_num + r_num;
    end loop;
    result := sum_num / counts;	-- 求平均数
    dbms_output.put_line('');
    dbms_output.put_line('-> Result: ' || result);
-- 执行结果
Random number: 87, 68, 91, 82, 14, 16, 68, 37, 60, 13, 53
-> Result: 58.9

3、WHILE循环

另一种常用的循环是 WHILE 循环,和 FOR 循环的语法相似,区别在于WHILE 循环使用 BOOLEAN 条件语句控制循环的开闭:

WHILE ( { cycle_condition } ) LOOP
	{ PL-SQL blocks }
END LOOP;

下面是一个示例,在这个例子中,我们通过过程 calc_sum 求从 1 开始到给定的参数 counter 的累加和,并在主程序段中输出这个结果:

declare
    result number := 0;
    counter number := 10;
begin
    while (counter <> 0) loop
        result := result + counter;
        counter := counter - 1;
    end loop;
    dbms_output.put_line('result: ' || result);
-- 输出结果
result: 55

4、循环名称

每次使用循环都需要用 END 将其关闭,但如果用了太多的循环语句段,我们可能会将它们弄混,而且过多的循环内容也需要一些有效的备注,使用双书名号可以让我们给循环命名,在使用 END 的时候,可以直接根据名字结束对应的循环:

<< loop_name >>
	......
END LOOP loop_name;

八、游标

在Java中使用过 ResultSet 类的同志对于游标这个概念应该不会陌生,Oracle和 ResultSet 的指针在用途上其实十分相似。在Oracle中执行CRUD操作的时候,系统会在内存中开辟一块缓冲区,将执行结果保存在缓冲区中。游标就是这个缓冲区里的指针,它的类型可以是系统标量类型也可以是记录类型,它可以有返回值。下面是游标的语法:

declare
    CURSOR cursor_name { (parameter_1 [, parameter_2..]) }
        [ RETURN datatype ]
    IS { PL-SQL select_statement };
    [ variable_list | record_variable ]
begin
    OPEN cursor_name; 	-- 打开游标
    -- 读取下一行的信息
    FETCH cursor_name INTO { variable_list | record_variable };
    ......
    CLOSE cursor_name;	-- 关闭游标
                            
android 判断拒绝权限 安卓app权限被拒绝

  你的APP应用为什么被拒绝?APP被拒绝的原因有哪些?很多公司辛辛苦苦开发一个APP出来,结果等到排期准备上架APP STORE的时候发现被拒绝了,真是太悲剧了,为什么你的APP会被拒绝呢,北京APP开发整理了一些APP应用被拒绝的原因,一起来看一下。     1. APP描述中带“Beta”字样,或是其他表明APP还未开发完成的信息  苹果坚决杜绝那些未完成的应用进入App Stor

for python 从第二开始 python中怎么获取第二行

print("\n----------------读取指定的行列-----------------------") df=pd.read_excel('测试.xlsx') data=df.iloc[1,2]#读取第一行第二列的值,这里不需要嵌套列表 print("读取指定行的数据:\n{0}".format(data))print("\n----------------读取指定的多行多列值-