1. 程式人生 > >Oracle遊標

Oracle遊標

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遊標