通过数据库链接在Oracle数据库中插入CLOB数据类型

通过数据库链接在Oracle数据库中插入CLOB数据类型,oracle,performance,plsql,clob,sql-tuning,Oracle,Performance,Plsql,Clob,Sql Tuning,我试图从sql server上的varchar2(8000)文本字段中插入数据。我在oracle db上创建了一个类似的列,但它的数据类型为clob。您能帮助我解决不一致的数据类型问题并提高查询的性能吗? 请告诉我是否有其他更好的方法可以为多行插入大型文本文件。当我在sql server和oracle db上运行相同的查询时(即从TBL中选择“Note”)_NOTES@PPRLEG)结果很快就被检索出来了。当我尝试插入数据时,需要花费很多时间,而且不会结束。我应该在这里只给出包含CLOB的列,它

我试图从sql server上的varchar2(8000)文本字段中插入数据。我在oracle db上创建了一个类似的列,但它的数据类型为clob。您能帮助我解决不一致的数据类型问题并提高查询的性能吗? 请告诉我是否有其他更好的方法可以为多行插入大型文本文件。当我在sql server和oracle db上运行相同的查询时(即从TBL中选择“Note”)_NOTES@PPRLEG)结果很快就被检索出来了。当我尝试插入数据时,需要花费很多时间,而且不会结束。我应该在这里只给出包含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 TBL_NOTES@PPRLEG;
  for indx in 1..v_notes.count
   loop
    l_text := l_text || ' ' ||v_notes(indx);
  end loop;

RETURN l_text;
END;

/既然还没有人回答这个问题,我就开始对话

但请记住,我今天没有一个带有文本字段的远程SQL Server可供测试

关于您最初的答案,我注意到的是,您在一个函数中访问远程数据库,这与我有关,因为在一个函数中重复检索整个表在时间上是非常昂贵的

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

因此,您可以在oracle端创建一个表:

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 TBL_NOTES@PPRLEG;
这些都是示例,您可能需要调整定义,例如,我不知道userin varchar列的大小

在这种情况下,我只是想把对话向前推进

但是我想看看,用一个select语句来处理整个表是否足够快?还是太慢了

还要注意的是,我在本例中使用了一个全局临时表,如果它耗尽了PGA和TEMP表空间,显然是不起作用的,因此根据您现有的可用表,您可以选择不使用GTT


过去,我对与SQL Server的ODBC连接的性能不满意,并做了更复杂的变通方法,但我不能说我有任何具体的变通方法可以作为一般规则使用。

感谢您的回复。我创建了全局临时表,当我运行insert语句时,它抛出以下错误: SQL错误:ORA-00997:非法使用长数据类型 99700000-“非法使用长数据类型”


虽然我将检查查询的性能

afaik sql server没有varchar2数据类型。为什么在这里使用函数?这个函数是如何工作的,您将输出限制为4000个字符,但选择了整个远程表?如果你能提供更多的细节,帮助会更容易。远程表的定义、行数、您试图完成的操作。我们正在尝试将sql server data 2008 R2迁移到Oracle 11 g数据库。我们正在尝试使用dblink插入行(count-379012),但sql server中文本较大的字段存在性能问题。我们为一个这样的表创建了CLOB数据类型(TBL_NOTES)我们正在这里尝试执行批量收集操作。字段“Note”sql server上的字段为文本数据类型,Oracle端的字段为CLOB数据类型。我对此迁移非常陌生,因此希望对此进行修复。请注意,sql server上有非常大的文本文件和多个CLOB数据类型。TBL_NOTES-note-text datatype。TBL_NOTES-NOTE-CLOB datatype at Oracle.379012是sql server中的行数。远程表的定义-ID int、REPORT_ID-int、UNIQUE_ID-varchar、user_ID-int、NOTE text、DTS datetime、SalesNote-text、userrole varchar、userein-varchar您尝试过吗?谢谢您的回复。我创建了全局临时表,当我运行insert语句时,它抛出以下错误:SQL错误:ORA-00997:非法使用长数据类型00997。00000-“非法使用长数据类型”意味着我将检查查询插入NOTES的性能(id、NOTES、dts、report\u id、unique\u id、userin)从tbl中选择“id”、“NOTES”、“dts”、“report\u id”、“unique\u id”、“userin”_notes@pprleg; 这是insert语句。我们可以使用sql加载器加载数据吗。如果是的话,我们怎么做?