【问题标题】:Insert CLOB datatype in Oracle DB via DB link通过 DB 链接在 Oracle DB 中插入 CLOB 数据类型
【发布时间】:2015-12-24 15:39:00
【问题描述】:

我正在尝试从 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;

/

【问题讨论】:

  • afaik sql server 没有 varchar2 数据类型。你为什么在这里使用一个函数?此功能如何工作,您将输出限制为 4000 个字符,但选择了整个远程表?如果您提供更多详细信息,会更容易提供帮助。远程表的定义、行数、您要完成的任务。
  • 我们正在尝试将 sql server 数据 2008 R2 迁移到 Oracle 11 g 数据库。我们正在尝试使用 dblink 插入行(count-379012),但在 sql server 中包含大文本的字段,它有性能问题。我们为一个这样的表 (TBL_NOTES) 创建了 CLOB 数据类型,我们正在尝试在这里执行批量收集操作。sql server 上的字段“Note”是文本数据类型,Oracle 端的字段是 CLOB 数据类型。I我对这次迁移非常陌生,因此正在寻找解决此问题的方法。请注意,我们有非常大的文本文件和多种 clob 数据类型。
  • TBL_NOTES - 注意 - sql server 上的文本数据类型。 TBL_NOTES- 注意 - Oracle.379012 中的 CLOB 数据类型是 sql server 中的行数。远程表的定义 - ID-int、REPORT_ID- int、UNIQUE_ID- varchar、user_id -int、NOTE-text、DTS-datetime、 SalesNote- text,userrole-varchar,userein- varchar

标签: oracle performance plsql clob sql-tuning


【解决方案1】:

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

但请记住,我今天没有要测试的带有文本字段的远程 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 连接的性能不满意,并做过更复杂的解决方法,但我不能说我有任何作为一般规则使用的特定解决方法。

【讨论】:

  • 感谢您的回复。我创建了全局临时表,当我运行插入语句时,它抛出以下错误: SQL 错误:ORA-00997:非法使用 LONG 数据类型 00997。00000 -“非法使用 LONG 数据类型”意思是我会检查性能查询的
【解决方案2】:

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

同时我将检查查询的性能

【讨论】:

  • 插入 NOTES_STG (id,note,dts,report_id,unique_id,userin)select "ID",("NOTE"),"DTS","REPORT_ID","UNIQUE_ID","UserEIN"来自 tbl_notes@pprleg;这是插入语句。我们可以使用 sql loader 加载数据吗?如果是这样,我们该怎么做?
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多