将PDF文件从MySQL以C#格式保存到Oracle,其间不进行任何转换
您好,我需要将存储在将PDF文件从MySQL以C#格式保存到Oracle,其间不进行任何转换,c#,mysql,oracle,pdf,blob,C#,Mysql,Oracle,Pdf,Blob,您好,我需要将存储在BLOBtype中的PDF从MySQL传输到Oracle。我知道如何将其转换为byte[]格式,然后保存到Oracle中 我的问题是,是否有其他选择可以避免这种转换并加快过程?任何类似于将MySQL文件保存在对象中直接将其交给Oracle query的操作?如果您想将BLOB从一个RDBMS移动到另一个RDBMS,则无法跳过这些段落,因为您的程序必须: 从源读取二进制数据 将数据写入目标 如果您有大量待转换的blob,那么更好的方法是: 将转换步骤封装在方法中 根据您的系统功
BLOB
type中的PDF从MySQL传输到Oracle。我知道如何将其转换为byte[]
格式,然后保存到Oracle中
我的问题是,是否有其他选择可以避免这种转换并加快过程?任何类似于将MySQL文件保存在对象中直接将其交给Oracle query的操作?如果您想将BLOB从一个RDBMS移动到另一个RDBMS,则无法跳过这些段落,因为您的程序必须:
如果您想将BLOB从一个RDBMS移动到另一个RDBMS,您就无法跳过这些段落,因为您的程序必须:
如果我正确理解了您的问题,您在MySQL数据库中有一个PDF文件,您希望将其移动到Oracle DB,并将数据类型保持为BLOB 您需要做的第一件事是,将文件移动到Oracle可以读取它的目录位置。然后,您需要做的就是将PDF加载到表的BLOB列中
CREATE OR replace PROCEDURE Load_lob
AS
id NUMBER;
pdf1 BLOB;
locator BFILE;
bfile_len NUMBER;
bf_desc VARCHAR2(30);
bf_name VARCHAR2(30);
bf_dir VARCHAR2(30);
bf_typ VARCHAR2(4);
ctr INTEGER;
CURSOR get_id IS
SELECT bfile_id,
bfile_desc,
bfile_type
FROM pdf_table;
BEGIN
OPEN get_id;
LOOP
FETCH get_id INTO id, bf_desc, bf_typ;
EXIT WHEN get_id%NOTFOUND;
dbms_output.Put_line('ID: '
||To_char(id));
SELECT bfile_loc
INTO locator
FROM pdf_table
WHERE bfile_id = id;
dbms_lob.Filegetname(locator, bf_dir, bf_name);
dbms_output.Put_line('Dir: '
||bf_dir);
dbms_lob.Fileopen(locator, dbms_lob.file_readonly);
bfile_len := dbms_lob.Getlength(locator);
dbms_output.Put_line('ID: '
||To_char(id)
||' length: '
||To_char(bfile_len));
SELECT temp_blob
INTO pdf1
FROM temp_blob;
bfile_len := dbms_lob.Getlength(locator);
dbms_lob.Loadfromfile(pdf1, locator, bfile_len, 1, 1);
INSERT INTO internal_graphics
VALUES (id,
bf_desc,
pdf1,
bf_typ);
dbms_output.Put_line(bf_desc
||' Length: '
||To_char(bfile_len)
|| ' Name: '
||bf_name
||' Dir: '
||bf_dir
||' '
||bf_typ);
dbms_lob.Fileclose(locator);
END LOOP;
END;
/
如果我正确理解了您的问题,您在MySQL数据库中有一个PDF文件,您希望将其移动到Oracle DB,并将数据类型保持为BLOB 您需要做的第一件事是,将文件移动到Oracle可以读取它的目录位置。然后,您需要做的就是将PDF加载到表的BLOB列中
CREATE OR replace PROCEDURE Load_lob
AS
id NUMBER;
pdf1 BLOB;
locator BFILE;
bfile_len NUMBER;
bf_desc VARCHAR2(30);
bf_name VARCHAR2(30);
bf_dir VARCHAR2(30);
bf_typ VARCHAR2(4);
ctr INTEGER;
CURSOR get_id IS
SELECT bfile_id,
bfile_desc,
bfile_type
FROM pdf_table;
BEGIN
OPEN get_id;
LOOP
FETCH get_id INTO id, bf_desc, bf_typ;
EXIT WHEN get_id%NOTFOUND;
dbms_output.Put_line('ID: '
||To_char(id));
SELECT bfile_loc
INTO locator
FROM pdf_table
WHERE bfile_id = id;
dbms_lob.Filegetname(locator, bf_dir, bf_name);
dbms_output.Put_line('Dir: '
||bf_dir);
dbms_lob.Fileopen(locator, dbms_lob.file_readonly);
bfile_len := dbms_lob.Getlength(locator);
dbms_output.Put_line('ID: '
||To_char(id)
||' length: '
||To_char(bfile_len));
SELECT temp_blob
INTO pdf1
FROM temp_blob;
bfile_len := dbms_lob.Getlength(locator);
dbms_lob.Loadfromfile(pdf1, locator, bfile_len, 1, 1);
INSERT INTO internal_graphics
VALUES (id,
bf_desc,
pdf1,
bf_typ);
dbms_output.Put_line(bf_desc
||' Length: '
||To_char(bfile_len)
|| ' Name: '
||bf_name
||' Dir: '
||bf_dir
||' '
||bf_typ);
dbms_lob.Fileclose(locator);
END LOOP;
END;
/
我认为在从MySql读取blob时,您没有其他选择(以字节[]存储)。但是,如果插入Oracle时需要移动大量记录,出于性能考虑,可以在ODP.NET中使用Oracle.DataAccess.Client.OracleBulkCopy
我认为在从MySql读取blob时,您没有其他选择(以字节[]存储)。但是,如果插入Oracle时需要移动大量记录,出于性能考虑,可以在ODP.NET中使用Oracle.DataAccess.Client.OracleBulkCopy
Oracle和MySQL是完全不同的系统。当您将二进制数据从一个移动到另一个时,您必须经历这个转换过程 虽然MySql和ODP.Net都以流的形式访问blob,但为了从一个blob读取数据并写入另一个blob,您的程序需要使用通用语言,而.Net中的通用语言是
byte[]
现在,使用Oracle,您可以将文件存储为BFILE
,它只是一个文件系统文件,而不是由RDBMS管理的文件。如果这样做,那么您可以将MySql中的所有blob转储到一个目录中,如本文所述,并完全跳过MySql中的字节数组转换
将BFILE添加到Oracle将是一个批处理作业,您可以在MySql转储完成后运行该批处理作业:
CREATE DIRECTORY test_dir AS '/tmp' -- replace tmp with actual my sql dump directory
-- Inserting the BFiles
INSERT INTO my_bfile_table VALUES (..., bfilename(test_dir, 'file1.pdf'));
INSERT INTO my_bfile_table VALUES (..., bfilename(test_dir, 'file2.pdf'));
...
请注意,ODP.NetBFILE
s,因此必须通过如上所示的SQL命令插入它们。不过,你可以通过网络来实现
如果文件很大,实际上可以通过以下方式获得一些性能改进:。当然有一些与存储为<代码> bFrase/COD>(如减少的可管理性,需要单独备份文件系统等)相关的权衡,所以您可能需要考虑这些。
如果您有选择的话,那么探索一下这个想法——跳过将PDF全部存储在数据库中(BLOB或BFILE),将它们移动到CDN,并只将一个定位器(URI)存储到数据库中的CDN资产。不仅数据库将大大减轻负担,最终用户体验也可能得到改善。当然,这取决于您的应用程序及其要求,但可能值得探索 Oracle和MySQL是完全不同的系统。当您将二进制数据从一个移动到另一个时,您必须经历这个转换过程 虽然MySql和ODP.Net都以流的形式访问blob,但为了从一个blob读取数据并写入另一个blob,您的程序需要使用通用语言,而.Net中的通用语言是
byte[]
现在,使用Oracle,您可以将文件存储为BFILE
,它只是一个文件系统文件,而不是由RDBMS管理的文件。如果这样做,那么您可以将MySql中的所有blob转储到一个目录中,如本文所述,并完全跳过MySql中的字节数组转换
将BFILE添加到Oracle将是一个批处理作业,您可以在MySql转储完成后运行该批处理作业:
CREATE DIRECTORY test_dir AS '/tmp' -- replace tmp with actual my sql dump directory
-- Inserting the BFiles
INSERT INTO my_bfile_table VALUES (..., bfilename(test_dir, 'file1.pdf'));
INSERT INTO my_bfile_table VALUES (..., bfilename(test_dir, 'file2.pdf'));
...
请注意,ODP.NetBFILE
s,因此必须通过如上所示的SQL命令插入它们。不过,你可以通过网络来实现
如果文件很大,实际上可以通过以下方式获得一些性能改进:。当然有一些与存储为<代码> bFrase/COD>(如减少的可管理性,需要单独备份文件系统等)相关的权衡,所以您可能需要考虑这些。
如果您有选择的话,那么探索一下这个想法——跳过将PDF全部存储在数据库中(BLOB或BFILE),将它们移动到CDN,并只将一个定位器(URI)存储到数据库中的CDN资产。不仅数据库将大大减轻负担,最终用户体验也可能得到改善。当然,这取决于您的应用程序及其要求,但可能值得探索 我不太确定我是否完全理解你的问题。是否要将MySQL BLOB中的PDF文件保存在Java对象中,然后使用自己的Ja将该对象加载到Oracle中