Этран ошибка 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.

Когда ORACLE выполняет хранимую процедуру, отчет
ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes.

Причина проблемы: процесс содержит dbms_output.putline (переменную), размер буфера составляет 10 000 бит, а количество напечатанных символов превышает ограничение.

Решение 1 Увеличьте буфер

set   serveroutput   on   size   1000000;

Решение 2 Установить буфер не ограничено

Добавьте DBMS_OUTPUT.ENABLE (buffer_size => null) после begin, чтобы указать, что выходной буфер не ограничен.

Вложение: Задайте команду в среде SQL * PLUS: set serveroutput on;
Метод dbms_output может выводить информацию. Кроме того, в Oracle SQL Developer должен быть открыт выход на сервер. PL / SQL может быть выполнен в ТЕСТОВОМ ОКНЕ, а распечатанный результат можно увидеть в выводе СУБД

The Impact

 The problem is because we had a partition splitting job which ran against the table and its going to give us an below error due to the either index or partition is not in a usable state. Other than that no major impacts. 

The Error

ORA-20000: index “<index_name>” or partition of such index is in unusable state

The Solution

You need to re-build the index or the partition of the index which is in an unusable state. The commands below will achieve this.

ALTER INDEX <index_name> REBUILD;

ALTER INDEX <index_name> REBUILD PARTITION <partition_name>;

You can then go ahead and re-run the stats gathering operation. Be aware that the rebuilding of this index may put additional load on your system, so think about when you do it. Also, if the index is invalid then you may have queries which are not running properly against this table if they would normally use the index.

ORA-20000: Insufficient privileges to analyze an object in Schema

Today I have experienced
a new error in my database. We have oracle jobs scheduled to analyze the tables
in a schema(PNYDV) , runs in frequent intervals. The job is created in the system schema. The code is as follows:

SQL>
sho user

USER
is «SYSTEM»

SQL>   DECLARE

  2     
X NUMBER;

  3   
BEGIN

  4     
SYS.DBMS_JOB.SUBMIT

  5       
( job       => X

  6        
,what      => ‘GATHER_ PNYDV_STATS;’

  7        
,next_date => to_date(’24/11/2011 07:22:18′,’dd/mm/yyyy hh24:mi:ss’)

  8        
,interval  =>
‘TRUNC(SYSDATE+7)+8/24’

  9        
,no_parse  => TRUE

 10       
);

 11     
SYS.DBMS_OUTPUT.PUT_LINE(‘Job Number is: ‘ || to_char(x));

 12   
END;

 13    / 

  commit;

We
created a procedure (GATHER_ PNYDV _STATS) to analyze the schema PNYDV in the system schema. It is
as follows

SQL>
CREATE OR REPLACE PROCEDURE «GATHER_PNYDV_STATS» AS

  2 
BEGIN

  3   
EXECUTE IMMEDIATE ‘ALTER SESSION SET HASH_AREA_SIZE=2147483647’;

  4   
EXECUTE IMMEDIATE ‘ALTER SESSION SET SORT_AREA_SIZE=2147483647’;

  5   
DBMS_STATS.GATHER_SCHEMA_STATS(ownname => ‘PNYDV’,method_opt =>
‘FOR ALL INDEXED COLUMNS SIZE AUTO’, CASCADE => TRUE);

  6  END;

  7  /

Procedure
created.

Error:

The job ran as per the scheduled
time. We got an alert in the logfile when the job ran as per the scheduled
time, an error occurred in the alert log file as in the below format.

ORA-20000:
Insufficient privileges to analyze an object in Schema

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

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

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

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

ORA-06512:
at «SYSTEM.GATHER_ PNYDV_STATS», line 5

ORA-06512:
at line 1

I
researched on the error but I did not get the result. Then I googled for the solution
and got to know that the system user should have the privilege ANALYZE ANY to
analyze the non system tables(other schema tables). I granted the ANALYZE ANY  privilege to system user and rescheduled the job. It ran successfully.

SQL>
conn / as sysdba

Connected.

SQL>
grant ANALYZE ANY to system;

Grant
succeeded.

SQL>
conn system/*****

Connected.

SQL>
exec GATHER_PNYDV_STATS;

PL/SQL
procedure successfully completed.

Cause:

                SYSTEM user doesn’t have the
privilege to analyze any non system table(Other schema’s table).

Solution:

·        
Grant
the ANALYZE ANY privilege to the SYSTEM user.

·        
Create
the procedure and the job under the particular schema which has to be analyzed (under PNYDV schema in my case)

I use Oracle 11g express. I try to install sample database HR. From cmd

sqlplus
system
123456

enter image description here

Error:
enter image description here

Comment created.


Commit complete.

BEGIN dbms_stats.gather_schema_stats(          'HR'                            ,                granularity => 'ALL'            ,                cascade => TRUE                 ,                block_sample => TRUE            ); END;

*
ERROR at line 1:
ORA-20000: Schema "HR" does not exist or insufficient privileges
ORA-06512: at "SYS.DBMS_STATS", line 3701
ORA-06512: at "SYS.DBMS_STATS", line 24470
ORA-06512: at "SYS.DBMS_STATS", line 24435
ORA-06512: at line 1

How I install sample database HR correctly?

asked Apr 12, 2016 at 4:38

Raphaël Colantonio's user avatar

2

Apparently the statement to create the user hr was not executed correctly, and despite that the execution of the hr_main.sql script is not stopped.

This worked for me:

Once as sysdba:

SQL> alter session set «_ORACLE_SCRIPT»=true;
Session altered.
SQL> create user hr identified by hr;
User created.
SQL> drop user hr cascade;
User droped.
SQL> @?/demo/schema/human_resources/hr_main.sql

User created.

answered Jul 28, 2019 at 1:20

Ikkiriu's user avatar

Navigate to the PDB container as SYS user before executing the script

[oracle@af18354c958e /]$ sqlplus sys as sysdba
Enter password: password

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> alter session set container = ORCLPDB1
SQL> @hr_main.sql

specify password for HR as parameter 1:
Enter value for 1: hr

specify default tablespeace for HR as parameter 2:
Enter value for 2: users

specify temporary tablespace for HR as parameter 3:
Enter value for 3: temp

specify log path as parameter 4:
Enter value for 4: $ORACLE_HOME/demo/schema/log/

answered Nov 12, 2018 at 17:36

Nanditha's user avatar

NandithaNanditha

531 silver badge6 bronze badges

4

The problem is the line

create user hr identified by 123456a@

Because user is not created, you are getting other errors.

To resolve it do either of below

  • Remove special character from password. Or use underscores _ in password.

    create user hr identified by 123456a
    

    OR

  • Try enclosing password in double quotes. (I am not able to test it now. But if it doesn’t work, try first option. I referred this link)

    create user hr identified by "123456a@"
    

answered Apr 12, 2016 at 5:44

Utsav's user avatar

UtsavUtsav

7,8742 gold badges16 silver badges37 bronze badges

0

Понравилась статья? Поделить с друзьями:
  • Этот метод позволит повысить эффективность труда ошибка
  • Этот фильм настоящий бестселлер лексические ошибки
  • Этот мальчик ужасный соня исправить ошибку
  • Этот фильм настоящий бестселлер исправить ошибку
  • Этот костюм мне менее велик чем тот ошибка