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;

 

posted @ 2018-04-13 11:25  Jin同学  阅读(235)  评论(0)    收藏  举报