1.基础数据类型
以ORACLE8i为例,可以使用的基础数据类型有:
类型 | 子类 | 说 明 | 范 围 | ORACLE限制 |
CHAR | Character String Rowid Nchar | 定长字符串
民族语言字符集 | 0à32767 可选,确省=1 | 2000 |
VARCHAR2 | Varchar, String NVARCHAR2 | 可变字符串 民族语言字符集 | 0à32767 4000 | 4000 |
BINARY_INTEGER |
| 带符号整数,为整数计算优化性能 |
|
|
NUMBER(p,s) | Dec
Double precision Integer Int Numeric Real Small int | 小数, NUMBER 的子类型 高精度实数 整数, NUMBER 的子类型 整数, NUMBER 的子类型 与NUMBER等价 与NUMBER等价 整数, 比 integer 小 |
|
|
LONG |
| 变长字符串 | 0->2147483647 | 32,767字节 |
DATE |
| 日期型 | 公元前4712年1月1日至公元后4712年12月31日 |
|
BOOLEAN |
| 布尔型 | TRUE, FALSE,NULL | 不使用 |
ROWID |
| 存放数据库行号 |
|
|
UROWID |
| 通用行标识符,字符类型 |
|
|
2.%TYPE变量
在声明变量时,除了可以使用Oracle规定的数据类型外,还可以使用%TYPE关键字定义一个变量。其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致。
使用%TYPE特性的优点在于:
l 所引用的数据库列的数据类型可以不必知道;
l 所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
%TYPE变量定义的格式如下:
DECLARE
var_name TableName.ColumnName%TYPE;
例子:
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_date emp.hiredate%TYPE;
BEGIN
SELECT ename, sal, hiredate
INTO v_name,v_sal,v_date
FROM emp
WHERE empno='7369';
DBMS_OUTPUT.PUT_LINE(v_name||'---'||v_sal||'--'||v_date);
END;
3.复合变量
3.1自定义记录类型记录类型类似于C语言中的结构数据类型,它把逻辑相关的、分离的、基本数据类型的变量组成一个整体存储起来,它必须包括至少一个标量型或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。在使用记录数据类型变量时,需要先在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
定义记录类型语法格式如下:
TYPE record_name IS RECORD(
v1 data_type1 [NOT NULL] [:= default_value ],
v2 data_type2 [NOT NULL] [:= default_value ],
......
vn data_typen [NOT NULL] [:= default_value ] );
例子1:
DECLARE
TYPE test_rec IS RECORD(
Name VARCHAR2(30) NOT NULL := '胡勇',
Info VARCHAR2(100));
rec_book test_rec;
BEGIN
rec_book.Name :='胡勇';
rec_book.Info :='谈PL/SQL编程;';
DBMS_OUTPUT.PUT_LINE(rec_book.Name||' ' ||rec_book.Info);
END;
例子2:
DECLARE
--定义与hr.employees表中的这几个列相同的记录数据类型
TYPE RECORD_TYPE_EMPLOYEES IS RECORD(
f_name hr.employees.first_name%TYPE,
h_date hr.employees.hire_date%TYPE,
j_id hr.employees.job_id%TYPE);
--声明一个该记录数据类型的记录变量
v_emp_record RECORD_TYPE_EMPLOYEES;
BEGIN
SELECT first_name, hire_date, job_id INTO v_emp_record
FROM employees
WHERE employee_id = &emp_id;
DBMS_OUTPUT.PUT_LINE('雇员名称:'||v_emp_record.f_name
||' 雇佣日期:'||v_emp_record.h_date
||' 岗位:'||v_emp_record.j_id);
END;
注:
1.可以用 SELECT语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相配即可。
2.一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。
3.2 %ROWTYPE类型
PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
使用%ROWTYPE特性的优点在于:
l 所引用的数据库中列的个数和数据类型可以不必知道;
l 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
例子:DECLARE
v_empno emp.empno%TYPE :=&no;
rec emp%ROWTYPE;--rec就是对应于emp表的%ROWTYPE类型
BEGIN
SELECT * INTO rec FROM emp WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工资:'||rec.sal||'工作时间:'||rec.hiredate);
END;
3.3 LOB类型
ORACLE提供了LOB (Large OBject)类型,用于存储大的数据对象的类型。ORACLE目前主要支持BFILE, BLOB, CLOB 及 NCLOB 类型。
BFILE (Movie)
存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。
BLOB(Photo)
存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。
CLOB(Book)
存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。
NCLOB
存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。