******************************************
數據庫之【標量類型及其使用篇】
******************************************
【1.標量類型】
--數字
binary_integer --帶符號的整數-2的31次冪-1到2的31次冪到-1
natural --自然數
naturaln --非自然數且非空
positive --正整數
positiven --非正整數且非空
signtype --只能存1、0、-1三個值
number --存整數、定點數、浮點數
float --126位的二進制的浮點數
decimal --38位十進制的定點數
integer --38位十進制數字的整數
real --63位二進制數字的浮點數
pls_integer --帶符號的整數、區別是以機器運算爲基礎,速度快、存儲空間小
--字符
char --固定長度的字符32767
raw --存二進制數據或字節串
long long raw --可變長度字符串32760
varchar2(varchar string)--可變長度的字符串32767
數據類型 SQL類型 PL/SQL類型
CHAR 1..2000 1..32767
LONG 1..2GB 1..32760
LONG RAW1..2GB 1..32760
RAW 1..2000 1..32767
VARCHAR2 1..4000 1..32767
--日期
date --日期時間
timestamp--日期時間精確到小數秒到小數後0-9(默認6)位
--布爾
boolean
--LOB類型 存儲非結構化數據
blob/clob/nclob/bfile
--屬性類型
%type --變量或表字段對象的引用
%rowtype--錶行的引用
【ORACLE中定義變量的幾種方式】
--聲明可從外面接收的參數
num number :=&id;
--聲明可從外面接收的公用變量,並有提示
accept num prompt '請輸入一個數字:';
--使用時:&num就可以在PLSQL塊中訪問
--聲明可以公用的變量
variable num number;
--在PLSQL語句外進行賦值
execute :num :=100;
--在PLSQL語句中進行使用
:num :=100;
【2.舉例使用】
--2.1 BFILE使用示例
select * from dba_directories; --查詢系統中創建的所有目錄,在SYS用戶下
--創建目錄
create directory book_text as 'c:\text';
grant read on directory images to scott;
create table my_book (file_descr varchar2(40),book_file bfile);
--插入
insert into my_book values('第一章',bfilename('BOOK_TEXT','test.txt'));
--讀寫
declare--寫
fhandle utl_file.file_type;
begin
fhandle := utl_file.fopen('BFILE_DIR', 'lunartest1.txt', 'w');
utl_file.put_line(fhandle, 'aaa');
utl_file.put_line(fhandle, 'bbb');
utl_file.fclose(fhandle);
end;
/
declare--讀
fhandle utl_file.file_type;
fp_buffer varchar2(4000);
begin
fhandle := utl_file.fopen('BFILE_DIR', 'lunartest1.txt', 'R');
utl_file.get_line(fhandle, fp_buffer);
dbms_output.put_line(fp_buffer);
utl_file.get_line(fhandle, fp_buffer);
dbms_output.put_line(fp_buffer);
utl_file.fclose(fhandle);
end;
/
--2.2 BLOB使用示例
create directory images as 'c:\images'; --創建目錄
grant read on directory images to scott;--授權給用戶
create table my_img(img_no number,img_name varchar2(200),img blob); --建BLOB類型字段表
--將文件中的圖片存到數據庫中
declare
l_bfile bfile;
l_blob blob;
begin
insert into my_img (img) values (empty_blob()) return img into l_blob;
l_bfile := bfilename('IMAGES', '\one.jpg');
dbms_lob.open(l_bfile, dbms_lob.file_readonly);
dbms_lob.loadfromfile(l_blob, l_bfile, dbms_lob.getlength(l_bfile));
dbms_lob.close(l_bfile);
commit;
end;
--2.3 CLOB示例
create table test1(tno number,tname varchar2(200),text clob);
insert into test1 values(1,'李海','追求幸福美好的生活將使他的青春變作一曲閃光的樂章!');
declare
c_text clob;
sta number;
len number;
t_text varchar2(2000);
begin
select text into c_text from test1 where tno = 1;
sta := 1;
len := 5;
--len :=length(c_text);--用函數獲取文本長度
dbms_lob.read(c_text, len, sta, t_text);
dbms_output.put_line(t_text);
end;
--2.4 TABLE類型示例(組合類型的使用)
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE;
emp_tab EmpTabTyp := EmpTabTyp(NULL); -- initialize(定義同時初始化必須的)
BEGIN
SELECT * INTO emp_tab(1) FROM emp WHERE empno = 7788;
dbms_output.put_line(emp_tab(1).ename || ' sal is: ' || emp_tab(1).sal);
END;
--2.5 RECORD,VARRAY記錄數組類型示例(組合類型的使用)
DECLARE
TYPE definition IS RECORD(
xm VARCHAR2(20),
gz VARCHAR2(200));
TYPE DICTIONARY IS VARRAY(2000) OF definition;
lexicon DICTIONARY := DICTIONARY(); --定義同時初始化(必須的)
BEGIN
lexicon.EXTEND;
select ename, job
into lexicon(1).zm,lexicon(1).gz
from emp
where empno = 7369;
DBMS_OUTPUT.put_line(lexicon(1).xm || lexicon(1).gz);
END;