代码改变世界

PL/SQL

2017-06-25 14:09  cnblogs_qm  阅读(206)  评论(0编辑  收藏  举报
Procedural Language/SQL 过程化编程语言
 

PL/SQL块
[DECLARE]
  -- 声明部分
BEGIN
  -- 执行部分
[EXCEPTION]
  -- 异常处理部分
END

 

变量
-- 参数
param_name datatype [{:=|default} param_value]
-- 输入参数
param_name [in] datatype [{:=|default} param_value]
-- 输出参数
param_name out datatype [{:=|default} param_value]

 


流程控制语句
IF
if <condition_expression1> then
  plsql_sentence_1;
elsif <condition_expression2> then
  plsql_sentence_2;
...
else
  plsql_sentence_n;
end if;

注:是“elsif”,不是“elseif”,木有“e” 

 

CASE
case <selector>
  when <expression_1> then plsql_sentence_1;
  when <expression_2> then plsql_sentence_2;
  ...
  when <expression_n> then plsql_sentence_n;
  [else plsql_sentence;]
end case;

 


循环语句
LOOP
loop
  plsql_sentence;
  exit when end_condition_exp;
end loop;

 

 1 -- 计算前100个自然数之和
 2 set serveroutput on
 3 declare
 4   sum_i int := 0;
 5   i int := 0;
 6 begin
 7   loop
 8     i := i + 1;
 9     sum_i := sum_i + i;
10     exit when _i = 100;
11   end loop;
12   dbms_output.put_line('前100个自然数之和:' || sum_i);
13 end;
14 /

 

WHILE
while condition_expression loop
  plsql_sentence;
end loop;

 

 1 -- 计算前100个自然数之和
 2 set serveroutput on
 3 declare
 4   sum_i int := 0;
 5   i int := 0;
 6 begin
 7   while 1<=99 loop
 8     i := i + 1;
 9     sum_i := sum_i + i;
10   end loop;
11   dbms_output.put_line('前100个自然数之和:' || sum_i);
12 end;
13 /

 

FOR
for variable_counter_name in [reverse] lower_limit..upper_limit loop
  plsql_sentence;
end for;

 

 1 -- 计算前100个自然数之和
 2 declare
 3   sum_i int := 0;
 4 begin
 5   for i in 1..100 loop
 6     sum_i := sum_i + i;
 7   end loop;
 8   dbms_output.put_line('前100个自然数之和:' || sum_i);
 9 end;
10 /

 

 


游标
      游标提供了一种从表中检索数据并进行操作的灵活手段,它主要用在服务器上,处理由客户端发送给服务器端的SQL语句,或是批处理、存储过程、触发器中的数据处理请求。
      游标的作用相当于指针,通过它PL/SQL程序可以一次处理查询结果集中的一行,并可以对该行数据执行特定操作。
 
 
显示游标
      它是由用户声明、操作的一种游标,通常用于操作查询结果集,使用它处理数据的步骤包括:声明、打开、读取、关闭4个步骤。其中读取游标可能是个反复操作的步骤,因为游标每次只能读取一行数据,所以对于多条记录,需要反复读取,直到游标读取不到数据为止。
 
-- 声明游标
cursor cur_name[(input_param1[, input_param2]...)]
[return ret_type]
is select_sentence;
 
-- 打开游标
open cur_name[(param_value1[, param_value2]...)];
 
-- 读取游标
fetch cur_name into {variable};
 
-- 关闭游标
close cur_name;

 

 1 -- 
 2 set serveroutput on
 3 declare
 4   -- 声明游标
 5   cursor cup_demo(var_valid in SMALLINT := '0')
 6   is select id, name, type
 7      from t_demo
 8      where valid = var_valid;
 9   -- 声明一个RECORD类型
10   type record_demo is record
11   (
12     id   t_demo.id%type,
13     name t_demo.name%type,
14     type t_demo.type%type
15   );
16   -- 声明一个record_demo类型的变量
17   v_row record_demo;
18 begin
19   -- 打开游标
20   open cur_demo('1');
21   -- 读取游标
22   fetch cur_demo into v_row;
23   while cur_demo%found loop
24     dbms_output.putline(v_row.name || ':' || v_row.type);
25     fetch cur_demo into v_row;
26   end loop;
27   -- 关闭游标
28   close cur_demo;
29 end;
30 /

 

使用FOR语句循环游标

 1 --
 2 set serveroutput on
 3 declare
 4   -- 声明游标
 5   cursor cup_demo(var_valid in SMALLINT := '0')
 6   is select id, name, type
 7      from t_demo
 8      where valid = var_valid;
 9 begin
10   -- 循环游标
11   for v_row in cur_demo loop
12     dbms_output.put_line(v_row.name || ':' || v_row.type);
13   end loop;
14 end;
15 /

注:在使用游标(包括显示、隐式)的FOR循环中,可以声明游标,但不用打开游标、读取游标、关闭游标,这些是由Oracle系统内部自动完成的。