
Learn the cause and how to resolve the ORA-01400 error message in Oracle.
Description
When you encounter an ORA-01400 error, the following error message will appear:
- ORA-01400: cannot insert NULL into («SCHEMA».»TABLE_NAME».»COLUMN_NAME»)
Cause
You tried to insert a NULL value into a column that does not accept NULL values.
Resolution
The option(s) to resolve this Oracle error are:
Option #1
Correct your INSERT statement so that you do not insert a NULL value into a column that is defined as NOT NULL.
For example, if you had a table called suppliers defined as follows:
CREATE TABLE suppliers ( supplier_id number not null, supplier_name varchar2(50) not null );
And you tried to execute the following INSERT statement:
INSERT INTO suppliers ( supplier_id ) VALUES ( 10023 );
You would receive the following error message:

You have defined the supplier_name column as a NOT NULL field. Yet, you have attempted to insert a NULL value into this field.
You could correct this error with the following INSERT statement:
INSERT INTO suppliers ( supplier_id, supplier_name ) VALUES ( 10023, 'IBM' );
Now, you are inserting a NOT NULL value into the supplier_name column.
I’m trying to insert a record into a table, but getting the error —
‘ORA-01400: cannot insert NULL into (….’. The table structure is:
I migrate from Mysql to Oracle.
On Mysql this works, but on Oracle it is not working. How can I fix this? Do I need write all column insert query or unselect not null option
![]()
asked Mar 6, 2013 at 12:25
9
Try this:
create or replace trigger EDITIONS_COR
before insert or update on EDITIONS
for each row
begin
if INSERTING then
select EDITIONS_SEQ.nextval into :new.ID from DUAL;
end if;
:new.CORDATE:=SYSDATE;
:new.USERNAME:=USER;
end;
![]()
ChrisF♦
133k31 gold badges255 silver badges324 bronze badges
answered Apr 17, 2014 at 17:07
Have you gotten the “ORA-01400: cannot insert null into (string)” error? Learn what causes this and how to resolve it in this article.
ORA-01400 Cause
If you try to run an INSERT statement to insert data into a table, you may get this error.
ORA-01400: cannot insert NULL into (string)
In Oracle databases, you can store a NULL value in any column of any data type, as long as the column is not defined as “NOT NULL” or is a primary key.
A NULL value is not the same as 0 or an empty string of ”.
When you attempt to insert a record into a table, and a value of NULL is being inserted into a column that does not allow NULL values, then this error will occur.
To resolve the ORA-01400 error, you have a few options:
- Change your INSERT statement so it inserts a value that is not NULL
- Change your table definition so that it allows for NULL values.
Let’s take a look at these solutions in more detail.
Solution 1: Adjust your INSERT Statement
To avoid the ORA-01400 error, you can adjust your INSERT statement to ensure that a non-NULL value is inserted.
Let’s see an example of this.
We have a customer table here:
CREATE TABLE customer (
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(100) NOT NULL,
email_address VARCHAR2(400)
);
The customer_id has been set as the primary key, which means it cannot take NULL values.
The customer_name field has the words NOT NULL after it. This means a NOT NULL constraint has been applied and NULL values are not allowed in this column.
The email_address column is allowed NULL values.
Now, let’s try insert a value.
INSERT INTO customer (customer_id, customer_name, email_address)
VALUES (1, 'John', '[email protected]');
This value is inserted successfully.
Now, let’s try specify a NULL value for the customer_name:
INSERT INTO customer (customer_id, customer_name, email_address)
VALUES (2, NULL, '[email protected]');
SQL Error: ORA-01400: cannot insert NULL into ("INTRO_USER"."TEST_CUSTOMER"."CUSTOMER_NAME")
01400. 00000 - "cannot insert NULL into (%s)"
*Cause: An attempt was made to insert NULL into previously listed objects.
*Action: These objects cannot accept NULL values.
The error appears because a NULL value is specified for the customer_name column, which is not allowed to have NULL values.
This could also happen with this statement. We have not specified the customer_name field in the INSERT statement columns, so a NULL value is used.
INSERT INTO customer (customer_id, email_address)
VALUES (3, '[email protected]');
SQL Error: ORA-01400: cannot insert NULL into ("INTRO_USER"."TEST_CUSTOMER"."CUSTOMER_NAME")
01400. 00000 - "cannot insert NULL into (%s)"
*Cause: An attempt was made to insert NULL into previously listed objects.
*Action: These objects cannot accept NULL values.
To resolve this, we need to ensure that a value of NULL is not added into this column.
Change the value of customer_name to something that is not NULL:
INSERT INTO customer (customer_id, customer_name, email_address)
VALUES (3, 'Sarah', '[email protected]');
Or, if you’re getting data from another source, surround your value with the NVL function, which translates a NULL value to something else.
INSERT INTO customer (customer_id, customer_name, email_address)
VALUES (3, NVL(input_name, 'Unknown'), '[email protected]');
If your values are coming from another system or source and definitely should not be NULL, then you might need to investigate the source of the data to find out why the values are NULL.
Solution 2: Change the Table Definition
Another way to resolve the ORA-01400 error is to change the definition of the table so that it allows for NULL values.
You can do this using the ALTER TABLE statement.
For example, to remove the NOT NULL constraint from the customer_name field in the customer table (mentioned above), you can run this command:
ALTER TABLE customer MODIFY COLUMN customer_name VARCHAR2(100);
This will remove the NOT NULL constraint from the table.
Now, you can insert a NULL value into this column.
INSERT INTO customer (customer_id, customer_name, email_address)
VALUES (4, NULL, '[email protected]');
Conclusion
So, that’s how you can resolve the ORA-01400 error.
It’s caused by inserting a NULL value into a column that cannot be NULL.
You can resolve it by adjusting your INSERT statement or modifying your table.
Lastly, if you enjoy the information and career advice I’ve been providing, sign up to my newsletter below to stay up-to-date on my articles. You’ll also receive a fantastic bonus. Thanks!
ORA-01400 means that there’s a column which was found as NOT NULL is not listed in the INSERT statement, you have to provide a value for it. For example, I tried to insert a row into a table.
SQL> conn hr/hr
Connected.
SQL> insert into hr.countries (country_id, country_name) values ('SE', 'Sweden');
insert into hr.countries (country_id, country_name) values ('SE', 'Sweden')
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("HR"."COUNTRIES"."REGION_ID")
Let’s describe the table’s definition.
SQL> desc hr.countries;
Name Null? Type
----------------------------------------- -------- ----------------------------
COUNTRY_ID NOT NULL CHAR(2)
COUNTRY_NAME NOT NULL VARCHAR2(40)
REGION_ID NOT NULL NUMBER
As you can see, the column is NOT NULL which is one type of constraints to keep data integrity.
Please note that, not only in a normal INSERT, but also in import, SQL Loader, Golden Gate, Hibernate and Informatica could see ORA-01400 sometimes. Especially for data import which includes imp of original import and impdp of data pump.
As for JDBC exception handling, sometimes the error message may not be so obvious because it’s related to constraint violation signals, but fortunately the error stack that companies with ORA-01400 is mostly the same:
- java.sql.SQLException
- java.sql.SQLNonTransientException
- java.sql.SQLIntegrityConstraintViolationException
Solutions to ORA-01400
Now, we can have 3 choices to solve ORA-01400.
- Put the Column on the List of INSERT
- Remove NOT NULL constraint from the Column
- Provide a default Value for the Column
1. Put the Column on the List of INSERT
You have to modify the statement and provide a proper value to it at run-time.
SQL> insert into hr.countries (country_id, country_name, region_id) values ('SE', 'Sweden', 1);
1 row created.
It’s successful. Now we have to revert the operation for later steps.
SQL> rollback;
Rollback complete.
I know, sometimes, you don’t have any proper value of this column. So you can go for the next choice.
2. Remove NOT NULL constraint from the Column
You can either disable the constraint or drop it, but the drawback is that you have to change the definition of the table, the data integrity may be compromised.
Disable the constraint
Let’s check which constraint should be disabled from the column.
SQL> column constraint_name format a25;
SQL> select a.constraint_name, b.status from user_cons_columns a inner join user_constraints b on a.constraint_name = b.constraint_name where a.table_name = 'COUNTRIES' and a.column_name = 'REGION_ID' and b.constraint_type = 'C' and search_condition_vc like '%NOT NULL';
CONSTRAINT_NAME STATUS
------------------------- --------
SYS_C007819 ENABLED
Then we disable the constraint by ALTER TABLE DISABLE CONSTRAINT.
SQL> alter table countries disable constraint SYS_C007819;
Table altered.
Check the status again.
SQL> select a.constraint_name, b.status from user_cons_columns a inner join user_constraints b on a.constraint_name = b.constraint_name where a.table_name = 'COUNTRIES' and a.column_name = 'REGION_ID' and b.constraint_type = 'C' and search_condition_vc like '%NOT NULL';
CONSTRAINT_NAME STATUS
------------------------- --------
SYS_C007819 DISABLED
SQL> desc countries;
Name Null? Type
----------------------------------------- -------- ----------------------------
COUNTRY_ID NOT NULL CHAR(2)
COUNTRY_NAME NOT NULL VARCHAR2(40)
REGION_ID NUMBER
As you can see, the constraint was removed, OK, just temporarily.
Drop the constraint
To remove the constraint permanently, you can drop it by ALTER TABLE DROP CONSTRAINT.
SQL> alter table countries drop constraint SYS_C007819;
Table altered.
SQL> select a.constraint_name, b.status from user_cons_columns a inner join user_constraints b on a.constraint_name = b.constraint_name where a.table_name = 'COUNTRIES' and a.column_name = 'REGION_ID' and b.constraint_type = 'C';
no rows selected
Dropping a NOT NULL constraint can be easier than the above statement. I guess you’d like to know more ways to add or drop a NOT NULL constraint.
No matter you disable or drop it, you can insert the row now.
SQL> insert into hr.countries (country_id, country_name) values ('SE', 'Sweden');
1 row created.
It’s successful. Now we have to revert the operation for later steps.
SQL> rollback;
Rollback complete.
SQL> alter table countries modify (region_id not null);
Table altered.
3. Provide a default Value for the Column
This could be the best solution to ORA-01400.
SQL> alter table hr.countries modify (region_id default 1);
Table altered.
SQL> insert into hr.countries (country_id, country_name) values ('SE', 'Sweden');
1 row created.
The best thing is that you don’t have to modify INSERT statements or remove NOT NULL constraints from the column. The business logic stays stable.
Abstract
Oracle Error ORA-01400 and ORA-00001
Body
Once every couple of months I will hear about our client getting the following Oracle error messages.
If you get one of these errors after restoring from backup or migrating to another server, please rebuild the sequence or Recreate Triggers:
1. ORA-01400: cannot insert NULL into («MAXIMO».»WORKPERIOD».»ROWSTAMP»)
RECREATE and ENABLE the TRIGGER
For Example:
create or replace TRIGGER WORKPERIOD_T
BEFORE INSERT OR UPDATE ON WORKPERIOD
FOR EACH ROW DECLARE NEXTVAL INTEGER;
BEGIN SELECT MAXSEQ.NEXTVAL INTO NEXTVAL FROM DUAL;
:NEW.ROWSTAMP := NEXTVAL; END;
COMMIT;
2. ORA-00001: unique constraint (MAXIMO.LOGINTRACKING_NDX1) violated
REBUILD THE ORACLE SEQUENCE
a) Run query: select MAX(LOGINTRACKINGID) from LOGINTRACKING
OUTPUT: 110
b) Drop the sequence in question:
DROP SEQUENCE LOGINTRACKINGSEQ;
c) Recreate the sequence as the recorded value+1.
create sequence LOGINTRACKINGSEQ start with 111;
commit;
[{«Business Unit»:{«code»:»BU059″,»label»:»IBM Software w/o TPS»},»Product»:{«code»:»SSLKT6″,»label»:»IBM Maximo Asset Management»},»Component»:»»,»Platform»:[{«code»:»PF025″,»label»:»Platform Independent»}],»Version»:»»,»Edition»:»»,»Line of Business»:{«code»:»LOB59″,»label»:»Sustainability Software»}}]
April 27, 2021
I got ” ORA-01400: cannot insert NULL into ” error in Oracle.
ORA-01400: cannot insert NULL into
Details of error are as follows.
ORA-01400: cannot insert NULL into (string)
Cause: An attempt was made to insert a NULL into the column "USER"."TABLE"."COLUMN".
For example, if you enter:
connect scott/tiger create table a (a1 number not null); insert into a values (null);
Oracle returns:
ORA-01400 cannot insert NULL into ("SCOTT"."A"."A1") : which means you cannot insert NULL into "SCOTT"."A"."A1".
Action: Retry the operation with a value other than NULL
To see if a table allows NULL values, use tthe SQL*Plus desc command on the table name:
cannot insert NULL into
This ORA-01400 errors are related with the NULL value for the not null or primary key columns.
For example; I have created test table and id column has NOT NULL constraint as follows.
CREATE TABLE ora_1400_error ( id NUMBER(12) NOT NULL, name VARCHAR2(100) );
When you insert any NULL value, you will get this error.
INSERT INTO ora_1400_error (id, name) VALUES (NULL, 'Ora-01400 error'); ORA-01400: cannot insert NULL into ID
You need to insert any not null value to this column as follows.
INSERT INTO ora_1400_error (id, name) VALUES (1400, 'Ora-01400 error');
Or you can drop or disable this NOT NULL Constraint to solve this error.
You can find the constraint of table as follows.
SQL> select a.constraint_name, b.status from user_cons_columns a inner join user_constraints b on a.constraint_name = b.constraint_name where a.table_name = 'ORA_1400_ERROR' and a.column_name = 'ID'; CONSTRAINT_NAME STATUS ------------------------- -------- SYS_C006334 ENABLED
You can disable the constraint as follows.
SQL> alter table ORA_1400_ERROR disable constraint SYS_C006334 ; Table altered.
Do you want to learn Oracle Database for Beginners, then read the following articles.
Oracle Tutorial | Oracle Database Tutorials for Beginners ( Junior Oracle DBA )
1,390 views last month, 2 views today
Автор признателен руководителям и сотрудникам ЗАО «Нефтегазсистемы»,
начальникам и персоналу вычислительных центров региональных управлений ОАО «Транснефть»,
c чьей помощью был разработан и внедрен данный Oracle-проект.
Возможные ошибки и методы их устранения
В
данном пункте приводится список ошибок с примерами сообщений на английском и
русском языке (через косую черту). Далее идет текст с указанием причины и
решения проблемы: сначала из фирменной документации, затем комментарий из
практики (чаще всего по решению проблемы, но иногда только по причине, если
решение проблемы ясно).
Ошибка ORA-00020
ORA-00020: maximum number of
processes (num) exceeded
/ превышено максимальное
количество процессов (ном)
По
документации:
Причина:
Операция потребовала ресурс,
оказавшийся недоступным. Максимальное количество процессов определяется
параметром инициализации PROCESSES.
Когда этот максимум превышается, никакие запросы больше обрабатываться не
могут.
Действие:
Повторите операцию еще раз через
несколько минут. Если это сообщение выдается часто, закройте ORACLE,
увеличьте параметр PROCESSES в файле
параметров инициализации, и запустите ORACLE вновь.
Из
практики:
Действие:
Требуется увеличить параметр PROCESSES в
файле INIT<SID>.ORA, причем для деф-сайта этот параметр должен
быть больше, чем для дест-сайта. Для БД СИСТЕМЫ было рекомендовано
установить этот параметр в 300 для дест-сайта и 400 для деф-сайта.
Ошибка ORA-00060
ORA-00060: deadlock detected
while waiting for resource
/ во время ожидания ресурса
произошла взаимоблокировка
По
документации:
Причина: Активный сеанс и какой-то другой сеанс, оба ожидающие
один и тот же ресурс, заблокировали друг друга. Это состояние известно как
взаимоблокировка. Для того, чтобы выйти из взаимоблокировки, надо сделать откат
(восстановить предыдущее состояние) одной или нескольких команд, таким образом
другой сеанс сможет продолжить работу.
Действие: Либо:
·
выдайте команду ROLLBACK и перезапустите все команды, входящие в последнюю транзакцию;
·
подождите, пока блокировка не
закончится (возможно, через несколько минут), и перезапустите те команды, на
которых произошел откат.
Из
практики:
Причина:
Ошибка может возникнуть при
перегенерации сайта на БД, куда был неудачно выполнен полный импорт БД другого
сайта (см. Часть 2, Глава 3: Перенос основной БД на сервер с другой ОС).
Действие: Попробуйте удалить мастер-группы вместе с объектами и
повторить генерацию сайта.
Ошибка ORA-00600
ORA-00600:
internal error code, arguments: [num],[?],[?],[?],[?],[?] ,[?],[?]
/ код внутренней ошибки,
аргументы: [ном],[?],[?],[?], [?],[?],[?],[?]
По
документации:
Причина:
Это общее внутреннее сообщение для
исключительных ситуаций программ ORACLE. Оно указывает, что процесс столкнулся с неожиданным
событием нижнего уровня. Причинами,
вызывающими это сообщение, могут быть:
·
истечение времени
ожидания;
·
поломка файла;
·
сбойные ситуации при проверке
данных в памяти;
·
сообщения ввода/вывода,
аппаратного обеспечения, памяти;
·
некорректно
восстановленные файлы.
Первый
аргумент — это номер внутреннего сообщения; другие аргументы — различные
числа, имена и символьные строки. (Для получения более полной информации см.
раздел «Обращение в службу поддержки пользователей ORACLE«.)
Числа могут меняться в зависимости от версии сервера ORACLE.
Действие:
Отправьте описание этой ошибки в
службу поддержки пользователей ORACLE, сопроводив его информацией о:
·
событиях, которые привели к
ошибке;
·
предпринятых вами действиях,
которые привели к ошибке;
·
состоянии операционной системы и ORACLE
на момент ошибки;
·
подробностях всех необычных
обстоятельств, предшествовавших получению сообщения ORA-00600;
·
содержимом всех файлов трассировок,
созданных в результате ошибки;
·
относящихся к этому случаю
реакциях сигнального файла.
Замечание:
необходимо знать предысторию ошибок,
произошедших в самое разное время до этой внутренней ошибки, поскольку именно
они и могут оказаться ее причиной.
Из
практики:
Действие:
Это одна из самых скверных ошибок.
При ее возникновении рекомендуется обратиться к группе технической поддержки Oracle.
Но существует также еще одна рекомендация: настройте работу в Oracle через
протокол IPC.
Ошибка ORA-01400
ORA-01400: cannot
insert NULL into (PLIPEKN.EDITIONS.ID)
/ Пропущен первичный ключ
или обязательный
(NOT NULL) столбец, или NULL во время операции INSERT
ORA-06512: at
«PLIPEKN.WORKS_LOG», line 16
ORA-04088: error
during execution of trigger ‘PLIPEKN.WORKS_LOG’
ORA-06512: at
«PLIPEKN.WORKS$RP», line 831
ORA-01085:
preceding errors in deferred rpc to «PLIPEKN.WORKS$RP. REP_UPDATE»
ORA-02063:
preceding 5 lines from PLI_NORD
По документации:
Причина: При вводе или редактировании записи Вы не задали
значение обязательного (NOT
NULL) столбца.
Действие: Задайте значение для каждого столбца NOT NULL или измените определение таблицы так, чтобы
разрешить устанавливать пустые значения столбцов.
Из
практики:
Причина:
Возникает при попытке сделать изменение
в таблице при отключенном или отсутствующем триггере EDITIONS_COR (который расчитывает и устанавливает системный
идентификатор записи ID).
Действие:
Включите (поставьте Enabled с
помощью Oracle Schema
Manager) либо создайте
триггер EDITIONS_COR:
create or replace
trigger EDITIONS_COR
before insert
or update on EDITIONS
for each row
begin
if INSERTING
then
select
EDITIONS_SEQ.nextval into :new.ID from DUAL;
end if;
:new.CORDATE:=SYSDATE;
:new.USERNAME:=USER;
end;
Ошибка ORA-01403
ORA-01403: data not found
/ данные не найдены
ORA-06512: на
«PLIPEKN.DRFEAT$RP», строки 321
ORA-01085: ошибка обработки в
задержанном rpc в «PLIPEKN.DRFEAT$RP. REP_UPDATE«
По
документации:
Причина: В программе на базовом языке были выбраны все записи.
Код возврата от операции FETCH равен +4. Это означает, что из запроса на были
извлечены все записи.
Действие: Прекратите обработку для данного оператора SELECT.
Из
практики:
Причина:
Ошибка ORA-01403 является большим сюрпризом. Она возникает в самом важном месте – при выполнении
удаленной транзакции, и, притом, из-за множества причин, большинство которых
Вам еще не известно. Эта трудно распознаваемая ошибка обязательно будет время
от времени у Вас возникать.
Действие:
Дело может быть в следующем: не
обновлено поле, по которому разрешаются конфликты (отключен или отсутствует
триггер ТАБЛИЦА_COR, который расчитывает и устанавливает поле CORDATE, по которому как раз и разрешаются конфликты методом Latest Timestamp — см. пример триггера _COR выше при описании ошибки ORA-01400). Эта ошибка не возникает, если транзакция по данной
записи идет одна, без встречной.
Ошибка ORA-01591
ORA-01591: lock held by
in-doubt distributed transaction 6.58.10015
/ блокировка, удерживаемая
распред. транзакцией 6.58.10015,
находящейся в неопр. сост.
По
документации:
Причина:
Была попытка доступа к ресурсу,
заблокированному «повисшей» распределенной транзакцией, находящейся в
состоянии подготовки.
Действие:
Для того, чтобы определить связь баз
данных и состояние транзакции, сравните номер транзакции в сообщении со
столбцом GLOBAL_TRAN_ID таблицы DBA_2PC_PENDING.
Попытайтесь исправить сетевое соединение для координатора и узла точки
завершения транзакции, если это необходимо. Если исправление временно невозможно,
обратитесь к администратору базы данных узла точки завершения транзакции (если
она известна), чтобы «протолкнуть» ожидающую какого-то действия
транзакцию.
Из
практики:
Причина:
Ошибка диагностирует возникновение
«смертельных объятий», зацикливании процессов друг на друге. Может возникнуть
при попытке удалить из мастер-группы дест-сайт, если одна из БД других
сайтов остановлена.
Действие:
Запустите БД всех сайтов и в
состоянии мастер-группы NORMAL повторите операцию.
Ошибка ORA-02049
ORA-02049: time-out:
distributed transaction waiting for lock
/ таймаут: распределенная
транзакция ждет блокировку
По
документации:
Причина:
Превышено время ожидания блокировки
распределенной транзакции. Это время задается в параметре инициализации DISTRIBUTED_LOCK_TIMEOUT.
Действие:
Эта ситуация трактуется как
тупиковая, поэтому происходит откат вашей команды. Установите в параметре
инициализации DISTRIBUTED_LOCK_TIMEOUT более длительный интервал времени ожидания; затем
закройте и перезапустите экземпляр СУБД.
Из
практики:
Причина:
Ошибка может порождаться при
возникновении «смертельных объятий», связанных с тем, что кончилось время
ожидания выполнения распределенной транзакции, заданное в конфигурационном
файле параметром DISTRIBUTED_LOCK_TIMEOUT.
Действие:
Увеличьте значение указанного
параметра и перезагрузите БД.
ПРИМЕЧАНИЕ 1.
На момент внедрения этот параметр можно снизить до 60
(1 мин), чтобы долго не ожидать результатов выполнения небольших тестов по
проверке репликации. Во время же эксплуатации лучше увеличить этот параметр,
например, до 300 (5 мин).
ПРИМЕЧАНИЕ 2.
Такое сообщение может появиться при выполнении
административных запросов, причем не адекватным образом, например, при переводе
группы в NORMAL, затем сразу в QUIESCED
(для проверки). Транзакций в этом случае быть не должно (кроме, возможно,
системных). Подождите немного и повторите попытку.
ПРИМЕЧАНИЕ 3.
Сообщение об этой ошибке однажды появилось при
одновременном добавлении сайта к двум мастер-группам (первой и последней),
причем таблицы обеих групп друг на друга не ссылались.
Ошибка ORA-02266
ORA-02266: unique/primary
keys in table referenced by enabled
foreign keys
/ таблица имеет некие уникальные/первичные
ключи,
на которые ссылаются внешние ключи
По
документации:
Причина: Была попытка уничтожить таблицу, хотя она имела еще
какие-то уникальные или первичные ключи, на которые имеются активные (enabled) ссылки внешних ключей.
Действие:
Перед удалением таблицы отключите все
ссылки внешних ключей на уникальные или первичные ключи. Посмотреть имеющиеся
ссылки и их статус Вы можете с помощью следующего SQL-запроса:
select
CONSTRAINT_NAME, TABLE_NAME, STATUS
from
USER_CONSTRAINTS
where
R_CONSTRAINT_NAME in (
select CONSTRAINT_NAME
from
USER_CONSTRAINTS
where
TABLE_NAME=’TABNAM’);
Из практики:
Причина:
Фирма Oracle
инструктирует, что эта ошибка возникает при попытке сделать DROP или TRUNCATE на
таблицу со связями. Но при репликации эта ошибка может возникнуть в случае,
если на дест-сайте таблица имеет статус Error.
Действие:
Для исправления ситуации требуется
приостановить мастер-группу (Suspend),
удалить таблицу (Remove) из
мастер-группы деф-сайта (не удаляя физически), дождаться удаления из дест-сайта,
затем опять ее добавить (Add) и
активизировать мастер-группу (Resume).
Ошибка ORA-02449
ORA-02449: unique/primary keys in table referenced by
foreign keys
/ уникальный/первичный
ключ в таблице,
на которую
ссылаются по внешнему ключу
По документации:
Причина: Была попытка уничтожить таблицу, хотя она имела еще
какие-то уникальные или первичные ключи, на которые ссылаются внешние ключи.
Действие:
Перед удалением таблицы удалите все
ссылки внешних ключей на уникальные или первичные ключи. Посмотреть имеющиеся
ссылки Вы можете с помощью следующего SQL-запроса:
select * from
USER_CONSTRAINTS where table_name = «TABNAM»;
Из практики:
Причина:
Возникает при попытке удалить таблицу
с первичным или уникальным ключем, если на нее ссылается другая таблица (см.
выше: ORA-02266).
Ошибка ORA-03113
ORA-03113:
end-of-file on communication channel
/ конец файла по
коммуникационному каналу
По документации:
Причина: По коммуникационному каналу передан сигнал
конца файла, который не был обработан соответствующим образом программным
обеспечением SQL*Net (двухзадачным программным обеспечением). Это
сообщение может быть выдано, если теневой двухзадачный процесс, связанный с SQL*Net, завершился ненормально, или же на устройстве связи
между процессами произошел физический сбой (сеть или сервер отключились от
коммуникации).
Действие: Если это сообщение было выдано при попытке
осуществить связь, проверьте установочные файлы для соответствующего драйвера SQL*Net и убедитесь, что программное обеспечение SQL*Net на сервере установлено правильно. Если сообщение было
выдано после того, как связь правильно установилась, и ошибка не связана с
физическим сбоем, проверьте файл трассировки, если таковой был создан на
сервере в момент сбоя. Существование файла трассировки может указать вам на то,
что эта ошибка — внутренняя ошибка ORACLE, требующая вмешательства
службы поддержки пользователей ORACLE.
Из практики:
При
возникновении этой ошибки рекомендуется посмотреть трассировочные файлы (обычно
находятся в каталоге RDBMS80TRACE). Как
правило, это связано с потерей связи или неисправностью на сервере, возникших
во время выполнения процесса в Oracle.
Эта
ошибка часто возникает при прохождении на сервер большого пакета транзакций или
подтверждений от них (см. Часть 2, Глава 3: Если пропала связь с сервером),
но может возникнуть и во время выполнения административных запросов (например,
одновременный запуск добавления достаточно больших таблиц в несколько
мастер-групп).
Конкретно
эта ошибка может возникнуть при попытке создания на удаленном сервере большой
таблицы (команда create table TAB as select * from USER.TAB@DBLINK или
аналогичный процесс в Мультимастере). В этом случае рекомендуется
послать администратору удаленного сервера дамп для импорта больших файлов
(можно целой группы или всей БД), а затем лишь сгенерить репликационную
поддержку для этих таблиц.
Ошибка ORA-04030
ORA-04030: out of
process memory when trying to allocate 524316 bytes
(pga heap, KSFQ Buffers)
/ выход за пределы
памяти процесса при попытке выделить
524316 байт (стр)
По
документации:
Причина:
Собственная память системного
процесса исчерпана.
Действие:
Попросите администратора базы данных
или администратора операционной системы увеличить квоту памяти процессу. В
приложении может быть ошибка, которая и приводит к чрезмерному потреблению
памяти процесса.
Из
практики:
Выделяемая
под процессы память на сервере исчерпалась. Причины могут быть разные. На Netware-сервере
это обычно происходит при фрагментации кэш-памяти и помогает только
перезагрузка сервера.
Ошибка ORA-04052
ORA-04052: error
occurred when looking up remote object
REPADMIN.SYS @ULAN.WORLD
/ ошибка возникла
во время поиска удаленного объекта
REPADMIN.SYS
@ULAN.WORLD
ORA-00604: error
occurred at recursive SQL level 2
ORA-12154:
TNS:could not resolve service name
ORA-06512: at
«SYS.DBMS_REPCAT_MAS», line 674
ORA-06512: at
«SYS.DBMS_REPCAT», line 516
ORA-06512: at line 2
По
документации:
Причина:
Ошибка возникла во время поиска
удаленного объекта.
Действие:
Исправьте ошибку. Убедитесь, что на
удаленной базе данных были запущены все необходимые командные файлы создания
представлений данных, используемых для запроса/поиска объектов базы данных. См.
книгу Сервер ORACLE7. Руководство администратора.
Из практики:
Причина: Ошибка может возникнуть при ручном «толкании»
административных запросов (Apply all admin requests now).
Действие: Посмотрите, не «уронили» ли Вы при этом сервер. Если
да – перезапустите его.
Ошибка ORA-06502
ORA-06502: PL/SQL:
numeric or value error
/ PL/SQL: ошибка в числе или в
значении
По документации:
Причина: Произошла ошибка арифметическая, числовая, строковая,
преобразования или правила целостности. Например, такая ошибка может произойти
при попытке присвоить значение NULL
переменной, описанной как NOT NULL, или при
попытке присвоить целое, больше переменной, описанной как NUMBER(2).
Действие: Измените данные, которыми вы манипулируете, или их
описание таким образом, чтобы они не противоречили друг другу.
Из практики:
Причина:
Ошибка может возникнуть при
перегенерации сайта на БД, куда уже был выполнен полный импорт БД другого сайта
(см. Часть 2, Глава 3: Перенос основной БД на сервер с другой ОС).
Действие: Необходимо удалить мастер-группы вместе с объектами и
повторить генерацию сайта (на самом деле так просто отделаться от этой ошибки
не всегда удается).
Ошибка ORA-12011
ORA-12011: execution of 1
jobs failed
/ сбой при выполнении 1
задания
ORA-06512: at «SYS.DBMS_IJOB», line 255
ORA-06512: at «SYS.DBMS_JOB»,
line 218
ORA-06512: at line 2
По
документации:
Причина:
DBMS_IJOB.RUN обнаружил ошибку. Запуск одного или нескольких
заданий привел к ошибке, которую не удалось обработать.
Действие:
Посмотрите в журнале предупреждений,
какое задание не смогло запуститься и почему.
Из
практики:
Причина:
Ошибка возникает при попытке
запустить задачу PUSH, которая до этого
находилась в состоянии BROKEN, причем, предварительный перевод ее в состояние NORMAL не помогает –
задача или сама через некоторое время устанавливается в BROKEN, или это происходит после попытки ее запустить. Это может произойти по
причине выполненного ранее выполнилось автоматически при установке в это
состояние пакета транзакций).
Ошибка ORA-23308
ORA-23308: object
PLIPEKN.COUNTRY$RU does not exist or is invalid
/ объект PLIPEKN.COUNTRY$RU
либо неправильный,
либо не
существует
По
документации:
Причина:
Указанное имя введено неправильно или
пусто, заданный тип неправилен, объект не является правильным объектом базы данных
или не существует как тиражируемый объект с соответствующим состоянием.
Действие:
Проверьте, что объект существует,
доступен пользователю и, если требуется, является правильным объектом в списке ALL_REPOBJECT.
Из
практики:
Причина:
Ошибка возникает при несоответствии
структуры таблицы одного сайта с другим (например, при перегенерации
репликационной поддержки).
Действие:
Тщательно сверьте структуру указанной
таблицы на деф-сайте и дест-сайте. Возможно, на деф-сайте
была изменена ее структура, типы полей или ограничения вне DDL-механизма ORM.
ВНИМАНИЕ
!
Эта ошибка может создать заколдованный круг: при ее удалении на дест-сайте вне
DDL-механизма ORM остаются неудаленными $RP и $RR модули и операции Remove
затем Add для этой таблицы на деф-сайте вызывает ошибку.
Удаление вышеназванных модулей тоже не помогает. Не помогает также
соответствующая операция alter
table для этой таблицы в БД дест-сайта
(вне ORM). При попытке удаления этой таблицы из мастер-группы деф-сайта
(с тем, чтобы это удаление распространилось на дест-сайт) также
возникает ошибочный административный запрос, поскольку из мастер-группы дест-сайта
в этом случае нельзя удалить таблицу с несоответствующей структурой.
Рекомендуется следующее: сделайте соответствующую
операцию alter
table для этой таблицы в БД дест-сайта
через механизм ORM. Если при этом также возникнет ошибка можно поступить
иначе: удалите таблицу из БД дест-сайта с помощью SQL*Plus
(отключив предварительно ограничения) и создайте заново (можно пустую). Затем
можно попытаться удалить эту таблицу из мастер-группы деф-сайта,
подождать окончания административного запроса на обоих сайтах и вновь добавив
таблицу в мастер-группу. Если и это не поможет, то пересоздайте всю
мастер-группу путем удаления и последующего подключения к ней этого сайта с
отключенной опцией Use
existing object.
Ошибка ORA-23309
ORA-23309: object
PLIPEKN.COUNTRY of type TABLE exists
/ объект PLIPEKN.COUNTRY типа
TABLE существует
По документации:
Причина: Объект уже существует в том же пространстве имен,
возможно с другим типом или формой.
Действие: Удалите объект или повторите запрос со значением
TRUE логического параметра RETRY или USE_EXISTING_OBJECT.
Из
практики:
Причина:
Ошибка может возникнуть после
добавления на мастер-группу деф-сайта нового дест-сайта, если на дест-сайте
уже есть такая таблица, но ее структура другая. Ошибка возникает независимо от
того, была ли включена или отключена опция Use existing object при создании мастер-группы и включении в нее таблиц
на дест-сайте.
Действие:
Удалите эту таблицу в БД дест-сайта
и повторите добавление этого сайта на мастер-группу дест-сайта.
Ошибка ORA-23312
ORA-23312: not
the masterdef according to …
/ не masterdef согласно …
По документации:
Причина: Имя схемы пусто или неправильно введено,
запрашиваемая заданная база данных не является оригиналом, или один из
оригиналов не считает вызываемую базу данных оригиналом.
Действие:
Если заданное имя схемы и оригинала
правильны, соединитесь с оригиналом и повторите запрос, или переместите masterdef, использовав RELOCATE_masterdef.
Из
практики:
Причина:
Ошибка может возникнуть при
перегенерации репликационной поддержки для сайта, где объекты имеют статус Error (см. Часть 2, Глава 3: Работа с административными запросами, Решение
проблем при создании мастер-групп).
Действие: Удалите всю группу с объектами с этого сайта (или
только Error-объекты) и перегенерите репликацию.
Ошибка ORA-23313
ORA-23313: object
group PLIPEKN7 is not mastered at PLI_BONN.WORLD
/ схема PLIPEKN7 не явл.главной для PLI_BONN.WORLD
По документации:
Причина:
Имя схемы пусто или неправильно
введено, запрашиваемая база данных не является оригиналом или запрашиваемая
база данных не считает заданную базу данных оригиналом.
Действие:
Если заданное имя схемы правильно,
соединитесь с текущим оригиналом и повторите запрос, установите запрашиваемую
базу данных оригиналом с помощью ADD_MASTER_DATABASE или используйте SWITCH_SNAPSHOT_MASTER, если запрашиваемая база данных является узлом копии.
Из практики:
Причина:
Ошибка возникает, если мастер-БД с
мастер-группы деф-сайта уже удалена.
Ошибка ORA-23374
ORA-23374: object
group PLIPEKN0 already exists
/ мастер—группа PLIPEKN0 уже существует
ORA-06512: at
«SYS.DBMS_SYS_ERROR», line 86
ORA-06512: at
«SYS.DBMS_REPCAT_MAS», line 1598
ORA-06512: at
«SYS.DBMS_REPCAT», line 113
ORA-06512: at line 2
По документации:
Причина: Данная мастер-БД уже реплицирована данной
мастер-группой.
Действие: Выберите другую мастер-группу или мастер-БД.
Из практики:
Причина:
Ошибка возникает при попытке
«прицепить» дест-сайт к мастер-группе деф-сайта, если на этом дест-сайте
такая мастер-группа уже существует. Эта ситуация возникает, если сайт пытаются
пересоздать (см. Часть 2, Глава 3: Пересоздание дест-сайта), для чего
сначала его «отрывают» от мастер-группы деф-сайта, а потом (переведя ее
в состояние QUIESCED) пытаются опять присоединить.
Действие: Удалите в режиме NORMAL мастер-группу с дест-сайта
со всеми ее объектами, т.е. отметьте опцию Drop all objects in the group (на предупреждение, что объекты группы сохранятся на
других сайтах – нажмите OK). Затем повторите присоединение (Properties… => Destinations => Add… => Asysnc, Use
existing objects, Copy row
data).
SQL-команды по анализу и управлению репликацией
Нижеприведенные команды SQL и PL/SQL окажутся для администратора Oracle
полезными и часто необходимыми для.
анализа и управления распределенными транзакциями. Полный синтаксис
использования DBMS-процедур и структура представлений Словаря данных
приводятся в Приложении 3 и Приложении 4, соответственно.
Анализ объектов в мастер-группе
·
Поиск мастер-группы для таблицы
(например, BRANCH):
select GNAME from
ALL_REPOBJECT
where
ONAME=’BRANCH’ and TYPE=’TABLE’;
·
Кол-во записей по всем таблицам
мастер-группы (пример для PLIPEKN0). Используйте скрипт RowCntMg.sql (предварительно исправив в нем название нужной
мастер-группы или аналогичные скрипты для каждой мастер-группы: RwCntMg0.sql, …, RwCntMg7.sql), который формирует скрипт Temp.sql и запускает его
(создан по прототипу известного скрипта TabCount.sql автора Peter Koletzke):
Листинг скрипта
на подсчет записей всех таблиц БД
set echo off
set feed off
set term off
set head off
set pages 10000
col L newline
————————————————————
spool temp.sql
————————————————————
prompt set head off
prompt set feed off
prompt set term on
prompt set recsep off
—prompt set echo off
prompt variable iC number;;
prompt execute :iC:=0;;
prompt begin
select
‘select :iC + count(*) into :iC’,’from
‘||T.TABLE_NAME||’;’ L
from
ALL_REPOBJECT R, USER_TABLES T
where
R.GNAME=’PLIPEKN0′ and R.TYPE=’TABLE’ and
R.ONAME = T.TABLE_NAME
/
prompt end;;
prompt /
prompt select :iC from DUAL;;
—prompt set feed on
spool off
————————————————————
set term on
set pages 0
————————————————————
@temp
————————————————————
set pages 23
set feed on
set head on
Сформированный и
запускаемый далее скрипт Temp.sql имеет следующий вид:
set
head off
set
feed off
set
term on
set
recsep off
variable
iC number;
execute
:iC:=0;
begin
select :iC + count(*) into :iC from BRANCH;
select :iC + count(*) into :iC from CONOPF;
.
.
.
select
:iC + count(*) into :iC from TYPEM;
select
:iC + count(*) into :iC from TYPEOBJECT;
end;
/
select
:iC from DUAL;
/
·
Кол-во модулей по всем
мастер-группам (если объекты – только
таблицы, то равно учетверенному кол-ву таблиц – Package и Package Body по
модулям $RP и $RR):
select count(*) from
ALL_REPGENERATED order by ONAME, TYPE;
·
Кол-во модулей по каждой
мастер-группе (очень полезный запрос):
select GNAME,
count(*) from ALL_REPOBJECT
where
TYPE=’TABLE’
group by GNAME
order by GNAME;
·
Объекты, нуждающиеся в перегенерации
репликационной поддержки:
select ONAME from
ALL_REPOBJECT
where
(GENERATION_STATUS <> ‘GENERATED’) and TYPE=’TABLE’;
·
Error-объекты на сайте (обязателен к применению):
select GNAME,
ONAME from ALL_REPOBJECT
where
STATUS=’ERROR’ and TYPE=’TABLE’ order by GNAME;
·
Кол-во Error-объектов по мастер-группам:
select GNAME,
count(*) from ALL_REPOBJECT
where
STATUS=’ERROR’ and TYPE=’TABLE’
group by GNAME
order by GNAME;
·
Кол-во изменений по мастер-группам
за период времени (для определения
наиболее активных мастер-групп):
select R.GNAME,
count(A.ID) CNT
from
ALL_REPOBJECT R, EDITIONS A
where
R.TYPE=’TABLE’
and R.ONAME=A.TABNAME and
trunc(A.CORDATE)=trunc(SYSDATE-1)
group by R.GNAME
order by
count(A.ID);
Результат выполнения запроса (пример):
GNAME CNT
——————————
———
PLIPEKN6
4
PLIPEKN0
6
PLIPEKN4
35
PLIPEKN5
93
PLIPEKN3
143
Анализ административных запросов
·
Ошибочные административные
запросы по таблицам (некоторые
ошибки, в частности, end—of—file…, могут
не войти):
select
ID, to_char(TIMESTAMP,’DD.MM.YYYY HH24:MI:SS’) TIME,
substr(MASTER,1,15) MR, substr(GNAME,1,8) GR,
substr(ONAME,1,12) OB, substr(MESSAGE,1,40)
from
USER_REPCATLOG
where
STATUS=’ERROR’ and TYPE=’TABLE’;
·
Административные запросы по
мастер-группе (PLIPEKNn):
select
ID, to_char(TIMESTAMP,’DD.MM.YYYY HH24:MI:SS’) TIME,
substr(MASTER,1,15) MAST, substr(ONAME,1,12) OB,
STATUS, REQUEST, ERRNUM
from
USER_REPCATLOG
where
GNAME=’PLIPEKN0′
order
by ID;
·
Административные запросы по
мастер-сайту первой очереди (для
выявления блокирующих административных запросов):
select
ID, to_char(TIMESTAMP,’DD.MM.YYYY HH24:MI:SS’) TIME,
substr(MASTER,1,15) M, substr(GNAME,1,12) G,
substr(ONAME,1,12) O, STATUS, REQUEST, ERRNUM
from
USER_REPCATLOG
where
ROWNUM < 10;
·
Кол-во адм-запросов по всему
мастер-сайту (для общего контроля
выполнения):
select count(*) from
USER_REPCATLOG;
·
Кол-во административных
запросов по каждой мастер-группе (для
общего контроля выполнения):
select
substr(GNAME,1,12) GR, count(*) REQ_NUM
from
USER_REPCATLOG
group
by GNAME
order
by GNAME;
·
Кол-во каждого вида и статуса
административных запросов по каждой мастер-группе (для детального контроля выполнения):
select
substr(GNAME,1,12) GR, REQUEST, STATUS, count(*) REQ_NUM
from
USER_REPCATLOG
group
by
GNAME, REQUEST, STATUS
order
by
GNAME, REQUEST, STATUS
;
Анализ транзакций
·
Кол-во всех транзакций:
select count(*) from
DEFTRAN;
·
Кол-во транзакций для каждого
сайта:
select
substr(DBLINK,1,20), count(*) CNT from DEFTRANDEST
group by DBLINK
order by DBLINK;
·
Кол-во транзакций для каждого
сайта по дням формирования:
select
substr(DD.DBLINK,1,20) DL,
trunc(D.START_TIME) ST,
count(DD.DEFERRED_TRAN_ID) CT
from
DEFTRANDEST DD,
DEFTRAN D
where
DD.DEFERRED_TRAN_ID=D.DEFERRED_TRAN_ID
group by
substr(DD.DBLINK,1,20), trunc(D.START_TIME)
order by
DL, ST
;
Результат выполнения запроса (пример):
DL
ST CT
———————
——— ———
PLI_ANTA.WORLD
29-FEB-00 939
PLI_ANTA.WORLD
01-MAR-00 6160
PLI_ANTA.WORLD
02-MAR-00 7546
PLI_ANTA.WORLD
03-MAR-00 245
PLI_ANTA.WORLD
25-FEB-00 1580
PLI_ANTA.WORLD
26-FEB-00 570
PLI_ANTA.WORLD
27-FEB-00 165
PLI_ANTA.WORLD
28-FEB-00 8753
PLI_ANTA.WORLD
29-FEB-00 7491
PLI_ANTA.WORLD
01-MAR-00 6160
PLI_ANTA.WORLD
02-MAR-00 7546
PLI_ANTA.WORLD
03-MAR-00 245
12
rows selected.
·
Удаление транзакций. Для удаления одной транзакции (например, с
идентификатором 6.19.11941) используется следующее DBMS-предложение (значение NULL параметра DESTINATION указывает
о применении команды ко всем мастер-сайтам):
begin
DBMS_DEFER_SYS.DELETE_TRAN(
deferred_tran_id => ‘6.19.11941’,
destination
=> NULL);
end;
/
Для удаления всех транзакций используется пустое
значение параметра DEFERRED_TRAN_ID:
begin
DBMS_DEFER_SYS.DELETE_TRAN(
deferred_tran_id => »,
destination => NULL);
end;
/
·
Перезапуск транзакций: данная функция отсутствует, но можно использовать
запуск соответствующей задачи, т.е. процесс PUSH для нужного дест-сайта,
например:
DBMS_JOB.RUN(job
=> 204);
·
Кол-во ошибочных транзакций:
select count(*)
from DEFERROR;
·
Удаление всех ошибочных
транзакций. Для удаления ошибочной
транзакции (например, с идентификатором 8.55.21) используется
нижеприведенная DBMS-процедура (значение NULL параметра
DESTINATION указывает
о применении команды ко всем мастер-сайтам). Если значение параметра DEFERRED_TRAN_ID не
указано (=>’’), то удаляются все ошибочные транзакции (см. RemErr.sql):
begin
DBMS_DEFER_SYS.DELETE_ERROR(
deferred_tran_id => ‘8.55.21’,
destination => NULL);
end;
/
·
Перезапуск ошибочных транзакций. Для перезапуска ошибочной транзакции (например, с
идентификатором 8.55.21) используется нижеприведенная DBMS-процедура (параметр DESTINATION не
должен иметь значение NULL, а
указывать на требуемый мастер-сайт). Если значение параметра DEFERRED_TRAN_ID не
указано (=>’’), то перезапускаются все ошибочные транзакции:
begin
DBMS_DEFER_SYS.EXECUTE_ERROR(
deferred_tran_id => ‘8.55.21’,
destination => ‘PLI_ANTA’);
end;
/
Анализ журнала правок БД (EDITIONS)
В БД
рекомендуется создать и использовать специальную таблицу (например, EDITIONS), куда триггерами ТАБЛИЦА_LOG заносятся все изменения по таблицам
Вашей системы (находящимся только в БД Oracle). Анализ
этой таблицы полезен для сверки с выполненными и выполняемыми транзакциями.
Ниже приведен ряд полезных запросов (находятся в файле ShwAllEd.sql):
— Сводка по таблицам и датам последних правок
select TABNAME, count(TABNAME)
C, max(CORDATE) D
from EDITIONS
/*where CORDATE>SYSDATE-5*/
group by TABNAME
order by TABNAME;
— Сводка по видам правок за диапазон дат
select ACTION, count(ACTION)
C
from EDITIONS
where trunc(CORDATE)
between trunc(SYSDATE)-2 and trunc(SYSDATE)
group by ACTION
order by ACTION;
Пример
результата данного запроса (ACTION=1,2,3 – добавление,
изменение, удаление):
ACTION C
——— ———
1 431
2 247
3 44
— where to_char(CORDATE,’dd.mm.yy’)=to_char(SYSDATE-1,
‘dd.mm.yy’)
select TABNAME, count(TABNAME)
C
from EDITIONS
where trunc(CORDATE)=trunc(SYSDATE-1)
and ACTION=1
group by TABNAME
order by TABNAME;
— Сводка по таблицам, которые правились за
предыдущие дни
select TABNAME, count(TABNAME)
C
from EDITIONS
where trunc(CORDATE)>trunc(SYSDATE-2)
group by TABNAME
order by TABNAME;
— Все изменения (добавления) за день (для сверки с
репликацией)
select TABNAME,TABKEY,ACTION,to_char(CORDATE,’dd.mm.yy
hh:mi:ss’) DL
from EDITIONS
where to_char(CORDATE,’dd.mm.yy’)=to_char(SYSDATE-1,’dd.mm.yyyy’)
— and ACTION=1
order by CORDATE;
— Общее кол-во изменений за день
select count(*) CNT
from EDITIONS
where to_char(CORDATE,’dd.mm.yyyy’)=to_char(SYSDATE,’dd.mm.yyyy’)
and ACTION=1;
— Выборка добавленных в таблицу записей за 1 день
select T.ID, T.NAME, A.CORDATE
from PIPECROSS T, EDITIONS
A
where trunc(T.CORDATE)=trunc(SYSDATE-1)
and T.ID=A.TABKEY and A.TABNAME=’PIPECROSS’
and A.ACTION=1
and trunc(A.CORDATE)=trunc(SYSDATE-1)
order by A.CORDATE;
Необходимые конфигурационные параметры для репликаци
В этом пункте перечислены параметры конфигурационного
файла INIT<SID>.ORA, являющиеся важными для работы приложений. Эти
параметры должны иметь следующие значения.
·
DISTRIBUTED_LOCK_TIMEOUT = 300;
·
DISTRIBUTED_TRANSACTIONS
= 5 (для
репликации Мультимастер увеличить до 12-20);
·
GLOBAL_NAMES = TRUE;
·
JOB_QUEUE_INTERVAL = 10;
·
JOB_QUEUE_PROCESSES = 4 (для репликации Мультимастер
увеличить до 10 — 12, т.е., примерно, удвоенное кол-во мастер-сайтов);
·
OPEN_LINKS = 10;
·
PARALLEL_MAX_SERVERS = 10;
·
PARALLEL_MIN_SERVERS = 2;
·
REPLICATION_DEPENDENCY_TRACKING =
TRUE;
·
SHARED_POOL_SIZE – не менее 18000000, но не
более 40% ОЗУ сервера (если кроме Oracle на сервере не выполняются другие процессы), а если на сервере уже
установлены другие экземпляры Oracle (например, другая система или учебная БД), то сумма этих параметров не
должна превышать 40% ОЗУ;
·
DML_LOCK – не менее 300;
·
PROCESSES = 200 (при использовании репликации Мультимастер
увеличить: 300 на destination-сайте, 400 на definition-сайте).
ORA-01400
ORA-01400: cannot insert null into (string) is a specific error to the null value in Oracle. According to Oracle, a null value can appear in columns of any datatype as long as it is not set to the value “not null” or is restricted by primary key integrity constraints. Empty strings or those with a character value with a length of zero is not the same as a null value and should not be treated as one. Click here to read more about nulls from official Oracle documentation. Although is a straightforward error to correct, having a full understanding of the null value will help the user practice efficient programming techniques and avoid ORA-01400: cannot insert null into (string) in the future.
The Problem
The error occurs when you try to insert a NULL value in a column that does not accept NULL values. You will see the following:
ORA-01400: cannot insert NULL into (string)
This means that the data cannot be set to a null value; it must have some value other than null for the query to run successfully. You can see if a table will allow null values by using the SQL*Plus desc command:
SQL>desc table_name
The Solution
To correct error ORA-01400: cannot insert null into (string), you must enter a value other than null and rerun the operation.
You may also choose to modify the table itself so that it will allow null values for columns. However, this may not be the best solution as it may not be appropriate for the given table to have a null value.
Take the following example. This is a table called employees and is defined as the following:
CREATE TABLE employees
(employee_id not null,
employee_name varchar(30) not null);
Given this table, you attempted to execute the following INSERT statement:
INSERT INTO employees
(employee_id)
values
(413);
If you execute this statement, you would see ORA-01400: cannot insert null into (string). In the INSERT statement, you have entered the employee_id number but no employee_name. Employee_name in the TABLE employees was previously defined as NOT NULL, and therefore, must have a value other than NULL. To correct this, simply write the INSERT statement to include the name of the employee:
INSERT INTO employees
(employee_id)
values
(413, ‘Ronnie’);
This will resolve the error and run the query.
The second possible solution mentioned previously is to change the table to accept null values. You may do this will an “alter table” statement. As in the previous example with the table called “employees,” run the following statement:
Alter table
Employees
Modify
(mycol NULL);
This statement should successfully allow the table column values to be null. Use caution when using this option by making sure it actually makes sense to allow null values. In this example, it is likely not a good idea to allow null values. Both employee names and ids are important forms of identification and therefore, should be kept not null in the system.
Moving Forward
Being knowledgeable about the null value and when it is appropriate to use is the first step in avoiding seeing errors such as ORA-01400: cannot insert null into (string). It is a good idea to have a solid understanding in the null value as it is something you will use over and over again as a programmer.
If you are still struggling with the error, contact your database administrator. Your DBA will most likely be able to help you with this issue. Although this error does not warrant consultation of an outside professional, you may choose to hire a consultant if you are unable to resolve the issue yourself. Always check certification and credentials to ensure your Oracle needs are met.