Меню

Этран ошибка ora 20000

ORA-20000 Unable to Set Values for Index XX: Does Not Exist or Insufficient Priv is Raised While Executing Impdp (Doc ID 2176364.1)

There are two users (USER_A / USER_B) and each user has objects as below and statistics are gotten for them.

USER_A:
1. btree_tbl(table) and btree_index(normal index)
2. bitmap_tbl(table) and bitmap_index(bitmap index)

USER_B:
1. btree_tbl(table) and btree_index(normal index)

Then execute expdp as USER_A:

expdp USER_A/USER_A directory=test_dir dumpfile=exp_data.dmp include=statistics tables=btree_tbl reuse_dumpfiles=y

And execute impdp as USER_B:

impdp USER_B/USER_B directory=test_dir dumpfile=exp_data.dmp remap_schema=user_a:user_b

Because expdp is using «tables=btree_tbl», statistics for only this table should be exported.

But the error is for bitmap_index of bitmap_tbl table which is not imported.

Testcase below reproduces the problem:

conn / as sysdba

— Create user and directory
create user USER_A identified by USER_A default tablespace users;
grant dba to USER_A;
grant unlimited tablespace to USER_A;
create user USER_B identified by USER_B default tablespace users;
grant dba to USER_B;
grant unlimited tablespace to USER_B;
create or replace directory TEST_DIR as ‘/tmp’;
grant read, write on directory TEST_DIR to USER_A;
grant read, write on directory TEST_DIR to USER_B;

— Create objects for USER_A
conn USER_A/USER_A
show user
create table btree_tbl (col1 number(1), col2 number(2));
create index btree_index on btree_tbl (col1);
create table bitmap_tbl (col1 number(1), col2 number(2));
create bitmap index bitmap_index on bitmap_tbl (col1);
exec DBMS_STATS.GATHER_TABLE_STATS(ownname => ‘USER_A’ ,tabname => ‘BTREE_TBL’);
exec DBMS_STATS.GATHER_TABLE_STATS(ownname => ‘USER_A’ ,tabname => ‘BITMAP_TBL’);

— Create objects for USER_B
conn USER_B/USER_B
show user
create table btree_tbl (col1 number(1), col2 number(2));
create index btree_index on btree_tbl (col1);

— Execute expdp and impdp
!expdp USER_A/USER_A directory=test_dir dumpfile=exp_data.dmp include=statistics tables=btree_tbl reuse_dumpfiles=y
!impdp USER_B/USER_B directory=test_dir dumpfile=exp_data.dmp remap_schema=user_a:user_b

Changes

Cause

To view full details, sign in with your My Oracle Support account.

Don’t have a My Oracle Support account? Click to get started!

In this Document

My Oracle Support provides customers with access to over a million knowledge articles and a vibrant support community of peers and Oracle experts.

Oracle offers a comprehensive and fully integrated stack of cloud applications and platform services. For more information about Oracle (NYSE:ORCL), visit oracle.com. � Oracle | Contact and Chat | Support | Communities | Connect with us | Facebook | Twitter | Linked In | Legal Notices | Terms of Use

Обработка ошибок Oracle PL / SQL

Я создал триггер, который позволяет пользователю иметь только 10 текущих размещенных заказов. Итак, теперь, когда клиент пытается разместить заказ номер 11, база данных Oracle выдает ошибку. Ну 3 ошибки.

ORA-20000: В настоящее время обрабатывается 10 или более заказов.

ORA-06512: в «C3283535.TRG_ORDER_LIMIT», строка 12

ORA-04088: ошибка при выполнении триггера C3283535.TRG_ORDER_LIMIT

Самая главная ошибка — это ошибка, которую я создал с помощью:

Raise_application_error (-20000, ‘Сейчас обрабатывается 10 или более заказов.’);

Я просто задавался вопросом после поиска и пробовал много способов, как изменить сообщения об ошибках для двух других ошибок или даже не показывать их все вместе пользователю?

Вот код, который я использовал

Большое спасибо Ричард

3 ответа

Распространение исключения происходит от внутреннего блока к внешнему, в отличие от области видимости переменной, которая идет от внешнего блока к внутреннему. Дополнительные сведения об этом можно найти в главе 5 «Программирование с помощью PL / SQL» Маклафлина.

Здесь вы получаете стек исключений — исключения, возникающие из самых внутренних блоков в самые внешние блоки.

Когда вы вызываете исключение из триггера, ваш оператор raise_application_error возвращает ошибку.

Затем он передается в блок триггера, который говорит ORA-06512: at «C3283535.TRG_ORDER_LIMIT», line 12 . Это связано с тем, что триггер обрабатывает возникшее исключение как ошибку и прекращает работу.

