Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1

ТЕМА: Ошибка ORA-00164 в Oracle

Ошибка ORA-00164 в Oracle 19 июль 2011 00:57 #2449

  • Olessa
  • Olessa аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0
Всем привет!

Помогите, пожалуйста, разобраться со следующей проблемой.

Вобщем есть PLSQL скрипт , PLSQL пакет и PLSQL процедура. В скрипте происходт вызов процедуры из пакета и процедуры отдельной от пакета. При выполнении скрипта возникает ошибка ORA-00164: autonomous transaction disallowed within distributed transaction.
Структурно скрипт можно описать так:
declare
cursor cur is
select *
from clients@dblink;
begin
open cur;
-- 
fetch cur into yy;
-- 
if cur%notfound then
-- 
close cur;
exit;
-- 
end if;
-- 
close cur;
-- 
-- далее идет несколько селектов из другой базы
-- через db link. Селекты типа:
-- 
select *
into aa
from sale@dblink
where sale_id=yy.sale_id;--
-- потом вызывается процедура из пакета. в пакете
-- нету обращений к другой базе через линки.
-- 
package_body.package(yy.id,aa.name ...);
-- 
-- затем вызывается отдельная процедура в которой
-- нет обращения к другой базе через линк, но есть
-- автономная транзакция и как раз на этой процедуре
-- вознакие ошибка ORA-00164.
-- 
oth_procedure();
-- 
end;

Подскажите,пожалуйста, с чем связана ошибка и как ее можно побороть.
Заранее БОЛЬШОЕ спасибо!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Ошибка ORA-00164 в Oracle 19 июль 2011 01:02 #2450

  • Dior
  • Dior аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 41
  • Спасибо получено: 0

package_body.package(yy.id,aa.name ...);

Я думаю, что проблема тут во входных параметрах, которые хоть и независимые переменные, но наверняка имеют тип записи курсора открытого на удаленной базе. Возможно, что тип проверяется в run-time, отсюда и ошибка.

если б Вы привели тексты процедур полностью было бы понятней.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Ошибка ORA-00164 в Oracle 19 июль 2011 01:05 #2451

  • Gubin
  • Gubin аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0
Проблема состоит в том, что транзакции начинаются с COMMIT и заканчиваются COMMIT(ROLLBACK).

поскольку между:

> select *
> into aa
> from sale@dblink
> where sale_id=yy.sale_id;--


и процедурой прагмой AUTONOMOUS_TRANSACTION net COMMIT
то получается
ORA-00164: autonomous transaction disallowed within distributed transaction.

дальее автономная транзакция это то что явно оъявлено как AUTONOMOUS_TRANSACTION

-- затем вызывается отдельная процедура в которой
-- нет обращения к другой базе через линк, но есть
-- автономная транзакция и как раз на этой процедуре
-- вознакие ошибка ORA-00164.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Ошибка ORA-00164 в Oracle 19 июль 2011 01:06 #2452

  • Olessa
  • Olessa аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0
Т.е. что, мне надо поставить commit после селектов и до вызова процедуры?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Ошибка ORA-00164 в Oracle 19 июль 2011 01:07 #2453

  • Gubin
  • Gubin аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0
Ну вот тебе пример автономной транзакции...
create or replace
function is_another_module(p_course_id number, p_module_id number) return boolean is
pragma autonomous_transaction;
n number;
begin
select 1 into n from modules
where p_course_id = course_id and p_module_id <> module_id;
return true;
exception when no_data_found then return false;
when too_many_rows then return true;
when others then return false;

end;
/
show errors;

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Gubin.

Re: Ошибка ORA-00164 в Oracle 19 июль 2011 01:10 #2454

  • Joker
  • Joker аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0
Да, именно так. Тебе нужно commit'ом отделить транзакцию состоящую из выборок из через линк, от собственно обработки, которая уже локальная, и зовёт твою автономно-транзакционную процедуру.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1