Просмотр, чтобы определить, является ли столбец большого объекта пустым через ссылку на базу данных - PullRequest
1 голос
/ 31 января 2020

Новый столбец (типа BLOB) добавлен в таблицу удаленной базы данных. Приложение, которое я поддерживаю, читает эту таблицу через представление, которое является простым оператором выбора по ссылке на базу данных. Мне нужно обновить представление, чтобы у меня был доступ к новому столбцу.

По-видимому, вы не можете прочитать столбец больших объектов по ссылке в базе данных:

ORA-22992: невозможно использовать локаторы больших объектов, выбранные из удаленных таблиц

Пока мне просто нужно знать, есть ли в строках данные. Этот запрос работает безупречно:

select foo_id, foo_name, foo_date,
case
    when foo_binary is not null then 1
    else 0
end as has_foo_binary_data
from remote_table@remote_database;

Тем не менее, я не могу создать представление, пока не удалю выражение регистра:

create view remote_foo as
select foo_id, foo_name, foo_date,
case
    when foo_binary is not null then 1
    else 0
end as has_foo_binary_data
from remote_table@remote_database;

RA-22992: невозможно использовать выбранные локаторы больших объектов из удаленных таблиц

DBMS_LOB.GETLENGTH(foo_binary) запускает симпатичную ловушку-22:

ORA-02069: для параметра global_names должно быть установлено значение TRUE для этой операции

alter session set global_names = true`;
create view ...

ORA-02085: ссылка на базу данных remote_database подключается к remote_sid

Причина: ссылка на базу данных, подключенная к базе данных с другим именем. Соединение отклонено.

Действие: создайте ссылку на базу данных с тем же именем, что и база данных, к которой она подключается, или задайте global_names = false.

Не уверен, что я нажал стена или я просто делаю глупые ошибки. Есть ли способ получить любую информацию о CLOB (не о данных BLOB), которая работает в представлении?

1 Ответ

0 голосов
/ 31 января 2020

Вы уже опубликовали довольно много информации, поэтому я не собираюсь повторять все это.

Вот вариант, который вы, возможно, захотите рассмотреть; не идеальный, и зависит в порядке или нет. В любом случае:

Измените таблицу в удаленной базе данных и добавьте новый столбец:

alter remote_table add foo_binary_length number;

Заполните ее в триггере базы данных:

create or replace trigger trg_biu_remtab
  before insert or update on remote_table
  for each row
begin
  :new.foo_binary_length := dbms_lob.getlength(:new.foo_binary);
end;
/

Теперь это просто Задача создания представления в локальной базе данных:

create view remote_foo as
select foo_id, foo_name, foo_date,
case
    when foo_binary_length > 0 then 1      --> this
    else 0
end as has_foo_binary_data
from remote_table@remote_database;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...