oracle blob的使用,Oracle中BLOB/CLOB相关操作的使用笔记

使用pl

/

sql读取写入blob对象

一、写文件到BLOB

SQL

>

create

table

iihero_blob(fid

int

primary

key

, fname

varchar

(

32

), f blob);

表已创建。

SQL

>

conn

/

as

sysdba

已连接。

SQL

>

create

or

replace

directory BLOBDIR

as

'

d:oraclefile

'

;

目录已创建。

SQL

>

grant

read

on

directory BLOBDIR

to

test;

授权成功。

SQL

>

conn test

/

test

已连接。

SQL

>

create

sequence s_iihero_seq

2

start

with

1

3

increment

by

1

4

/

序列已创建。

CREATE

OR

REPLACE

PROCEDURE

iihero_load_blob (pfname

VARCHAR2

)

IS

src_file BFILE;

dst_file BLOB;

lgh_file BINARY_INTEGER;

BEGIN

src_file :

=

bfilename(

'

BLOBDIR

'

, pfname);

INSERT

INTO

iihero_blob (fid,fname,f)

VALUES

(S_IIHERO_SEQ.Nextval,pfname,EMPTY_BLOB())

RETURNING f

INTO

dst_file;

SELECT

f

INTO

dst_file

FROM

iihero_blob

WHERE

fname

=

pfname

FOR

UPDATE

;

dbms_lob.fileopen(src_file, dbms_lob.file_readonly);

lgh_file :

=

dbms_lob.getlength(src_file);

dbms_lob.loadfromfile(dst_file, src_file, lgh_file);

UPDATE

iihero_blob

SET

f

=

dst_file

WHERE

fname

=

pfname;

dbms_lob.fileclose(src_file);

commit

;

END

iihero_load_blob;

/

SQL

>

col segment_name

for

a30

SQL

>

conn

/

as

sysdba

已连接。

SQL

>

select

segment_name,segment_type,bytes

/

1024

/

1024

from

dba_segments

where

ow

ner

=

'

TEST

'

;

SEGMENT_NAME                   SEGMENT_TYPE       BYTES

/

1024

/

1024

--

---------------------------- ------------------ ---------------

ST_COURSE

TABLE

.

0625

TAB2

TABLE

.

0625

IIHERO_BLOB

TABLE

.

0625

SYS_LOB0000030667C00003$$      LOBSEGMENT                   .

0625

已选择34行。

SQL

>

conn test

/

test

已连接。

SQL

>

4

. 装数据(写数据到BLOB)

SQL

>

exec

iihero_load_blob(

'

ttt.txt

'

);

PL

/

SQL 过程已成功完成。

SQL

>

select

fid, fname, dbms_lob.getlength(f)

from

iihero_blob;

FID FNAME                            DBMS_LOB.GETLENGTH(F)

--

-------- -------------------------------- ---------------------

1

ttt.txt

28729

二、将BLOB中的数据读到文件

1

. 确认有数据

SQL

>

select

fid, fname, dbms_lob.getlength(f)

from

iihero_blob;

FID FNAME                            DBMS_LOB.GETLENGTH(F)

--

-------- -------------------------------- ---------------------

1

ttt.txt

28729

2

. 创建目录

SQL

>

conn

/

as

sysdba

已连接。

SQL

>

create

or

replace

directory BLOBDIR

as

'

d:oraclefile

'

;

目录已创建。

SQL

>

grant

read

,write

on

directory BLOBDIR

to

test;

授权成功。

3

.创建存储过程

conn test

/

test

CREATE

OR

REPLACE

PROCEDURE

iihero_dump_blob(piname

varchar2

,poname

varchar2

)

IS

l_file      UTL_FILE.FILE_TYPE;

l_buffer

RAW

(

32767

);

l_amount    BINARY_INTEGER :

=

32767

;

l_pos

INTEGER

:

=

1

;

l_blob      BLOB;

l_blob_len

INTEGER

;

BEGIN

SELECT

f

INTO

l_blob

FROM

iihero_blob

WHERE

FNAME

=

piname;

l_blob_len :

