主要有以下五種循環: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;