Oracle中cursor学习
参考文章:Oracle中Cursor介绍和使用
什么是cursor
好吧,我也没有他的定义,网上找也没找到,若有大侠有比较好的解释还请不吝赐教。
说说现在的理解吧:cursor游标,和它对应java中的对象是ResultSet,可以理解为一个map的数组,或者说想json数组,感觉应该是长这样的
{
{name:'张三',sex:'男',age:20},
{name:'李四',sex:'女',age:18}
}
简单用法
declare
cursor mycur is
select t_user.user_name,t_user.user_sex,t_user.user_age from t_user;
begin
for i in mycur
loop
Dbms_Output.put_line('姓名:'||i.user_name||'性别:'||i.user_sex||' 年龄:'||i.user_age);
end loop;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
再看一例子
DECLARE
CURSOR emp_cur IS
SELECT employee_id
FROM employees
WHERE salary > 3000
AND job_id = 'ST_CLERK'
FOR UPDATE OF salary NOWAIT;
c_row NUMBER;
BEGIN
IF NOT emp_cur%ISOPEN THEN
OPEN emp_cur;
END IF;
LOOP
FETCH emp_cur
INTO c_row;
EXIT WHEN emp_cur%NOTFOUND;
UPDATE employees SET salary = salary * 1.1 WHERE CURRENT OF emp_cur;
END LOOP;
COMMIT;
dbms_output.put_line('update complete');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
ROLLBACK;
end;
参数:在使用游标的时候,游标会产生四个属性:%found、%notfound、%isopen 和%rowcount,下面以隐式游标为例来看下游标属性的使用方法。
BEGIN
--update 语句会产生一个游标,我们会获取到相应的游标属性
UPDATE cux_cursor_test t SET t.age = 30 WHERE t.person_name = 'Herry';
IF SQL%FOUND THEN
dbms_output.put_line('Herry 更新了几条记录:' || SQL%ROWCOUNT);
ELSIF SQL%NOTFOUND THEN
dbms_output.put_line('Herry 在表中不存在');
END IF;
--delete 语句会产生一个游标,我们会获取到相应的游标属性
DELETE cux_cursor_test p WHERE p.person_name = 'Abc';
IF SQL%FOUND THEN
dbms_output.put_line('Abc 删除了几条记录' || SQL%ROWCOUNT);
ELSIF SQL%NOTFOUND THEN
dbms_output.put_line('Abc 在表中不存在');
END IF;
--insert 语句会产生一个游标,我们会获取到相应的游标属性
INSERT INTO cux_cursor_test
VALUES
(103,
'Peter',
28);
IF SQL%FOUND THEN
dbms_output.put_line('Peter 插入了几条记录:' || SQL%ROWCOUNT);
ELSIF SQL%NOTFOUND THEN
dbms_output.put_line('无数据可以插入');
END IF;
END;
%rowcount r它随每次fetch而累计:
参考文章
%notfound:It returns TRUE
if an INSERT
, UPDATE
, or DELETE
statement affected no rows, or a SELECT
INTO
statement returned no rows. Otherwise, it returns FALSE
.
参考文章
还没有评论,来说两句吧...