Oracle 原理: 数据类型
一、PL/SQL 的數(shù)據(jù)類(lèi)型和用法
PL/SQL可以使用變量和常量。變量賦值用兩種方式:一種是 :=? ? 還有一種是 select ..?into [變量],變量聲明語(yǔ)法:
變量名 [constraint]? 數(shù)據(jù)類(lèi)型 [NOT NULL] [ :=? | DEFAULT 表達(dá)式]
創(chuàng)建表,初始化表
drop table salary_tbl;create table salary_tbl(employer_nm varchar(20),department varchar(20) not null,salary number not null,leader_nm varchar(20) ); truncate table salary_tbl; declaretotalnum number := 130000; beginfor i in 1..totalnumloopinsert into salary_tbl values('雇傭者'||i,'部門(mén)'||Mod(i,50),100+sqrt(i),'雇傭者'||Mod(i,20)); if Mod(i,1000)=0 then commit;end if;end loop; end; / commit;當(dāng)過(guò)程寫(xiě)錯(cuò)時(shí),可以show error 來(lái)看編譯錯(cuò)誤信息
PL/SQL支持的內(nèi)置數(shù)據(jù)類(lèi)型有三種:標(biāo)量類(lèi)型、LOB類(lèi)型、屬性類(lèi)型;
標(biāo)量類(lèi)型 包含了:日期時(shí)間、數(shù)字、字符、布爾型。
日期類(lèi)型包括了:DATE類(lèi)型、TIMESTEMP類(lèi)型
數(shù)字類(lèi)型包括了BINARY_INTEGER類(lèi)型(表示一個(gè)有符號(hào)整數(shù),表示的范圍為-2的31次方到2的31次方),此類(lèi)型中的子類(lèi)型有:SIGNTYPE(正負(fù)符號(hào),只能取-1,,0,1)、POSITIVEN(非空正整數(shù)),POSITIVE(正整數(shù))、NATURALLN(非空自然數(shù))、NATURAL(自然數(shù));數(shù)字類(lèi)型包括了NUMBER類(lèi)型,子類(lèi)型包括了 DECIMAL(精確的小數(shù),可存儲(chǔ) 38 個(gè)數(shù)字),FLOAT(單精度浮點(diǎn)型采用四舍五入的方法近似)、INTEGER(可以簡(jiǎn)寫(xiě)為INT,和NUMBER(38)相同)、REAL(實(shí)數(shù),雙精度浮點(diǎn)型采用四舍五入的方法近似);數(shù)字類(lèi)型包括了PLS_INTERGER類(lèi)型,(有符號(hào)的整數(shù),適用于復(fù)雜的運(yùn)算)。SIMPLE_INTEGER 是11g的新的數(shù)據(jù)類(lèi)型(直接作用于硬件的數(shù)據(jù)類(lèi)型,大大提高性能可存值 -2^31 ~2^31-1)
字符類(lèi)型包括了char類(lèi)型、varchar2、long(最多2GB的字符數(shù)據(jù))類(lèi)型、raw(最多4KB二進(jìn)制數(shù)據(jù))、long raw(最多2GB的二進(jìn)制數(shù)據(jù))?類(lèi)型。
布爾類(lèi)型 boolean
LOB類(lèi)型 包含了:BFILE、BLOB、CLOB、NCLOB類(lèi)型,用于存儲(chǔ)大文本、圖像、視頻、聲音可存儲(chǔ)4GB
BLOB:存儲(chǔ)二進(jìn)制對(duì)象;CLOB存儲(chǔ)大型字符數(shù)據(jù);NCLOB,存儲(chǔ)UNICODE字符數(shù)據(jù);BFILE?存儲(chǔ)二進(jìn)制對(duì)象在操作系統(tǒng)文件中,數(shù)據(jù)庫(kù)只存放 BFILE文件的指針。LOB類(lèi)型無(wú)法通過(guò)select 語(yǔ)句完整的讀取數(shù)據(jù)。需要通過(guò)PL/SQL才能實(shí)現(xiàn)
?
屬性類(lèi)型 包含了:%TYPE 表某一列的字段類(lèi)型, %ROWTYPE表某一行的數(shù)據(jù)類(lèi)型。
二、Oracle11g 中隊(duì)LOB類(lèi)型進(jìn)行操作的方法,即
create table file_lobtest(filePath varchar2(50),clob_content clob ,blob_content blob ,bfile_content bfile ); truncate table file_lobtest; declare content_test clob := '我與父親不相見(jiàn)已二年余了,我最不能忘記的是他的背影。那年冬天,祖母死了,父親的差使也交卸了,正是禍不單行的日子,我從北京到徐州,打算跟著父親奔喪回家。到徐州見(jiàn)著父親,看見(jiàn)滿院狼藉的東西,又想起祖母,不禁簌簌地流下眼淚。父親說(shuō),“事已如此,不必難過(guò),好在天無(wú)絕人之路!”回家變賣(mài)典質(zhì),父親還了虧空;又借錢(qián)辦了喪事。這些日子,家中光景很是慘淡,一半為了喪事,一半為了父親賦閑。喪事完畢,父親要到南京謀事,我也要回北京念書(shū),我們便同行。到南京時(shí),有朋友約去游逛,勾留了一日;第二日上午便須渡江到浦口,下午上車(chē)北去。父親因?yàn)槭旅?#xff0c;本已說(shuō)定不送我,叫旅館里一個(gè)熟識(shí)的茶房陪我同去。他再三囑咐茶房,甚是仔細(xì)。但他終于不放心,怕茶房不妥帖;頗躊躇了一會(huì)。其實(shí)我那年已二十歲,北京已來(lái)往過(guò)兩三次,是沒(méi)有甚么要緊的了。他躊躇了一會(huì),終于決定還是自己送我去。我兩三回勸他不必去;他只說(shuō),“不要緊,他們?nèi)ゲ缓?#xff01;”我們過(guò)了江,進(jìn)了車(chē)站。我買(mǎi)票,他忙著照看行李。行李太多了,得向腳夫行些小費(fèi),才可過(guò)去。他便又忙著和他們講價(jià)錢(qián)。我那時(shí)真是聰明過(guò)分,總覺(jué)他說(shuō)話不大漂亮,非自己插嘴不可。但他終于講定了價(jià)錢(qián);就送我上車(chē)。他給我揀定了靠車(chē)門(mén)的一張椅子;我將他給我做的紫毛大衣鋪好坐位。他囑我路上小心,夜里警醒些,不要受涼。又囑托茶房好好照應(yīng)我。我心里暗笑他的迂;他們只認(rèn)得錢(qián),托他們直是白托!而且我這樣大年紀(jì)的人,難道還不能料理自己么?唉,我現(xiàn)在想想,那時(shí)真是太聰明了!我說(shuō)道,“爸爸,你走吧。”他望車(chē)外看了看,說(shuō),“我買(mǎi)幾個(gè)橘子去。你就在此地,不要走動(dòng)。”我看那邊月臺(tái)的柵欄外有幾個(gè)賣(mài)東西的等著顧客。走到那邊月臺(tái),須穿過(guò)鐵道,須跳下去又爬上去。父親是一個(gè)胖子,走過(guò)去自然要費(fèi)事些。我本來(lái)要去的,他不肯,只好讓他去。我看見(jiàn)他戴著黑布小帽,穿著黑布大馬褂,深青布棉袍,蹣跚地走到鐵道邊,慢慢探身下去,尚不大難。可是他穿過(guò)鐵道,要爬上那邊月臺(tái),就不容易了。他用兩手攀著上面,兩腳再向上縮;他肥胖的身子向左微傾,顯出努力的樣子。這時(shí)我看見(jiàn)他的背影,我的淚很快地流下來(lái)了。我趕緊拭干了淚,怕他看見(jiàn),也怕別人看見(jiàn)。我再向外看時(shí),他已抱了朱紅的橘子望回走了。過(guò)鐵道時(shí),他先將橘子散放在地上,自己慢慢爬下,再抱起橘子走。到這邊時(shí),我趕緊去攙他。他和我走到車(chē)上,將橘子一股腦兒放在我的皮大衣上。于是撲撲衣上的泥土,心里很輕松似的,過(guò)一會(huì)說(shuō),“我走了;到那邊來(lái)信!”我望著他走出去。他走了幾步,回過(guò)頭看見(jiàn)我,說(shuō),“進(jìn)去吧,里邊沒(méi)人。”等他的背影混入來(lái)來(lái)往往的人里,再找不著了,我便進(jìn)來(lái)坐下,我的眼淚又來(lái)了。近幾年來(lái),父親和我都是東奔西走,家中光景是一日不如一日。他少年出外謀生,獨(dú)力支持,做了許多大事。那知老境卻如此頹唐!他觸目傷懷,自然情不能自已。情郁于中,自然要發(fā)之于外;家庭瑣屑便往往觸他之怒。他待我漸漸不同往日。但最近兩年的不見(jiàn),他終于忘卻我的不好,只是惦記著我,惦記著我的兒子。我北來(lái)后,他寫(xiě)了一信給我,信中說(shuō)道,“我身體平安,惟膀子疼痛利害,舉箸提筆,諸多不便,大約大去之期不遠(yuǎn)矣。”我讀到此處,在晶瑩的淚光中,又看見(jiàn)那肥胖的,青布棉袍,黑布馬褂的背影。唉!我不知何時(shí)再能與他相見(jiàn)!'; begininsert into file_lobtest values('F:\\sqllobtest',content_test,null,null); end; / commit;select * from file_lobtest 查看結(jié)果如下
可以看見(jiàn),除了在PL/SQL develop點(diǎn)擊"..."查看。select 是不能看到完整內(nèi)容的。查詢完整的CLOB需要用過(guò)程或者函數(shù)來(lái)實(shí)現(xiàn)。
在SQL命令窗口或者SQLPLUS下
select to_char(Clob_content) from file_lobtest; 或者
set serveroutput on; declare clob_var clob;amount INTEGER :=5000;offset INTEGER :=1;output_var varchar2(5000); beginselect clob_content into clob_var from file_lobtest where filepath='F:\c.txt'; dbms_lob.read(clob_var,amount,offset,output_var);dbms_output.put_line(output_var ); --不用緩存時(shí)直接 dbms_output.put_line(clob_var ); end; /就能看見(jiàn)全部值了,如果緩存區(qū)太小就增加些
?
插入BFILE 和BLOB需要用到存儲(chǔ)過(guò)程來(lái)插入,示例如下
create or replace procedure insertBlob(ifilepath in varchar2,ifilename in varchar2 ) authid current_user isimg_file bfile;img_blob blob;lob_length number;sqlcommand varchar2(500); isexit number; begin----動(dòng)態(tài)SQL,需要相應(yīng)權(quán)限 create table read,write on directory等 -----設(shè)置虛擬路徑sqlcommand :='create or replace directory PHOTOPATH as ''' ||ifilepath ||'''' ;execute immediate sqlcommand;--獲取bfile文件img_file := bfilename('PHOTOPATH',ifilename);--打開(kāi)文件dbms_lob.open(img_file);--獲取文件長(zhǎng)度lob_length := dbms_lob.getlength(img_file);--判斷文件是否存在,先把blob設(shè)成empty_blob()select count(1) into isexit from file_lobtest t1 where t1.filepath = ifilepath;if isexit = 0 then insert into file_lobtest values(ifilepath,null,empty_blob(),img_file);else update file_lobtest t1 set bfile_content=img_file,blob_content=empty_blob() where t1.filepath = ifilepath;end if ;--然后賦值blob變量select blob_content into img_blob from file_lobtest t1 where t1.filepath = ifilepath;--加載blobdbms_lob.loadfromfile(img_blob,img_file,lob_length);--關(guān)閉文件dbms_lob.close(img_file);commit; end;編譯完后,在本地文件路徑上放個(gè)照片
調(diào)用存儲(chǔ)過(guò)程
begin insertBlob ('F:\\sqllobtest','aaa.jpg'); end; /查看得到
總結(jié)
以上是生活随笔為你收集整理的Oracle 原理: 数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle 原理: PL/SQL基础
- 下一篇: Oracle 原理: 过程和函数