过去曾经提出的问题似乎处理了我的完整问题,但我没有找到一个完全好的答案。
情况如下:
从这里开始,感觉就像一个很好的答案: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的最大硬盘大小,这至少对我来说是足够的。这可能是发送到连接的变量。
然而,这个修复现在有点偏离原始主题,但它可能对其他人有用。
答案 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;