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;

浙公网安备 33010602011771号