Ora 20000 что за ошибка
Перейти к содержимому

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

Symptoms
Changes
Cause
Solution
References

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *