Oracle临时表将Long Raw转换为Blob

时间:2015-10-27 21:15:32

标签: oracle type-conversion blob

过去曾经提出的问题似乎处理了我的完整问题,但我没有找到一个完全好的答案。

情况如下:

  • 我从旧的,但是运营和生产的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的最大硬盘大小,这至少对我来说是足够的。这可能是发送到连接的变量。

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

1 个答案:

答案 0 :(得分:1)

使用Oracle GTT,没有必要每次都删除和创建,并且您不必担心数据和闲逛。"事实上,放弃和重新创建是不可取的。结构本身仍然存在,但其中的数据却没有。数据仅在每个会话中持续存在。你可以通过打开两个单独的客户端来测试这个,用一个加载数据,你会注意到第二个客户端没有。

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

如果要在存储过程中清空表,则可以始终截断它。在存储过程中,如果执行此操作,则需要execute immediate

这非常方便,但如果您通过代码实现GTT,它也可以调试熊。

出于好奇,为什么一次只有一个块而不是整个数据集?您在谈论什么样的数据量?

- 编辑 -

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

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;