=

DBMS_LOB.GETLENGTH(l_blob);

--

dbms_output.put_line(l_blob_len);

--

l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);

l_file :

=

UTL_FILE.FOPEN(

'

BLOBDIR

'

,poname,

'

w

'

,

32767

);

WHILE

l_pos

<

l_blob_len LOOP

DBMS_LOB.

READ

(l_blob, l_amount, l_pos, l_buffer);

UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);

l_pos :

=

l_pos

+

l_amount;

END

LOOP;

UTL_FILE.FCLOSE(l_file);

EXCEPTION

WHEN

OTHERS

THEN

IF

UTL_FILE.IS_OPEN(l_file)

THEN

UTL_FILE.FCLOSE(l_file);

END

IF

;

RAISE;

END

;

/

SQL

>

host dir

/

b

/

s d:oraclefiled:oraclefileexample.txtd:oraclefile tt.txt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要导出和导入Oracle数据库CLOBBLOB数据类型,可以使用以下方法: 1. 使用Oracle自带的exp和imp工具导出和导入整个数据库或特定表的数据。在导出时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导出文件名。在导入时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导入文件名。 2. 使用Oracle SQL Developer工具导出和导入特定表的数据。在导出时,选择要导出的表,右键点击选择“导出”选项,选择“导出数据”并选择“导出为LOB文件”。在导入时,选择要导入的表,右键点击选择“导入”选项,选择“导入数据”并选择“从LOB文件导入”。 3. 使用PL/SQL代码导出和导入CLOBBLOB数据。在导出时,使用SELECT语句查询CLOBBLOB列的值,并将其写入文件。在导入时,使用INSERT语句将文件的值插入到CLOBBLOB。 以上是几种常见的导出和导入Oracle数据库CLOBBLOB数据的方法。具体使用哪种方法取决于具体情况和需求。 ### 回答2: Oracle是一个广泛使用的关系型数据库,其包含了CLOB(字符大对象)和BLOB(二进制大对象)类型的数据。这些数据类型通常用于存储大型文本和图像等二进制数据。在Oracle,导出和导入CLOBBLOB数据是非常常见的任务。本文将介绍如何导出和导入这些类型的数据。 首先,我们需要了解Oracle提供的导出工具是exp和expdp。exp是旧版工具,而expdp是新版工具。在导出CLOBBLOB数据时,我们建议使用expdp,因为它是专门为大量导出数据而设计的。下面我们来看看导出CLOB数据的方法: 1. 使用expdp导出 使用expdp命令导出CLOB数据需要指定以下参数: - expdp system/password tables=table_name directory=directory_name dumpfile=file_name.dmp lob_file=file_name.log EXCLUDE=STATISTICS 其table_name是要导出的表名,directory_name是导出文件的路径,file_name是导出文件的名称,lob_file是LOB类型的文件的名称。 2. 使用SQL*Plus导出 我们也可以使用SQL*Plus命令导出CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建目录 OBJECT_DIR: CREATE OR REPLACE DIRECTORY OBJECT_DIR AS 'C:\TEMP'; 3)使用以下命令导出CLOB数据: SET LONG 10000 SET PAGESIZE 0 SET LINESIZE 1000 SET FEEDBACK OFF SPOOL CLOB_Export.sql SELECT 'SELECT ' || column_name || ' FROM ' || table_name || ' WHERE ' || where_clause || ';' FROM all_tab_cols WHERE data_type = 'CLOB' AND table_name = 'TABLE_NAME'; SPOOL OFF 4)使用以下命令将生成的SQL脚本文件CLOB_Export.sql导出到本地目录: exp userid=username/password file=dumpfile.dmp owner=owner_name log=clob_export.log 接下来我们会介绍如何导入CLOBBLOB数据。 1. 使用impdp导入 使用impdp命令导入CLOB数据需要指定以下参数: - impdp system/password directory=directory_name dumpfile=file_name.dmp logfile=file_name.log tables=table_name 其directory_name是导入文件的路径,file_name是导入文件的名称,table_name是要导入数据的表的名称。 2. 使用SQL*Plus导入 我们也可以使用SQL*Plus命令导入CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建LOB的目录 LOB_DIR: CREATE OR REPLACE DIRECTORY LOB_DIR AS 'C:\TEMP'; 3)使用以下命令在Oracle创建LOB表: CREATE TABLE lob_table ( lob_column CLOB ); 4)使用以下命令将LOB类型的文件loaded_file.xml导入到LOB表: INSERT INTO lob_table (lob_column) VALUES (EMPTY_CLOB()); SELECT lob_column FROM lob_table FOR UPDATE; DECLARE infile BFILE :=BFILENAME('OBJECT_DIR', 'loaded_file.xml'); lob_loc CLOB; BEGIN DBMS_LOB.OPEN(lob_column, DBMS_LOB.LOB_READWRITE); DBMS_LOB.LOADFROMFILE(lob_column, infile, DBMS_LOB.GETLENGTH(infile)); DBMS_LOB.CLOSE(lob_column); COMMIT; END; / 以上是导出导入CLOB/BLOB数据的两种方法,根据实际情况可以选择使用expdp、impdp或SQL*Plus导出和导入。然而在导入CLOB/BLOB时,需要特别注意数据库版本以及LOB大小限制等问题。 ### 回答3: 在OracleCLOBBLOB是用来存储大文本和二进制数据的数据类型。有时候我们需要对这些数据进行导入和导出。在这篇文章,我会介绍如何将CLOBBLOB数据导入和导出。 导出CLOB/BLOB数据 在Oracle,可以使用DBMS_LOB包来导出CLOBBLOB数据。首先,我们需要使用SELECT语句来查询需要导出的数据。查询的结果会以一个CLOBBLOB对象的形式存在,然后我们可以把这个对象导出到一个文件。以下是导出CLOBBLOB对象到文件的步骤: 1.查询需要导出的数据 例如,我们可以使用以下SELECT语句来查询一个CLOB的数据: SELECT clob_column FROM clob_table; 2.将查询结果存储到变量 为了方便将查询结果导出到文件,我们需要将查询结果存储到一个变量。我们可以使用PL/SQL或SQL*Plus来完成这个任务。以下是一个PL/SQL的例子: DECLARE my_data CLOB; BEGIN SELECT clob_column INTO my_data FROM clob_table; END; 3.将变量的值导出到文件 使用DBMS_LOB包的函数,可以将变量的值导出到文件,以下是一个导出CLOB数据的例子: DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN SELECT clob_column INTO my_data FROM clob_table; my_file := UTL_FILE.FOPEN('MY_DIR', 'my_file.txt', 'w'); DBMS_LOB.FILEEXPORT(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'MY_DIR'是Oracle指定的一个目录,需要在数据库提前定义。 - 'my_file.txt'是导出文件的名称 - 'w'表示以覆盖模式写入文件 这个例子将会把查询出来的CLOB数据导出为txt文件。 导入CLOB/BLOB数据 同样的,我们可以使用DBMS_LOB包来导入CLOBBLOB数据。以下是导入CLOBBLOB数据的步骤: 1.读取文件内容 使用UTL_FILE包的函数,可以读取文件的内容到一个变量,例如以下SQL*Plus的命令: DEFINE my_file='my_file.txt' DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN my_file := UTL_FILE.FOPEN('MY_DIR', '&my_file', 'r'); UTL_FILE.GET_LINE(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'my_file.txt'是要导入到数据库的文件名称 - MY_DIR是Oracle指定的一个目录,需要在数据库提前定义。 2.将变量的值导入到数据库 使用INSERT语句将变量的值插入到CLOB,例如以下的SQL*Plus命令: INSERT INTO clob_table (clob_column) VALUES (my_data); 注意: 在Oracle,插入CLOBBLOB数据时,要使用专门的函数,例如: INSERT INTO clob_table (clob_column) VALUES (TO_LOB('some text')); 以上就是导出和导入CLOB/BLOB数据的步骤。当然,在实际操作可能会遇到各种各样的问题,我们需要仔细阅读相关的文档,查找正确的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值