如何將WORD文檔放入ORACLE
我要實(shí)現(xiàn)一個(gè)簡(jiǎn)歷管理系統(tǒng),把簡(jiǎn)歷(word文檔)上傳到數(shù)據(jù)庫(kù)里,然后還要下載下來(lái),請(qǐng)問(wèn)一下如何:rn1)定義數(shù)據(jù)庫(kù)字段屬性rn2)如何鏈接數(shù)據(jù)庫(kù)與系統(tǒng)?rn回答完備有加分哦。。。先謝謝啦。將WORD文檔放入ORACLE有兩種方式,一是文件采用文件系統(tǒng)存儲(chǔ),數(shù)據(jù)庫(kù)只存放文件的相對(duì)路徑,二是存入BLOB類型字段中。
這里比較推薦第一種方式,便于數(shù)據(jù)及文件管理,方便導(dǎo)入導(dǎo)出,缺點(diǎn)是容易造成數(shù)據(jù)與文件內(nèi)容不一致,文件管理與ORACLE關(guān)系不大。
重點(diǎn)說(shuō)一下第二種方式即BLOB\CLOB方式,對(duì)于內(nèi)容不大的可直接存取BLOB,太大的文件借助目錄文件。
reate or replace procedure TEST_BLOB_INS (FBuffer IN VARChAR2) IS
DEST_LOB BLOB;
WRITE_AMOUNT INTEGER ;
BEGIN
--FILE_CONTENT為指定大字段
UPDATE XXTABLE SET FILE_CONTENT=EMPTY_BLOB() WHERE ID= 999 ;
SELECT FILE_CONTENT INTO DEST_LOB FROM XXTABLE WHERE ID = 999 FOR UPDATE;
DBMS_LOB.OPEN(DEST_LOB,DBMS_LOB.LOB_READWRITE);
WRITE_AMOUNT := LENGTHB(WR_BUFFER) ;
DBMS_LOB.WRITE(DEST_LOB, WRITE_AMOUNT, 1, UTL_RAW.cast_to_raw(WR_BUFFER));
DBMS_LOB.CLOSE(DEST_LOB);
COMMIT;
END TEST_BLOB;
借助目錄方式在存取:
具體過(guò)程:
A,首先請(qǐng)DBA在控制臺(tái)創(chuàng)建目錄記錄
CREATE OR REPLACE DIRECTORY MY_DIR as '/home/jsp';
-- 可使用 select * from dba_directories 進(jìn)行查詢是否創(chuàng)建成功;
B,再將新建的MY_DIR目錄別名授權(quán)給指定用戶使用
GRANT READ,WRITE on DIRECTORY MY_DIR TO user_cms ;
C,將擬存入數(shù)據(jù)庫(kù)的文件上傳至服務(wù)器的/home/jsp目錄下
D,再使用以下過(guò)程進(jìn)行文件讀出并寫(xiě)入數(shù)據(jù)庫(kù), FName 為文件名, RecID為指定表記錄的ID
create or replace procedure TEST_BLOB_FILEINS(RECID IN INTEGER,FName IN VARCHAR2) IS
DEST_LOB BLOB;
V_FILE BFILE ;
V_Fsize INTEGER ;
BEGIN
V_FILE := BFILENAME('MY_DIR', FName);
UPDATE xxTAble SET FILE_CONTENT=EMPTY_BLOB() WHERE ID= RECID RETURN FILE_CONTENT INTO DEST_LOB;
v_FSize := DBMS_LOB.GETLENGTH(v_file);
DBMS_OUTPUT.PUT_LINE('File size: ' || v_Fsize);
DBMS_LOB.FILEOPEN(V_FILE);
DBMS_LOB.LOADFROMFILE(DEST_LOB, V_FILE, DBMS_LOB.LOBMAXSIZE);
DBMS_LOB.FILECLOSEALL;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('在更新BLOB內(nèi)容時(shí)不成功,ID=' || RECID ) ;
END TEST_BLOB;
數(shù)據(jù)提取過(guò)程
create or replace procedure download_blob(srcname varchar2, dstname varchar2) as
mount binary_integer := 32767;
fbuffer raw(32767);
utlfile utl_file.file_type;
dumpfile blob;
pos integer := 1;
len binary_integer;
begin
select blob_file into dumpfile from blob_tb where data_name = srcname;
len := dbms_lob.getlength(dumpfile);
utlfile := utl_file.fopen('MY_DIR', dstname, 'wb', 32767);
while pos < len loop
dbms_lob.read(dumpfile, mount, pos, fbuffer);
utl_file.put_raw(utlfile, fbuffer, true);
pos := pos + mount;
end loop;
utl_file.fclose(utlfile);
end;
字段類型用blob,先把blob設(shè)成空然后再操作,我用的是upload_5xsoft.inc(asp人都知道),顯示的時(shí)候就用數(shù)據(jù)流寫(xiě)出即可。代碼如下
寫(xiě)入:
sql = "update d_doc_modi_rec set doc_content=empty_blob() where doc_no='"&doc_no&"' and version='"&maxver&"'"
Oradatabase.dbEXECUTESQL(sql)
Selsql ="select * from d_doc_modi_rec where doc_no='"&doc_no&"' and version='"&maxver&"'"
file.SavetoDB Selsql,feild
Public function SavetoDB(Selstr,area)
dim rsDB,ErrorChar,dr
if selstr="" or area="" then exit function
set rsDB=Oradatabase.dbcreatedynaset(Selstr,0)
set dr=CreateObject("Adodb.Stream")
dr.Mode=3
dr.Type=1
dr.Open
dr.position=0
'dr.Type = 2
'dr.Charset = "gb2312"
path = filepath&filename
dr.LoadFromFile path
chunk=dr.read
chunksize=lenb(chunk)
'response.end
set infoblob=rsDB.fields(area).value
rsDB.Edit
infoblob.offset=1
amount_written=infoblob.write (chunk,chunksize)
rsDB.update
dr.close
set amount_written = nothing
rsDB.close
end function
沒(méi)有人會(huì)來(lái)給你設(shè)計(jì)數(shù)據(jù)庫(kù)的,你可以用blob,上傳文件,然后下載
數(shù)據(jù)庫(kù)中只是存放路徑,拜托!
你需要有文件服務(wù)器來(lái)存放文檔,然后在數(shù)據(jù)庫(kù)中記錄文檔在文件服務(wù)器中的下載路徑。正常都是這么實(shí)現(xiàn)的。
WORD文檔能直接存入ORACLE數(shù)據(jù)庫(kù)嗎
當(dāng)然可以啊,Oracle字段類型BLOB就是用來(lái)存儲(chǔ)大的二進(jìn)制文件,不過(guò)這個(gè)字段你不能通過(guò)insert語(yǔ)句就能完成數(shù)據(jù)的插入,讀寫(xiě)也比較麻煩,你要確定使用這種方法的可用性,很少有這么做的,文件的存儲(chǔ)可以使用文件管理器來(lái)做么,比如SVN之類的,
可以用blob或者clob存
oracle數(shù)據(jù)庫(kù)怎么存儲(chǔ)長(zhǎng)文本的字段
BLOB :大數(shù)據(jù)類型,最大存儲(chǔ)65K,不可以被導(dǎo)出,只能在oracle數(shù)據(jù)庫(kù)中進(jìn)行查看。 擴(kuò)展: BLOB (binary large object),二進(jìn)制大對(duì)象,是一個(gè)可以存儲(chǔ)二進(jìn)制文件的容器。在計(jì)算機(jī)中,BLOB常常是數(shù)據(jù)庫(kù)中用來(lái)存儲(chǔ)二進(jìn)制文件的字段類型。
在Oracle里存入大數(shù)據(jù)的時(shí)候,用什么字段類型?
超過(guò)nvarchar(4000)的話,rn在建表的時(shí)候,數(shù)據(jù)類型寫(xiě)什么?長(zhǎng)度怎么限定?rn謝謝。可用的話加分20clob 類型就可以。
**************
補(bǔ)充:
**************
1,按存儲(chǔ)數(shù)據(jù)的類型分:
①字符類型:
CLOB:存儲(chǔ)大量 單字節(jié) 字符數(shù)據(jù)。
NLOB:存儲(chǔ)定寬 多字節(jié) 字符數(shù)據(jù)。
②二進(jìn)制類型:
BLOB:存儲(chǔ)較大無(wú)結(jié)構(gòu)的二進(jìn)制數(shù)據(jù)。
如上,自己斟酌。。
long
raw
clob
相關(guān)推薦:
電子合同糾紛解決(簽電子合同糾紛怎么解決)
現(xiàn)戶籍所在地怎么填寫(xiě)(戶籍所在地怎么填寫(xiě))
超生新生兒如何上戶(超生如何給孩子上戶口)
行政處罰會(huì)留案底嗎(行政處罰決定書(shū)會(huì)留案底嗎)
公民如何保護(hù)生命健康權(quán)(法律如何保護(hù)我們的健康)