一、PLSQL编程思维导图
二、PLSQL编程思维导图对应笔记
1 PL/SQL编程 @Holly老师 2 3 4 5.1 为什么学习PL/SQL编程? 5 5.1.1 当我们要批量插入100万数据,怎么办? 6 1、难道要写一百条insert into吗?不是,由于插入数据的操作是重复的,所以我们可以利用循环去实现,那怎么去实现呢?就用plsql编程去实现! 7 8 5.2 什么是PL/SQL编程 9 5.2.1 概念 10 pl/sql是块结构语言,它将一组语句放在一个块中。 11 PL/SQL程序结构是一种描述性很强、界限分明的块结构、嵌套块结构,被分成单独的过程、函数、触发器,且可以把它们组合为程序包,提高程序的模块化能力。 12 13 5.2.2 组成 14 1、声明部分 15 declare 16 2、执行部分 17 begin 18 3、异常处理部分 19 exception 20 21 5.2.3 PL/SQL块的结构 22 DECLARE 23 --声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 24 BEGIN 25 -- 执行部分: 过程及SQL 语句 , 即程序的主要部分 26 EXCEPTION 27 -- 执行异常部分: 错误处理 28 END; 29 其中:执行部分不能省略 30 31 5.2.4 PL/SQL块可以分类 32 1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。 33 2. 命名块(named):是带有名称的匿名块,这个名称就是标签。 34 3. 子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。 35 4. 触发器 (Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。 36 5. 程序包(package):存储在数据库 中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。 37 38 5.2.5 PL/SQL结构 39 1、 PL/SQL块中可以包含子块; 40 41 2、子块可以位于 PL/SQL中的任何部分; 42 43 3、子块也即PL/SQL中的一条命令; 44 45 5.2.6 运算符 46 关系运算符 47 48 一般运算符 49 50 逻辑运算符 51 52 5.2.7 数据类型 53 5.2.7.1 LOB数据类型 54 1、BFILE (Movie) 55 存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。 56 2、 BLOB(Photo) 57 存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。 58 3、 CLOB(Book) 59 存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。 60 4、 NCLOB 61 存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。 62 63 5.2.7.2 属性类型 64 1、使用%TYPE 65 (1)概念: 66 定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE 67 (2)优点: 68 使用%TYPE特性的优点在于: 69 70 1. 所引用的数据库列的数据类型可以不必知道; 71 72 2. 所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。 73 (3)示例1: 74 例7: 75 set serverout on 76 DECLARE 77 -- 用%TYPE 类型定义与表相配的字段 78 TYPE T_Record IS RECORD( 79 T_no emp.empno%TYPE, 80 T_name emp.ename%TYPE, 81 T_sal emp.sal%TYPE ); 82 -- 声明接收数据的变量 83 v_emp T_Record; 84 BEGIN 85 SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788; 86 DBMS_OUTPUT.PUT_LINE 87 (TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' ' || TO_CHAR(v_emp.t_sal)); 88 END; 89 90 / 91 示例2: 92 例8: 93 set serverout on 94 DECLARE 95 v_empno emp.empno%TYPE :=&no; 96 Type t_record is record ( 97 v_name emp.ename%TYPE, 98 v_sal emp.sal%TYPE, 99 v_date emp.hiredate%TYPE); 100 Rec t_record; 101 BEGIN 102 SELECT ename, sal, hiredate INTO Rec FROM emp WHERE empno=v_empno; 103 DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'--'||Rec.v_date); 104 END; 105 / 106 2、使用%ROWTYPE 107 (1)概念 108 PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。 109 (2)优点 110 使用%ROWTYPE特性的优点在于: 111 112 1. 所引用的数据库中列的个数和数据类型可以不必知道; 113 114 2. 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。 115 (3)示例 116 例9: 117 set serverout on 118 DECLARE 119 v_empno emp.empno%TYPE :=&no; 120 rec emp%ROWTYPE; 121 BEGIN 122 SELECT * INTO rec FROM emp WHERE empno=v_empno; 123 DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工资:'||rec.sal||'工作时间:'||rec.hiredate); 124 END; 125 / 126 127 5.2.7 变量 128 5.2.6.1 变量的定义 129 1、 定义变量 130 语法:变量名 数据类型[(大小)] [:=变量的初始值] ; 131 2、定义常量 132 语法:常量名 constant 数据类 := 常量值 ; 133 134 5.2.6.2 命名要求 135 PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有: 136 137 1. 标识符名不能超过30字符; 138 139 2. 第一个字符必须为字母; 140 141 3. 不分大小写; 142 143 4. 不能用"-"(减号); 144 145 5. 不能是SQL保留字。 146 147 提示: 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果. 148 149 5.2.6.3 命名规则 150 变量命名规则 151 152 5.2.7.1 变量类型 153 变量类型 154 155 5.2.6.3 案例1: 156 例如:下面的例子将会删除所有的纪录,而不是’EricHu’的记录; 157 158 DECLARE 159 ename varchar2(20) :='EricHu'; 160 BEGIN 161 DELETE FROM scott.emp WHERE ename=ename; 162 END; 163 164 5.2.8 变量增删改示例 165 1. 示例:插入 166 例1. 插入一条记录并显示; 167 set serverout on 168 DECLARE 169 Row_id ROWID; 170 info VARCHAR2(40); 171 BEGIN 172 INSERT INTO scott.dept VALUES (90, '财务室', '海口') 173 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc 174 INTO row_id, info; 175 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); 176 DBMS_OUTPUT.PUT_LINE(info); 177 END; 178 / 179 其中: 180 181 RETURNING子句用于检索INSERT语句中所影响的数据行数,当INSERT语句使用VALUES 子句插入数据 时,RETURNING 字句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING 子句是应注意以下 几点限制: 182 183 1.不能与DML语句和远程对象一起使用; 184 185 2.不能检索LONG 类型信息; 186 187 3.当通过视图向基表中插入数据时,只能与单基表视图一起使用。 188 2.示例:修改 189 例2. 修改一条记录并显示 190 set serverout on 191 DECLARE 192 Row_id ROWID; 193 info VARCHAR2(40); 194 BEGIN 195 UPDATE dept SET deptno=100 WHERE DNAME='财务室' 196 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc 197 INTO row_id, info; 198 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); 199 DBMS_OUTPUT.PUT_LINE(info); 200 END; 201 / 202 其中: 203 204 RETURNING子句用于检索被修改行的信息。当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的 ROWID和REF值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据 时,RETURNING 子句可以将被修改行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在UPDATE中使用 RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。 205 3.删除 206 例3. 删除一条记录并显示 207 set serverout on 208 DECLARE 209 Row_id ROWID; 210 info VARCHAR2(40); 211 BEGIN 212 DELETE dept WHERE DNAME='办公室' 213 RETURNING rowid, dname||':'||to_char(deptno)||':'||loc 214 INTO row_id, info; 215 DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id); 216 DBMS_OUTPUT.PUT_LINE(info); 217 END; 218 / 219 其中: 220 221 RETURNING子句用于检索被删除行的信息:当DELETE语句删除单行数据时,RETURNING 子句可以检索被删除行的 ROWID和REF值,以及被删除列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当DELETE语句删除多行数据 时,RETURNING 子句可以将被删除行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在DELETE中使用 RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。 222 223 5.3 如何使PL/SQL编程 224 大家有没有发现我们每天sql语句后面都有什么呀?都有分号!如果在java中 225 226 5.4 在什么时候使用PL/SQL编程