主要有以下五种循环:Exit When、Loop、While、For(普通循环)、For(游标循环),下面举例一一说明(均为存储过程)。
1、Exit When循环:create or replace procedure proc_test_exit_when isi number;begini:=0;LOOPExit 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 isi number;begini:=0;loopi:=i+1;dbms_output.put_line(i);if i>5 thenexit;end if;end loop;end proc_test_loop;——————————————————–俺是分割线—————————————————————–3、While循环:
create or replace procedure proc_test_while isi number;begini:=0;while i<5 loopi:=i+1;dbms_output.put_line(i);end loop;end proc_test_while;——————————————————–俺是分割线—————————————————————–4、For普通循环:
create or replace procedure proc_test_for isi number;begini:=0;for i in 1..5 loopdbms_output.put_line(i);end loop;end proc_test_for;——————————————————–俺是分割线—————————————————————–5、For游标循环:
create or replace procedure proc_test_cursor isuserRow test%rowtype;cursor userRows isselect * from test;beginfor userRow in userRows loopdbms_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;