【问题标题】:Oracle Temporary Table to convert a Long Raw to BlobOracle 临时表将 Long Raw 转换为 Blob
【发布时间】:2016-01-27 11:48:18
【问题描述】:

过去提出的问题似乎可以处理我的全部问题,但我没有找到一个完全好的答案。

情况如下:

  • 我正在从旧的但可操作和生产的 Oracle 服务器导入数据。
  • 其中一列被创建为 LONG RAW。
  • 我将无法将表转换为 BLOB。
  • 我想在每次调用服务器时使用全局临时表来提取数据。

这感觉是一个很好的答案,来自这里:How to create a temporary table in Oracle

CREATE GLOBAL TEMPORARY TABLE newtable ON COMMIT PRESERVE ROWS AS SELECT MYID, TO_LOB("LONGRAWDATA") "BLOBDATA" FROM oldtable WHERE .....;

我不想让桌子到处乱晃,我一次只做一大块行,把旧桌子拉成碎片,每次都把桌子弄死。执行 CREATE,然后执行 SELECT,然后 DROP 是否可以接受?

谢谢..

--- 编辑 ---

作为后续行动,我决定采取不同的方法来解决这个问题。

分支strong-oracle 包,我能够做我最初希望做的事情,即直接从表中提取数据而无需进行转换。

Here 是我发布的问题。如果我被允许将我的代码发布到一个分支,我会在这里发布一个跟进以确保完整性。

Oracle ODBC 驱动程序版本 11.2.0.1.0 表示支持预取 LONG RAW 数据类型,这是真的。

需要注意的是,从技术上讲,LONG RAW 的大小可以达到 2GB。我必须在代码中设置 10MB 的最大硬性大小,这足以满足我的使用需求,至少到目前为止。这可能是发送到连接的变量。

这个修复现在有点偏离原始主题,但它可能对其他人有用。

【问题讨论】:

标签: oracle type-conversion blob


【解决方案1】:

使用 Oracle GTT,无需每次都删除和创建,您无需担心数据“徘徊”。实际上,不建议丢弃并重新创建。结构本身会持续存在,但其中的数据不会。数据仅在每个会话中保留。您可以通过打开两个单独的客户端来测试这一点,用一个加载数据,您会注意到它在第二个客户端中不存在。

实际上,每次打开会话时,就好像您正在阅读一个完全不同的表,只是被截断了。

如果您想清空存储过程中的表,您可以随时截断它。在存储过程中,如果您这样做,则需要execute immediate

这确实很方便,但如果您通过代码实现 GTT,它也可以让调试变得很麻烦。

出于好奇,为什么一次一个块而不是整个数据集?您指的是哪种数据量?

-- 编辑--

根据我们的 cmets 对话,这是非常原始且未经测试的,但我希望它能让您了解我的意思:

CREATE OR REPLACE PROCEDURE LOAD_DATA()
AS
  TOTAL_ROWS number;
  TABLE_ROWS number := 1;
  ROWS_AT_A_TIME number := 100;
BEGIN

  select count (*)
  into TOTAL_ROWS
  from oldtable;

  WHILE TABLE_ROWS <= TOTAL_ROWS
  LOOP
    execute immediate 'truncate table MY_TEMP_TABLE';  

    insert into MY_TEMP_TABLE
    SELECT 
      MYID, TO_LOB(LONGRAWDATA) as BLOBDATA
    FROM oldtable
    WHERE ROWNUM between TABLE_ROWS and TABLE_ROWS + ROWS_AT_A_TIME;

    insert into MY_REMOTE_TABLE@MY_REMOTE_SERVER
    select * from MY_TEMP_TABLE;

    commit;

    TABLE_ROWS := TABLE_ROWS + ROWS_AT_A_TIME;
  END LOOP;

  commit;

end LOAD_DATA;

【讨论】:

  • 数据集基本上是一堆存储的图像。大约有 10 万条记录。我想一次做一个块,因为我想避免使用多种导入方法,并避免必须存储到服务器并从网络共享读取。我想一次分块,因为出于导入目的,我想一次做一点以随着时间(历史)分散服务器负载,并在定期更新间隔内仅抓取新图像。
  • (显然你不能在 iPhone Stack Overflow 应用程序上按 Enter 键?)实际上是 50 万条记录。
  • 对多个 cmets 感到抱歉。如果表是空的,但结构上在那里,那么一旦你进行下一次调用,你如何将数据移入其中?我目前正在运行简单的 SELECT 语句来获取所需的数据。当您使用 proc 时,它是否也存在于服务器上?谢谢您的帮助。 (是的,这里有点 Oracle 新手)。
  • 带有 LOB 的 500k 记录...好吧,也许我明白你的意思了。您的最后一个问题是关于如何在数据到达那里后移动数据,这让我迷失了方向。您有机会从存储过程中发布代码吗?我假设您使用数据库链接将数据从旧服务器获取到新服务器,然后通过TO_LOB 将数据从 GTT 复制到真实表。不是这样吗?
  • 我的一般方法是在节点服务器上导入数据以一次引入一个块,例如约 100 条记录。所以我通常会做一个(伪代码)'SELECT col1,col2 from TABLE where row > 0 and row
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2013-12-26
  • 2014-10-30
  • 2021-12-06
  • 2013-05-09
  • 2020-01-19
  • 2017-01-17
  • 2011-02-09
相关资源
最近更新 更多