Затем ошибка распространяется на сеанс, который вызывает ORA-04088: error during execution of trigger ‘C3283535.TRG_ORDER_LIMIT’ . Эта ошибка сообщает нам, где и в какой части программы возникла ошибка.

Если вы используете интерфейсную программу, такую ​​как Java Server Pages или PHP, вы обнаружите возникшую ошибку — сначала 20000. Таким образом, вы можете показать то же самое конечному пользователю.

РЕДАКТИРОВАТЬ:

Что касается первой ошибки — ORA-20000 , вы можете изменить ее в самой инструкции RAISE_APPLICATION_ERROR .

Если вы хотите обработать ORA-06512 , вы можете использовать ответ Удая Шанкара, который поможет устранить эту ошибку и отобразит соответствующее сообщение об ошибке.

Но вы все равно получите последний ORA-04088 . Если бы я был у вас, я бы не волновался, так как после получения ORA-20000 я бы вызвал ошибку приложения в самом интерфейсе, скрывая при этом все остальные детали от пользователя.

Фактически, это природа стека исключений Oracle. Возникают все ошибки от самого внутреннего до самого внешнего блока. Это часто помогает нам определить точный источник ошибки.

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

ORU-10027: buffer overflow, limit of 100000 bytes

I am getting below error while generating 100k record in PL/SQL. I have created a package and calling that package from anonymous block.

I am using below line to print log

I have read some of the answers and they have suggested to use below.

I dont know where in package I should put the same? will it solve the problem? I put below in my anonymous block but it dit not help

user avatar

2 Answers 2

If at all logging to a server side file is an option,then UTL_FILE is the best bet.It doesn’t complain about buffer overflow.

You can open the file in read-only mode and can see the progress as the records are written while the script is running.This is a bonus.

If you’re blowing the limits of DBMS_OUTPUT you should probably use a logging table to record your trace messages.

Being an Oracle built-in library, DBMS_OUTPUT has the advantage of availability. That is its only advantage. Its output is hard to search, a problem which is logarithmic to the size of output. It is not persistent. It is troublesome to manage in other environments.

Unfortunately Oracle does not provide a PL/SQL logger utility but you don’t have to write your own (unless you want to). Use Tyler Muth’s third-party library. It is the closest thing we have to an industry standard. Find it on GitHub.

Вопрос:

Я создал триггер, который позволяет пользователю иметь 10 текущих размещенных заказов. Итак, теперь, когда клиент пытается разместить номер заказа 11, база данных оракула возвращает ошибку. Ну, 3 ошибки.

ORA -20000: В настоящее время у вас 10 или более заказов.

ORA-06512: в строке “C3283535.TRG_ORDER_LIMIT”, строка 12

ORA-04088: ошибка во время запуска триггера C3283535.TRG_ORDER_LIMIT ‘

Верхняя ошибка – это то, что я создал, используя:

raise_application_error (-20000: “В настоящее время у вас 10 или более заказов”.);

Я просто задался вопросом после поиска и пытался много способов изменить сообщения об ошибках для двух других ошибок или даже не показать их всем вместе с пользователем?

Вот код, который я использовал

    create or replace trigger trg_order_limit
before insert on placed_order for each row
declare
v_count number;
begin
-- Get current order count
select count(order_id)
into   v_count
from   placed_order
where  fk1_customer_id = :new.fk1_customer_id;

-- Raise exception if there are too many
if v_count >= 10 then
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, 'You currently have 10 or more orders  processing.');
end if;
end;

Большое спасибо Ричард

Лучший ответ:

Происхождение исключения идет от внутреннего к внешнему блоку, в отличие от переменной области, которая идет от внешнего к внутреннему блоку. Для получения дополнительной информации об этом, прочитайте “Макрофлин” “Программирование с помощью PL/SQL”, глава 5.

То, что вы получаете здесь, представляет собой стек исключений – исключения, полученные от самых внутренних блоков до самых внешних блоков.

Когда вы вызываете исключение из триггера, оператор raise_application_error возвращает ошибку.

Затем он распространяется на триггерный блок, который говорит ORA-06512: at "C3283535.TRG_ORDER_LIMIT", line 12. Это связано с тем, что триггер рассматривает повышенное исключение как ошибку и останавливается для продолжения.

Затем ошибка распространяется на сеанс, который вызывает ORA-04088: error during execution of trigger 'C3283535.TRG_ORDER_LIMIT'. Эта ошибка сообщает нам о том, где, как в какой части программы, была поднята ошибка.

Если вы используете внешнюю программу, такую как страницы сервера Java или PHP, вы сначала поймаете поднятую ошибку – 20000. Таким образом, вы можете отобразить то же самое для своего конечного пользователя.

