0

我正在尝试从 sql server 上的 varchar2(8000) 文本字段插入数据。我在 oracle db 上创建了一个类似的列,但属于 clob 数据类型。你能帮我解决不一致的数据类型问题并提高查询的性能吗?请让我知道是否有任何其他更好的方法可以为多行插入巨大的文本文件。当我在 sql server 和 oracle db 上运行相同的查询(即从 TBL_NOTES@PPRLEG 中选择“Note”)时,可以快速检索结果。当我尝试插入数据时,它需要很长时间并且不会结束。我应该只在此处给出包含 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;

/

4

2 回答 2

0

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

同时,我将检查查询的性能

于 2015-09-28T14:39:38.003 回答
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 列的大小。

在这种情况下,我只是想推动对话向前发展。

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

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

过去,我对与 SQL Server 的 ODBC 连接的性能不满意,并完成了更复杂的解决方法,但我不能说我有任何作为一般规则使用的特定解决方法。

于 2015-09-27T20:27:48.873 回答