Oracle遊標
阿新 • • 發佈:2017-05-30
begin 隱式 open put 定義 delete declare ora update
遊標分顯示遊標跟隱式遊標,它們都具有%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT四個屬性。
%FOUND:如果SQL語句至少影響到一行數據,則該屬性為true,反之為false。
%NOTFOUND:與%FOUND相反。
%ISOPEN:判斷遊標是否打開。
%ROWCOUNT:返回愛SQL語句影響的行數。
1.顯示遊標
Oracle的遊標可以設置參數值,如下,IN表示參數的方向,可以省略,參數的類型不需要指定長度
DECLARE CURSOR emp_cur(jobName IN VARCHAR2:=‘SALESMAN‘) IS SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=jobName;
1.1用變量接收值。遊標循環時用參數接收值,類似於MS SQL SERVER 的遊標。
DECLARE EMP_NO EMP.EMPNO%TYPE; EMP_NAME EMP.ENAME%TYPE; EMP_SAL EMP.SAL%TYPE; BEGIN OPEN emp_cur(‘MANAGER‘); --打開遊標 FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL; --讀取第一行 WHILE emp_cur%FOUND LOOP --循環判斷,用%FOUND 返回TRUE則表示讀取到了DBMS_OUTPUT.put_line(‘FETCH CURSOR--‘||EMP_NO||‘--‘||EMP_NAME||‘--‘||‘--‘||EMP_SAL); FETCH emp_cur INTO EMP_NO,EMP_NAME,EMP_SAL; --讀取下一行 END LOOP; END; END;
1.2 用記錄類型
DECLARE CURSOR cur_emp(var_job IN VARCHAR2:=‘SALESMAN‘) IS SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB=var_job; TYPE emp_record IS RECORD --定義記錄類型( EMPNO EMP.EMPNO%TYPE, ENAME EMP.ENAME%TYPE, SAL EMP.SAL%TYPE ); emp_row emp_record; --定義類型對象 BEGIN OPEN cur_emp(‘MANAGER‘); FETCH cur_emp INTO emp_row; --讀取數據到記錄對象 WHILE cur_emp%FOUND LOOP DBMS_OUTPUT.put_line(emp_row.EMPNO||‘--‘||emp_row.ENAME||‘--‘||‘--‘||emp_row.SAL); FETCH cur_emp INTO emp_row; END LOOP; CLOSE cur_emp; --關閉遊標 END;
1.3 FOR循環讀取遊標
1.3.1 讀取遊標
DECLARE CURSOR mycur(VAR_JOB VARCHAR2:=‘SALESMAN‘) IS SELECT * FROM EMP WHERE JOB=VAR_JOB; BEGIN FOR cur IN mycur LOOP DBMS_OUTPUT.put_line(cur.EMPNO||‘--‘||cur.ENAME||‘--‘||‘--‘||cur.SAL||‘--‘||cur.JOB); END LOOP; END;
1.3.2 直接循環SQL語句
FOR cur IN (SELECT * FROM EMP) LOOP DBMS_OUTPUT.put_line(‘FOR--‘||cur.EMPNO||‘--‘||cur.ENAME||‘--‘||‘--‘||cur.SAL||‘--‘||cur.JOB); END LOOP;
2.隱式遊標
2.1在執行一個SQL,ORACLE會自動的創建一個隱式遊標,如INSERT,UPDATE,DELETE語句。使用時需要在屬性前面加上隱式遊標默認的標識--SQL
--INSERT INTO EMP VALUES(‘7935‘,‘KEN‘,‘ENGINEER‘,7902,SYSDATE,2000,‘‘,20);
UPDATE EMP SET SAL=SAL+100; IF SQL%NOTFOUND THEN DBMS_OUTPUT.put_line(‘NOTFOUND‘); ELSE DBMS_OUTPUT.put_line(SQL%ROWCOUNT||‘受影響‘); END IF;
Oracle遊標