【问题标题】:Inserting clob into varchar(max) using db link in oracle plsql使用oracle plsql中的db链接将clob插入varchar(max)
【发布时间】:2017-04-02 05:39:39
【问题描述】:

我在clob 列中有一个图像的base64 字符串,我想将它存储到sql servervarchar(max) 类型列中。我正在使用 oracle 数据库中的 db 链接访问 sql server database

这是我正在使用的代码。

declare
    c clob;
begin
    select base64_clob into c from base64clobtable;
    insert into EMPTRANS_ACTIVE_TEST@attlogdb values(null, null, null,c);
    commit;
end;

当我运行这个语句时,我得到了这个错误。

ORA-06550: line 5, column 71:
PL/SQL: ORA-22992: cannot use LOB locators selected from remote tables
ORA-06550: line 5, column 5:
PL/SQL: SQL Statement ignored

请分享您对如何使用数据库链接将clob 列插入varchar(max) 的想法。

【问题讨论】:

  • 您不能在远程表中引用 LOB。相反,您可以创建物化视图来引用远程表。或者创建一个临时表。
  • 非常感谢您回复 @JSapkota 先生。你能更具体地说明你上面所说的吗? Base64clobtable 在我的 oracle 数据库中。

标签: sql sql-server oracle plsql dblink


【解决方案1】:

错误是什么状态:你有一个指向远程 LOB 的 lob 定位器。您不能以这种方式通过 DB 链接玩 lob。

我建议你使用 gloabl 临时表。

1)在oracle db中加载GTT中的数据。
2)插入EMPTRANS_ACTIVE_TEST@attlogdb select * from gtt;

SQL> create global temporary table foo as select base64_clob from base64clobtable;

SQL> insert into EMPTRANS_ACTIVE_TEST@attlogdb select null, null, null, clob_data from foo;
SQL> commit;

【讨论】:

  • 您能否为您的答案添加解释?
  • clob 用于保存大量数据....这可能会导致您的情况出现问题。我只是建议您在 clob 上执行 substr 并获取您认为是 sql server 中 varchar 数据类型的最大限制的字符数。它也可以解决您的问题。您必须将“sql_server 的 max_limit”替换为 sql server 中 varchar 的大小限制
  • 不要将该解释作为评论包含在内,而是编辑您的答案。
  • 您的编辑没有包含任何解释
  • 先生,我刚刚将“sql_server 的 max_limit”替换为 8000 个字符。有那么难理解吗?
【解决方案2】:

您的问题是从远程 Db 中选择 clob,您有两种解决方案来获取远程 clob

1) 在选择 dbms_lob.substr 的远程站点上创建一个视图。然后,您可以通过 dblink 从该视图中进行选择。(MAX 4000 字符)

2) 插入到本地临时表中,复制 lob 以使用它。

【讨论】:

  • 问题是将 clob 插入远程数据库,而不是选择
  • 如果您从其他网站复制并粘贴答案,您应该提及这一点并添加指向该答案的链接asktom.oracle.com/pls/asktom/…
【解决方案3】:

试试这个。但我不确定我的解决方案是否有效。 如果我理解 sql server 中的 varchar(max) 等效于 oracle clob 数据类型。 将本地 clob 拆分为 varchar2 块并循环更新远程记录。

 declare
   c clob;
   l_chunk_cnt number;
   v_chunk_size number := 4000;
   v_remote_id  number;
 begin 
  select base64_clob into c from base64clobtable;  
  insert into EMPTRANS_ACTIVE_TEST@attlogdb values(null, null, null,'') returning remote_id into v_remote_id;   
  l_chunk_cnt  := ceil(bms_lob.getlength(c)/v_chunk_size);   
  for rec in (select dbms_lob.substr(c, v_chunk_size, ((level-1) * v_chunk_size) + 1) c_chunk
          ,level
    from   dual
  connect by level <= l_chunk_cnt) loop
      update EMPTRANS_ACTIVE_TEST@attlogdb set clob_column = clob_column||rec.c_chunk where remote_id = v_remote_id;
  end loop;

end;

【讨论】:

  • 谢谢@Arkadiusz update EMPTRANS_ACTIVE_TEST@attlogdb set clob_column = clob_column||rec.c_chunk where remote_id = v_remote_id;给出错误。 ORA-00932: 不一致的数据类型: 预期 CHAR 得到 LONG
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多