參考文章: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
.