Oracle не может использовать локаторы больших объектов, выбранные из удаленных таблиц - PullRequest
0 голосов
/ 18 марта 2020

Как показано ниже, я хочу создать запись в другой базе данных удаленно, которая будет работать, когда я изменил c1 на некоторую строку в запросе на вставку, но когда я использую объект c1, это приведет к ошибке согласно заголовку.

Пожалуйста, обратите внимание: он работает нормально на том же пульте без @, и, используя объект c1, пробовал другое решение, но безрезультатно, может кто-нибудь помочь мне со скриптом для этого dbms_lob. И его удаленный к другому удаленному БД вставки

set define off;
Declare 
c1 clob default ' ';
begin 

dbms_lob.append(c1,chr(10));dbms_lob.append(c1,q'[DOCTYPE]');

Insert into SYSTEM_CONFIG@rtfqa (CONFIG_ID,NAME,VALUE_OLD,TYPE,SUB_TYPE,FROM_SYSTEM,TO_SYSTEM,VALUE) values ((select max(config_id)+1 from SYSTEM_CONFIG@rtfqa),'CONTRACT_HASHTAG_EN',null,'system','system',null,null,c1);
end; 

ОШИБКА

Insert into SYSTEM_CONFIG@rtfqa (CONFIG_ID,NAME,VALUE_OLD,TYPE,SUB_TYPE,FROM_SYSTEM,TO_SYSTEM,VALUE) values ((select max(config_id)+1 from SYSTEM_CONFIG@rtfqa),'CONTRACT_HASHTAG_EN',null,'system','system',null,null,c1);
end;

>Error report -  
>ORA-06550: line 7, column 148:  
>PL/SQL: ORA-22992: cannot use LOB locators selected from remote tables  
>ORA-06550: line 7, column 1:  
>PL/SQL: SQL Statement ignored  
>06550. 00000 -  "line %s, column %s:\n%s"   
>*Cause:    Usually a PL/SQL compilation error.  
>*Action:

sql developer 18.2.0
DB = Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

1 Ответ

0 голосов
/ 18 марта 2020

Существуют различные ограничения при использовании распределенных больших объектов. Одним из способов решения этой проблемы является работа с глобальной временной таблицей локального большого объекта следующим образом:

  • Создание global temporary table
  • Загрузка строки и манипулирование этим большим объектом в этом GTT
  • Используйте insert@remote as select from gtt, чтобы скопировать данные поверх

, который выглядит следующим образом:

create table t (
  c1 int, c2 clob
);

create global temporary table gtt as
  select * from t
  where  1 = 0;

declare
  v2 clob default ' ';
begin

  dbms_lob.append (
    v2,
    chr (10)
  );
  dbms_lob.append (
    v2,
    q'[DOCTYPE]'
  );

  insert into gtt (
    c1, c2 
  ) values (
    1, v2
  );

  insert into t@loopback 
    select * from gtt;

end;
/

select * from t;

C1   C2          
    1  
DOCTYPE  

Loopback - это ссылка на базу данных, указывающая на ту же базу данных для моделирования удаленная БД .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...