for循环游标
DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE JOB = 'MANAGER';
V_ROW C_EMP%ROWTYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
END LOOP;
END;
或者
DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE JOB = 'MANAGER';
V_ROW EMP%ROWTYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
END LOOP;
END;
或者
DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
END LOOP;
END;
fetch游标
DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
OPEN C_EMP;
LOOP
FETCH C_EMP INTO V_ROW;
EXIT WHEN C_EMP%NOTFOUND;
DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
END LOOP;
CLOSE C_EMP;
END;
隐式游标
BEGIN
UPDATE EMP SET ENAME = 'SMITH' WHERE EMPNO = 7369;
COMMIT;
DBMS_OUTPUT.put_line('SQL%ROWCOUNT = ' || SQL%ROWCOUNT);
IF SQL%ISOPEN THEN
DBMS_OUTPUT.put_line('SQL%ISOPEN');
ELSE
DBMS_OUTPUT.put_line('NOT SQL%ISOPEN');
END IF;
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('SQL%FOUND');
ELSE
DBMS_OUTPUT.put_line('NOT SQL%FOUND');
END IF;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.put_line('SQL%NOTFOUND');
ELSE
DBMS_OUTPUT.put_line('NOT SQL%NOTFOUND');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('NO_DATA_FOUND');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.put_line('TOO_MANY_ROWS');
END;
while循环游标
DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
OPEN C_EMP;
FETCH C_EMP INTO V_ROW;
WHILE C_EMP%FOUND LOOP
DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
FETCH C_EMP INTO V_ROW;
END LOOP;
CLOSE C_EMP;
END;
参数游标
DECLARE
CURSOR C_EMP(P_EMPNO NUMBER) IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE EMPNO = P_EMPNO;
V_ROW EMP%ROWTYPE;
BEGIN
FOR V_ROW IN C_EMP(7369) LOOP
DBMS_OUTPUT.put_line(V_ROW.EMPNO||V_ROW.ENAME||V_ROW.SAL);
END LOOP;
END;
更新游标
CREATE TABLE EMP1 AS SELECT * FROM EMP;
DECLARE
CURSOR C_EMP IS
SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, D.DEPTNO
FROM EMP1 E, DEPT D
WHERE E.DEPTNO = D.DEPTNO FOR UPDATE OF E.DEPTNO;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
IF V_ROW.SAL < 1500 THEN
V_SAL := V_ROW.SAL * 1.2;
ELSIF V_ROW.SAL < 2000 THEN
V_SAL := V_ROW.SAL * 1.5;
ELSIF V_ROW.SAL < 3000 THEN
V_SAL := V_ROW.SAL * 2;
END IF;
UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
END LOOP;
COMMIT;
END;
锁住E表中满足条件的行。
或者
DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP1 FOR UPDATE;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
IF V_ROW.SAL < 1500 THEN
V_SAL := V_ROW.SAL * 1.2;
ELSIF V_ROW.SAL < 2000 THEN
V_SAL := V_ROW.SAL * 1.5;
ELSIF V_ROW.SAL < 3000 THEN
V_SAL := V_ROW.SAL * 2;
END IF;
UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
END LOOP;
COMMIT;
END;
锁住所有行。
或者
DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP1 FOR UPDATE NOWAIT;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
FOR V_ROW IN C_EMP LOOP
IF V_ROW.SAL < 1500 THEN
V_SAL := V_ROW.SAL * 1.2;
ELSIF V_ROW.SAL < 2000 THEN
V_SAL := V_ROW.SAL * 1.5;
ELSIF V_ROW.SAL < 3000 THEN
V_SAL := V_ROW.SAL * 2;
END IF;
UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
END LOOP;
COMMIT;
END;
默认情况下当前会话要一直等待对方释放锁,使用nowait子句可以避免等待锁