主要有以下五种循环:Exit When、Loop、While、For(普通循环)、For(游标循环),下面举例一一说明(均为存储过程)。


1、Exit When循环:
create or replace procedure proc_test_exit_when is
i number;
begin
i:=0;
LOOP
Exit When(i>5);
Dbms_Output.put_line(i);
i:=i+1;
END LOOP;
end proc_test_exit_when;
——————————————————–俺是分割线—————————————————————–

2、Loop循环:
create or replace procedure proc_test_loop is
i number;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
if i>5 then
exit;
end if;
end loop;
end proc_test_loop;
——————————————————–俺是分割线—————————————————————–

3、While循环:
create or replace procedure proc_test_while is
i number;
begin
i:=0;
while i<5 loop
i:=i+1;
dbms_output.put_line(i);
end loop;
end proc_test_while;
——————————————————–俺是分割线—————————————————————–

4、For普通循环:
create or replace procedure proc_test_for is
i number;
begin
i:=0;
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end proc_test_for;
——————————————————–俺是分割线—————————————————————–

5、For游标循环:
create or replace procedure proc_test_cursor is
userRow test%rowtype;
cursor userRows is
select * from test;
begin
for userRow in userRows loop
dbms_output.put_line(userRow.id||’,'||userRow.Name||’,'||userRows%rowcount);
end loop;
end proc_test_cursor;
——————————————————–俺是分割线—————————————————————–

上面所示为存储过程相应代码,你可以通过如下方式进行测试:

进入pl/sql, 执行 文件->新建->程序窗口->空白,拷贝以上各段代码,到pl/sql空白窗口中,安F8执行编译。

再 执行 文件->新建->命令窗口 进入命令窗口 执行一下 set serveroutput on 这句代码,然后,输入exec 相应存储过程,ok。

第5中循环 要求新建一个名为test的表 字段 id、name,插入几条数据,进行测试即可。


1.--创建一个FUNCTION , 名为get_salary,并且有参数no,也有返回值salary。
2.CREATE OR REPLACE FUNCTION get_salary(no NUMBER)
3.RETURN NUMBER IS
4. salary NUMBER(5,2) := 110; --为salary赋值,salary变量临时存放工资的值
5.BEGIN
6. --查询出来的sal值,存放入salary变量中
7. SELECT e.sal into salary FROM emp e WHERE e.empno = no;
8. --返回salary
9. RETURN salary;
10.END;
11.
12.--下面有两种测试方法
13.
14.--测试一
15.DECLARE
16.salary NUMBER(5,2);
17.begin
18. salary := get_salary(7369);
19. dbms_output.put_line(salary);
20.end;
21.
22.--测试二
23.SELECT get_salary(7369) FROM dual;

 

 

 

Oracle学习之数组 Oracle数组一般可以分为固定数组和可变数组
固定数组
declare
type v_ar is varray(10) of varchar2(30);
my_ar v_ar:=v_ar('g','m','d','龚','帅');
begin
for i in 1..my_ar.count
loop
dbms_output.put_line(my_ar(i));
end loop;
end;
可变数组
一维数组
declare
type v_table is table of varchar2(30) index by binary_integer;
--类型可以是前面的类型定义,index by binary_integer子句代表以符号整数为索引,
--这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。
my_table v_table;
begin
for i in 1..20
loop
my_table(i):=i;
dbms_output.put_line(my_table(i));
end loop;
end;
多维数组--多条记录
declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
select * bulk collect into my_table from liutest;
for i in 1..my_table.count/10 --my_table.count/10取到的值为四舍五入值
loop
dbms_output.put_line('name--'||my_table(i).name);
dbms_output.put_line('address---'||my_table(i).address);
dbms_output.put_line('age----'||my_table(i).age);
end loop;
end;
多维数组--单条记录
declare
type v_table is table of liutest%rowtype index by binary_integer;
my_table v_table;
begin
select * into my_table(1) from liutest where id=1;
--my_table(i) i可以为任意整数,但取值时必须保持以i一致;
dbms_output.put_line('--name--'||my_table(1).name||'--address--'||my_table(1).address);
end;
自定义数组
create or replace type varray_list as varray(30) of varchar2(50);
--使用自定义数组
create or replace procedure show_list(p_varlist in varray_list)
is
v_str varchar2(50);
begin
for i in 1..p_varlist.count
loop
v_str:=p_varlist(i);
dbms_output.put_line('v_str='||v_str);
dbms_output.put_line('p_varlist('||i||')='||p_varlist(i));
end loop;
end;

declare
my_var varray_list:=varray_list('g','m','d','龚','帅');
begin
show_list(my_var);
end;

 

-- Created on 2012-4-26 星期四 by ADMINISTRATOR
declare
-- Local variables here
i integer;
s varchar2(200) :='g-m-d-龚-帅';
--type v_ar is varray(10) of varchar2(30);
my_ar ty_str_split;
begin
-- Test statements here
my_ar :=fn_split(s,'-');
for i in 1..my_ar.count
loop
dbms_output.put_line(my_ar(i));
end loop;

dbms_output.put_line(0.2+ 0.1*(0.22-0.23));
end;