如何将WORD文档放入ORACLE
我要实现一个简历管理系统,把简历(word文档)上传到数据库里,然后还要下载下来,请问一下如何:1)定义数据库字段属性2)如何链接数据库与系统?回答完备有加分哦。。。先谢...
我要实现一个简历管理系统,把简历(word文档)上传到数据库里,然后还要下载下来,请问一下如何:
1)定义数据库字段属性
2)如何链接数据库与系统?
回答完备有加分哦。。。先谢谢啦。
能不能不要复制啊。。。。baituo,我可以加分的。。
我的是MFC上用。
不是ASP上的。 展开
1)定义数据库字段属性
2)如何链接数据库与系统?
回答完备有加分哦。。。先谢谢啦。
能不能不要复制啊。。。。baituo,我可以加分的。。
我的是MFC上用。
不是ASP上的。 展开
5个回答
展开全部
将WORD文档放入ORACLE有两种方式,一是文件采用文件系统存储,数据库只存放文件的相对路径,二是存入BLOB类型字段中。
这里比较推荐第一种方式,便于数据及文件管理,方便导入导出,缺点是容易造成数据与文件内容不一致,文件管理与ORACLE关系不大。
重点说一下第二种方式即BLOB\CLOB方式,对于内容不大的可直接存取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;
借助目录方式在存取:
具体过程:
A,首先请DBA在控制台创建目录记录
CREATE OR REPLACE DIRECTORY MY_DIR as '/home/jsp';
-- 可使用 select * from dba_directories 进行查询是否创建成功;
B,再将新建的MY_DIR目录别名授权给指定用户使用
GRANT READ,WRITE on DIRECTORY MY_DIR TO user_cms ;
C,将拟存入数据库的文件上传至服务器的/home/jsp目录下
D,再使用以下过程进行文件读出并写入数据库, 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内容时不成功,ID=' || RECID ) ;
END TEST_BLOB;
数据提取过程
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;
这里比较推荐第一种方式,便于数据及文件管理,方便导入导出,缺点是容易造成数据与文件内容不一致,文件管理与ORACLE关系不大。
重点说一下第二种方式即BLOB\CLOB方式,对于内容不大的可直接存取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;
借助目录方式在存取:
具体过程:
A,首先请DBA在控制台创建目录记录
CREATE OR REPLACE DIRECTORY MY_DIR as '/home/jsp';
-- 可使用 select * from dba_directories 进行查询是否创建成功;
B,再将新建的MY_DIR目录别名授权给指定用户使用
GRANT READ,WRITE on DIRECTORY MY_DIR TO user_cms ;
C,将拟存入数据库的文件上传至服务器的/home/jsp目录下
D,再使用以下过程进行文件读出并写入数据库, 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内容时不成功,ID=' || RECID ) ;
END TEST_BLOB;
数据提取过程
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,上传文件,然后下载
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-07-03
展开全部
字段类型用blob,先把blob设成空然后再操作,我用的是upload_5xsoft.inc(asp人都知道),显示的时候就用数据流写出即可。代码如下
写入:
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
写入:
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |