В этом учебном материале вы узнаете, как использовать встроенные исключительные ситуации в Oracle/PLSQL c синтаксисом и примерами.
Описание
Встроенные исключительные ситуации это исключительные ситуации, которые имеют определенные имена в PL/SQL. Они определены в стандартном пакете в PL/SQL и не могут быть определены программистом.
Oracle имеет стандартный набор встроенных исключительных ситуаций:
Исключительные ситуации ORACLE | Ошибки Oracle | Пояснения |
---|---|---|
DUP_VAL_ON_INDEX | ORA-00001 | Вы пытались выполнить операторы insert или update поля, изменение значения которого нарушит ограничение уникальности поля. |
TIMEOUT_ON_RESOURCE | ORA-00051 | Возбуждается при возникновении таймаута, когда ORACLE ожидает ресурса. |
TRANSACTION_BACKED_OUT | ORA-00061 | Откат удаленной части транзакции. |
INVALID_CURSOR | ORA-01001 | Вы пытаетесь сослаться на курсор, который еще не существует. Это могло произойти потому, что вы выполняете выборку (fetch) курсора, который был закрыт (close) или не был открыт (open). |
NOT_LOGGED_ON | ORA-01012 | Вы пытаетесь выполнить вызов в Oracle, не подключившись к Oracle. |
LOGIN_DENIED | ORA-01017 | Вы пытаетесь войти в Oracle с неверными имя пользователя / пароль. |
NO_DATA_FOUND | ORA-01403 | Вы пробовали один из следующих вариантов:
|
TOO_MANY_ROWS | ORA-01422 | Вы пытались выполнить SELECT INTO и запрос вернул более одной строки. |
ZERO_DIVIDE | ORA-01476 | Вы пытались поделить число на ноль. |
INVALID_NUMBER | ORA-01722 | Вы пытаетесь выполнить оператор SQL который пытается преобразовать строку в число. |
STORAGE_ERROR | ORA-06500 | Вы исчерпали доступную память или память повреждена. |
PROGRAM_ERROR | ORA-06501 | Это общее сообщение Обратитесь в службу поддержки Oracle, возбуждается по причине обнаружения внутренней ошибки. |
VALUE_ERROR | ORA-06502 | Вы пытались выполнить операцию и была ошибка преобразования, усечения, или ограничения числовых или символьных данных. |
CURSOR_ALREADY_OPEN | ORA-06511 | Вы попытались открыть курсор, который уже открыт. |
Синтаксис
Рассмотри синтаксис встроенных исключительных ситуаций в процедуре и функции.
Синтаксис для процедуры
CREATE [OR REPLACE] PROCEDURE procedure_name
[ (parameter [,parameter]) ]
IS
[declaration_section]BEGIN
executable_sectionEXCEPTION
WHEN exception_name1 THEN
[statements]
WHEN exception_name2 THEN
[statements]
WHEN exception_name_n THEN
[statements]
WHEN OTHERS THEN
[statements]
END [procedure_name];
Синтаксис для функции
CREATE [OR REPLACE] FUNCTION function_name
[ (parameter [,parameter]) ]
RETURN return_datatype
IS | AS
[declaration_section]BEGIN
executable_sectionEXCEPTION
WHEN exception_name1 THEN
[statements]
WHEN exception_name2 THEN
[statements]
WHEN exception_name_n THEN
[statements]
WHEN OTHERS THEN
[statements]
END [function_name];
Пример использования исключительных ситуаций в процедуре.
CREATE OR REPLACE PROCEDURE add_new_supplier (supplier_id_in IN NUMBER, supplier_name_in IN VARCHAR2) IS BEGIN INSERT INTO suppliers (supplier_id, supplier_name ) VALUES ( supplier_id_in, supplier_name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,‘Вы пытались вставить дубликат supplier_id.’); WHEN OTHERS THEN raise_application_error (-20002,‘Произошла ошибка при вставке supplier.’); END; |
В этом примере, мы перехватываем исключительную ситуацию DUP_VAL_ON_INDEX. Мы можем также использовать WHEN OTHERS, чтобы перехватить остальные исключительные ситуации.
EXCEPTION блок
Обработка ошибок производится в блоке exception
:
begin
-- Код
exception
-- Обработка ошибок
when .... then .....;
when .... then .....;
when .... then .....;
end;
Ошибки отлавливаются в пределах блока begin-end
. Работает это так:
- Сначала выполняется код между
begin
иexception
- Если ошибок не произошло, тогда секция между
exception
иend
ингорируется - Если в процессе выполнения кода происходит ошибка, выполнение останавливается
и переходит в блокexception
. - Если в блоке находится обработчик для исключения, вызывается код после
then
- Если обработчик не найден, исключение выбрасывается за пределы блока
begin-end
Пример блока с обработчиком исключений:
declare
l_val number;
begin
select 1 into l_var
where 2 > 3;
exception
when no_data_found then
dbms_output.put_line('Нет данных');
when dup_val_on_index then
dbms_output.put_line('Такая строка уже есть');
end;
Предопределённые ошибки
Ошибки обрабатываются по их имени, поэтому часть наиболее частых ошибок в PL/SQL
уже предопределена, как например вышеуказанные no_data_found
и dup_val_on_index
.
Ниже показан их список и в каких случаях ошибка может возникнуть.
Ошибка | Когда возникает |
---|---|
ACCESS_INTO_NULL | Попытка присвоить значение атрибуту неинициализированного объекта. |
CASE_NOT_FOUND | В выражении CASE не нашлось подходящего условия When , и в нём отсутствует условие Else . |
COLLECTION_IS_NULL | Попытка вызвать любой метод коллеции(за исключением Exists ) в неинициализированной вложенной таблице или ассоциативном массиве, или попытка присвоить значения элементам неинициализированной вложенной таблице или ассоциативного массива. |
CURSOR_ALREADY_OPEN | Попытка открыть уже открытый курсор. Курсор должен быть закрыт до момента его открытия. Цикл FOR автоматически открывает курсор, который использует, поэтому его нельзя открывать внутри тела цикла. |
DUP_VAL_ON_INDEX | Попытка вставить в таблицу значения, которые нарушают ограничения, созданные уникальным индексом. Иными словами, ошибка возникает, когда в колонки уникального индекса добавляются дублирующие записи. |
INVALID_CURSOR | Попытка вызова недопустимой операции с курсором, например закрытие не открытого курсора. |
INVALID_NUMBER | Ошибка приведения строки в число в SQL запросе, потому что строка не является числовым представлением (В PL/SQL коде в таких случаях выбрасывается VALUE_ERROR). Также может возникнуть, если значение параметра LIMIT в выражении Bulk collect не является положительным числом. |
LOGIN_DENIED | Попытка подключиться к БД с неправильным логином или паролем. |
NO_DATA_FOUND | Выражение SELECT INTO не возвращает ни одной строки, или программа ссылается на удалённый элемент во вложенной таблице или неинициализированному объекту в ассоциативной таблице. Агрегатные функции в SQL, такие как AVG или SUM, всегда возвращают значение или null. Поэтому, SELECT INTO , которое вызывает только агрегатные функции, никогда не выбросит NO_DATA_FOUND . Выражение FETCH работает так, что ожидает отсутствия строк в определённый момент, поэтому ошибка также не выбрасывается. |
NOT_LOGGED_ON | Обращение к БД будучи неподключенным к ней |
PROGRAM_ERROR | Внутренняя проблема в PL/SQL. |
ROWTYPE_MISMATCH | Курсорные переменные, задействованные в присваивании, имеют разные типы. |
SELF_IS_NULL | Попытка вызвать метод неинициализированного объекта. |
STORAGE_ERROR | Переполнение памяти или память повреждена. |
SUBSCRIPT_BEYOND_COUNT | Попытка обратиться к элементу вложенной таблицы или ассоциативного массива по индексу, который больше, чем количество элементов в коллекции. |
SUBSCRIPT_OUTSIDE_LIMIT | Попытка обратиться к элементу коллекции по индексу(например, -1) вне допустимого диапазона. |
SYS_INVALID_ROWID | Ошибка конвертации строки в rowid. |
TIMEOUT_ON_RESOURCE | Возникает при ожидании доступности ресурса. |
TOO_MANY_ROWS | Выражение SELECT INTO возвращает более одной строки. |
VALUE_ERROR | Арифметическая ошибка, ошибка конвертации, или превышение размерности типа. Может возникнуть, к примеру, если в переменную с типом number(1) попытаться присвоить значение 239 . |
ZERO_DIVIDE | Попытка деления на ноль. |
Объявление собственных ошибок
Можно объявлять собственные исключения, давая им
названия, которые полнее раскрывают их суть.
declare
-- Объявление собственного исключения,
-- которое мы выбрасываем, если значение заработной
-- платы ниже дозволенного минимума.
exc_too_low_salary exception;
l_salary number := 100;
begin
if l_salary < 200 then
-- Бросаем ошибку.
raise exc_too_low_salary;
end if;
exception
when exc_too_low_salary then
dbms_output.put_line('Обработчик исключения');
end;
Область видимости собственного исключения в данном случае — блок, в котором оно
объявлено. Вне этого блока обработать исключение не получится.
Для более удобной работы с собственными исключениями их можно вынести в отдельный пакет:
create or replace pck_hr_errors is
-- Объявляем исключения в спецификации пакета.
-- Тела пакет не имеет, только спецификацию.
exc_wrong_name exception;
exc_too_low_salary exception;
exc_incorrect_pass exception;
end;
Далее работать с этими исключениями можно подобным образом:
begin
-- Какой-то код
...
exception
when pck_hr_errors.exc_too_low_salary then
-- Обработка исключения
...
end;
Обработка непредопределённых ошибок
Не все ошибки в Oracle являются предопределёнными. Когда возникает необходимость
их обрабатывать, нужно связать переменную типа exception
с кодом ошибки, которую нужно обработать:
declare
-- объявляем ошибку
e_incorrect_date exception;
-- связываем ошибку с кодом
pragma exception_init(e_incorrect_date, -1830);
begin
dbms_output.put_line(to_date('2022-02-01', 'dd.mm.yyyy'));
exception
when e_incorrect_date then
dbms_output.put_line ('Неправильный формат даты');
end;
Следует помнить, что коды ошибок являются отрицательными числами.
Ошибки и вложенные блоки
Если ошибка не обрабатывается в пределах блока begin ..end
,
она выбрасывается за его пределы. Далее эта ошибка может быть
обработана блоком exception
внешнего блока. Если и там ошибка
не обрабатывается, она выбрасывается и за его пределы, и так
далее.
declare
a number;
-- Внешний блок
begin
-- Вложенный блок
begin
a := 1 / 0;
-- Важно помнить, что после возникновения ошибки
-- выполнение кода в пределах блока прекращается.
-- Следующий код не будет выполнен
dbms_output.put_line('Этот код не будет выполнен');
end;
exception
when zero_divide:
dbms_otuput.put_line('Ошибка обработана внешним блоком');
end;
raise_application_error
Если ошибка, брошенная Oracle, достигает клиентского приложения,
то она имеет примерно такой текст: ORA-01722 invalid number
.
Процедура raise_application_error
позволяет вызвать исключение
с заданным номером, связать его с сообщением и отправить его
вызывающему приложению.
begin
raise_application_error(-20134, 'Неправильный номер паспорта');
end;
Диапазон возможных кодов ошибок [-20999, 20000]. Сообщение должно
помещаться в тип varchar2(2000)
.
Можно указать третий boolean параметр, который в случае
значения true
добавит текущую ошибку в список предыдущих
ошибок, возникших в приложении. По умолчанию значение равно false
,
что значит, про сообщение об ошибке заменяет все предыдущие ошибки
собой.
Мы можем объявить собственное исключение, связать его с номером
в диапазоне [-20999, 20000] и использовать для обработки исключений,
брошенных с помощью raise_application_error
:
declare
e_wrong_passport exception;
-- связываем ошибку с кодом
pragma exception_init(e_wrong_passport, -20999);
begin
raise_application_error(-20999, 'Неправильный номер паспорта');
exception
when e_wrong_password then
dbms_output.put_line ('Неправильный номер паспорта');
end;
This chapter explains how to handle PL/SQL compile-time warnings and PL/SQL runtime errors. The latter are called exceptions.
Topics
-
Compile-Time Warnings
-
Overview of Exception Handling
-
Internally Defined Exceptions
-
Predefined Exceptions
-
User-Defined Exceptions
-
Redeclared Predefined Exceptions
-
Raising Exceptions Explicitly
-
Exception Propagation
-
Unhandled Exceptions
-
Error Code and Error Message Retrieval
-
Continuing Execution After Handling Exceptions
-
Retrying Transactions After Handling Exceptions
See Also:
-
«Exception Handling in Triggers»
-
«Handling FORALL Exceptions After FORALL Statement Completes»
Tip:
If you have problems creating or running PL/SQL code, check the Oracle Database trace files. The USER_DUMP_DEST
initialization parameter specifies the current location of the trace files. You can find the value of this parameter by issuing SHOW
PARAMETER
USER_DUMP_DEST
. For more information about trace files, see Oracle Database Performance Tuning Guide.
Compile-Time Warnings
While compiling stored PL/SQL units, the PL/SQL compiler generates warnings for conditions that are not serious enough to cause errors and prevent compilation—for example, using a deprecated PL/SQL feature.
To see warnings (and errors) generated during compilation, either query the static data dictionary view *_ERRORS
(described in Oracle Database Reference) or, in the SQL*Plus environment, use the command SHOW
ERRORS
.
The message code of a PL/SQL warning has the form PLW-nnnnn. For the message codes of all PL/SQL warnings, see Oracle Database Error Messages.
Table 11-1 summarizes the categories of warnings.
Table 11-1 Compile-Time Warning Categories
Category | Description | Example |
---|---|---|
|
Condition might cause unexpected action or wrong results. |
Aliasing problems with parameters |
|
Condition might cause performance problems. |
Passing a |
|
Condition does not affect performance or correctness, but you might want to change it to make the code more maintainable. |
Code that can never run |
By setting the compilation parameter PLSQL_WARNINGS
, you can:
-
Enable and disable all warnings, one or more categories of warnings, or specific warnings
-
Treat specific warnings as errors (so that those conditions must be corrected before you can compile the PL/SQL unit)
You can set the value of PLSQL_WARNINGS
for:
-
Your Oracle database instance
Use the
ALTER
SYSTEM
statement, described in Oracle Database SQL Language Reference. -
Your session
Use the
ALTER
SESSION
statement, described in Oracle Database SQL Language Reference. -
A stored PL/SQL unit
Use an
ALTER
statement from «ALTER Statements» with itscompiler_parameters_clause
. For more information about PL/SQL units and compiler parameters, see «PL/SQL Units and Compilation Parameters».
In any of the preceding ALTER
statements, you set the value of PLSQL_WARNINGS
with this syntax:
PLSQL_WARNINGS = 'value_clause' [, 'value_clause' ] ...
For the syntax of value_clause
, see Oracle Database Reference.
Example 11-1 shows several ALTER
statements that set the value of PLSQL_WARNINGS
.
Example 11-1 Setting Value of PLSQL_WARNINGS Compilation Parameter
For the session, enable all warnings—highly recommended during development:
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';
For the session, enable PERFORMANCE
warnings:
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:PERFORMANCE';
For the procedure loc_var
, enable PERFORMANCE
warnings, and reuse settings:
ALTER PROCEDURE loc_var COMPILE PLSQL_WARNINGS='ENABLE:PERFORMANCE' REUSE SETTINGS;
For the session, enable SEVERE
warnings, disable PERFORMANCE
warnings, and treat PLW-06002 warnings as errors:
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:SEVERE', 'DISABLE:PERFORMANCE', 'ERROR:06002';
For the session, disable all warnings:
ALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';
To display the current value of PLSQL_WARNINGS
, query the static data dictionary view ALL_PLSQL_OBJECT_SETTINGS
, described in Oracle Database Reference.
DBMS_WARNING Package
If you are writing PL/SQL units in a development environment that compiles them (such as SQL*Plus), you can display and set the value of PLSQL_WARNINGS
by invoking subprograms in the DBMS_WARNING
package.
Example 11-2 uses an ALTER
SESSION
statement to disable all warning messages for the session and then compiles a procedure that has unreachable code. The procedure compiles without warnings. Next, the example enables all warnings for the session by invoking DBMS_WARNING.set_warning_setting_string
and displays the value of PLSQL_WARNINGS
by invoking DBMS_WARNING.get_warning_setting_string
. Finally, the example recompiles the procedure, and the compiler generates a warning about the unreachable code.
Note:
Unreachable code could represent a mistake or be intentionally hidden by a debug flag.
Example 11-2 Displaying and Setting PLSQL_WARNINGS with DBMS_WARNING Subprograms
Disable all warning messages for this session:
ALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';
With warnings disabled, this procedure compiles with no warnings:
CREATE OR REPLACE PROCEDURE unreachable_code AUTHID DEFINER AS x CONSTANT BOOLEAN := TRUE; BEGIN IF x THEN DBMS_OUTPUT.PUT_LINE('TRUE'); ELSE DBMS_OUTPUT.PUT_LINE('FALSE'); END IF; END unreachable_code; /
Enable all warning messages for this session:
CALL DBMS_WARNING.set_warning_setting_string ('ENABLE:ALL', 'SESSION');
Check warning setting:
SELECT DBMS_WARNING.get_warning_setting_string() FROM DUAL;
Result:
DBMS_WARNING.GET_WARNING_SETTING_STRING() ----------------------------------------- ENABLE:ALL 1 row selected.
Recompile procedure:
ALTER PROCEDURE unreachable_code COMPILE;
Result:
SP2-0805: Procedure altered with compilation warnings
Show errors:
SHOW ERRORS
Result:
Errors for PROCEDURE UNREACHABLE_CODE: LINE/COL ERROR -------- ----------------------------------------------------------------- 7/5 PLW-06002: Unreachable code
DBMS_WARNING
subprograms are useful when you are compiling a complex application composed of several nested SQL*Plus scripts, where different subprograms need different PLSQL_WARNINGS
settings. With DBMS_WARNING
subprograms, you can save the current PLSQL_WARNINGS
setting, change the setting to compile a particular set of subprograms, and then restore the setting to its original value.
Overview of Exception Handling
Exceptions (PL/SQL runtime errors) can arise from design faults, coding mistakes, hardware failures, and many other sources. You cannot anticipate all possible exceptions, but you can write exception handlers that let your program to continue to operate in their presence.
Any PL/SQL block can have an exception-handling part, which can have one or more exception handlers. For example, an exception-handling part could have this syntax:
EXCEPTION WHEN ex_name_1 THEN statements_1 -- Exception handler WHEN ex_name_2 OR ex_name_3 THEN statements_2 -- Exception handler WHEN OTHERS THEN statements_3 -- Exception handler END;
In the preceding syntax example, ex_name_
n
is the name of an exception and statements_
n
is one or more statements. (For complete syntax and semantics, see «Exception Handler».)
When an exception is raised in the executable part of the block, the executable part stops and control transfers to the exception-handling part. If ex_name_1
was raised, then statements_1
run. If either ex_name_2
or ex_name_3
was raised, then statements_2
run. If any other exception was raised, then statements_3
run.
After an exception handler runs, control transfers to the next statement of the enclosing block. If there is no enclosing block, then:
-
If the exception handler is in a subprogram, then control returns to the invoker, at the statement after the invocation.
-
If the exception handler is in an anonymous block, then control transfers to the host environment (for example, SQL*Plus)
If an exception is raised in a block that has no exception handler for it, then the exception propagates. That is, the exception reproduces itself in successive enclosing blocks until a block has a handler for it or there is no enclosing block (for more information, see «Exception Propagation»). If there is no handler for the exception, then PL/SQL returns an unhandled exception error to the invoker or host environment, which determines the outcome (for more information, see «Unhandled Exceptions»).
Topics
-
Exception Categories
-
Advantages of Exception Handlers
-
Guidelines for Avoiding and Handling Exceptions
Exception Categories
The exception categories are:
-
Internally defined
The runtime system raises internally defined exceptions implicitly (automatically). Examples of internally defined exceptions are ORA-00060 (deadlock detected while waiting for resource) and ORA-27102 (out of memory).
An internally defined exception always has an error code, but does not have a name unless PL/SQL gives it one or you give it one.
For more information, see «Internally Defined Exceptions».
-
Predefined
A predefined exception is an internally defined exception that PL/SQL has given a name. For example, ORA-06500 (PL/SQL: storage error) has the predefined name
STORAGE_ERROR
.For more information, see «Predefined Exceptions».
-
User-defined
You can declare your own exceptions in the declarative part of any PL/SQL anonymous block, subprogram, or package. For example, you might declare an exception named
insufficient_funds
to flag overdrawn bank accounts.You must raise user-defined exceptions explicitly.
For more information, see «User-Defined Exceptions».
Table 11-2 summarizes the exception categories.
Table 11-2 Exception Categories
Category | Definer | Has Error Code | Has Name | Raised Implicitly | Raised Explicitly |
---|---|---|---|---|---|
Internally defined |
Runtime system |
Always |
Only if you assign one |
Yes |
OptionallyFoot 1 |
Predefined |
Runtime system |
Always |
Always |
Yes |
OptionallyFootref 1 |
User-defined |
User |
Only if you assign one |
Always |
No |
Always |
Footnote 1 For details, see «Raising Internally Defined Exception with RAISE Statement».
For a named exception, you can write a specific exception handler, instead of handling it with an OTHERS
exception handler. A specific exception handler is more efficient than an OTHERS
exception handler, because the latter must invoke a function to determine which exception it is handling. For details, see «Error Code and Error Message Retrieval».
Advantages of Exception Handlers
Using exception handlers for error-handling makes programs easier to write and understand, and reduces the likelihood of unhandled exceptions.
Without exception handlers, you must check for every possible error, everywhere that it might occur, and then handle it. It is easy to overlook a possible error or a place where it might occur, especially if the error is not immediately detectable (for example, bad data might be undetectable until you use it in a calculation). Error-handling code is scattered throughout the program.
With exception handlers, you need not know every possible error or everywhere that it might occur. You need only include an exception-handling part in each block where errors might occur. In the exception-handling part, you can include exception handlers for both specific and unknown errors. If an error occurs anywhere in the block (including inside a sub-block), then an exception handler handles it. Error-handling code is isolated in the exception-handling parts of the blocks.
In Example 11-3, a procedure uses a single exception handler to handle the predefined exception NO_DATA_FOUND
, which can occur in either of two SELECT
INTO
statements.
Example 11-3 Single Exception Handler for Multiple Exceptions
CREATE OR REPLACE PROCEDURE select_item ( t_column VARCHAR2, t_name VARCHAR2 ) AUTHID DEFINER IS temp VARCHAR2(30); BEGIN temp := t_column; -- For error message if next SELECT fails -- Fails if table t_name does not have column t_column: SELECT COLUMN_NAME INTO temp FROM USER_TAB_COLS WHERE TABLE_NAME = UPPER(t_name) AND COLUMN_NAME = UPPER(t_column); temp := t_name; -- For error message if next SELECT fails -- Fails if there is no table named t_name: SELECT OBJECT_NAME INTO temp FROM USER_OBJECTS WHERE OBJECT_NAME = UPPER(t_name) AND OBJECT_TYPE = 'TABLE'; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No Data found for SELECT on ' || temp); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Unexpected error'); RAISE; END; /
Invoke procedure (there is a DEPARTMENTS
table, but it does not have a LAST_NAME
column):
BEGIN select_item('departments', 'last_name'); END; /
Result:
No Data found for SELECT on departments
Invoke procedure (there is no EMP
table):
BEGIN select_item('emp', 'last_name'); END; /
Result:
No Data found for SELECT on emp
If multiple statements use the same exception handler, and you want to know which statement failed, you can use locator variables, as in Example 11-4.
Example 11-4 Locator Variables for Statements that Share Exception Handler
CREATE OR REPLACE PROCEDURE loc_var AUTHID DEFINER IS stmt_no POSITIVE; name_ VARCHAR2(100); BEGIN stmt_no := 1; SELECT table_name INTO name_ FROM user_tables WHERE table_name LIKE 'ABC%'; stmt_no := 2; SELECT table_name INTO name_ FROM user_tables WHERE table_name LIKE 'XYZ%'; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('Table name not found in query ' || stmt_no); END; / CALL loc_var();
Result:
Table name not found in query 1
You determine the precision of your error-handling code. You can have a single exception handler for all division-by-zero errors, bad array indexes, and so on. You can also check for errors in a single statement by putting that statement inside a block with its own exception handler.
Guidelines for Avoiding and Handling Exceptions
To make your programs as reliable and safe as possible:
-
Use both error-checking code and exception handlers.
Use error-checking code wherever bad input data can cause an error. Examples of bad input data are incorrect or null actual parameters and queries that return no rows or more rows than you expect. Test your code with different combinations of bad input data to see what potential errors arise.
Sometimes you can use error-checking code to avoid raising an exception, as in Example 11-7.
-
Add exception handlers wherever errors can occur.
Errors are especially likely during arithmetic calculations, string manipulation, and database operations. Errors can also arise from problems that are independent of your code—for example, disk storage or memory hardware failure—but your code still must take corrective action.
-
Design your programs to work when the database is not in the state you expect.
For example, a table you query might have columns added or deleted, or their types might have changed. You can avoid problems by declaring scalar variables with
%TYPE
qualifiers and record variables to hold query results with%ROWTYPE
qualifiers. -
Whenever possible, write exception handlers for named exceptions instead of using
OTHERS
exception handlers.Learn the names and causes of the predefined exceptions. If you know that your database operations might raise specific internally defined exceptions that do not have names, then give them names so that you can write exception handlers specifically for them.
-
Have your exception handlers output debugging information.
If you store the debugging information in a separate table, do it with an autonomous routine, so that you can commit your debugging information even if you roll back the work that the main subprogram did. For information about autonomous routines, see «AUTONOMOUS_TRANSACTION Pragma».
-
For each exception handler, carefully decide whether to have it commit the transaction, roll it back, or let it continue.
Regardless of the severity of the error, you want to leave the database in a consistent state and avoid storing bad data.
-
Avoid unhandled exceptions by including an
OTHERS
exception handler at the top level of every PL/SQL program.Make the last statement in the
OTHERS
exception handler eitherRAISE
or an invocation of theRAISE_APPLICATION_ERROR
procedure. (If you do not follow this practice, and PL/SQL warnings are enabled, then you get PLW-06009.) For information aboutRAISE
or an invocation of theRAISE_APPLICATION_ERROR
, see «Raising Exceptions Explicitly».
Internally Defined Exceptions
Internally defined exceptions (ORA-n errors) are described in Oracle Database Error Messages. The runtime system raises them implicitly (automatically).
An internally defined exception does not have a name unless either PL/SQL gives it one (see «Predefined Exceptions») or you give it one.
If you know that your database operations might raise specific internally defined exceptions that do not have names, then give them names so that you can write exception handlers specifically for them. Otherwise, you can handle them only with OTHERS
exception handlers.
To give a name to an internally defined exception, do the following in the declarative part of the appropriate anonymous block, subprogram, or package. (To determine the appropriate block, see «Exception Propagation».)
-
Declare the name.
An exception name declaration has this syntax:
exception_name EXCEPTION;
For semantic information, see «Exception Declaration».
-
Associate the name with the error code of the internally defined exception.
The syntax is:
PRAGMA EXCEPTION_INIT (exception_name, error_code)
For semantic information, see «EXCEPTION_INIT Pragma».
Note:
An internally defined exception with a user-declared name is still an internally defined exception, not a user-defined exception.
Example 11-5 gives the name deadlock_detected
to the internally defined exception ORA-00060 (deadlock detected while waiting for resource) and uses the name in an exception handler.
Example 11-5 Naming Internally Defined Exception
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN ... EXCEPTION WHEN deadlock_detected THEN ... END; /
Predefined Exceptions
Predefined exceptions are internally defined exceptions that have predefined names, which PL/SQL declares globally in the package STANDARD
. The runtime system raises predefined exceptions implicitly (automatically). Because predefined exceptions have names, you can write exception handlers specifically for them.
Table 11-3 lists the names and error codes of the predefined exceptions.
Table 11-3 PL/SQL Predefined Exceptions
Exception Name | Error Code |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example 11-6 calculates a price-to-earnings ratio for a company. If the company has zero earnings, the division operation raises the predefined exception ZERO_DIVIDE
and the executable part of the block transfers control to the exception-handling part.
Example 11-6 Anonymous Block Handles ZERO_DIVIDE
DECLARE stock_price NUMBER := 9.73; net_earnings NUMBER := 0; pe_ratio NUMBER; BEGIN pe_ratio := stock_price / net_earnings; -- raises ZERO_DIVIDE exception DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Company had zero earnings.'); pe_ratio := NULL; END; /
Result:
Company had zero earnings.
Example 11-7 uses error-checking code to avoid the exception that Example 11-6 handles.
Example 11-7 Anonymous Block Avoids ZERO_DIVIDE
DECLARE stock_price NUMBER := 9.73; net_earnings NUMBER := 0; pe_ratio NUMBER; BEGIN pe_ratio := CASE net_earnings WHEN 0 THEN NULL ELSE stock_price / net_earnings END; END; /
User-Defined Exceptions
You can declare your own exceptions in the declarative part of any PL/SQL anonymous block, subprogram, or package.
An exception name declaration has this syntax:
exception_name EXCEPTION;
For semantic information, see «Exception Declaration».
You must raise a user-defined exception explicitly. For details, see «Raising Exceptions Explicitly».
Redeclared Predefined Exceptions
Oracle recommends against redeclaring predefined exceptions—that is, declaring a user-defined exception name that is a predefined exception name. (For a list of predefined exception names, see Table 11-3.)
If you redeclare a predefined exception, your local declaration overrides the global declaration in package STANDARD
. Exception handlers written for the globally declared exception become unable to handle it—unless you qualify its name with the package name STANDARD
.
Example 11-8 shows this.
Example 11-8 Redeclared Predefined Identifier
DROP TABLE t; CREATE TABLE t (c NUMBER);
In the following block, the INSERT
statement implicitly raises the predefined exception INVALID_NUMBER
, which the exception handler handles.
DECLARE default_number NUMBER := 0; BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
Result:
Substituting default value for invalid number.
The following block redeclares the predefined exception INVALID_NUMBER
. When the INSERT
statement implicitly raises the predefined exception INVALID_NUMBER
, the exception handler does not handle it.
DECLARE default_number NUMBER := 0; i NUMBER := 5; invalid_number EXCEPTION; -- redeclare predefined exception BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
Result:
DECLARE
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 6
The exception handler in the preceding block handles the predefined exception INVALID_NUMBER
if you qualify the exception name in the exception handler:
DECLARE default_number NUMBER := 0; i NUMBER := 5; invalid_number EXCEPTION; -- redeclare predefined exception BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN STANDARD.INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
Result:
Substituting default value for invalid number.
Raising Exceptions Explicitly
To raise an exception explicitly, use either the RAISE
statement or RAISE_APPLICATION_ERROR
procedure.
Topics
-
RAISE Statement
-
RAISE_APPLICATION_ERROR Procedure
RAISE Statement
The RAISE
statement explicitly raises an exception. Outside an exception handler, you must specify the exception name. Inside an exception handler, if you omit the exception name, the RAISE
statement reraises the current exception.
Topics
-
Raising User-Defined Exception with RAISE Statement
-
Raising Internally Defined Exception with RAISE Statement
-
Reraising Current Exception with RAISE Statement
Raising User-Defined Exception with RAISE Statement
In Example 11-9, the procedure declares an exception named past_due
, raises it explicitly with the RAISE
statement, and handles it with an exception handler.
Example 11-9 Declaring, Raising, and Handling User-Defined Exception
CREATE PROCEDURE account_status ( due_date DATE, today DATE ) AUTHID DEFINER IS past_due EXCEPTION; -- declare exception BEGIN IF due_date < today THEN RAISE past_due; -- explicitly raise exception END IF; EXCEPTION WHEN past_due THEN -- handle exception DBMS_OUTPUT.PUT_LINE ('Account past due.'); END; / BEGIN account_status ('1-JUL-10', '9-JUL-10'); END; /
Result:
Account past due.
Raising Internally Defined Exception with RAISE Statement
Although the runtime system raises internally defined exceptions implicitly, you can raise them explicitly with the RAISE
statement if they have names. Table 11-3 lists the internally defined exceptions that have predefined names. «Internally Defined Exceptions» explains how to give user-declared names to internally defined exceptions.
An exception handler for a named internally defined exception handles that exception whether it is raised implicitly or explicitly.
In Example 11-10, the procedure raises the predefined exception INVALID_NUMBER
either explicitly or implicitly, and the INVALID_NUMBER
exception handler always handles it.
Example 11-10 Explicitly Raising Predefined Exception
DROP TABLE t; CREATE TABLE t (c NUMBER); CREATE PROCEDURE p (n NUMBER) AUTHID DEFINER IS default_number NUMBER := 0; BEGIN IF n < 0 THEN RAISE INVALID_NUMBER; -- raise explicitly ELSE INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); -- raise implicitly END IF; EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; / BEGIN p(-1); END; /
Result:
Substituting default value for invalid number. BEGIN p(1); END; /
Result:
Substituting default value for invalid number.
Reraising Current Exception with RAISE Statement
In an exception handler, you can use the RAISE
statement to»reraise» the exception being handled. Reraising the exception passes it to the enclosing block, which can handle it further. (If the enclosing block cannot handle the reraised exception, then the exception propagates—see «Exception Propagation».) When reraising the current exception, you need not specify an exception name.
In Example 11-11, the handling of the exception starts in the inner block and finishes in the outer block. The outer block declares the exception, so the exception name exists in both blocks, and each block has an exception handler specifically for that exception. The inner block raises the exception, and its exception handler does the initial handling and then reraises the exception, passing it to the outer block for further handling.
Example 11-11 Reraising Exception
DECLARE salary_too_high EXCEPTION; current_salary NUMBER := 20000; max_salary NUMBER := 10000; erroneous_salary NUMBER; BEGIN BEGIN IF current_salary > max_salary THEN RAISE salary_too_high; -- raise exception END IF; EXCEPTION WHEN salary_too_high THEN -- start handling exception erroneous_salary := current_salary; DBMS_OUTPUT.PUT_LINE('Salary ' || erroneous_salary ||' is out of range.'); DBMS_OUTPUT.PUT_LINE ('Maximum salary is ' || max_salary || '.'); RAISE; -- reraise current exception (exception name is optional) END; EXCEPTION WHEN salary_too_high THEN -- finish handling exception current_salary := max_salary; DBMS_OUTPUT.PUT_LINE ( 'Revising salary from ' || erroneous_salary || ' to ' || current_salary || '.' ); END; /
Result:
Salary 20000 is out of range. Maximum salary is 10000. Revising salary from 20000 to 10000.
RAISE_APPLICATION_ERROR Procedure
You can invoke the RAISE_APPLICATION_ERROR
procedure (defined in the DBMS_STANDARD
package) only from a stored subprogram or method. Typically, you invoke this procedure to raise a user-defined exception and return its error code and error message to the invoker.
To invoke RAISE_APPLICATION_ERROR
, use this syntax:
RAISE_APPLICATION_ERROR (error_code, message[, {TRUE | FALSE}]);
You must have assigned error_code
to the user-defined exception with the EXCEPTION_INIT
pragma. The syntax is:
PRAGMA EXCEPTION_INIT (exception_name, error_code)
For semantic information, see «EXCEPTION_INIT Pragma».
The error_code
is an integer in the range -20000..-20999 and the message
is a character string of at most 2048 bytes.
If you specify TRUE
, PL/SQL puts error_code
on top of the error stack. Otherwise, PL/SQL replaces the error stack with error_code
.
In Example 11-12, an anonymous block declares an exception named past_due
, assigns the error code -20000 to it, and invokes a stored procedure. The stored procedure invokes the RAISE_APPLICATION_ERROR
procedure with the error code -20000 and a message, whereupon control returns to the anonymous block, which handles the exception. To retrieve the message associated with the exception, the exception handler in the anonymous block invokes the SQLERRM
function, described in «Error Code and Error Message Retrieval».
Example 11-12 Raising User-Defined Exception with RAISE_APPLICATION_ERROR
CREATE PROCEDURE account_status ( due_date DATE, today DATE ) AUTHID DEFINER IS BEGIN IF due_date < today THEN -- explicitly raise exception RAISE_APPLICATION_ERROR(-20000, 'Account past due.'); END IF; END; / DECLARE past_due EXCEPTION; -- declare exception PRAGMA EXCEPTION_INIT (past_due, -20000); -- assign error code to exception BEGIN account_status ('1-JUL-10', '9-JUL-10'); -- invoke procedure EXCEPTION WHEN past_due THEN -- handle exception DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLERRM(-20000))); END; /
Result:
ORA-20000: Account past due.
Exception Propagation
If an exception is raised in a block that has no exception handler for it, then the exception propagates. That is, the exception reproduces itself in successive enclosing blocks until either a block has a handler for it or there is no enclosing block. If there is no handler for the exception, then PL/SQL returns an unhandled exception error to the invoker or host environment, which determines the outcome (for more information, see «Unhandled Exceptions»).
In Figure 11-1, one block is nested inside another. The inner block raises exception A. The inner block has an exception handler for A, so A does not propagate. After the exception handler runs, control transfers to the next statement of the outer block.
In Figure 11-2, the inner block raises exception B. The inner block does not have an exception handler for exception B, so B propagates to the outer block, which does have an exception handler for it. After the exception handler runs, control transfers to the host environment.
In Figure 11-3, the inner block raises exception C. The inner block does not have an exception handler for C, so exception C propagates to the outer block. The outer block does not have an exception handler for C, so PL/SQL returns an unhandled exception error to the host environment.
A user-defined exception can propagate beyond its scope (that is, beyond the block that declares it), but its name does not exist beyond its scope. Therefore, beyond its scope, a user-defined exception can be handled only with an OTHERS
exception handler.
In Example 11-13, the inner block declares an exception named past_due
, for which it has no exception handler. When the inner block raises past_due
, the exception propagates to the outer block, where the name past_due
does not exist. The outer block handles the exception with an OTHERS
exception handler.
Example 11-13 Exception that Propagates Beyond Scope is Handled
CREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS BEGIN DECLARE past_due EXCEPTION; due_date DATE := trunc(SYSDATE) - 1; todays_date DATE := trunc(SYSDATE); BEGIN IF due_date < todays_date THEN RAISE past_due; END IF; END; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /
If the outer block does not handle the user-defined exception, then an error occurs, as in Example 11-14.
Example 11-14 Exception that Propagates Beyond Scope is Not Handled
BEGIN
DECLARE
past_due EXCEPTION;
due_date DATE := trunc(SYSDATE) - 1;
todays_date DATE := trunc(SYSDATE);
BEGIN
IF due_date < todays_date THEN
RAISE past_due;
END IF;
END;
END;
/
Result:
BEGIN
*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at line 9
Note:
Exceptions cannot propagate across remote subprogram invocations. Therefore, a PL/SQL block cannot handle an exception raised by a remote subprogram.
Topics
-
Propagation of Exceptions Raised in Declarations
-
Propagation of Exceptions Raised in Exception Handlers
Propagation of Exceptions Raised in Declarations
An exception raised in a declaration propagates immediately to the enclosing block (or to the invoker or host environment if there is no enclosing block). Therefore, the exception handler must be in an enclosing or invoking block, not in the same block as the declaration.
In Example 11-15, the VALUE_ERROR
exception handler is in the same block as the declaration that raises VALUE_ERROR
. Because the exception propagates immediately to the host environment, the exception handler does not handle it.
Example 11-15 Exception Raised in Declaration is Not Handled
DECLARE credit_limit CONSTANT NUMBER(3) := 5000; -- Maximum value is 999 BEGIN NULL; EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('Exception raised in declaration.'); END; /
Result:
DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: number precision too large ORA-06512: at line 2
Example 11-16 is like Example 11-15 except that an enclosing block handles the VALUE_ERROR
exception that the declaration in the inner block raises.
Example 11-16 Exception Raised in Declaration is Handled by Enclosing Block
BEGIN DECLARE credit_limit CONSTANT NUMBER(3) := 5000; BEGIN NULL; END; EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('Exception raised in declaration.'); END; /
Result:
Exception raised in declaration.
Propagation of Exceptions Raised in Exception Handlers
An exception raised in an exception handler propagates immediately to the enclosing block (or to the invoker or host environment if there is no enclosing block). Therefore, the exception handler must be in an enclosing or invoking block.
In Example 11-17, when n
is zero, the calculation 1/n
raises the predefined exception ZERO_DIVIDE
, and control transfers to the ZERO_DIVIDE
exception handler in the same block. When the exception hander raises ZERO_DIVIDE
, the exception propagates immediately to the invoker. The invoker does not handle the exception, so PL/SQL returns an unhandled exception error to the host environment.
Example 11-17 Exception Raised in Exception Handler is Not Handled
CREATE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS BEGIN DBMS_OUTPUT.PUT_LINE(1/n); -- handled EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error:'); DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined'); -- not handled END; / BEGIN -- invoking block print_reciprocal(0); END;
Result:
Error: BEGIN * ERROR at line 1: ORA-01476: divisor is equal to zero ORA-06512: at "HR.PRINT_RECIPROCAL", line 7 ORA-01476: divisor is equal to zero ORA-06512: at line 2
Example 11-18 is like Example 11-17 except that when the procedure returns an unhandled exception error to the invoker, the invoker handles it.
Example 11-18 Exception Raised in Exception Handler is Handled by Invoker
CREATE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS BEGIN DBMS_OUTPUT.PUT_LINE(1/n); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error:'); DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined'); END; / BEGIN -- invoking block print_reciprocal(0); EXCEPTION WHEN ZERO_DIVIDE THEN -- handles exception raised in exception handler DBMS_OUTPUT.PUT_LINE('1/0 is undefined.'); END; /
Result:
Error: 1/0 is undefined.
Example 11-19 is like Example 11-17 except that an enclosing block handles the exception that the exception handler in the inner block raises.
Example 11-19 Exception Raised in Exception Handler is Handled by Enclosing Block
CREATE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS BEGIN BEGIN DBMS_OUTPUT.PUT_LINE(1/n); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error in inner block:'); DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined.'); END; EXCEPTION WHEN ZERO_DIVIDE THEN -- handles exception raised in exception handler DBMS_OUTPUT.PUT('Error in outer block: '); DBMS_OUTPUT.PUT_LINE('1/0 is undefined.'); END; / BEGIN print_reciprocal(0); END; /
Result:
Error in inner block: Error in outer block: 1/0 is undefined.
In Example 11-20, the exception-handling part of the procedure has exception handlers for user-defined exception i_is_one
and predefined exception ZERO_DIVIDE
. When the i_is_one
exception handler raises ZERO_DIVIDE
, the exception propagates immediately to the invoker (therefore, the ZERO_DIVIDE
exception handler does not handle it). The invoker does not handle the exception, so PL/SQL returns an unhandled exception error to the host environment.
Example 11-20 Exception Raised in Exception Handler is Not Handled
CREATE PROCEDURE descending_reciprocals (n INTEGER) AUTHID DEFINER IS i INTEGER; i_is_one EXCEPTION; BEGIN i := n; LOOP IF i = 1 THEN RAISE i_is_one; ELSE DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || i || ' is ' || 1/i); END IF; i := i - 1; END LOOP; EXCEPTION WHEN i_is_one THEN DBMS_OUTPUT.PUT_LINE('1 is its own reciprocal.'); DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || TO_CHAR(i-1) || ' is ' || TO_CHAR(1/(i-1))); WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error:'); DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined'); END; / BEGIN descending_reciprocals(3); END; /
Result:
Reciprocal of 3 is .3333333333333333333333333333333333333333 Reciprocal of 2 is .5 1 is its own reciprocal. BEGIN * ERROR at line 1: ORA-01476: divisor is equal to zero ORA-06512: at "HR.DESCENDING_RECIPROCALS", line 19 ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at line 2
Example 11-21 is like Example 11-20 except that an enclosing block handles the ZERO_DIVIDE
exception that the i_is_one
exception handler raises.
Example 11-21 Exception Raised in Exception Handler is Handled by Enclosing Block
CREATE PROCEDURE descending_reciprocals (n INTEGER) AUTHID DEFINER IS i INTEGER; i_is_one EXCEPTION; BEGIN BEGIN i := n; LOOP IF i = 1 THEN RAISE i_is_one; ELSE DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || i || ' is ' || 1/i); END IF; i := i - 1; END LOOP; EXCEPTION WHEN i_is_one THEN DBMS_OUTPUT.PUT_LINE('1 is its own reciprocal.'); DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || TO_CHAR(i-1) || ' is ' || TO_CHAR(1/(i-1))); WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error:'); DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined'); END; EXCEPTION WHEN ZERO_DIVIDE THEN -- handles exception raised in exception handler DBMS_OUTPUT.PUT_LINE('Error:'); DBMS_OUTPUT.PUT_LINE('1/0 is undefined'); END; / BEGIN descending_reciprocals(3); END; /
Result:
Reciprocal of 3 is .3333333333333333333333333333333333333333 Reciprocal of 2 is .5 1 is its own reciprocal. Error: 1/0 is undefined
Unhandled Exceptions
If there is no handler for a raised exception, PL/SQL returns an unhandled exception error to the invoker or host environment, which determines the outcome.
If a subprogram exits with an unhandled exception, then actual parameters for OUT
and IN
OUT
formal parameters passed by value (the default) retain the values that they had before the subprogram invocation (see Example 8-15).
If a stored subprogram exits with an unhandled exception, PL/SQL does not roll back database changes made by the subprogram.
The FORALL
statement runs one DML statement multiple times, with different values in the VALUES
and WHERE
clauses. If one set of values raises an unhandled exception, then PL/SQL rolls back all database changes made earlier in the FORALL
statement. For more information, see «Handling FORALL Exceptions Immediately» and «Handling FORALL Exceptions After FORALL Statement Completes».
Tip:
Avoid unhandled exceptions by including an OTHERS
exception handler at the top level of every PL/SQL program.
Error Code and Error Message Retrieval
In an exception handler, for the exception being handled:
-
You can retrieve the error code with the PL/SQL function
SQLCODE
, described in «SQLCODE Function». -
You can retrieve the error message with either:
-
The PL/SQL function
SQLERRM
, described in «SQLERRM Function»This function returns a maximum of 512 bytes, which is the maximum length of an Oracle Database error message (including the error code, nested messages, and message inserts such as table and column names).
-
The package function
DBMS_UTILITY
.FORMAT_ERROR_STACK
, described in Oracle Database PL/SQL Packages and Types ReferenceThis function returns the full error stack, up to 2000 bytes.
Oracle recommends using
DBMS_UTILITY
.FORMAT_ERROR_STACK
, except when using theFORALL
statement with itsSAVE
EXCEPTIONS
clause, as in Example 12-13. -
A SQL statement cannot invoke SQLCODE
or SQLERRM
. To use their values in a SQL statement, assign them to local variables first, as in Example 11-22.
Example 11-22 Displaying SQLCODE and SQLERRM Values
DROP TABLE errors; CREATE TABLE errors ( code NUMBER, message VARCHAR2(64) ); CREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS name EMPLOYEES.LAST_NAME%TYPE; v_code NUMBER; v_errm VARCHAR2(64); BEGIN SELECT last_name INTO name FROM EMPLOYEES WHERE EMPLOYEE_ID = -1; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1, 64); DBMS_OUTPUT.PUT_LINE ('Error code ' || v_code || ': ' || v_errm); /* Invoke another procedure, declared with PRAGMA AUTONOMOUS_TRANSACTION, to insert information about errors. */ INSERT INTO errors (code, message) VALUES (v_code, v_errm); RAISE; END; /
Result:
Error code 100: ORA-01403: no data found
Continuing Execution After Handling Exceptions
After an exception handler runs, control transfers to the next statement of the enclosing block (or to the invoker or host environment if there is no enclosing block). The exception handler cannot transfer control back to its own block.
For example, in Example 11-23, after the SELECT
INTO
statement raises ZERO_DIVIDE
and the exception handler handles it, execution cannot continue from the INSERT
statement that follows the SELECT
INTO
statement.
Example 11-23 Exception Handler Runs and Execution Ends
DROP TABLE employees_temp; CREATE TABLE employees_temp AS SELECT employee_id, salary, commission_pct FROM employees; DECLARE sal_calc NUMBER(8,2); BEGIN INSERT INTO employees_temp (employee_id, salary, commission_pct) VALUES (301, 2500, 0); SELECT (salary / commission_pct) INTO sal_calc FROM employees_temp WHERE employee_id = 301; INSERT INTO employees_temp VALUES (302, sal_calc/100, .1); DBMS_OUTPUT.PUT_LINE('Row inserted.'); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Division by zero.'); END; /
Result:
Division by zero.
If you want execution to resume with the INSERT
statement that follows the SELECT
INTO
statement, then put the SELECT
INTO
statement in an inner block with its own ZERO_DIVIDE
exception handler, as in Example 11-24.
Example 11-24 Exception Handler Runs and Execution Continues
DECLARE sal_calc NUMBER(8,2); BEGIN INSERT INTO employees_temp (employee_id, salary, commission_pct) VALUES (301, 2500, 0); BEGIN SELECT (salary / commission_pct) INTO sal_calc FROM employees_temp WHERE employee_id = 301; EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Substituting 2500 for undefined number.'); sal_calc := 2500; END; INSERT INTO employees_temp VALUES (302, sal_calc/100, .1); DBMS_OUTPUT.PUT_LINE('Enclosing block: Row inserted.'); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Enclosing block: Division by zero.'); END; /
Result:
Substituting 2500 for undefined number. Enclosing block: Row inserted.
See Also:
Example 12-13, where a bulk SQL operation continues despite exceptions
Retrying Transactions After Handling Exceptions
To retry a transaction after handling an exception that it raised, use this technique:
-
Enclose the transaction in a sub-block that has an exception-handling part.
-
In the sub-block, before the transaction starts, mark a savepoint.
-
In the exception-handling part of the sub-block, put an exception handler that rolls back to the savepoint and then tries to correct the problem.
-
Put the sub-block inside a
LOOP
statement. -
In the sub-block, after the
COMMIT
statement that ends the transaction, put anEXIT
statement.If the transaction succeeds, the
COMMIT
andEXIT
statements execute.If the transaction fails, control transfers to the exception-handling part of the sub-block, and after the exception handler runs, the loop repeats.
Example 11-25 uses the preceding technique to retry a transaction whose INSERT
statement raises the predefined exception DUP_VAL_ON_INDEX
if the value of res_name
is not unique.
Example 11-25 Retrying Transaction After Handling Exception
DROP TABLE results; CREATE TABLE results ( res_name VARCHAR(20), res_answer VARCHAR2(3) ); CREATE UNIQUE INDEX res_name_ix ON results (res_name); INSERT INTO results (res_name, res_answer) VALUES ('SMYTHE', 'YES'); INSERT INTO results (res_name, res_answer) VALUES ('JONES', 'NO'); DECLARE name VARCHAR2(20) := 'SMYTHE'; answer VARCHAR2(3) := 'NO'; suffix NUMBER := 1; BEGIN FOR i IN 1..5 LOOP -- Try transaction at most 5 times. DBMS_OUTPUT.PUT('Try #' || i); BEGIN -- sub-block begins SAVEPOINT start_transaction; -- transaction begins DELETE FROM results WHERE res_answer = 'NO'; INSERT INTO results (res_name, res_answer) VALUES (name, answer); -- Nonunique name raises DUP_VAL_ON_INDEX. -- If transaction succeeded: COMMIT; DBMS_OUTPUT.PUT_LINE(' succeeded.'); EXIT; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE(' failed; trying again.'); ROLLBACK TO start_transaction; -- Undo changes. suffix := suffix + 1; -- Try to fix problem. name := name || TO_CHAR(suffix); END; -- sub-block ends END LOOP; END; /
Result:
Try #1 failed; trying again. Try #2 succeeded.
October 11, 2020
ORACLE
This article contains information about Oracle PL/SQL Exception and Types such as system defined, user defined.
What is Exception in Oracle PL/SQL?
These are the structures used for the management of errors that occur during the execution of commands.
Oracle PL/SQL Exception Types
- System-defined
- User-defined
The use of the PL / SQL Exception structure is as follows.
DECLARE — definitions BEGIN — commands EXCEPTION WHEN HATA—TURU THEN — commands WHEN OTHERS THEN — commands END; |
Sample Exception Usage is as follows;
BEGIN DBMS_OUTPUT.put_line(3/0); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.put_line(‘Divide by zero error.’); WHEN OTHERS THEN DBMS_OUTPUT.put_line(‘unknown error.’); END; |
System Defined Exceptions in Oracle PL/SQL
The Exception type previously created by Oracle PL / SQL is called System defined.
System-defined exception types are listed below.
- ACCESS_INTO_NULL
- ASE_NOT_FOUND
- COLLECTION_IS_NULL
- DUP_VAL_ON_INDEX
- INVALID_CURSOR
- INVALID_NUMBER, LOGIN_DENIED
- NO_DATA_FOUND
- NOT_LOGGED_ON
- PROGRAM_ERROR
- ROWTYPE_MISMATCH
- SELF_IS_NULL
- STORAGE_ERROR
- TOO_MANY_ROWS
- VALUE_ERROR
- ZERO_DIVIDE
User Defined Exceptions in Oracle PL/SQL
Oracle also allows custom exception definition. These Exception types are called user defined exceptions. You can create User Defined Exception as follows.
DECLARE MY_CUSTOM_ERROR EXCEPTION; BEGIN NULL; END; |
We can set a special error code for the exception as follows.
DECLARE CUSTOM_ERROR EXCEPTION; PRAGMA EXCEPTION_INIT (CUSTOM_ERROR, —1453); BEGIN NULL; END; |
The occured error can be triggered by RAISE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SET SERVEROUTPUT ON; DECLARE CUSTOM_ERROR EXCEPTION; PRAGMA EXCEPTION_INIT (CUSTOM_ERROR, —1453); v_sayi PLS_INTEGER := ‘0’; BEGIN IF v_sayi = 0 THEN RAISE CUSTOM_ERROR; — RAISE_APPLICATION_ERROR(—1453, ‘Another Error.’); END IF; EXCEPTION WHEN CUSTOM_ERROR THEN DBMS_OUTPUT.put_line(‘Special Error Occured.’); DBMS_OUTPUT.put_line(SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.put_line(‘Unknown Error Occured.’); END; |
The RAISE_APPLICATION_ERROR function takes the “error code”, “error message”, and “whether the error should be replaced with existing errors” as parameters to create a custom error.
You can find more detailed information about below topics in the below link.
PL/SQL Tutorial
You will find below topics in this article.
- What is PL/SQL
- Oracle PL/SQL Data Types and Variables and Literals
- Oracle PL/SQL Operators
- Oracle PL/SQL Conditional Statements
- Oracle PL/SQL Loops
- Oracle PL/SQL Procedures and Procedure Parameters
- Oracle PL/SQL Functions
- Oracle PL/SQL Cursor
- Oracle PL/SQL Records
- Oracle PL/SQL Exception
- Oracle PL/SQL Trigger
- Oracle PL/SQL Packages
- Oracle PL/SQL Collections
You can find more information about exception at docs.oracle.com
Ошибки Оракла ORA-00000 — ORA-00999
Группы первой тысячи ошибок Oracle (по диапазонам кодов от 0 до 999):
- Сообщения об ошибках ORA-00000 — ORA-00099
- Ошибки областей и сегментов ORA-00100 — ORA-00299
- Ошибки I/O-управления базой данных ORA-00300 — ORA-00399
- Ошибки инициализации базы данных ORA-00400 — ORA-00499
- Сообщения об ошибках ORA-00500 — ORA-00599
- Ошибки аварийного восстановления ORA-00600 — ORA-00699
- Словарные ошибки ORA-00700 — ORA-00799
- Общие ошибки ORACLE ORA-00800 — ORA-00899
- Синтаксические ошибки ORA-00900 — ORA-00999
Сообщения об ошибках ORA-00000 — ORA-00099
Сообщения ORA-00000 — нормальное, успешное завершение, т.е., не ошибка.
Методологические ошибки доступа к ядру 0001-0049
- ORA-00001: Дублированный ключ в индексе
- ORA-00017: Превышено максимальное число вызовов
- ORA-00018: Превышено максимальное количество сеансов
- ORA-00019: Число сеансов превысило число лицензий
- ORA-00020: Превышено максимальное число(количество) процессов (num)
- ORA-00021: Сеанс занят другим процессом. Не переключайте сеанс
- ORA-00022: Неверный ID сеанса. Доступ запрещен
- ORA-00023: Сеанс содержит ссылки на частную память. Нельзя отсоеденить сеанс
- ORA-00024: Соединение более чем с одним процессом запрещено в однопользовательском режиме
- ORA-00025: Невозможно разместить [значение]
- ORA-00026: Пропущен или некорректный ID сеанса
- ORA-00027: Невозможно уничтожить текущий сеанс
- ORA-00028: Ваша сессия была уничтожена
- ORA-00029: Сеанс не пользовательский сеанс
- ORA-00030: Сеанса пользователя с указанным ID не сществует
- ORA-00031: Сеанс помечен для уничтожения
- ORA-00032: Неверный пароль перемещения сессии
- ORA-00033: Текущий сеанс с пустым паролем перемещения
- ORA-00034: Невозможно выполнить COMMIT или ROLLBACK в текущем PL/SQL сеансе
- ORA-00035: Значение LICENSE_MAX_USERS не может быть меньше чем текущее количество пользователей
- ORA-00036: Достигнуто максимальное количество уровней (значение) рекурсии SQL
- ORA-00037: Невозможно переключится на сеанс другой серверной группы
- ORA-00038: Невозможно создать сеанс. Серверная группа принадлежит другому пользователю
ENQ ошибки 0050-0080
- ORA-00050: Ошибка операционной системы при получении очереди
- ORA-00051: Истекло время ожидания ресурса
- ORA-00052: Превышено максимальное число возвращаемых ресурсов
- ORA-00053: превышено максимальное количество очередей
- ORA-00054: Ресурс занят, при обращении с указателем NOWAIT
- ORA-00055: Превышено максимальное количество DML блокировок
- ORA-00056: На заблокированный объект накладывыется DDL блокировка
- ORA-00057: Превышено максимальное количество временных блокировок таблицы
- ORA-00058: DB_BLOCK_SIZE должен быть равным с монтируемой БД
- ORA-00059: Превышено значение параметра DB_FILES
- ORA-00060: Возникла мертвая блокировка во время ожидания ресурса
- ORA-00061: Другой экземпляр имеет другие настройки DML_LOCK
- ORA-00062: DML блокировка всей таблицы ен может быть установлена. Параметр DML_LOCKS нулевой
- ORA-00063: Превышено значение параметра LOG_FILES
- ORA-00064: Размещение объекта невозможно, он слишком большой для данной операционной системы
- ORA-00065: Ошибка инициализации параметра FIXED_DATE
- ORA-00066: Значение LOG_FILES не совпадают
- ORA-00067: Некорректное значение для строкового параметра, должна быть строка
- ORA-00068: Некорректное значение для строкового параметра, должно быть строковым
- ORA-00069: Нельзя заблокировать таблицу — блокировка запрещена для [значение]
- ORA-00070: Команда [значение] некорректна
- ORA-00071: количество процессов должно быть от 1:
- ORA-00072: Указанный процесс не является активным
- ORA-00073: Указано неверное количетсво аргументов для команды
- ORA-00074: Пооцесс не определен
- ORA-00075: Процесс [значение] не найден в текущем экземпляре
- ORA-00076: dump [значение] не найден
- ORA-00077: Указанный dump некорректный
- ORA-00078: Невозможно определить dump по имени
- ORA-00079: Переменная [значение] не найдена
- ORA-00080: Была попытка сделать dump неверной области памяти
- ORA-00081: Указанный диапазон не является корректным
- ORA-00082: Диапазон памяти не в указанном диапазоне
- ORA-00083: Возможно повреждена SGA
- ORA-00084: Global Area должна быть PGA, SGA или UGA
- ORA-00085: Текущий вызов не существует
- ORA-00086: Пользовательский вызов не существует
- ORA-00087: Команда не может быть выполнена на удаленном экземпляре
- ORA-00088: Команда не может быть выполнена распеределенным сервером
- ORA-00089: Неверный номер экземпляра в команде ORADEBUG
- ORA-00090: Команда ORADEBUG не смогла корректно выделить память в кластерной БД
- ORA-00091: LARGE_POOL_SIZE должен быть указан
- ORA-00092: LARGE_POOL_SIZE должен быть больше LARGE_POOL_MIN_ALLOC
- ORA-00093: %s указан неверно
- ORA-00094: %s должен содержать значение Integer
- ORA-00096: Неверное значение [значение] для параметра [значение], должно быть из допустимого диапазона
- ORA-00097: Особенности Oracle SQL не поддерживаются SQL92:
- ORA-00099: Истекло время ожидания ресурса. Потенциальная PDML мертвая блокировка
Ошибки областей и сегментов ORA-00100 — ORA-00299
- ORA-00100: Данных не найдено
- ORA-00101: Неверная спецификация системного параметра DISPATCHERS
- ORA-00102: Указанный сетевой протокол не может быть использован диспетчерами
- ORA-00103: Неверный сетевой протокол, зарезервирован для использования диспетчерами
- ORA-00104: Обнаружена мертвая блокировка, все доступные сервера блокированы, ожидание ресурса
- ORA-00105: слишком много конфигураций диспетчера
- ORA-00106: База данных не может быть простартована или остановлена пока есть соединение с диспетчером
- ORA-00107: невозможно установить соединение с процессом прослушивателем ORACLE
- ORA-00108: Невозможна настройка диспетчера для принятия асинхронных соединений
- ORA-00111: Неверный аттрибут [значение]
- ORA-00112: Значение аттрибута пусто (null)
- ORA-00113: Наименование протокола [значение] слишком длинное
- ORA-00114: Неверное значение для системного параметра SERVICE_NAMES
- ORA-00115: Соединение сброшено, таблица соединений заполнена
- ORA-00116: Значение SERVICE_NAMES некорректно
- ORA-00117: PROTOCOL, ADDRESS или DESCRIPTION должны быть указаны
- ORA-00118: Только одно значение PROTOCOL, ADDRESS или DESCRIPTION может быть указано
- ORA-00119: Неверное значение системного параметра
- ORA-00120: Диспетчер не разрешен или не установлен
- ORA-00121: SHARED_SERVERS определен без параметра DISPATCHERS
- ORA-00122: Невозможно проинициализорвать конфигурацию сети
- ORA-00123: Простой общего сервера
- ORA-00124: DISPATCHERS указан без MAX_SHARED_SERVERS
- ORA-00125: Соединение сброшено; неверное представление
- ORA-00126: Соединение сброшено; противоречие
- ORA-00127: Диспетчер не существет
- ORA-00128: Для команды требуется имя диспетчера
- ORA-00129: Неверный адрес прослушивания
- ORA-00130: Неверный адрес для прослушивания
- ORA-00131: Сетевой протокол не поддерживает указанную регистрацию
- ORA-00132: Синтаксическая ошибка или недопустимое сетевое имя
- ORA-00150: Дублирующийся идентификатор транзакции
- ORA-00151: Дублирующийся идентификатор транзакции
- ORA-00152: Текущая сессия не соотвествует запрошенной
- ORA-00153: Ошибка в библиотеке XA
- ORA-00154: Ошибка протокола в мониторе транзакций
- ORA-00155: Не могу выполнить задание за пределами глобальной транзакции
- ORA-00160: Имя глобальной транзакции превышает масксимальную длину
- ORA-00161: Длина транзакции некорректна
- ORA-00162: Внешний идентификатор базы данных превышает маскимальное значение
- ORA-00163: Внешнее имя базы данных превышает максимальное значение
- ORA-00164: Распределенные автономные транзакции не разрешены поверх переносимых распределенных транзакций
- ORA-00165: Автономные переносимые распределенные транзакции с удаленными операциями не разрешены
- ORA-00200: Управляющий файл не может быть создан
- ORA-00201: Версия управляющенго файла [значение] несовместима с версией ORACLE [значение]
- ORA-00202: Управляющий файл: [значение]
- ORA-00203: Использование неверного управляющего файла
- ORA-00204: Ошибка чтения блока данных (блок [значение], блоков [значение]) в управляющем файле
- ORA-00205: Ошибка идентификации управляющего файла. Смотрите лог для дополнительной информации
- ORA-00206: Ошибка записи в управляющий файл (блок [значение], блоков [значение])
- ORA-00207: Управляющий файл не от этой базы данных
- ORA-00208: Количество управляющих файлов превышает допустимое значение [значение]
- ORA-00209: Блок данных управляющего файла не совпадает. Смотрите лог для получения дополнительной информации
- ORA-00210: Невозможно открыть указанный управляющий файл
- ORA-00211: Управляющий файл не совпадает с предыдущим
- ORA-00212: Размер блока [значение] меньше минимально требуемого [значение]
- ORA-00213: Невозможно повторно использовать управляющий файл, размер файла %1: требуется %2:
- ORA-00214: Версия управляющего файла несовместима с версией файла
- ORA-00215: Должен быть минимум один управляющий файл
- ORA-00216: Размер управляющего файла не может быть изменен для переноса с 8.0.2:
- ORA-00217: Размер управляющего файла не может быть изменен для переноса с 9.0.1:
- ORA-00218: Размер блока данных управляющих файлов не совпадает с размером указанным в параметре DB_BLOCK_SIZE
- ORA-00219: Размер управляющего файла превышает установленный размер
- ORA-00220: Управляющий файл не может быть подключен, смотрите alert-log для более детальной информации
- ORA-00221: Ошибка записи в управляющий файл
- ORA-00222: Операция пытается использовать имя уже примонтированного управляющего файла
- ORA-00223: Конвертируемый файл неверный или имеет неверную версию
- ORA-00224: Неудачное изменение размера управляющего файла с неверным типом записи
- ORA-00225: Ожидаемый размер управляющего файла [значение] отличается от актуального [значение]
- ORA-00226: Операция невозможна пока альтернативный управляющий файл открыт
- ORA-00227: В управляющем файле найден поврежденный блок данных (блок [значение] блоков [значение]).
- ORA-00228: Длина имени альтернативного контрольного файла превышает допустимое значение [значение]
- ORA-00229: Операция запрещена. Файл-снимок (snapshot) уже помещен в очередь и занят процессом
- ORA-00230: Операция запрещена. Очередь снимоков контрольного файла недоступна
- ORA-00231: Снимок управляющего файла не назван
- ORA-00232: Снимок управляющего файла не существует, поврежден или нечитаемый
- ORA-00233: Копия управляющего файла повреждена или нечитаема
- ORA-00234: Ошибка идентификации или открытия снимка или копирования управляющего файла
- ORA-00235: Управляющий файл заблокирован для паралельного изменения
- ORA-00236: Снимок отменен, выбран резервный управляющий файл
- ORA-00237: Операция создания снимка запрещена. Создан новый управляющий файл
- ORA-00238: Операция пытается использовать имя файла как и имя базы данных
- ORA-00250: Архиватор не запущен
- ORA-00251: LOG_ARCHIVE_DUPLEX_DEST не может быть той же самой директорией что и %1:
- ORA-00252: Журнал пуст. Архивирование невозможно
- ORA-00253: Длина указанной строки превышает предел
- ORA-00254: Ошибка в управляющей строке архива
- ORA-00255: Ошибка во время архивации log-файла
- ORA-00256: Произошла ошибка при разборе архивной строки
- ORA-00257: Ошибка архиватора. Не могу подсоеденится пока занят ресурс
- ORA-00258: При ручном архивировании в режиме NOARCHIVELOG log должен быть указн
- ORA-00259: Журнал открытого экземпляра является текущим журнало и не может быть заархивирован
- ORA-00260: Не могу найти активный журнал очереди [значение] для потока [значение]
- ORA-00261: Журнал был изменен или архивирован
- ORA-00262: Текущий журнал [значение] занят другим потоком [значение], невозможно переклюится
- ORA-00263: Нет журналов для архивирования для потока [значение]
- ORA-00264: Восстаовления не требуется
- ORA-00265: Требуется восстановление экземпляра, новозможно утсановить режим ARCHIVELOG
- ORA-00266: Требуется имя архивного журнала
- ORA-00267: Имя архивного журнала не требуется
- ORA-00268: Указанный журнальный файл не существует
- ORA-00269: Указанный журнальный файл — часть потока [значение] не [значение]
- ORA-00270: Ошибка создания архивного журнала [значение]
- ORA-00271: Нет журналов требующих архивации
- ORA-00272: Ошибка записи в архивный журнал [значение]
- ORA-00273: Восстановление данных загруженных напрямую без журнализации
- ORA-00274: Указано неверное значение [значение] параметра восстановления
- ORA-00275: Процедура восстановления уже запущена
- ORA-00276: Ключевое слово CHANGE указано, но не указан номер изменения
- ORA-00277: Недопустимая опция восстановления UNTIL флаг [значение]
- ORA-00278: Журнальный файл [значение] больше не требуется для восстановления
- ORA-00279: Требуется имя журнального файла
- ORA-00280: Требуется имя потока и последовательности
- ORA-00281: Восстановление не может быть выполнено с использованием диспетчера
- ORA-00282: UPI вызов не поддерживается, используйте ALTER DATABASE RECOVER
- ORA-00283: Сеанс восстановления отменен из за ошибок
- ORA-00284: Сеанс восстановления в процессе
- ORA-00285: Значение TIME задано неверно
- ORA-00286: Нет доступных файлов или файлов с корректными данными
- ORA-00287: Указанный номер изменения [значение] не найден в потоке [значение]
- ORA-00288: Для продолжения восстановления используйте ALTER DATABASE RECOVER CONTINUE
- ORA-00289: Переменная [значение]
- ORA-00290: Ошибка операционной системы. См сообщение об ошибке ниже
- ORA-00291: Для PARALLEL требуется числовое значение
- ORA-00292: Компонет «паралельное восстановление» не установлен
- ORA-00293: Управляющий файл не синхронизирован с журналом повторного выполнения
- ORA-00294: Указан неверный формат для архивного журнала [значение]
- ORA-00295: Неверный номер файла данных/временных данных [значение], должно быть от 1: до [значение]
- ORA-00296: Превышено значение RECOVER DATAFILE LIST
- ORA-00297: Требуется указать RECOVER DATAFILE LIST перед RECOVER DATAFILE START
- ORA-00298: Пропущенное или неверное значение аттрибута
- ORA-00299: Восстановление на файловом уровне файла данных %1
Ошибки I/O-управления базой данных ORA-00300 — ORA-00399
Ошибки управления входом в БД Оракл и выходом из неё:
- ORA-00300: Недопустимый размер блока журнала повторного выполнения, указанный размер [значение] превышает предел размер [значение]
- ORA-00301: Ошибка в добавлении файла протокола [значение] — файл не может быть создан
- ORA-00302: Превышен лимит количества журнальных файлов
- ORA-00303: невозможно выполнить Parallel Redo
- ORA-00304: Запрашиваемый INSTANCE_NUMBER занят
- ORA-00305: Журнал [значение] потока [значение] не согласован и принадлежит другой базе данных
- ORA-00306: Достигнут предел количества экземпляров [значение]
- ORA-00307: Запрошенный INSTANCE_NUMBER выходит за допустимые пределы, максимум [значение]
- ORA-00308: Невозможно открыть архивный журнал [значение]
- ORA-00309: Журнал принадлежит другой базе данных
- ORA-00310: Архивный журнал содержит последовательность [значение]; требуется последовательность [значение]
- ORA-00311: Невозможно прочитать заголовок архивного журнала
- ORA-00312: Доступный журнал [значение] поток [значение]
- ORA-00313: Ошибка при открытии файла журнальной группы [значение] поток [значение]
- ORA-00314: Журнал [значение], ожидаемая последовательность [значение] не совпадает с [значение]
- ORA-00315: Журнал [значение] поток [значение], неверное значение [значение] в заголовке
- ORA-00316: Журнал [значение], значение [значение] в заголовке указывает что это не журнальный файл
- ORA-00317: Указанный файл [значение] не является журнальным файлом
- ORA-00318: Журнал [значение] превысил допустимый размер [значение] не совпадает с [значение]
- ORA-00319: Журнал [значение] имеет некорректный статус сброса
- ORA-00320: Невозможно прочитать заголовок файла [значение] потока [значение]
- ORA-00321: Невозможно обновить данные в заголовке журнального файла [значение] поток [значение]
- ORA-00322: Журнал [значение] потока [значение] не текуща копия
- ORA-00323: Текущий журнал потока [значение] не пригоден к использованию и все другие требуют архивации
- ORA-00324: Имя журнального файла [значение] переведенное [значение] слишком длинное, превышен допустимый предел [значение]
- ORA-00325: Архивный журнал потока [значение] содержит неверное значение [значение] в заголовке
- ORA-00326: Журнал начинается на [значение], требуется ранее измененное [значение]
- ORA-00327: Журнал [значение] потока [значение] имеет физический размер [значение] меньшее чем требуется [значение]
- ORA-00328: Архивный журнал заканчивается на [значение], требуется более позднее изменение [значение]
- ORA-00329: Архивный журнал начинается на [значение], требуется изменение [значение]
- ORA-00330: Архивный журнал заканчивается на [значение], требуется изменение [значение]
- ORA-00331: Версия журнала [значение] не совместима с версией ORACLE [значение]
- ORA-00332: Архивный журнал очень маленький, возможно неполностью заархивирован
- ORA-00333: Журнал повторного выполения прочитал [значение] ошибочных блоков из доступных [значение]
- ORA-00334: Архивный журнал [значение]
- ORA-00335: Доступный журнал [значение]: Нет журнала с таким номером, журнал не существует
- ORA-00336: Размер блока файла журнала меньше чем минимальный блок [значение]
- ORA-00337: Журнальный файл [значение] не существует и размер не указан
- ORA-00338: Журнал [значение] больше чем последнее значение управляющего файла
- ORA-00339: Архивный журнал не содержит каких либо повторных исполнений
- ORA-00340: I/O ошибка при обработке журнала [значение] потока [значение]
- ORA-00341: Журнальный файл [значение] имеет неверный номер [значение] в заголовке
- ORA-00342: Архивный журнал не содержит информации SCN [значение]
- ORA-00343: Слишком много ошибок, журнал закрыт
- ORA-00344: Невозможно пересздать доступный журнал [значение]
- ORA-00345: Ошибка записи в журнал повторного исполнения, блок [значение] всего [значение]
- ORA-00346: Журнал отмечен как устаревший (STALE)
- ORA-00347: Журнал [значение] потока [значение] имеет размер блока [значение], не совпадает, должно быть [значение]
- ORA-00348: Неудачная обработка повторного восстановления, экземпляр должен быть остановлен
- ORA-00349: Отказ в получении размера блока для [значение]
- ORA-00350: Журнал [значение] (поток [значение])экземпляра [значение] требует архивирования
- ORA-00351: Неправильное время для восстановления
- ORA-00352: Все журналы из потока [значение] должны быть архивированы — нельзя разрешить
- ORA-00353: Поврежден журнал блок [значение] изменение [значение] время [значение]
- ORA-00354: Поврежден заголовок блока журнала повторного выполнения
- ORA-00355: Номер изменения за пределами последовательности
- ORA-00356: Неверная длина описания изменения
- ORA-00357: Слишком много членов указано для журнального файла, максимум [значение]
- ORA-00358: Слишком много членов указано, максимум [значение]
- ORA-00359: Группа журнальных файлов [значение] не существует
- ORA-00360: Не член журнального файла: [значение]
- ORA-00361: Невозможно удалить последний журнал [значение] из группы [значение]
- ORA-00362: Требуемый член является верным журнальным файлом в группе [значение]
- ORA-00363: Журнал не архивированный
- ORA-00364: Невозможно писать в заголовок нового журнала
- ORA-00365: Указанный журнал не корректный
- ORA-00366: Журнал [значение] потока [значение], ошибка контрольной суммы в заголовке файла
- ORA-00367: Ошибка контрольной суммы в заголовке файла
- ORA-00368: Ошибка контрольной суммы в блоке журнала повторного выполнения
- ORA-00369: Текущий журнал потока [значение] испорчен и другой журнал очищен
- ORA-00371: Недостаточно памяти в разделяемом пуле, должно быть не меньше [значение]
- ORA-00372: Файл [значение] не может быть изменен в настоящее время
- ORA-00373: Версия открытого журнала [значение] несовместима с версией ORACLE [значение]
- ORA-00374: Значение параметра db_block_size=[значение] некорректно; должен быть составной в диапазоне [значение..значение]
- ORA-00375: Невозможно получить значение по-умолчанию db_block_size
- ORA-00376: Файл [значение] не может быть прочитан в настоящее время
- ORA-00377: Частое резервное копирование файла [значение] причина тупика в операциях записи
- ORA-00378: Буферный кэш не может быть создан как указано
- ORA-00379: Нет свободных буферов в буферном кэше [значение] для блока [значение]K
- ORA-00380: Не могу указать db_[значение]k_cache_size [значение]K это стандартный размер блока.
- ORA-00381: Невозможно использовать старый и новый параметры для указания размера буферного кэша
- ORA-00382: %s неверный размер блока, верное значение [значение..значение]
- ORA-00383: Значение по умолчанию для кэша не может быть уменьшено до нуля
- ORA-00384: Недостаточно памяти для увеличения кэша
- ORA-00390: Журнал [значение] потока [значение] очищен и не может быть текущим журналом
- ORA-00391: Все потоки с этого момента должны переключится на новый формат журнала
- ORA-00392: Журнал [значение] потока [значение] был очищен, операция не разрешена
- ORA-00393: Журнал [значение] потока [значение] необходим для восстановления недоступной (offline) базы данных.
- ORA-00394: Доступный журнал заново используется во время его архивирования
- ORA-00395: Журнал для клона базы данных должен быть переименован
- ORA-00396: Ошибка [значение] требует отката на однопроходное восстановление
- ORA-00397: Восстановление экземпляра прервано с ошибкой
- ORA-00398: Восстановление прервано до правильной переконфигурации
- ORA-00399: Поврежденное описание изменений в журнале повторного исполнения
Ошибки инициализации базы данных ORA-00400 — ORA-00499
- ORA-00400: Неверное значение [значение] для параметра [значение]
- ORA-00401: Значение для параметра [значение] не поддерживается этой версией
- ORA-00402: Изменения базы данных версии [значение] не могут быть использованы версией [значение]
- ORA-00403: [значение] не тоже самое как в других экземплярах [значение]
- ORA-00404: Преобразованный файл не найден: [значение]
- ORA-00405: Тип совместимости [значение]
- ORA-00406: Параметр COMPATIBLE требует значение [значение] или выше
- ORA-00407: Откат обновления с версии [значение].[значение] до версии [значение].[значение] неразрешено
- ORA-00408: Значение параметра [значение] выставлено в TRUE
- ORA-00436: Oracle не лицензирован. Обратитесь в корпорацию Oracle для помощи
- ORA-00437: Дополнительные возможности Oracle не лицнзированны. Обратитесь в корпорацию Oracle для помощи
- ORA-00438: Опция [значение] не установлена
- ORA-00439: Дополнительная возможность не разрешена: [значение]
- ORA-00443: Фоновый процесс [значение] не запущен
- ORA-00444: Фоновый процесс [значение] вышел из строя при запуске
- ORA-00445: Фоновый процесс [значение] не стартовал по истечение [значение] секунд
- ORA-00446: Фоновый процесс стартовал, когда этого не ожидали
- ORA-00447: Критическая ошибка в фоновом процессе
- ORA-00448: Нормальное завершение фонового процесса
- ORA-00449: Фоновый процесс [значение] внезапно прервал работу с ошибкой [значение]
- ORA-00470: LGWR процесс завершился с ошибкой
- ORA-00471: DBWR процесс завершился с ошибкой
- ORA-00472: PMON процесс завершился с ошибкой
- ORA-00473: ARCH процесс завершился с ошибкой
- ORA-00474: SMON процесс завершился с ошибкой
- ORA-00475: TRWR процесс завершился с ошибкой
- ORA-00476: RECO процесс завершился с ошибкой
- ORA-00477: SNP* процесс завершился с ошибкой
- ORA-00478: SMON процесс завершился с ошибкой [значение]
- ORA-00480: LCK* процесс завершился с ошибкой
- ORA-00481: LMON процесс завершился с ошибкой
- ORA-00482: LMD* процесс завершился с ошибкой
- ORA-00483: Во время остановки процесс завершился ненормально
- ORA-00484: LMS* процесс завершился с ошибкой
- ORA-00485: DIAG процесс завершился с ошибкой [значение]
Сообщения об ошибках ORA-00500 — ORA-00599
- ORA-00568: Максимальное количество прерываний обработчика превышено
Ошибки аварийного восстановления ORA-00600 — ORA-00699
- ORA-00600: Код внутренней ошибки,
аргументы [значение], [значение], [значение], [значение], [значение], [значение], [значение], [значение] - ORA-00601: Конфликт чистых блокировок
- ORA-00602: Внутренее программное исключение
- ORA-00603: Сеанс сервера Oracle был прерван критичной ошибкой
- ORA-00604: Ошибка случилась на рекурсивном уровне SQL [значение]
- ORA-00606: Внутренний код ошибки
- ORA-00607: Внутреняя ошибка при изменении блока данных
Словарные ошибки ORA-00700 — ORA-00799
- ORA-00701: Объект необходимый для старта базы данных не может быть изменен
- ORA-00702: Загрузчик версии [значение] несовместим с версией [значение]
- ORA-00703: Максимальное количество блокировок кэша строк экземпляра превышено
- ORA-00704: Процесс загрузки завершился аварийно
- ORA-00705: Неверное состояние во время запуска; остановите экземпляр и заново запустите
- ORA-00706: Ошибка смены формата файла [значение]
Общие ошибки ORACLE ORA-00800 — ORA-00899
-
ORA-0800: buffer write process is not active (процесс записи в буфер не активен).
Причина: Проблема связана с попыткой запуска
ORACLE, что вызвало снятие процесса записи в буфер.
Обычно это сообщение выдается вместе с сообщением
о системной ошибке, обьясняющей причину сбоя.
Действие: Используйте сообщение о системной ошибке
( если такое есть ) для выяснения причины ошибки.
Если системная ошибка отсутствует, обратитесь к
руководству по инстолляции ORACLE за перечнем требо-
ваний. Убедитесь, что все логические имена ORACLE
присвоены верно, что достаточно свободного дискового
пространства в директории ORACLE, и что достаточное
число глобальных секций и страниц. Также убедитесь в
наличии у бюджета ORACLE трубуемого приоритета. Если
источник проблемы не определен, обратитесь к соответ-
ствущему установочному обеспечению. -
ORA-0801: after image write process is not active (процесс записи последущего вида не активен).
Причина: Это свойство не поддерживается.
Действие: Обратитесь к соответствующему установочному обеспечению. -
ORA-0802: invalid context area (недопустимая контекстная область).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0805: opiodr: inconsistent recursion level number (несовместимый уровень рекурсии).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0806: before image process is not active (процедура предварительного вида не активна).
Причина: Проблема связана с попыткой запуска
ORACLE, что вызвало снятие процесса предварительного
вида.Обычно это сообщение выдается вместе с сообще-
нием о системной ошибке, обьясняющей причину сбоя.
Действие: Используйте сообщение о системной ошибке
(если такое есть) для выяснения причины ошибки.
Если системная ошибка отсутствует, обратитесь к
руководству по инстолляции ORACLE для вашей опера-
ционной системы,чтобы проверить правильность инстол-
ляции. Если источник проблемы не определен, обрати-
тесь к соответствущему установочному обеспечению. -
ORA-0807: clean up process is not active (процедура очистки не активна).
Причина: Проблема связана с попыткой запуска
ORACLE, что вызвало снятие процесса предварительного
вида.Обычно это сообщение выдается вместе с сообще-
нием о системной ошибке, обьясняющей причину сбоя.
Действие: Используйте сообщение о системной ошибке
( если такое есть ) для выяснения причины ошибки.
Если системная ошибка отсутствует, обратитесь к
руководству по инстолляции ORACLE для вашей опера-
ционной системы,чтобы проверить правильность инстол-
ляции. Если источник проблемы не определен, обрати-
тесь к соответствущему установочному обеспечению. -
ORA-0809: opispf: invalid special function code (неверный спецкод функции).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0810: opiomc: context area not remapped at original addres (контекстная область не соответствует начальному адресу).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0811: readahead process is not active (процедура чтения вперед не активна).
Причина: Проблема связана с попыткой запуска
ORACLE, что вызвало снятие процесса чтения вперед.
Обычно это сообщение выдается вместе с сообщением
о системной ошибке, обьясняющей причину сбоя.
Действие: Используйте сообщение о системной ошибке
( если такое есть ) для выяснения причины ошибки.
Если системная ошибка отсутствует, обратитесь к
руководству по инстолляции ORACLE для вашей опера-
ционной системы,чтобы проверить правильность инстол-
ляции. Если источник проблемы не определен, обрати-
тесь к соответствущему установочному обеспечению. -
ORA-0813: assertion failure (добавление снято).
Причина:Это сообщение о внутренней ошибке, относящейся к ORACLE SORT.
Это не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0814: ltbdrv: illegal lock mode (недопустимый режим защиты).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. - ORA-00816: error message translation failed
(не достает перевода сообщения об ошибке / сбой трансляции сообщения об ошибке).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0817: prsgkw: internal error token not found (индентификатор внутренней ошибки не обнаружен).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы. -
ORA-0818: opispf: osf too big (osf слишком велик).
Причина:Это сообщение о внутренней ошибке, которая не может произойти при нормальной работе.
Действие: Обратитесь к соответствуюшему наладочному обеспечению с подробным описанием проблемы.
Синтаксические ошибки ORA-00900 — ORA-00999
-
ORA-00900: Неверное SQL предложение.
Причина: Введенный вами оператор не опознан как допустимая команда SQL.
Действие:
Проверьте опечатки,убедитесь, что ключевые слова команд SQL начинаются одним из следущих слов:
ALTER, AUDIT, CREATE, DELETE, DROP, GRANT, INSERT, NOAUDIT, RENAME, REVOKE, SELECT, UPDATE, LOCK, VALIDATE.
Другие команды вызовут эту ошибку.
Комментприй из практики:
Однажды ошибка затаилась хитро — самым первым байтом стоял плюсик перед «create or replace function …».
Но чаще первым байтом может быть «s», который ставится при сохранении (Ctrl-S), когда Ctrl слабо нажимаешь. - ORA-00901: Неверный синтаксис команды CREATE / Неверная команда на создание.
Причина: В команде CREATE использована недопустимая опция CREATE.
Действие: Проверьте опечатки, убедитесь,что за командой CREATE следует одна из следущих опций :
[UNIQUE] INDEX, PARTITION, SPACE DEFINITION, [PUBLIC] SYNONYM, TABLE или VIEW. -
ORA-00902: Неверный тип данных.
Причина: Введенный тип данных в операторе CREATE или ALTER TABLE не является допустимым.
Действие:
Проверьте опечатки, убедитесь, что за каждым именем колонки следует один из следущих типов данных:
DATA, CHAR, NUMBER, RAW, LONG или LONG RAW. -
ORA-00903: Неверное имя таблицы.
Причина:
Введенные имена таблицы или группы не существуют или недопустимые.
Это сообщение так же появляется в сучае, если неверное или несуществующее имя группы
описано в команде ALTER/DROP CLUSTER.
Действие:
Проверьте опечатки. Допустимое имя группы должно начинаться с буквы
и содержать только буквы,цифры и спецсимволы: $,# и _.
Имя должно быть не длиннее 30 символов и не являться зарезервированным словом. -
ORA-00904: Неверное имя колонки.
Причина: Введенное имя колонки отсутствует или недопустимо.
Действие: Введите верное имя колонки.
Допустимое имя должно начинаться с буквы и содержать только буквы,цифры и спецсимволы: $,# и _.
Имя должно быть не длиннее 30: символов и не являться зарезервированным словом.
Если оно содержит другие символы, оно долно быть в двойных кавычках. -
ORA-00905: Пропущено ключевое слово.
Причина: Требуемое ключевое слово пропущено.
Действие: Проверьте синтаксис команды и добавьте пропущенные ключевые слова. -
ORA-00906: Пропущена левая скобка.
Причина: Требуемая левая скобка пропущена. Основные
команды (такие как CREATE TABLE,CREATE CLUSTER и
INSERT) требуют список пунктов, заключенный в скобки.
Скобки также необходимы вокруг последовательностей в
предложении WHERE и в UPDATE таблица SET колонка = (SELECT …).
Действие: Проверьте синтаксис команды и вставь-
те пропущенные скобки. -
ORA-00907: missing right parenthesis
пропущена правая скобка
Причина: Левая скобка введена бз закрывающей правой
или предыдущая информация была заключена в скобки.
Все скобки должны быть парными.
Действие: Вставьте закрывающую правую скобку. -
ORA-00908: missing NULL keyword
пропущено ключевое слово NULL
Причина: В командах СREATE или ALTER TABLE, NOT
было введенодля указания, что никакие нулевые величи-
ны не допустимы в этой колонке,но ключевое слово
NULL было пропущено.
Действие: Если требуете наличие значения в этой
колонке, замените ключевое слово NOT на NOT NULL. - ORA-00909: invalid number of arguments
недопустимое число аргументовПричина: Указание на встроенную функцию ORACLE
было сделано с неверным числом аргументов.Все фун-
кции ORACLE, за исключением SYSDATE требуют по
крайней мере один аргумент.
Действие: Проверьте синтаксис команды и введите
введите необходимое число аргументов . - ORA-00910: specified length too large for CHAR colum
указанная длина слишком велика для колонки CHAR
Причина: Размер поля знака не указан или указан
неверно. Необходимо указывать максимальную длину
для каждой колонки знаков.Это длина может принимать
значения от 0: до 240: .
Действие: Введите максимальную длину из диапазона
от 0 до 240: . - ORA-00911: invalid character
неверный знакПричина: Спецзнак неверен или допустим только в
определенных местах. Если спецзнак( кроме $, # и _ )
используется в имени и имя не заключено в двойные
кавычки («), появится данное сообщение.
Действие: Удалите неверный знак из команды. - ORA-00912: operand pop оperation with no operands on stack
для операции с операндом рор отсутствуют операнды в стеке
Причина: Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00913: too many values
слишком много значений
Причина: Команда предполагает два одинаковых
набора значений, но во втором наборе пунктов больше,
чем в первом. Например: подзапрос в предложении
WHERE или HAVING может быть слишком много колонок,
или в предложениях VALUES или SELECT колонок больше,
чем в INSERT.
Действие: Проверьте число пунктов и измените их. - ORA-00914: missing ADD keyword
пропущено ключевое слово ADD
Причина: Команда ALTER PARTITION введна без
ключевого слова ADD.
Действие: проверьте синтаксис команды и повторите
ее. - ORA-00915: network access of dictionary table not currently allowed
неверно установлен сетевой доступ к словарной таблице
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00917: missing comma
пропущена запятая
Причина: Пропущена запятая в списке колонок,или
в списке значений в операторе INSERT, или в списке
формы ((c,d),(e < f),…).
Действие: Проверьте сиснтаксис в вашем SQL оператор
и, если необходимо, добавьте пропущенную запятую. - ORA-00918: column ambigiuously defined
неоднозначное определение колонки
Причина: Колонка, использованая для присоединения
существует в более, чем одной таблице. При присоеди-
нении любая колонка, присутствующая более чем в одной
таблице, должна содержать имя таблицы. Имя колонки
должно указываться следущим образом: TABLE.COLUM
или TABLE_ALIAS.COLUMN, EMP.DEPTNO или E.DEPTNO, а
не просто EMP.
Действие: Введите имя таблицы в имя колонки перед
точкой или альтернативное имя таблицы, как показано
выше. - ORA-00919: invalid functio
неверная функция
Причина: Ввод, похожий на функцию, типа
функция(аргумент), не опознан как функция ORACLE.
Действие: Обратитесь к руководству за списком
допустимых имен функций. - ORA-00920: invalid relational operator
неверный оператор отношения
Причина: Задача поиска с неверным или пропущенным
оператором условия.
Действие: Введите допустимый условный оператор.
Допустимы следущие орераторы отношения:=, !=, <>, >,
>=, <, <=,IN, IS[NOT], NULL, LIKE, и BETWEEN. - ORA-00921: unexpected end of SQL command
неожиданный конец команды SQL
Причина: Команда SQL не полная. Была введена часть
верной команды, но по крайней мере одина главная ком-
понента пропущена.
Действие: Проверьте синтаксис команды и вставьте
пропущенные компоненты. - ORA-00922: invalid optio
неверная опция
Причина: Неверная опция была описана в определении
колонки или в определении области.
Действие: Удалите неверную опцию из определения
колонки или области. Допустимой опцией, описывающей
колонку, является NOT NULL для указания, что колонка
не может содержать NULL значения. Все прочее,следущее
за типом данных, кроме запятой или закрывающей скобки,
классифицируется как недопустимая опция. Описывая
длину для DATA или тип данных LONG, вы получите данное
сообщение об ошибке. В описании определения области
допустимы только следущие опции: INITIAL, INCREMENT и
MAXEXTENTS,( для DATAPAGES и INDEXPAGES) и PCTFREE
( только для DATAPAGES ). - ORA-00923: missing FROM keyword
пропущено ключевое слово FROM
Причина: В командах SELECT или REVOKE ключевое слово
FROM или пропущено, или неверно помещено, или с опе-
чаткой. Ключевое слово FROM должно следовать в команде
SELECT за выбранным пунктом, или за быбранным именем
таблицы в команде REVOKE.
Действие: Вставьте на место слово FFROM. Выбранный
список может быть сам по себе ошибочным. Убедитесь,
что использованы одинарные кавычки для выделения
альтернативного имени, и является или нет альтерна-
тивное имя зарезервированным словом. - ORA-00924: missing BY keyword
пропущено ключевое слово BY
Причина: Пропущено ключевое слово BY в выражениях
GROUP BY, ORDER BY, или CONNECTED BY. Кроме того в
команде GRANT за словом INDENTIFIED должно следовать
BY.
Действие: Правильно вставьте слово BY. - ORA-00925: missing INTO keyword
пропущено ключевое слово INTO
Причина: Была употреблена команда INSERT без ключе-
чевого слова INTO.
Действие: Замените INSERT на INSERT INTO. - ORA-00926: missing VALUES keyword
пропущено ключевое слово VALUES
Причина: Оператор INSERT без ключевого слова
VALUES или SELECT. За выражением INSERT INTO должно
следовать выражение VALUES или SELECT последователь-
ность.
Действие: Введите после выражения INSERT INTO
выражение VALUES или последовательность. - ORA-00927: missing equal sig
пропущен знак равно
Причина: Знак равно пропущен в одном из следущих
мест: * в выражении SET команды UPDATE
* после ! для указания на неравенство
* в выражении PCTFREE команды CREATE INDEX
Действие: Вставьте знак равенства. - ORA-00928: missing SELECT keyword
пропущено ключевое слово SELECT
Причина: В команду CREATE VIEW должна быть включена
SELECT последовательность.
Действие: Вставьте требуемое выражение SELECT в
команду CREATE VIEW. - ORA-00929: missing period
пропущен период
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00930: missing asterisk
пропущена звездочка *
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00931: missing identifier
порущен индентификатор
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00932: inconsistent datatypes
несовместимый тип данных
Причина: Попытка добавить символьное поле к полю
данных. Данные могут быть добавлены только к числовым
полям.
Действие: Преобразуйте символьное поле в числовое
поле с помощью функции TO_NUMBER перед добавлением
поля данных. - ORA-00933: SQL comand not properly ended
команда SQL не закончена
Причина: SQL-команда закончена неверным выражением.
Например: выражение ORDER BY может быть включено в
команду CREATE VIEW или INSERT.Однако ORDER BY не
должна использоваться для создания очередного обзора
или включаться в основной порядок.
Действие: Проверьте синтаксис команды и удалите
лишние компоненты. Вы должны уметь дублировать удален-
ные выражения другими командами. Например, если вы
желаете упорядочить строки обзора, действуйте так же,
как при запросе на обзор, но не как при создании его.
Эта ошибка также может произойти при применении
SQL*Forms, если смещено продолжение строки. Проверьте
смещения и удалите пробелы. Вы должны испоьзовать
соответствующие окончания SQL, если используете I
выражение с одним аргументом, например: IN(X). В вы-
ражении IN должно испоьзоваться не менее двух аргу-
ментов. - ORA-00934: set function not allowed here
данная функция недопустима здесь
Причина: одна из групповых функций ( таких как
AVG, SUM, MAX, MIN, COUNT) была использована в вы-
жении WHERE или GROUP BY.
Действие: Удалите групповую функцию из выражений
WHERE или GROUP BY.Вы можете получить желаемый резу-
льтат,включив функцию в запрос или предложение HAVING. - ORA-00935: set function is nested too deep
данная функция является слишком вложеной
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00936: missing expressio
пропущено выражение
Причина: Необходимая часть выражения пропущена.
Например, команда SELECT вводится без списка колонок,
или с несовместимым выражением типа (SAL+). Это может
произойти и в том случае, если пропущены зарезервиро-
ванные слова типа SELECT TABLE.
Действие: Проверьте синтаксис команды и введите
пропущенные команды. - ORA-00937: not a single group set functio
устанавливается не только групповая функция
Причина: В запрос нельзя одновременно включать и
групповую функцию ( AVG, SUM,COUNT,MIN или MAX) и
собственное выражение для колонки, пока выражение для
колонки не включено в выражение GROUP BY.
Действие: Удалите из запроса или выражение для
колонки, или групповую функцию, или добавьте выражение
GROUP BY , в которое включите перечисление колонок. - ORA-00938: not enough arguments for functio
недостаточно аргуметов для функции
Причина: В функции описано слишком мало аргументов.
Действие: Проверьте синтаксис функции и добавьте
все необходимые аргументы. - ORA-00939: too many arguments for functio
cлишком много аргументов в функции
Причина: В функции описано слишком много аргументов.
Действие: Проверьте синтаксис функции и опишите
только необходимые аргументы. - ORA-00940: invalid ARTER comand
неверная команда ALTER
Причина: Описана неверная опция ALTER. Только
разделы и таблицы могут быть неповторяющимися. Пра-
вильная команда ALTER должна начинаться одним из сле-
дущих вариантов : ALTER TABLE или ALTER PARTITION.
Действие: Проверьте синтаксис рпавильного написания
команды ALTER. - ORA-00941: missing cluster name
пропущено имя группы
Причина: Имя группы или пропущено или неверное.
Действие: Опишите верное имя группы. Допустимое имя
группы начинается с буквы, содержит не более 30: сим-
волов и состоит только из букв, цифр и спецсимволов $,
_ и #. Оно не должно быть зарезервированным словом.
Имя должно быть напечатано сразу за ключевым словом
CREATE CLUSTER. - ORA-00942: table or view does not exist
таблица или обзор не существуют
Причина: Данная таблица или обзор не существуют.
или введено имя обзора вместо таблицы. Существующие
пользовательские таблицы и обзоры можно просмотреть
в обзоре TAB.
Действие: Проверьте опечатки и не ввели ли вы имя
обзор вместо таблицы. Введите существующие имена. - ORA-00943: cluster does not exist
группа не существует
Причина: Ресурс пользователя не включен в группу
под описанным именем.
Действие: Опишите верное имя группы сразу после
ключевого слова CLUSTER. - ORA-00944: insufficient number of clustered columns
недостаточное число сгруппированных колонок
Причина: Была попытка создать таблицу с меньшим
числом сгруппированных колонок, чем было описано
в команде CREATE CLUSTER. Выражение CLUSTER команды
CREATE TABLE должно описывать все сгруппированные
колонки, определенные при создании группы. Используя
имя группы можно просмотреть все групповые колонки в
таблице словаря COL.
Действие: Опишите все имена колонок в команде
CREATE TABLE. - ORA-00945: specified clustered column does not exist
описанная групповая колонка не существует
Причина: Колонка, описанная в выражении оператора
CREATE TABLE не является колонкой данной таблицы.
Действие: Повторите, используя имя колонки таблицы. - ORA-00946: missing TO keyword
пропущено ключевое слово TO
Причина: Команда GRANT введена без ключевого слова
TO или использована неверная форма этой команды.
Действие: Проверьте синтаксис двух основных форм
команды GRANT ( предоставление доступа к базе данных
и предоставление привилегий). Вставьте ключевое слово
TO правильно в команду GRANT. - ORA-00947: not enough values
недостаточно значений
Причина: Опертор SQL требует двух одинаковых наборов
значений, а второй набор содержит меньшее число зна-
чений. Это может произойти и в случае, если в выраже-
ниях WHERE или HAVING вложенная SELECT находит меньшее
число колонок, как в : WHERE(A,B) IN (SELECT C FROM..)
Возможна ошибка и в операторе INSERT в котором выра-
жения VALUES или SELECT не содержат достаточно для
INSERT значений, как в:
INSERT INTO таблица (A,B) VALUES(‘C’).
Действие: Поверрьте численность каждого набора и
сделайте их равными по числу. - ORA-00948: ALTER CLUSTER statement no longer supported
опреатор ALTER CLUSTER более не поддерживается
Причина: Оператор ALTER CLUSTER удален
Действие: Для добавления данных из таблицы исполь-
зуйте следущий набор операторов SQL: CREATE TABLE
<новая_таблица> SELECT*FROM <старая_таблица> CLUSTER
<имя_группы> DROP <старая_таблица> и
RENAME TABLE <новая_таблица> <старая_таблица>. - ORA-00949: illegal reference to external database
неверная сноска на внешнюю базу данных
Причина:Это сообщение о внутренней ошибке,
которая не может произойти при нормальной работе .
Действие: Обратитесь к соответствуюшему наладочному
обеспечению с подробным описанием проблемы. - ORA-00950: invalid drop optio
неверная опция DROP
Причина: После команды DROP не было опции DROP
такой, как TABLE, VIEW, SYNONYM, CLUSTER, или SPACE.
Действие: Проверьте синтаксис команды и используй-
те верный формат опции DROP. - ORA-00951: cluster not empty
группа не является пустой
Причина: Команда DROP описывает не пустую группу.
Группа может быть удалена только в том случае, если
она не содержит таблиц. Удалить таблицу из группы
с помощью команды DROP TABLE.
Действие: Удалите из группы все таблицы и после
этого используйте команду DROP CLUSTER. - ORA-00952: missing GROUP keyword
пропущено ключевое слово GROUP
Причина: Группа неверно реализована.
Действие: От пользователя не требуется ни каких
действий. - ORA-00953: missing index name
—
пропущено имя индексаПричина: В командах CREATE, DROP, VALIDATE INDEX
имя индекса неверное или отсутствует.
Действие: Напечатайте верное имя индекса после
ключевого слова INDEX. Если вы желаете удалить или
исправить индекс, проверьте имя, просмотрев обзор
INDEXES. Если необходимо создать новый индекс, про-
верьте сначала синтаксис. - ORA-00954: missing INDENTIFIED keyword
пропущено ключевое слово INDENTIFIED
Причина: Команда GRANT CONNECTION была введена без
ключевого слова INDENTIFIED.
Действие: Вставьте ключевое слово INDENTIFIED после
имени пользователя. Формат команды следущий:GRANT
CONNECTION TO <список пользователей> INDETIFIED BY
<пароль списка>. - ORA-00955: name is already used by existing object
имя используется существующим объектом
Причина: Была попытка создать таблицу, обзор,
группу или синоним, которые уже есть. Каждое имя поль-
зовательской таблицы долно быть отличным от других
имен таблиц, обзоров, групп или синонимов, принадле-
жащих другим пользователям.Действие: Или введите уникальное имя таблицы, об-
зора,группы или синонима, или измените или удалите
существующее. - ORA-00956: invalid auditing optio
—
неверная опция контроляПричина: Была неверная опция проверки.
Действие: Проверьте синтаксис команды и повторирте
попытку с верной опцией. - ORA-00957: duplicate column name
дублирование имени колонки
Причина: Имя колонки было описано дважды в команде
CREATE или INSERT. Имя колонки в таблице, обзоре или
в группе должно быть уникальным.Действие: Замените в команде CREATE имя колонки
на новое уникальное. В команде INSERT удалите дубли-
рущее имена. - ORA-00958: missing CHECK keyword
—
пропущено ключевое слово CHECKПричина: Отсутствует CHECK сразу после ключевого
слова WHITH в выражении WITH CHECK OPTION оператора
CREATE VIEW.Действие: Проверьте синтаксис оператора SQL.
- ORA-00959: space definition name does not exist
—
имя области не существуетПричина: В команде A DROP SPACE описано несущест-
вующее имя области.Действие: Используйте существующие имена определе-
ния области. Для просмотра существующих имен выберите
SNAME из SPACES. - ORA-00960: invalid INITIAL value
—
неверное значение INITIALПричина: Было описано неверное значение номера
начальной datapage или indexpage в команде CREATE
SPACE. Это значение должно быть не менее 3.Действие: Введите значение INITIAL не меньшее 3.
- ORA-00961: invalid INCREMENT value
—
неверное значение INCREMENTПричина: Было описано неверное значение числа
шагов для datapage или indexpage. Значение шага
должно быть более 3.Действие: Введите значение INCREMENT болшее 3.
- ORA-00962: invalid PCTFREE value
—
неверное значение PCTFREEПричина: Неверное значение процента свободного
места было описано в определении SPACE. Это значение
долно находиться в диапазоне от 1: до 99.Действие: Введите значение PCTFREE в интервале
от 1: до 99. - ORA-00963: invalid SIZE value
неверное значение SIZE
Причина: Было описано неверное значение размера
логического блока в команде CREATE CLUSTER. Размер
логического блока используется для эффективного хра-
нения малых групп данных.Действие: Опишите допустимое значение размера логи-
ческого блока ( более 0). - ORA-00964: invalid space defenition name
—
неверное имя определения областиПричина: Было описано неверное имя области в коман-
де CREATE/DROP SPACE или в CREATE TABLE, или в команде
CREATE TABLE описано несуществующее имя области.Действие: Введите верное имя области. Допустимое
имя начинается с буквы, содержит не более 30: сим-
волов и состоит только из букв, цифр и спецсимволов $,
_ и #. Оно не должно быть зарезервированным словом.
Если ваше имя верное, возможно вы нечаянно удалили
определение области TEMP. - ORA-00965: space definition name already exists
—
имя определения области уже существуетПричина: В команде CREATE SPACE было использовано
существующее имя области. Имена определений областей
должны быть уникальными.Действие: Введите уникальное имя области.
- ORA-00966: missing TABLE keyword
—
пропущено ключевое слово TABLEПричина: Была использована команда LOCK и при этом
ключевое слово TABLE было с опечаткой, или пропущено,
или неверно расположено. Команда LOCK должна начи-
наться так: LOCK TABLE <имя таблицы> … .
Действие: Вставьте ключевое слово TABLE в соот-
ветствущее место. - ORA-00968: missing INDEX keyword
—
пропущено ключевое слово INDEXПричина: Была использована команда CREATE UNIQUE
и при этом ключевое слово INDEX было с опечаткой,
или пропущено, или неверно расположено .
Действие: Проверьте синтаксис и повторите попытку. - ORA-00969: missing ON keyword
—
пропущено ключевое слово OПричина: Была использована команда GRANT или CREATE
INDEX и при этом ключевое слово ON было с опечаткой,
или пропущено, или неверно расположено.Действие: Вставьте ключевое слово ON в соот-
ветствущее место. - ORA-00970: missing WITH keyword
—
пропущено ключевое слово WITHПричина: Ключевое слово START было использовано без
WITH. Оба ключевых слова необходимы в выражении
START WITH для запроса.Действие: Замените слово START на START WITH.
- ORA-00971: missing SET keyword
—
пропущено ключевое слово SETПричина: В команде UPDATE ключевое слово SET
было с опечаткой, или пропущено, или неверно распо-
ложено.Действие: Вставьте ключевое слово SET после имени
изменяемой таблицы. - ORA-00972: indentifier is too big
—
индентификатор слишком большойПричина: Размер имени объекта базы данных более
30: символов.(Объектами базы данных являются таблицы,
группы, обзоры, индексы, синонимы, области и имена
пользователей.Действие: Укоротите имя до максимум 30: символов.
- ORA-00973: invalid row count estimate
—
неверная оценка счета строкПричина: Величина счета строк, описанная в команде
CREATE INDEX является числом, меньшим 0.Действие: Опишите верное значение (большее чем 0).
- ORA-00974: invalid index block loading factor ( percentage )
—
неверный фактор загрузки блока индексов (процент)Причина: Процент назанятого объема, описанной в
команде CREATE INDEX, области не принадлежит интерва-
лу от 1: до 90%.Действие: Введите значение PCTFREE из диапазона от 1 до 90. По умолчанию — 10.
- ORA-00975: Date + date not allowed
—
неразрешается данные + данныеПричина: Попытка сложить вместе два поля данных.
Данные могут быть добавлены только к полям чисел, но
не к другим данным.Действие: Добавьте поле данных к полю чисел.
- ORA-00977: duplicate auditing optio
—
двойная опция контроляПричина: Та же самая опция контроля была описана
еще раз.Действие: Удалите лишнее описание контроля.
- ORA-00978: nested set function with out GROUP BY
—
вложенный групповая функция без GROUP BYПричина: Групповая функция (такая как MIN, MAX,
или AVG) была использована внутри другой групповой
функции (такой как MAX(COUNT(*))) без соответствую-
щего выражения GROUP BY.Действие: Или добавьте выражение GROUP BY или
удалите внешний уровень вложенности. - ORA-00979: not a GROUP BY expressio
выражение не принадлежит к GROUP BY
Причина: Предложение GROUP BY не содержит всех
выражений предложения SELECT. Выражения из SELECT,
не включенные в групповые функции (COUNT, SUM, AVG,
MAX, MIN ) должны быть перечислены в предложении
GROUP BY.Действие: Включите все выражения из SELECT, не
являющиеся аргументами групповых функций в предложе-
ние GROUP BY. - ORA-00980: synonym translation no longer valid
трансляции синонима более не доступна
Причина: Используемый вами синоним относился к таб-
лице, обзору или синониму, которые удалены или переи-
менованы.Действие: Замените синоним на имя таблицы, обзора,
синонима, для которых он предназначался. Или заново
создайте синоним для верных таблиц, обзоров или сино-
нимов. - ORA-00981: cannot mix table and system-wide auditing options
нет возможности совместить опцию контроля ширины таблицы
и системыПричина: Одновременно опция ширины и таблицы и
системы описаны в одном операторе AUDIT.Действие: Исправьте оператор.
- ORA-00982: missing plus sign — пропущен знак плюс
Причина: При присоединении после левой скобки нет
знака плюс (+). При присоединении левая (открывающая)
скобка интерпритируется как описывающая присоединение
и ожидается знак плюс. Для описания присоединения к
колонке, за описанием колонки следует поставить знак
плюс, заключенный в скобки (+).Действие: Исправьте синтаксис SQL.
- ORA-00984: column not allowed here — колонки здесь не употребимы
Причина: Имя колонки было использовано там, где это запрещено,
например в предложении VALUES оператора INSERT.
Действие: Проверьте синтаксис команды и используйте имена колонок только там, где это допустимо. - ORA-00985: invalid program name — неверное имя программы
Причина: Это свойство не реализовано.
Действие: Не требуется ни каких действий пользователя. - ORA-00986: missing or invalid group name(s) — пропущено или неверное имя группы
Причина: Это свойство не реализовано.
Действие: Не требуется ни каких действий пользователя. - ORA-00987: missing or invalid user name(s)
—
пропущено или неверное имя пользователяПричина: Имя пользователя не было описано в команде
GRANT или одно из описанных имен неверное. Верные
имена пользователей должны описываться после слова
TO в команде GRANT. Допустимое имя пользователя
начинается с буквы, содержит не более 30: символов
и состоит только из букв, цифр и спецсимволов $,
_ и #. Оно не должно быть зарезервированным словом.Действие: Опишите верное имя пользователя (или
список пользователей ) после ключевого слова TO в
команде GRANT. - ORA-00988: missing or invalid password(s)
—
пропущен или неверный пароль(и)Причина: В команде GRANT описано имен пользователей
больше, чем паролей. Допустимый пароль должен быть
описан для каждого пользователя, перечисленного в
команде GRANT.Действие: Введите правильный пароль для каждого
пользователя. - ORA-00989:
too many passwords for user names given — слишком много паролей для пользователей введеноПричина: Паролей больше, чем было описано имен поль-
зователей в команде GRANT. Только один пароль должен
вводиться для каждого пользователя, перечисленного в
команде GRANT.Действие: Введите одинаковое количество пользователей и паролей.
- ORA-00990: missing or invalid privilege — пропущена или неверная привелегия
Причина: В команде для привелегий GRANT не было
описано никаких привелегий или одна из них неверная.Действие: Введите одну или более верных привелегий.
Допустимы следущие привелегии: SELECT, INSERT, DELETE,
UPDATE, ALTER, INDEX, DROP, CLUSTER и ALL. Более чем
одну привелегию можно предоставить введя их в списке
через запятую(,) или описывая словом ALL предоставлять
все привелегии. - ORA-00991:
unrecognizable format for GRANT command — неопознанный формат команды GRANTПричина: Введена неправильная форма команды GRANT.
Действие: Проверьте синтаксис команды.Существует два
типа команды GRANT. Первый тип используется для опре-
деления доступа пользователей к базе данных и должен
иметь следущий формат: GRANT CONNECT/RESOURCE/DBA TO
<имя пользователя> INDENTIFIED BY <пароль>. По крайней
мере одно из ключевых слов CONNECT, RESOURCE или DBA
должно присутствовать. Второй тип используется для
предоставления превелегий объектам базы данных и
и имеет формат: GRANT <список привелегий> ON <обзор/
таблица> TO < индентификатор пользователя>/PUBLIC. - ORA-00992:
unrecognizable format for REVOKE command — неопознанный формат команды REVOKE
Причина: Введена неправильная форма команды REVOKE.
Действие: Проверьте синтаксис команды и повторите ее. - ORA-00993: missing GRANT keyword — пропущено ключевое слово GRANT
Причина: Ключ WITH был описан в конце команды GRANT
без ключа GRANT.Чтобы предоставить привелегии пользо-
вателю и разрешение на предоставление их другим поль-
зователям, следует использовать ключ WITH GRANT OPTIO
в конце команды GRANT.Действие: Замените ключевое слово WITH на WITH GRANT OPTION.
- ORA-00994: missing OPTION keyword — пропущено ключевое слово OPTIO
Причина: Был использован ключ WITH GRANT в конце команды GRANT без слова OPTION.
Действие: Замените ключ WITH GRANT на WITH GRANT OPTION. - ORA-00995:
missing or invalid synonym indentifier — пропущен или неверный синоним индентификатора
Причина: В командах CREATE или DROP SYNONYM имя синонима или было пропущено или неверное.
Действие: Проверьте опечатки и синтаксис команды.
Правильное имя синонима должно следовать сразу за ключом SYNONYM в обеих командах.
Допустимое имя синонима начинается с буквы, содержит не более 30 символов
и состоит только из букв, цифр и спецсимволов $, _ и #.
Оно не должно быть зарезервированным словом. - ORA-00996:
the concatenate operator is ¦¦ not ¦ — оператором конкатенации является ||, а не |
Причина: Единичный штрих (|) был понят как попытка описать конкатенацию,
но оператор конкатенации состоит из двух штрихов (||).
Действие: Введите двойной штрих для операции конкатенации
или удалите одиночный, если конкатенация не нужна. - ORA-00997:
illegal use of long datatype (недопустимое использование типа данных LONG).
Причина: Вы использовали тип данных LONG, используемый для хранения данных размером более 240 символов,
в функции или в предложениях WHERE, GROUP BY, ORDER BY.
Значение LONG может использоваться только в предложении SELECT.
Действие: Удалите это поле из функции или предло жения. - ORA-00998:
must name this expression with a column label (это выражение должно называться с псевдонима).
Причина: В команде CREATE VIEW была использована
функция или выражение, но не было описано соответствущее имя колонки.
Когда для обзора используется выражение или функция,
все имена колонок и обзоров должны правильно быть перечислены в команде CREATE VIEW.
Действие: Введите все имена колонок обзора в
скобках после имени обзора. - ORA-00999:
invalid view name (неверное имя представления).
Причина: В команде CREATE VIEW пропущено или неверное имя обзора.
Действие: Введите сразу за CREATE VIEW верное имя обзора.
Допустимое имя обзора начинается с буквы, содержит не более 30 символов
и состоит только из букв, цифр и спецсимволов $,_ и #.
Оно не должно быть зарезервированным словом.
На правах рекламы (см.
условия):
На русском языке: ошибки Oracle, коды оракловых ошибок;
На английском языке: ORA-00000: — ORA-00999.
|
Страница обновлена 28.09.2022
|
|