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

时间:2015-09-27 06:47:44

标签: oracle performance plsql clob sql-tuning

我正在尝试从sql server上的varchar2(8000)文本字段插入数据。我在oracle db上创建了一个类似但是clob数据类型的列。你能帮我解决不一致的数据类型问题并提高查询性能吗? 如果还有其他更好的方法可以为多行插入大文本文件,请告诉我。当我在sql server和oracle db上运行相同的查询时(即从TBL_NOTES @ PPRLEG中选择“注意”),可以快速检索结果。当我尝试插入数据时需要花费很多时间并且它不会结束。我应该只在这里给出包含clobs的列,它应该处理剩下的。

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;

/

2 个答案:

答案 0 :(得分:0)

由于还没有人回答这个问题,我将开始谈话。

但请记住,我今天没有带有文本字段的远程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列的大小。

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

但是我想看一下,整个表格是否只有一个选择语句能够足够快地运行?还是它还太慢了?

还要注意,我在这个例子中使用了一个全局临时表,显然如果它耗尽了你的PGA和TEMP表空间就无法工作,所以根据你有的东西,你可以选择不使用GTT。

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

答案 1 :(得分:0)

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

我将检查查询的性能