【问题标题】:Oracle: Copying Long Raw data from one table to anotherOracle:将 Long Raw 数据从一个表复制到另一个表
【发布时间】:2016-01-22 22:43:47
【问题描述】:

假设我有两个表 Table1 和 Table2 具有完全相同的结构。我想将数据从 Table1 复制到 Table2。两个表都有一个 Long Raw 数据类型的字段。我正在使用以下插入语句来复制数据。

INSERT INTO TABLE2
SELECT ID, NAME, TO_LOB(IMAGE_DATA) FROM TABLE1

上面的插入语句正在执行,没有错误,但 Image_Data 列中的结果数据中有 0 个字节;表示没有为此字段复制任何内容。 Image_Data 的数据类型在两个表中都是 (Long Raw)。有人可以建议将此类数据从一个表复制到另一个表的正确方法。

非常感谢

【问题讨论】:

  • LONG RAW 已被贬低近十年。您是否有理由不使用 BLOB 代替?至少从 8.1.5 开始,这就是首选方法。
  • 这是我们拥有的遗留系统。我不想参与其中,但如果别无选择,我会试一试。关于 Long_Raw 有什么建议吗?
  • 没有使用导出和导入实用程序和/或编写 C/VB/Java 应用程序,我不知道有任何方法可以使用LONG RAW 来做到这一点。如果您使用的是BLOB,则可以像复制任何其他数据类型一样复制数据。

标签: oracle copy binary-data


【解决方案1】:

Oracle 早在上个千年就弃用 LONG 和 LONG RAW 的原因正是因为这个问题:它们完全是一个令人头疼的问题。现在可能是咬紧牙关转向现代(但不完全是尖端)BLOB 实现的好时机。这取决于您使用这些表的频率。记住,to tolerate a problem is to insist on it

替代方案很麻烦。有多种机制可以将 LONG 转换为更易于管理的东西,但它们不能以另一种方式工作。一种可能适合您的方法是:

  1. 导出Table1。如果您喜欢传统技术,您会希望使用 EXP 而不是 Data Pump :)
  2. Table1 重命名为Table2
  3. 导入Table1

【讨论】:

    【解决方案2】:

    使用 pl/sql

    declare
        l long;
    begin 
        select long_column into l from some_table where pk = 1;
        insert into some_other_table values (l);
        commit;
    end;
    

    【讨论】:

      【解决方案3】:

      尽管不应再使用长或长的原始列,但仍有许多遗留表需要处理。看一下这个: Copy Tables with Long/LongRaw columns

      declare  
         l_rec_long_table long_table%rowtype;
      begin
        select *
          into l_rec_long_table
          from long_table a
         where a.long_id = 'some old id';
      
      
        insert into long_table
        values
          ('new id',
           l_rec_long_table.long_column);
      end;
      

      【讨论】:

        【解决方案4】:
        SET DEFINE OFF;
        DECLARE
           fldLong VARCHAR2(10000);
           idTable MYSCHEMA.MYTABLE.ID_MYTABLE%TYPE;
        BEGIN
            FOR r IN (SELECT LONGFIELD_MYTABLE, ID_MYTABLE FROM MYSCHEMA.MYTABLE) LOOP
                fldLong := r.LONGFIELD_MYTABLE;
                idTable := r.ID_MYTABLE;
                DBMS_OUTPUT.PUT_LINE('Value field long: ' || fldLong );
        
                Insert into MYSCHEMA.MY_ANOTHER_TABLE
                (
                    ANOTHERFIELD1 [, ANOTHERFIELD2 ...], LONGFIELD_MY_ANOTHER_TABLE
                )
                SELECT FIELD1[, FIELD2 ...], fldLong
                FROM MYSCHEMA.MYTABLE
                WHERE ID_MYTABLE = idTable;
            END LOOP;
        END;
        /
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-26
          • 2012-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-24
          • 2011-05-16
          • 2023-03-16
          相关资源
          最近更新 更多