======================PLSQL=========================
PL/SQL使用“--”注释单行和“/**/”注释多行
一、基本类型
1、PL/SQL块
【PL/SQL块结构】
声明部分(DECLARE):声明变量、常量、游标、类型,以及局部的存储过程和函数
执行部分(BEGIN---END):执行语句,操作数据库
异常处理(EXCEPTION):对异常和错误进行处理
-------------------------------------
<<block_name>>    //有名块标号
[DECLARE]
-
-declare;
BEGIN
mysql语句的执行顺序
--execute;
[EXCEPTION]
--exception;
END [block_name]
-------------------------------------
【块分类】:
无名块:动态构造,只能执行一次
有名块:加了标号的无名块
子程序:包括存储在数据库中的存储过程,函数和包,可以随时调用
-
------------------------------------
CREATE OR REPLACE PROCEDURE block_name AS
--declare;
BEGIN
--execute;
END [block_name]
-------------------------------------
触发器:存储在数据库中的块,一旦相关事件被触发则执行本块
-------------------------------------
CREATE OR REPLACE TRIGGER block_name
--when and where
BEGIN
--execute;
END [block_name]
-------------------------------------
2、变量
【标识符】
不带双引号的标识符:以字母开头,可以为字母,数字和特殊字符($、#、_)组成,并且长度不超过30的字符串(不区分大小写)
带双引号的标识符:同不带双引号的标识符,但可以区分大小写和可包含空格等其他特殊字符。
【数据类型】
a.标量类型:
NUMERIC用于存放整数,实数和浮点数
1)BINARY_INTEGER:存储带符号的整数(-2147483647~2147483647),对应的派生类型:
NATURAL:存储非负的整数
NATURALN:存储非负的整数,不能为空
POSITIVE:存储正整数
POSITIVEN:存储正整数,不能为空
SIGNTYYE:存储-1,0和1
2)NUMBER:可以存储定点数,整形数和浮点数(1.0E-130~9.99E125),对应的派生类:
定点数:DEC、DECIMAL、NUMERIC最大精度为38
type(precision,scale),其中precision表示精度(1~38),scale(-84~127)表示标度,标度指定从什么位置进行四舍五入,当scale>0时表示从小数点右边小数部分第scale位开始,如果scale<0时从小数点左边整数部分第scale位开始。
浮点数:DOUBLE PRECISION、FLOAT最大精
度为38,REAL最大精度为18
type,精度为38或则18的浮点数,没有精度的概念
整形数:INTEGER、INT、SMALLINT,最大精度为38
type(precision),只需指定精度即可
3)PLS_INTEGER:
存储带符号的整数范围同BINARY_INTEGER(-2147483647~2147483647),速度比NUMBER和BINARY_INTEGER块,但是PLS_INTEGER会出现溢出错误,而BINARY_INTEGER在NUMBER类型之间赋值时,即使有溢出也不会出现溢出错误
CHARACTER用于存放字符串,对应的派生类型有:
1)CHAR:用于存放固定长度的字符数据
render最常用的是什么意思CHAR[(length)],1<=length<=32767,length的默认长度为1。其实数据库最大的CHAR类型的列最大存储2000个字符,因此不能直接把大于2000字符的字符串直接插入到数据库列中,但可以插入到VARCHAR2或LONG类型的列中。
2)NCHAR:用于存放固定长度的NLS字符数据。其他同CHAR,但NCHAR和CHAR之间的数据不能直接交换
3)VARCHAR2:用于存放变长字符类型。
VARCHAR2(length),length取值范围同CHAR,但数据的内部表示取决于当前数据库的字符集。数据库中VARCHAR2类型的列的最大存储为4000个字节,因此大于4000的可以存储到LONG类型的列中。
4)NVARCHAR2:用于存放可变长度的NLS字符数据。其他同VARCHAR2,但VARCHAR2和VARCHAR2之间的数据不嫩直接交换
5)LONG:用于存储可变长字符数据,最大长度为32760,但数据库中LONG类型的列中可以存放2G的数据。
RAW用于存储二进制数据,对应的派生类型有:
1)RAW:存放固定长度的二进制数据。
RAW(length),1<=length<=32767,数据库中RAW列最大长度为2000,因此不能直接把大于2000字节的值插入数据库列中,可以插入LONG RAW列
2)LONG RAW:最大长度为32760,数据库中的LONG RAW列最大长度为2G,因此不能直接从数据库中读取数据存放于PL/SQL的LONG RAW类型变量中
ROWID用于存储行标识,每个数据表都有一个ROWID伪列,是固定长度的十六进制的字符串,表示一条记录的存储地址。
DATE用于存储长度固定的日期和时间值,日期范围为公元前4712.1.1到公园后4712.12.31。日期的缺省值为当月的第一天,时间的缺省值为午夜12:00
可以使用TO_DATE和TO_CHAR在CHARACTER和DATE之间转换
BOOLEAN用于存储逻辑值,TURE,FALSE和NULL。
NULL表示一个错误的,不合适或者不确定的值。BOOLEAN类型在数据库中不存在,只能用在PL/SQL中做逻辑运算。
TRUSTED,MLSLABEL类型的变量被用在Trusted Oracle中存储变
长的二进制标签
标量类型之间的转换:
1)强制转换:通过使用函数完成不同类型之间的转换
TO_CHAR:将NUMERIC和DATE类型转换成VARCHAR2类型
TO_DATE:将CHARACTER类型转换成DATE类型
TO_NUMBER:将CHARACTER类型转换成NUMBER类型
RAWTOHEX:将RAW类型转换成十六进制数值
HEXTORAW:将CHARACTER类型描述的十六进制转换成二进制数
CHARTOROWID:将CHARACTER类型描述的ROWID转换成二进制数
ROWIDTOCHAR:将二进制的ROWID转换成18个字符的行标识符
2)自动转换:某些数据类型中间可以进行自动转换
b.复合类型:
复合类型是用户自定义的类型,在使用之前必须定义好。
1)记录:
-------------------------------------
TYPE record_type IS RECORD(
field1 type1[NOT NULL] [:=value1]
field2 type2[NOT NULL] [:=value2]
...
fieldn typen[NOT NULL] [:=valuen]
)
-------------------------------------
定义了记录后,可以当作基本类型使用,而且这里可以通过简单的%ROWTYPE定义一个与表字段一样的变量,如v_Record table%ROWTYPE。
2)集合:(类似于数组)
index_by表:不能直接存储在数据库中
-------------------------------------
TYPE table_name IS TABLE OF type [NOT NULL] INDEX BY BINARY_INTERGER
-------------------------------------
嵌套表:可以作为列存储在数据库中,但实际上数据库是通过另一张表存储嵌套表这列,其不能保证取得的元素的顺序;属于离线存储,适合大型数据集合。
-------------------------------------
TYPE table_name IS TABLE OF type [NOT NULL]
-------------------------------------
VARRAY:可以作为列存储在数据库中,于表中的其他数据存放在同一张表中,并顺序保存;属于在线存储,适合小型数据集合。
-------------------------------------
TYPE table_name IS [VARRAY|VARYING ARRAY](max_size) OF type [NOT NULL]
-------------------------------------
index_by表、嵌套表和VARRAY都有以下表属性(通过table.attribute获取属性值):
COUNT:PL/SQL表中元素个数
DELETE:删除PL/SQL表中的元素
DELETE删除全部
DELETE(i)删除第i个元素
DELE
TE(i,j)删除第i到j个元素
EXISTS(i):索引号为i的元素是否存在
FIRST:返回PL/SQL表中第一个元素的索引
数据加载失败1001
LAST:返回PL/SQL表中最后一个元素的索引
NEXT(i):返回PL/SQL表中索引为i的后一个元素的索引
PRIOR(i):返回PL/SQL表中索引为i的前一个元素的索引
c.引用类型:
引用类型类似于C中的指针,用于存储指向存储空间的指针,包括游标和对象引用类型
d.LOB类型:
用于存储大对象。可以存储不超过4G的二进制数据或者字符数据,通过DBMS_LOB包来操作LOB类型
e.用户自定义类型
系统有预定义的子类,用户可以在PL/SQL块的定义部分定义自己的子类型
SUBTYPE subtype_name IS base_type
base_type是可以是基本数据类型、%TYPE和%ROWTYPE
base_type不能直接指定变量的长度,精和标度,及不能定义为SUBTYPE my_type IS NUMBER(4),但是可以通过一下方式达到效果
-------------------------------------
DECLARE
v_temp NUMBER(4);
SUBTYPE my_type IS v_temp%TYPE;
my_type my_Num;
-------------------------------------
【数据】
a.字符型数据
字符型数据是指包含在单引号('')中的字符串。
b.数值型数据
可以赋值个NUMBER类型的数据,分为整数和实数。
整数:没有小数点的完整数值
实数:带有小数点的数值
c.布尔型数据
用于条件判断的值,有TRUE,FALSE和NULL三个值。
【变量申明】
声明变量时,为变量分配存储空间,指定数据类型和存储空间的名称。
a.声明变量的语法
variable_name [CONSTANT] type [NOT NULL] [:=value]
b.变量的作用域和可视域
作用域:指变量在程序中的有效范围。PL/SQL变量,其作用域是在变量被声明开始,到其所在块结束。
可视域:是指在变量前不加以限定就能够直接访问该变量的那一段程序,变量的可视域总是在作用域之内。
-------------------------------------
<<l_father>>
DECLARE
v_num NUMBER(3,4);
BEGIN
v_num := 1;
DECLARE
高效的transformer
v_num CHAR(10);
BEGIN
v_num := 'charValue';
l_father.v_num = 45;
excel随机小数点一位END;
END;
-------------------------------------
【赋值语句】
variable := expression;
【表达式】
**:求幂
+、-:正负号
*、/、+、-:算数运算符
||:连接多个字符串
=、!=、<、>、<=、>=、IS NULL、LIKE、BETWEEN AND、IN:比较
AND:逻辑与
OR:逻辑或
c语言条件编译
NOT:逻辑非
【注释】
单行注释:--
多行注释:/**/
二、控制语句
【选择控制语句】
THEN
-------------------------------------
IF 条件 THEN
语句;
END IF;
-------------------------------------
ELSE
-------------------------------------
IF 条件 THEN
语句;
ELSE
语句;
END IF;
-
------------------------------------
ELSIF
-------------------------------------
IF 条件 THEN
语句;
ELSIF 条件 THEN
语句;
[ELSE
语句;]
END IF;
-------------------------------------
【循环控制语句】
a.LOOP
-------------------------------------
LOOP
语句;
END LOOP;
-------------------------------------
可以用EXIT和EXIT WHEN退出循环,也可以使用标号<<>>使程序跳转到指定位置。
LOOP
-------------------------------------
WHILE 条件 LOOP
语句;
END LOOP;
-------------------------------------
LOOP
-------------------------------------
FOR 循环变量 IN [REVERSE] 初始值..结束值 LOOP
语句;
END LOOP;
-------------------------------------
每执行一次,循环变量自动加1,如果使用REVERSE则循环变量自动减1,包括初始值和结束值
【顺序控制语句】
a.GOTO
无条件的跳转到某个标号<<lable>>
b.NULL
用于明显的指定一个什么也不执行的语句,相当于占位符。
三、游标
环境区域是用来处理SQL语句的一个Oracle存储区域。游标是指向它的指针或句柄,PL/SQL可以通过这个游标控制这个环境区域中被处理的语句。
【显式游标】
在块定义部分、包或者子程序中申明,使用IS命令定义的游标,可以对查询语句返回的多条记录进行处理。
游标声明后可以通过打开游标,推进游标,关闭游标操作游标。
a.申明显式游标
-------------------------------------
CURSOR cursor_nam
e[(parameter,parameter,...)]
[RETURN return_type] IS select_statement;
-------------------------------------
其中parameter是parameter_name [IN] datatype[{:=|DEFAULT} expr]。
b.打开游标
打开游标做的处理是先查绑定在游标中的变量,然后安装该变量的值确定查询结果集。
-------------------------------------
OPEN cursor_name[(parameter,parameter,...)];
-------------------------------------
c.推进游标
-------------------------------------
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
-------------------------------------
其中list_of_variables是已什么的变量列表,PL/SQL_record是已经定义好的PL/SQL记录。
d.关闭游标
-------------------------------------
CLOSE cursor_name;
-------------------------------------
【游标属性】
游标有四个属性,分别为%FOUND、%NOTFOUNT、%ISOPEN、%ROWCOUNT,这些属性只能用在过程性语句中,不能用在SQL语句中
a.%FOUND
如果FETCH语句成功返回一行,则该属性返回TRUE,反之返回FALSE
b.%NOTFOUND
与%FOUND相反
c.%ISOPEN
返回游标是否打开
d.%ROWCOUNT
返回游标推进的行数
【显式游标的推进循环】
可以使用循环(END LOOP和LOOP)和游标属性结合实现游标数据的提取,但必须对游标进行OPEN、FETCH、CLOSE来显式控制游标。
这里可以使用LOOP语句实现游标的自动打开,推进,关闭操作。
-------------------------------------
DECLARE
--定义游标和变量
BEGIN
--循环开始前自动打开游标
FOR 变量 IN 游标 LOOP
--隐含的执行一次FETCH语句,读取到变量中
语句;
--隐含的检测%NOTFOUND被检测
END LOOP
--循环结束后自动关闭游标
END;
-------------------------------------
【隐式游标处理】
隐式游标也叫SQL游标,它不能通过专门的命令打开或关闭游标。SQL游标用于处理INSERT、UPDATE、DELETE以及返回一行的INTO语句。
隐式游标的属性也有四种,通过SQL%attribute引用,但跟显式游标的属性有些不同:
%FOUND:当执行DML语句并成功返回一行后,结果为TRUE。如果INTO返回了多行时,会产生TOO_MANY_ROWS异常,并把控制权交到异常处理部分,SQL%FOUND并不返回TRUE,如果返回0行,会产生NO_DATA_FOUND异常,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。