PLSQL(1)

PLSQLl编程                      

    plsql是Oracle在标准的sql语言上的扩展

    特点:可以在数据库中定义变量,常量,还可以使用条件语句和判断语句以及异常等

PLSQL程序组成部分         

    PLSQL由 声明部分、执行部分、异常处理部分组成

    DECLARE   -- 声明部分

    -- 在此声明pl/sql用到的变量

    BEGIN   -- 执行

  -- 在此写执行语句

    EXCEPTION

    -- 执行异常 

    END;

简单的PLSQL块               

1 DECLARE     -- 声明并赋值       变量名 类型 := 值;          := 表示赋值    = 表示条件判断
2     V_NUM NUMBER := 10;    -- PLSQL在声明变量时在前面加v_ 代表变量
3 BEGIN
4     V_NUM := V_NUM + 1;   -- 对V_NUM加1
5     DBMS_OUTPUT.put_line('NUM' || V_NUM);   -- 对结果进行输出
6 END;

SELECT...INTO、%TYPE、 %ROWTYPE、常量        

SELECT...INTO...    

[1] 声明变量赋值为员工表中Smith的员工编号    SELECT ...INTO 

SELECT...INTO可以将表中查询到的数据赋值给变量V_NUM

1 DECLARE
2     V_NUM NUMBER;    -- 声明
3 BEGIN
4     SELECT EMPNO INTO V_NUM FROM EMP WHERE ENAME = 'SMITH';
5     DBMS_OUTPUT.put_line('NUM' || V_NUM);
6 END;

%TYPE               

[2] 声明变量,变量的类型是scott用户下emp表empno字段的字段类型    %TYPE

1 DECLARE
2     V_NUM SCOTT.EMP.EMPNO%TYPE;  -- 声明类型是SCOTT用户下的EMP表的EMPNO列对应的类型
3 BEGIN
4     SELECT EMPNO INTO V_NUM FROM EMP WHERE ENAME = 'SMITH';
5     DBMS_OUTPUT.put_line('NUM' || V_NUM);
6 END;

%ROWTYPE              

[3] 取一行数据   %rowtype

1 DECLARE
2     V_EMPROW SCOTT.EMP%ROWTYPE;  -- 拿到SCOTT用户下的EMP表的所有列数据的类型
3 BEGIN
4     SELECT * INTO V_EMPROW FROM EMP WHERE ENAME = 'SMITH';
5     DBMS_OUTPUT.put_line(V_EMPROW.ENAME || V_EMPROW.EMPNO);
6 END;

常量                          

1 DECLARE
2     -- 声明
3     C_PI CONSTANT NUMBER := 3.1415; -- CONSTANT: 常量,一旦设定,不能改变    命名规范:常量前面加C
4     V_R NUMBER := 20;
5     V_AREA NUMBER;
6 BEGIN
7     V_AREA := C_PI*V_R*V_R;
8     DBMS_OUTPUT.put_line('圆的面积:' || V_AREA);
9 END;

判断语句                      

IF判断       

 1 DECLARE
 2     V_SCORE NUMBER;
 3 BEGIN
 4     V_SCORE := '&请输入成绩';    -- &表示输入
 5     IF(V_SCORE >= 90) THEN 
 6         DBMS_OUTPUT.PUT_LINE('去玩游戏');
 7     ELSIF (V_SCOE >= 80) THEN
 8         DBMS_OUTPUT.PUT_LINE('去报补习班');
 9     ELSIF (V_SCORE >= 70) THEN
10         DBMS_OUTPUT.PUT_LINE('去报两个补习班');
11     ELSE
12         DBMS_OUTPUT.PUT_LINE('去写作业');
13     END IF;
14 END;

SWITCH判断           

 1 DECLARE
 2     V_SCORE NUMBER;
 3 BEGIN
 4     V_SCORE := '&请输入成绩';
 5     CASE
 6         WHEN V_SCORE > 90 THEN DBMS_OUTPUT.PUT_LINE('去玩游戏');
 7         WHEN V_SCORE > 80 THEN DBMS_OUTPUT.PUT_LINE('去报补习班');
 8         WHEN V_SCORE > 70 THEN DBMS_OUTPUT.PUT_LINE('去报两个补习班');
 9         ELSE DBMS_OUTPUT.PUT_LINE('去写作业');
10     END CASE;
11 END;

循环结构                  

LOOP循环     

 1 -- 要求一个变量,每次循环减1,并输出结果 ,当变量小于3时,退出循环
 2 DECLARE
 3     V_COUNT NUMBER := 10;
 4 BEGIN
 5     LOOP    -- 循环开始
 6         V_COUNT := V_COUNT - 1;     -- 减1
 7         EXIT WHEN V_COUNT < 3;      -- 当V_COUNT小于3时,退出循环
 8         DBMS_OUTPUT.PUT_LINE(V_COUNT);
 9     END LOOP;     -- 结束循环
