oracle資料庫的資料類型主要是以下三種:標量 (sclare)、複合(composite)、引用(reference)。
一、標量(char ,number,varchar2,long,clob,blob,nclob,bfile,date)
char(num)定長,最長為2000個字元,運用char的查詢效率特高,但是用char的話,不會自動識別字元長度,定義了多少個字元,它就會佔用幾個字元,即使儲存的字元只有2個,而定義的char為4個字元的話,它會用空格把後兩個輸入鍵台。
number類型是一個資料類型,只定義number的話,就表示整形,而如果定義number(7,2)的話,就表示7個有效數字,小數位為兩位,例如12345.67這個數字就符合number(7,2)的定義。number的範圍是-(10的38次方)到10的38次方。
varchar2(num)算是varchar的升級版,Oracle對varchar2進行最佳化過,varchar的區別是varchar2把空串等同於null處理,最大長度是4000個字元,varchar2可以節省字元,跟char有個鮮明的區別就是,varchar2會識別儲存的字元長度,不會佔用多餘的空間。但是查詢效率沒有char高。至於一個varchar2字元要用幾個位元組儲存,要看資料庫使用的字元集,比如GBK,漢字就會佔兩個位元組,英文1個,如果是UTF-8,漢字一般佔3個位元組,英文還是1個。
long,在資料庫儲存中 可以用來儲存高達2G的資料,作為變數,可以表示一個最大長度為32760位元組的可變字串。
clob字元型的最大對象,儲存單位元組字元資料,可以存放4G的容量。(別用來存中文)。
blob位元據,可以存放圖片,視頻等資源,最大為4G。
nclob資料類型用於儲存資料庫中的固定寬度單位元組或多位元組字元的大型資料區塊,不支援寬度不等的字元集。可儲存的最大大小為4G位元組。
bfile當大型二進位對象的大小大與4G位元組時,bfile資料類型用於將其儲存在資料庫外的作業系統檔案中;當其大小不足4G位元組時,則將其儲存在資料庫內部的作業系統檔案中,bfile列隱藏檔定位程式,此定位程式指向伺服器上的大型二進位檔案。
date時間資料類型,包含年月日時分秒。
二、複合(record,table)
標量類型是經過預定義的,利用這些類型可以衍生出一些複合類型。主要有記錄、 表。
記錄,可以看作是一組標量的組合結構,它的聲明方式如下:
declare
type record_type_name is record(
參數1 參數類型
參數2 參數類型
......);
其中,record_type_name是記錄類型的名字。
例子:
declare
--聲明一個record類型的記錄myrecord
type myrecord is record(
--定義參數
id varchar2(10);
name varchar2(10));
--聲明一個myrecord類型的變數real_record
real_record myrecord;
begin
--將所取資料存放在real_record中
select eid,ename into real_record from emp where eid='001';
--通過real_record.變數的方式輸出
dbms_output.put_line(real_record.id||','||real_record.name);
end;
表,不是實體儲存體資料的表,在這裡是一種變數類型,也稱為PL/SQL表,它 類似於C語言中的數組,在處理方式上也相似。它的聲明方式如下:
declare
type table_type_name is table of scalar_type index by binary_integer;
其中,table_type_name是類型的名字,scalar_type 是一種標量類型的型別宣告,index by binary_integer指明下標為整數。引用時也必須定義相關的變數。表和數組不同,表有兩列,key和value,key就是定義時聲明的binary_integer,value就是定義時聲明的scalar_type。
例子:
declare
--聲明一個table類型的表sp_table_type
type sp_table_type is table of student.id%type index by binary_integer;
--聲明一個sp_table_type類型的變數sp_table
sp_table sp_table_type;
begin
--將查詢到的資料儲存在sp_table(0)中
select id into sp_table(0) from student where id=4;
dbms_output.put_line(sp_table(0));
end;
三、引用
在PL/SQL8.0之前,只有一種類型--REF CURSOR,也就是遊標。它的定義較為簡單,
declare
type cursor_type_name is ref cursor;
在PL/SQL8.0之後,引入了REF類型,它指向一個對象。
例子:
declare
--聲明一個cursor類型的遊標sp_emp_cursor
type sp_emp_cursor is ref cursor;
--聲明一個sp_emp_cursor類型的變數test_cursor
test_cursor sp_emp_cursor;
--聲明兩個%type類型的變數
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--開啟遊標
open test_cursor for select ename,sal from emp where depart=&no;
loop
--提取遊標
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line(v_ename||' '||v_sal);
end loop;
--關閉遊標
close test_cursor;
end;