将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,那么更好的方法是:

  • 将转换步骤封装在方法中
  • 根据您的系统功能,多线程处理每个转换任务

  • 如果您想将BLOB从一个RDBMS移动到另一个RDBMS,您就无法跳过这些段落,因为您的程序必须:

  • 从源读取二进制数据
  • 将数据写入目标
  • 如果您有大量待转换的blob,那么更好的方法是:

  • 将转换步骤封装在方法中
  • 根据您的系统功能,多线程处理每个转换任务

  • 如果我正确理解了您的问题,您在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.Net
    BFILE
    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.Net
    BFILE
    s,因此必须通过如上所示的SQL命令插入它们。不过,你可以通过网络来实现

    如果文件很大,实际上可以通过以下方式获得一些性能改进:。当然有一些与存储为<代码> bFrase/COD>(如减少的可管理性,需要单独备份文件系统等)相关的权衡,所以您可能需要考虑这些。
    如果您有选择的话,那么探索一下这个想法——跳过将PDF全部存储在数据库中(BLOB或BFILE),将它们移动到CDN,并只将一个定位器(URI)存储到数据库中的CDN资产。不仅数据库将大大减轻负担,最终用户体验也可能得到改善。当然,这取决于您的应用程序及其要求,但可能值得探索

    我不太确定我是否完全理解你的问题。是否要将MySQL BLOB中的PDF文件保存在Java对象中,然后使用自己的Ja将该对象加载到Oracle中