РЕДАКТИРОВАТЬ :

О первой ошибке – ORA-20000, вы можете изменить ее в самой инструкции RAISE_APPLICATION_ERROR.

Если вы хотите обрабатывать ORA-06512, вы можете использовать ответ Uday Shankar, который поможет в ORA-06512 этой ошибки и отображает соответствующее сообщение об ошибке.

Но вы все равно получите последний ORA-04088. Если бы я был у вас на месте, я бы не стал беспокоиться, так как после получения ORA-20000 я бы поднял ошибку приложения на самой передней панели, скрывая все остальные данные от пользователя.

Фактически, это характер стека исключений Oracle. Возникают все ошибки от самого внутреннего до самого внешнего блока. Это очень полезно для нас, чтобы определить точный источник ошибок.

Ответ №1

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

EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, 'You currently have 10 or more orders processing.');

Ответ №2

Я вижу, что это довольно старый пост, но я думаю, что читатели должны знать, что

  1. Это фактически не обеспечивает соблюдение бизнес-правила (максимум 10 заказов). Если это просто “некоторый” номер, чтобы избежать слишком больших сумм, и вам все равно, если иногда у людей есть 12 заказов, тогда это может быть хорошо. Но если нет, подумайте о сценарии, когда у вас уже 9 заказов, а затем заказы для одного и того же клиента вставляются из двух разных сеансов/транзакций одновременно. В этом случае вы получите 11 заказов, не обнаружив эту ситуацию с переполнением. Таким образом, вы не можете полагаться на этот триггер на самом деле.
  2. Кроме того, вам может потребоваться перезапустить этот триггерный огонь при обновлении, если fk1_customer_id может быть обновлен (я видел реализации, где сначала NULL помещается в столбец FK, а затем обновляется до фактического значения). Вы можете подумать, реалистичен ли этот сценарий.
  3. В триггере есть основной недостаток. Вы находитесь внутри транзакции и внутри оператора, который в настоящее время выполняется, но еще не завершен. Итак, что, если вставка не является одной вставкой строки, а что-то вроде insert into placed_order (select... from waiting_orders...) что вы ожидаете от триггера?

Подобное бизнес-правило непросто обеспечить. Но если вы решите сделать это в триггере, вам лучше сделать это в триггер после инструкции (таким образом, не в триггере перед строкой). Триггер after after по-прежнему не будет видеть результаты других незафиксированных транзакций, но, по крайней мере, текущий оператор находится в определенном состоянии.

Фактически бизнес-правило МОЖЕТ принципиально применяться только в момент фиксации; но в базе данных Oracle нет такой вещи, как триггер ON-COMMIT. Вы можете сделать денормализацию количества записей в таблице клиентов (добавить столбец ORDER_COUNT) и поместить в эту таблицу отложенное ограничение (ORDER_COUNT <= 10). Но тогда вы все еще полагаетесь на правильное поддержание этого поля в своем коде.

Полностью надежная альтернатива, но несколько громоздкая, заключается в создании материализованного представления (что-то вроде SELECT fk_customer_id, count(*) order_count from placed_orders group by fk_customer_id, с FAST REFRESH ON COMMIT в таблице place_order и создания контрольного ограничения order_count <= 10 на материализованном виде. Это единственный способ надежно применять этот тип ограничений, не задумываясь о всех возможных ситуациях, таких как параллельные сеансы, обновления и т.д. Обратите внимание, что FAST REFRESH ON COMMIT замедлит вашу фиксацию, поэтому это решение не пригодно для больших объемов (вздох… Почему Oracle не предоставляет триггер ON COMMIT…)

Hi,

In our BW prod system update stats failed with the below error.

BR0301E SQL error -20000 in thread 2 at location stats_tab_collect-89, SQL statement:

‘EXECUTE stmt_1x’

‘BEGIN DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => ‘»SAPSR3″‘, TABNAME => ‘»/BIC/FZPS_C041″‘, ESTIMATE_PERCENT => 1, METHOD_OPT => ‘FOR COLUMNS SIZE 150 «KEY_ZPS_C041P» FOR COLUMNS SIZE 1 «/BIC/ZAMOU

NT»,»/BIC/ZAMOUNT1″,»/BIC/ZAMOUNT3″,»/BIC/ZAMOUNT4″,»/BIC/ZKF_LEHR2″,»/BIC/ZKF_LEHRS»,»/BIC/ZQUANTY1″,»/BIC/ZQUANTY2″,»/BIC/ZROPAMT1″,»/BIC/ZROPAMT2″,»AMOUNT»,»AMOUNTDP»,»AMOUNTPP»,»KEY_ZPS_C0411″,

«KEY_ZPS_C0412″,»KEY_ZPS_C0413″,»KEY_ZPS_C0414″,»KEY_ZPS_C0415″,»KEY_ZPS_C0416″,»KEY_ZPS_C0417″,»KEY_ZPS_C0418″,»KEY_ZPS_C0419″,»KEY_ZPS_C041A»,»KEY_ZPS_C041B»,»KEY_ZPS_C041T»,»KEY_ZPS_C041U»,»OPR_

ACTWRK»,»OPR_PLDWRK»,»QUANTITY»,»QUANT_AVRG»‘, DEGREE => NULL, GRANULARITY => ‘ALL’, CASCADE => TRUE, NO_INVALIDATE => FALSE); END;’

