Oracle特殊数据类型
1.1PL/SQL变量、常量和数据类型
1.1.1定义变量
1.定义变量 运行过程中可以改变数据存储结构。 <变量名><数据类型>[<长度>:=<初始值>]; var_countryname varchar2(50):="中国"; 2.定义常量 常量指定值在运行过程中不可改变的数据存储结构。比如一些防止被修改的数值,列如圆周率,光速等。最好定义常量 <常量名> constant <数据类型>:=<常量值>; --定义常量存储一年的天数 on_day constant integer:=354;
1.1.2基本数据类型
PL/SQL基本数据类型 1.数值类型 数值类型包括NUMBER、PLS_INTEGER和BINARY_INTEGER三种基本类型。其中,NUMBER类型存储整数或浮点数;PLS_INTEGER和BINARY_INTEGER只适合存储整数。NUMBER可以通过NUMBER(P,S)格式化数字。P表示精度,S表示范围。 基于其他编程语言数据类型兼容。提出了子类型概念。NUMBER类型子类型DEC DECIMAL DOUBLE INTEGER INT NUMERIC SMALLINT BINARY_INTEGER PLS_INTEGER 2.字符类型 字符类型主要包括VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR2等。 1):VARCHAR2(MAXLENGTH) 参数maxlength可以存储字符串最大长度。最大为32767字节 ※:数据库类型VARCHAR2最大长度4000字节。所以最大长度4000字节PL/SQL类型的VARCHAR2变量是不可以赋值给数据库VARCHAR2变量的,只能赋值给LONG类型数据库变量。 2):CHAR 最大字节32767字节。CHAR类型的默认长度为1. ※:数据库中CHAR只有2000字节,所以PL\SQL变量长度大于2000个字节,则不能赋值给数据库的CHAR。 3):LONG LONG表示一个可变的字符串,数据库类型最大长度达到2GB。几乎所有字符变量都可以。 4):NCHAR和NVARCHAR2类型 NCHAR和NVARCHAR2类型是PL\SQL8.0之后加入的类型,她的长度要根据字符集来确定。 3.日期类型 只有一种DATE类型,存储日期和时间信息,DATE类型的存储空间7字节。分别1字节存储世纪、年、月、天、小时、分钟、秒。 4.布尔类型 只有一种BOOLEAN类型,主要做程序判断,变量值可以为TRUE FALSE或NULL。
1.1.3特殊类型
1%type类型 使用%TYPE类型声明一个指定列名相同的数据类型,他通常紧跟着指定列名的后面。 声明一个EMP表JOB列相同数据类型变量 DECLARE VAR_JOB_EMP EMP.JOB%TYPE; 列: DECLARE VAR_ENAME EMP.ENAME%TYPE; VAR_JOB EMP.JOB%TYPE; BEGIN SELECT ENAME,JOB INTO VAR_ENAME,VAR_JOB FROM EMP WHERE EMPNO=7369; DBMS_OUTPUT.PUT_LINE( VAR_ENAME||"的"||VAR_JOB); END; /
2.RECORD类型 记录之意。RECORD类型存储多个行列组成的数据。 列: DECLARE TYPE EMP_TYPE IS RECORD( VAR_ENAME VARCHAR2(20), VAR_JOB VARCHAR2(20), VAR_SQL NUMBER ); EMOINFO EMP_TYPE; BEGIN SELECT ENAME,JOB,SAL INFO EMPINFO FROM EMP WHERE EMPNO=7369; DBMS_OUTPUT.PUT_LINE(EMPINFO.VAR_ENAME); END; /
3.%ROWTYPE类型 %ROWTYPE类型变量结合了"%TYPE类型"和"RECORD类型"变量的优点。根据数据表中行的结构定义一种特殊的数据类型,用来存储数据表中检索到的一行数据。 列: DECLARE ROWVAR_EMP EMP%ROWTYPE; BEGIN SELECT * INTO ROWVAR_EMP FROM EMP WHERE EMPNO=7369; DBMS_OUTPUT_PUT_LINE(ROWVAR_EMP.ENAME); END; /
1.2PL/SQL基本程序结构语句
if...then:判断正确则执行then if...then...else:判断if正确则执行then,否则执行else if...then...elseif:嵌套式判断 case:有逻辑从数值中选出 loop...exit...end:循环控制,利用判断语句执行exit loop...exit when...end:同上,当when为真执行exit while...loop..end:当while为真循环 for..in...loop...end:已知循环次数的循环 GOTO:无条件转向控制
1.2.1PL/SQL程序块
DECLARE --声明部分 BEGIN --执行部分 [EXCEPTION] --异常处理部分 END; 异常处理部分: DECLARE A INT:=100; B INT:=200; C NUMBER; BEGIN C:=(A+B)/(A-B); DBMS_OUTPUT.PUT_LINE(C); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE("除数不可以为零"); END; /