PLSQL(2)
游标
[1] 不带参数的游标
1 -- 取出EMP表中的所有人名字 2 DECLARE 3 CURSOR C IS SELECT * FROM EMP; 4 V_EMP C%ROWTYPE; -- V_EMP : 带有游标C的EMP中所有数据 5 BEGIN 6 OPEN C; -- 打开游标 7 FETCH C INTO V_EMP; -- 把当前游标指向的数据拿出来 8 DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME); 9 CLOSE C; -- 关闭游标 10 END; 11 12 13 14 -- 循环读取 15 DECLARE 16 CURSOR C IS SELECT * FROM EMP; -- 声明游标 17 V_EMP C%ROWTYPE; 18 BEGIN 19 OPEN C; 20 LOOP 21 FETCH C INTO V_EMP; 22 EXIT_WHEN (C%NOTFOUND); 23 DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME); 24 END LOOP; 25 CLOSE C; 26 END;
[2] 带参数的游标
1 DECLARE 2 CURSOR C(V_DEPTNO EMP.DEPTNO%TYPE, V_JOB EMP.JOB%TYPE) 3 IS 4 SELECT ENAME, SAL FROM EMP WHERE DEPTNO = V_DEPTNO AND JOB = V_JOB; 5 BEGIN 6 FOR V_EMP IN C(30, 'CLERK') LOOP 7 DBMS_OUTPUT.PUT_LINE(V_TEMP.ENAME); 8 END LOOP; 9 END;
[3] 可更新的游标
1 DECLARE 2 CURSOR C IS SELECT * FROM EMP FOR UPDATE; -- 只要写for update: 为了更新才使用的游标 3 BEGIN 4 FOR V_TEMP IN C LOOP 5 IF(V_TEMP.SAL < 2000) THEN 6 UPDATE EMP SET SAL = SAL*2 WHERE CURRENT OF C; -- CURRENT OF C表示游标C当前位置 7 ELSIF(V_TEMP.SAL = 3000) THEN 8 DELETE FROM EMP WHERE CURRENT OF C; 9 END IF; 10 END LOOP; 11 END;
存储过程
[1] 不带参存储过程
1 -- 存储过程关键字: PROCEDURE 名字: PPP 2 CREATE OR REPLACE PROCEDURE PPP 3 IS 4 CURSOR C IS SELECT * FROM EMP FOR UPDATE; -- 为了更新才使用的游标 5 BEGIN 6 FOR V_TEMP IN C LOOP 7 IF(V_TEMP.SAL < 2000) THEN 8 UPDATE EMP SET SAL = SAL*2 WHERE CURRENT OF C; 9 ELSIF(V_TEMP.SAL = 3000) THEN 10 DELETE FROM EMP WHERE CURRENT OF C; 11 END IF; 12 END LOOP; 13 END; 14 15 -- 执行存储过程 16 BEGIN 17 PPP; 18 END;
[2] 带参的存储过程
1 -- IN: 传入参数 OUT: 传出参数 IN,OUT: 即可传入也可传出 2 CREATE OR REPLACE PROCEDURE P(V_A IN NUMBER, V_B IN NUMBER, V_C OUT NUMBER, V_TEMP IN OUT NUMBER) 3 IS 4 BEGIN 5 IF(V_A > V_B) THEN 6 V_C ;= V_A; 7 ELSE 8 V_C ;= V_B; 9 END IF; 10 V_TEMP := V_TEMP + 1; 11 END; 12 13 -- 调用存储过程 14 DECLARE 15 V_A NUMBER := 3; 16 V_B NUMBER := 4; 17 V_C NUMBER; 18 V_TEMP NUMBER := 5; 19 BEGIN 20 P(V_A, V_B, V_C, V_TEMP); 21 DBMS_OUTPUT.PUT_LINE(V_C); 22 DBMS_OUTPUT.PUT_LINE(V_TEMP); 23 END;
函数
1 -- 关键字: FUNCTION 2 CREATE OR REPLACE FUNCTION SAL_TAX 3 (V_SAL NUMBER) -- 形参 4 RETURN NUMBER -- 返回类型 5 IS 6 BEGIN 7 IF(V_SAL < 2000) THEN 8 RETURN 0.10; 9 ELSIF(V_SAL < 2750) THEN 10 RETURN 0.15; 11 ELSE 12 RETURN 0.20; 13 END IF; 14 END; 15 16 -- 使用 17 SELECT LOWER(ENAME), SAL_TAX(SAL) FROM EMP;
序列
1 -- 序列的名字为SEQ_AA,序列的第一值是1,每次执行增加1; 2 CREATE SEQUENCE SEQ_AA 3 START WITH 1 4 INCREMENT BY 1; 5 6 -- 查看当前值 7 SELECT SEO_AA.CURRENT FROM DUAL; 8 -- 查看下一个值 9 SELECT SEQ_AA.NEXTVAL FROM DUAL; 10 11 -- 查看序列 12 SELECT SEQUENCE_NAME FROM USER_SEQUENCE; 13 14 -- 删除序列 15 DROP SEQUENCE SEQ_AA; 16 17 -- 序列的值如何在想表中插入数据的时候使用 18 INSERT INTO AA VALUES (SEQ_AA.NEXTVAL,'色彩'); -- SEQ_AA.NEXTVAL将该序列的值与 '色彩' 栏匹配 19 20 21 -- 序列参数 22 CREATE SEQUENCE SEQ_IDD 23 START WITH 100 -- 序列从一百开始 24 INCREMENT BY -1 -- 每次减一 25 MAXVALUE 100 -- 序列最大值100 26 MINVALUE 90 -- 序列最小值90 27 CYCLE -- 缓存为10 28 CACHE 10;