10 END;
11 
12 
13 DECLARE
14     V_COUNT := 10;
15 BEGIN
16     LOOP
17         V_COUNT : V_COUNT - 1;
18         IF V_COUNT < 3 THEN
19             EXIT;       -- 满足条件,退出循环
20         DBMS_OUTPUT.PUT_LINE(V_COUNT);
21     END LOOP;
22 END;

WHILE循环                 

1 -- 声明变量1,每次循环加1,并输出结果,当变量大于20的时候,退出循环
2 DECLARE
3     V_NUM NUMBER := 1;    -- 声明变量并赋值
4 BEGIN
5     WHILE V_NUM < 20 LOOP    -- 开始循环
6         DBMS_OUTPUT_PUT_LINE(V_NUM);
7         V_NUM := V_NUM + 1;
8         END LOOP;                      -- 结束循环
9 END; 

FOR循环                     

1 -- 变量从0开始,变量等于10,每次循环+1,算循环的次数
2 DECLARE
3     V_NUM NUMBER := 10;
4 BEGIN
5     FOR I IN 0..10 LOOP    -- 0..10表示0到10
6         V_NUM := V_NUM + 1;
7         DBMS_OUTPUT.PUT_LINE(V_NUM);
8         END LOOP;
9 END;

PLSQL之异常处理                    

使用EXCEPTION处理异常      

 1 DECLARE
 2     V_TEMP NUMBER(4);
 3 BEGIN
 4     SELECT EMPNO INTO V_TEMP FROM EMP WHERE DEPNO = 100; -- 这里DEPNO等于10的列不只一条,而V_TEMP只能接收一条数据,所以会造成异常
 5 EXCEPTION
 6     WHEN TOO_MANY_ROWS THEN   
 7         DBMS_OUTPUT.PUT_LINE('返回的数据太多了');
 8     WHEN NO_DATA_FOUND THEN
 9         DBMS_OUTPUT.PUT_LINE('没有数据啊');
10     WHEN OTHERS THEN       -- 使用OTHERS表示其他异常 
11         DBMS_OUTPUT.PUT_LINE('其他异常');
12 END;

自定义异常          

 1 DECLARE
 2     V_NUMBER1 NUMBER;      -- 声明变量
 3     V_NUMBER2 NUMBER;
 4     V_RESULT NUMBER;
 5     E_NONUMBER EXCEPTION;    -- 声明异常
 6  
 7     PRAGMA EXCEPTION_INIT (E_NONUMBER, -6502);  -- 将错误的代码跟自定义的异常名称绑定,并注册到系统里面
 8 BEGIN
 9     V_NUMBER1 := '& 请输入被除数';
10     V_NUMBER2 := '& 请输入除数';
11     V_RESULT := V_NUMBER1 / V_NUMBER2;
12     DBMS_OUTPUT.PUT_LINE(V_RESULT);
13 EXCEPTION
14     WHEN E_NONUMBER THEN
15         DBMS_OUTPUT.PUT_LINE('你输入的不是数字');
16 END;

建立错误日志表      

 1 -- 创建表
 2 CREATE TABLE ERROLOG(    --错误日志
 3    ERROCODE NUMBER,       -- 出错的编码   (ORA-XXXX)
 4    ERROMSG VARCHAR2 (1024),  --出错的信息
 5    ERRODATE DATE      --出错的时间
 6 )
 7 
 8 
 9 
10 -- 记录错误日志
11 DECLARE 
12    V_DEPTNO DEPT.DEPTNO%TYPE := 10;   --声明一个变量v_deptno  是dept 表的deptno类型
13    ERROCODE NUMBER;   --出错的编码
14    ERROMSG VARCHAR2(1024);      --出错的信息
15    
16 BEGIN
17   DELETE FROM DEPT WHERE DEPTNO = 90;  
18   DELETE FROM DEPT WHERE DEPTNO = V_DEPTNO;
19        COMMIT;
20 EXCEPTION
21   WHEN OTHERS THEN
22         ROLLBACK;    --回滚到之前的状态
23     ERROCODE := SQLCODE;  --打印错误编码
24     ERROMSG  := SQLERRM;  --打印错误的信息
25     INSERT INTO ERROLOG VALUES (ERROCODE,ERROMSG,SYSDATE);
26      COMMIT;  
27 END;

 

posted @ 2018-03-28 19:43  Jin同学  阅读(353)  评论(0)    收藏  举报