【问题标题】:Is there a way to copy BLOB records between databases in Oracle 10g?有没有办法在 Oracle 10g 中的数据库之间复制 BLOB 记录?
【发布时间】:2011-08-26 17:36:48
【问题描述】:

我们有一个生产表,其中包含数百万行并包含一个 BLOB 字段,如果可能,我想将这些记录的一小部分复制到我们的开发数据库中,而不需要 DBA 参与。我尝试了以下 COPY 命令,但收到了CPY-0012: Datatype cannot be copied

COPY FROM user/password@prod_db TO user/password@dev_db -
INSERT TABLE_A (COL1, COL2, COL3, BLOB_COL) USING -
SELECT COL1, COL2, COL3, BLOB_COL -
FROM TABLE_A WHERE COL1='KEY' 

有没有办法通过 SQL 在数据库之间复制带有 BLOB 字段的记录?

【问题讨论】:

    标签: sql oracle oracle10g blob


    【解决方案1】:

    很遗憾,您无法使用COPY 命令复制BLOB 值。

    另一种方法是在源数据库上设置DB链接,并执行SQL INSERT语句:

    CREATE DATABASE LINK link_to_prod CONNECT TO prod_user IDENTIFIED BY prod_password USING 'prod_db';
    
    INSERT INTO TABLE_A@link_to_prod (COL1, COL2, COL3, BLOB_COL) SELECT COL1, COL2, COL3, BLOB_COL FROM TABLE_A
    

    【讨论】:

    • 谢谢,这太糟糕了。由于内部审计,我没有“被允许”创建从一个数据库到另一个数据库的数据库链接,尤其是从生产到另一个位置。看来无论如何我都需要让 DBA 参与进来。
    【解决方案2】:

    Oracle's Data Pump (started 10g+) 支持移动 BLOB 数据。

    【讨论】:

    • 如果需要在服务器之间进行复制,数据泵仍然需要创建一个数据库链接并使用 network_link 参数指定。
    • @Datajam Ltd:是的,我相信链接提供的地址 - 你的意思是什么?
    【解决方案3】:

    我想出了一个我喜欢的解决方案——这个版本的 CLOB 有 4000 个字符的限制。

    1) 在 COPY TO 数据库上:

    create TABLE_A_TMP as 
    select COL1, COL2, COL3, cast(BLOB_COL as varchar2(4000)) BLOB_COL
    from TABLE_A
    where 1=0;
    

    2) 然后运行复制命令

    COPY FROM user/password@prod_db TO user/password@dev_db -
     INSERT TABLE_A_TMP (COL1, COL2, COL3, BLOB_COL) USING -
     SELECT COL1, COL2, COL3, cast(BLOB_COL as varchar2(4000)) -
     FROM TABLE_A WHERE COL1='KEY' 
    

    3) 在 COPY TO 数据库上:

    INSERT TABLE_A (COL1, COL2, COL3, BLOB_COL)
    SELECT COL1, COL2, COL3, BLOB_COL
    FROM TABLE_A_TMP
    

    4) 然后删除 tmp 表

    我一直在与这个限制作斗争,这个解决方案对我帮助很大。

    【讨论】:

    • 您是否遇到过需要超过 4000 个字符的场景?我喜欢这个想法,但在我的情况下,blob 字段可能非常大。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2011-01-29
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多