ORA-20000: partition «/BIC/FZPS_C0410000025043» of table «SAPSR3».»/BIC/FZPS_C041″ does not exist or insufficient privileges

ORA-06512: at «SYS.DBMS_STATS», line 23902

ORA-06512: at «SYS.DBMS_STATS», line 23953

ORA-06512: at line 1

BR0886E Collecting statistics failed for table SAPSR3./BIC/FZPS_C041

And when i re executed, it is successful.

Please help me finding out the cause for this.

Thanks

Padmini

Hi,

In our BW prod system update stats failed with the below error.

BR0301E SQL error -20000 in thread 2 at location stats_tab_collect-89, SQL statement:

‘EXECUTE stmt_1x’

‘BEGIN DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => ‘»SAPSR3″‘, TABNAME => ‘»/BIC/FZPS_C041″‘, ESTIMATE_PERCENT => 1, METHOD_OPT => ‘FOR COLUMNS SIZE 150 «KEY_ZPS_C041P» FOR COLUMNS SIZE 1 «/BIC/ZAMOU

NT»,»/BIC/ZAMOUNT1″,»/BIC/ZAMOUNT3″,»/BIC/ZAMOUNT4″,»/BIC/ZKF_LEHR2″,»/BIC/ZKF_LEHRS»,»/BIC/ZQUANTY1″,»/BIC/ZQUANTY2″,»/BIC/ZROPAMT1″,»/BIC/ZROPAMT2″,»AMOUNT»,»AMOUNTDP»,»AMOUNTPP»,»KEY_ZPS_C0411″,

«KEY_ZPS_C0412″,»KEY_ZPS_C0413″,»KEY_ZPS_C0414″,»KEY_ZPS_C0415″,»KEY_ZPS_C0416″,»KEY_ZPS_C0417″,»KEY_ZPS_C0418″,»KEY_ZPS_C0419″,»KEY_ZPS_C041A»,»KEY_ZPS_C041B»,»KEY_ZPS_C041T»,»KEY_ZPS_C041U»,»OPR_

ACTWRK»,»OPR_PLDWRK»,»QUANTITY»,»QUANT_AVRG»‘, DEGREE => NULL, GRANULARITY => ‘ALL’, CASCADE => TRUE, NO_INVALIDATE => FALSE); END;’

ORA-20000: partition «/BIC/FZPS_C0410000025043» of table «SAPSR3».»/BIC/FZPS_C041″ does not exist or insufficient privileges

ORA-06512: at «SYS.DBMS_STATS», line 23902

ORA-06512: at «SYS.DBMS_STATS», line 23953

ORA-06512: at line 1

BR0886E Collecting statistics failed for table SAPSR3./BIC/FZPS_C041

And when i re executed, it is successful.

Please help me finding out the cause for this.

Thanks

Padmini

  • Главная
  • Страховое сообщество
  • Помогите с СК МАКС

Помогите с СК МАКС

Доюрый. Товарищи, помогите! Не могу издать полис Макс осаго. Выдает сообщение «ORA-20000: Внимание! Необходимо обратиться в офис ЗАО „МАКС“ для проверки документов.», это после установки галочки на вкладке трансп средство «Соглашение о порядке выплаты суммы страхового возмещения » -«отказано».Что делаю не так???? Спасибо


2 комментария

  • Гость (гость)

    Ну и обращайся в филиал! Зачем засорять сайт глупыми вопросами!!!

  • Гость (гость)

    Pups.
    В единичных случая база не пропускает некоторых клиентов и ничего уже не сделаешь.Только клиент у обращаться в сам филиала Страховой Компании.

    так же хотелось бы предложит сотрудничество по Страховой компании Макс. У нас большие объемы продажи и не хватка бланков.Москва пишите на почту khorin.p@mail.ru

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Этот шоколад хорошее исправь ошибку
  • Этот человек стал для меня образцом благородства у которого я многому научился ошибка