语法
定义:CREATE [OR REPLACE] PROCEDURE <过程名>[(参数列表)] IS
[局部变量声明]
BEGIN
可执行语句
EXCEPTION
异常处理语句
END [<过程名>];
变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
例如:
create or replace procedure cursor_test(v1 varchar2,v2 in out int) is
-- 为v_rid的类型和表room的rid字段类型一致
v_rid room.rid%type;
v_name room.rname%type;
-- v_room 的类型和room表的行类型一致
v_room room%rowtype;
cursor room_cursor is
select rid,rname from room;
begin
loop
if not room_cursor%isopen then
open room_cursor;
end if;
fetch room_cursor into v_rid,v_name;
exit when room_cursor%notfound;
dbms_output.put_line(v_name);
end loop;
end;
declare
n int;
begin
n:=1;
cursor_test('test',n);
end;
oracle游标使用
oracle游标分为显式游标和隐式游标,显式游标需要显示的定义:
CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
[FOR UPDATE | FOR UPDATE OF 字段] --给游标加锁,当程序执行DML语句时,游标自动给指定的表或者字段加锁,防止同时有别的程序对指定的表或字段进行"UPDATE",“INSERT”,“DELETE"操作.
在使用"DELETE”,"UPDATE"后还可以在程序中使用CURRENT OF <游标名> 子句引用当前行.
1.打开游标
OPEN <游标名>
2.获取游标当前位置的值
FETCH <游标名> INTO 变量1,变量2,…变量n,;
或者 FETCH <游标名> INTO 行对象; --取出游标当前
位置的值
3.关闭游标
CLOSE <游标名>
游标属性
%NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当前行的行数;
%ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
游标一般配合循环来进行使用
调用存贮过程
1.使用begin和end块
declare
n int;
begin
n:=1;
cursor_test('test',n);
end;
2.call p();
3.exec p();
其他语法
1. 使用全局变量
使用:号修饰
:i=100;
2.用户交互输入
使用&
declare
n int;
begin
n:=&n;
end;
3.for循环
3.FOR
FOR <循环变量> IN 下限..上限
LOOP
语句;
END LOOP;
用for循环处理游标
create or replace procedure cursor_test(v1 varchar2,v2 in out int) is
v_rid room.rid%type;
v_name room.rname%type;
cursor room_cursor is
select rid,rname from room;
begin
for v_room in room_cursor loop
dbms_output.put_line(v_room.rname);
end loop;
end;