2015-09-27 141 views
0

我想从sql server上的varchar2(8000)文本字段插入数据。我在oracle数据库上创建了一个类似的列,但是clob数据类型。你能帮我解决不一致的数据类型问题并提高查询的性能吗? 请让我知道是否有其他更好的方法来插入多行的大文本文件。当我在sql server和oracle db上运行相同的查询(即从TBL_NOTES @ PPRLEG选择“注释”)时,结果会很快被检索到。当我尝试插入数据时,需要花费很多时间并且不会结束。我应该只在这里给出包含clobs的列,并且它应该处理剩下的部分。通过数据库链接在Oracle数据库中插入CLOB数据类型

CREATE OR REPLACE FUNCTION get_clob_data 
(id in TBL_NOTES.id%TYPE, 
REPORT_ID in TBL_NOTES.REPORT_ID%type, 
UNIQUE_ID in TBL_NOTES.UNIQUE_ID%type, 
USER_ID in TBL_NOTES.USER_ID%type, 
DTS in TBL_NOTES.USERROLE%type, 
USEREIN in TBL_NOTES.USERROLE%type 
) 
RETURN varchar2 
    IS 
    l_text varchar2(4000); 
    Type t_note_txt IS TABLE OF TBL_NOTES.NOTE%type; 
    v_notes t_note_txt; 
BEGIN 
SELECT ltrim(rtrim("NOTE"))NOTE 
bulk collect into v_notes 
FROM [email protected]; 
    for indx in 1..v_notes.count 
    loop 
    l_text := l_text || ' ' ||v_notes(indx); 
    end loop; 

RETURN l_text; 
END; 

/

+0

afaik sql server没有varchar2数据类型。你为什么在这里使用一个函数?这个功能如何工作,你将输出限制为4000个字符,但选择整个远程表?如果你想提供更多的细节,帮助会更容易。远程表的定义,行数,你试图完成什么。 –

+0

我们正在尝试将sql server数据2008 R2迁移到Oracle 11 g数据库。我们试图使用dblink插入行(count-379012),但是在sql server上有大文本的字段,它有一个性能问题。我们为一个这样的表创建了CLOB数据类型(TBL_NOTES),并且我们试图执行批量收集这里的操作.SQL服务器上的字段“Note”是文本数据类型,Oracle端的字段是CLOB数据类型。我对这种迁移非常陌生,因此寻找对此的修复。请注意,我们有非常大的文本文件和多个clob数据类型。 – user3296391

+0

TBL_NOTES - 注 - sql服务器上的文本数据类型。 TBL_NOTES-注意 - Oracle379012上的CLOB数据类型是sql server中的行数。定义远程表 - ID-int,REPORT_ID- int,UNIQUE_ID- varchar,user_id -int,NOTE-text,DTS-datetime, SalesNote-text,userrole-varchar,userein-varchar – user3296391

回答

0

因为没有其他人已经回答了这个问题呢,我要开始对话。

但请记住,我今天没有带有文本字段的远程SQL Server进行测试。

我注意到你的原始答案,你是否去了一个函数内部的远程数据库 - 这一点与我有关,因为在一个函数内重复检索整个表格会花费很多时间。

我的首选是在一次调用中从远程SQL Server数据库中取回数据。

CREATE GLOBAL TEMPORARY TABLE NOTES_STG (
ID int, 
REPORT_ID int, 
USER_ID int, 
NOTE clob, 
DTS date, 
SalesNote clob, 
userrole varchar2(50), 
userin varchar2(50) 
); 

然后:

INSERT INTO NOTES_STG SELECT ID, REPORT_ID, USER_ID, NOTE, DETS, SAlesNote, USERROLE, USERIN FROM [email protected]; 

这些都是例子,你可能需要调整的定义,我不知道

所以,你可以在Oracle一端创建一个表例如,userin varchar列的大小。

在这种情况下,我只是试图推动对话。

但我想看看,正在整个表与一个选择语句将工作足够快?或者它仍然太慢?

另外请注意,我在这个例子中使用了一个全局临时表,显然,如果它耗尽了您的PGA和TEMP表空间,它将无法工作,所以根据您可用的内容,您可以选择不使用GTT。

我过去一直不太满意与SQL Server的ODBC连接的性能,并且做了更复杂的解决方法,但我不能说我有任何特定的解决方法,我将其用作一般规则。

+0

谢谢你的回复。我创建了全局临时表,并且当我运行插入语句时,它会抛出以下错误:SQL错误:ORA-00997:非法使用LONG数据类型00997. 00000 - “非法使用LONG数据类型” 意思是我会检查插入到NOTES_STG(id,note,dts,report_id,unique_id,userin)的查询 – user3296391

0

谢谢您的回复。我创建了全局临时表,当我跑的INSERT语句,它抛出下面的错误: SQL错误:ORA-00997:非法使用LONG数据类型的 00997. 00000 - “非法使用LONG数据类型的”

平均而我将检查查询的性能

+0

的性能从tbl_notes中选择“ID”,(“NOTE”),“DTS”,“REPORT_ID”,“UNIQUE_ID”,“UserEIN” @pprleg;这是插入语句。我们可以使用sql加载器加载数据吗?如果是这样,我们该怎么做? – user3296391