Не хватает значений для данных oracle

Обновлено: 06.07.2024

Даже лучшее написано PL/SQL Программа также столкнется с ошибками или неожиданными событиями. Хорошая программа должна быть в состоянии правильно обрабатывать все виды ошибок и максимально исправлять ошибки. Любые ошибки ORACLE (сообщается как ORA-xxxxx Номер ошибки Oracle в форме), ошибка операции PL / SQL или определенные пользователем условия (не записано является ошибкой), могут быть. Конечно, ошибки компиляции PL / SQL не могут быть обработаны обработкой исключений PL / SQL, потому что эти ошибки происходят до выполнения программы PL / SQL.

ORACLE предоставляет исключения ( EXCEPTION ) И обработка исключений ( EXCEPTION HANDLER ) Реализовать обработку ошибок.

5.1 Концепции обработки исключений

Обработка исключений ( EXCEPTION ) Используется для обработки непредвиденных событий во время обычного выполнения. PL/SQL Как только программный блок генерирует исключение и не указывает, как его обработать, программа автоматически завершит всю программу.

Существует три типа ошибок исключений:

1. Предопределено ( Predefined )ошибка

ORACLE Есть около 24 предопределенных аномалий. Обработка этой ненормальной ситуации не должна быть определена в программе, ORACLE Это срабатывает автоматически.

2. Не определено ( Predefined )ошибка
- это другой стандарт ORACLE ошибка. Обработка этой ненормальной ситуации требует, чтобы пользователь определил ее в программе, а затем ORACLE Это срабатывает автоматически.

3. Определяемые пользователем ( User_define ) Ошибка

Часть обработки исключений обычно помещается в PL/SQL Вторая половина тела программы имеет структуру:

Обработка исключений может быть организована в любом порядке, но OTHERS Должно быть последним.

5.1.1 Предопределенная обработка исключений

Предопределенный раздел описания ORACLE ошибка

Пример 1. Обновите зарплату назначенного сотрудника, если зарплата меньше 1500, добавьте 100;

5.1.2 Неопределенная обработка исключений

Для обработки таких нештатных ситуаций вы должны сначала определить неопределенную ошибку ORACLE. Действуйте следующим образом:

  1. в PL/SQL Раздел определения блока определяет исключение:

<Ненормальная ситуация> ИСКЛЮЧЕНИЕ;

  1. Определите ненормальную ситуацию и стандарт ORACLE Ошибки ссылок, используйте EXCEPTION_INIT Утверждение:
  1. в PL/SQL Часть обработки нештатной ситуации блока соотносит обработку с ненормальной ситуацией.

Пример 2. Удалите информацию о записи назначенного отдела, чтобы убедиться, что в отделе нет сотрудников.

5.1.3 Определяемая пользователем обработка исключений

Когда возникает ошибка, связанная с ошибкой исключения, ошибка исключения неявно запускается. Определяемые пользователем ошибки исключения используются явно RAISE Заявление для запуска. При возникновении ненормальной ошибки управление передается EXCEPTION Блокировать исключительную часть ошибки, выполнить код обработки ошибок.

Для обработки таких нештатных ситуаций необходимо выполнить следующие шаги:

1. Определите исключение в разделе определения блока PL / SQL:

<Ненормальная ситуация> ИСКЛЮЧЕНИЕ;

2. Поднять <ненормальная ситуация>;

3. В части обработки исключений блока PL / SQL выполните соответствующую обработку для исключения.

Пример 3: Обновление зарплаты назначенных сотрудников, увеличение на 100;

5.1.4 Определяемая пользователем обработка исключений

RAISE_APPLICATION_ERROR Синтаксис выглядит следующим образом:

Пример 4: создание функции get_salary , Эта функция извлекает сумму заработной платы указанного отдела, которая определяет ошибки -20991 и -20992, и обрабатывает два вида ошибок: параметр пуст и недопустимый код отдела:

Пример 5: Определите триггер, используйте RAISE_APPLICATION_ERROR Чтобы предотвратить вставку новых записей сотрудников без имен сотрудников:

5.2 Распространение аномальной ошибки

Поскольку ошибки исключения могут появляться в части объявления, части выполнения и части ошибки исключения, ошибки исключения, возникающие в разных частях, также различны.

5.2.1 В исполнительной части возникает ошибка исключения

Когда в исполнительной части возникает ошибка исключения, возможны следующие ситуации:

l Если текущий блок настроен на обработку ошибки исключения, выполните ее и успешно завершите выполнение блока, а затем управление передается в содержащий блок.

l Если для настройки ошибки исключения текущего блока не определен процессор, то ошибка исключения распространяется путем увеличения его в содержащем блоке. Затем выполните шаг 1) для содержащего блока.

5.2.2 Ошибка исключения возникает в разделе объявлений

Если в части объявления возникает ненормальное условие, то есть в части объявления возникает ошибка, то эта ошибка может повлиять на другие блоки. Например, есть следующие программы на PL / SQL:

В примере, потому что Abc number(3)=’abc’; Ошибка, хотя в EXCEPTION Объяснил в WHEN OTHERS THEN Заявление, но WHEN OTHERS THEN Это не будет выполнено. Но если есть ненормальная ошибка за пределами блока оператора ошибки, ошибка может быть обнаружена, например:

5.3 Программирование обработки ненормальных ошибок

При общей обработке приложения рекомендуется, чтобы персонал программы использовал обработку исключений, потому что, если в программе не объявлена ​​обработка исключений, программа будет прервана, если программа работает неправильно, и никакая информация не будет запрошена. Ниже приведен пример программирования с использованием исключения, предоставленного системой.

5.4 Использование в PL / SQL SQLCODE, SQLERRM Функция обработки исключений

Пример 6. Сохраните код ошибки ORACLE и его информацию в таблице кодов ошибок.

Пример 7. Запрос кода ошибки ORACLE;

Пример 8. Использование кодов ошибок ORACLE для написания кода обработки ошибок исключений;

Интеллектуальная рекомендация

совместный запрос mysql с тремя таблицами (таблица сотрудников, таблица отделов, таблица зарплат)

1. Краткое изложение проблемы: (внизу есть инструкция по созданию таблицы, копирование можно непосредственно практиковать с помощью (mysql)) Найдите отделы, в которых есть хотя бы один сотрудник. Отоб.


[Загрузчик классов обучения JVM] Третий день пользовательского контента, связанного с загрузчиком классов


IP, сеанс и cookie

Традиционно в программировании принято считать, что переменная - это именованная ячейка памяти, имя которой используется для доступа к данным. Можно сказать просто, что переменная - это обозначение, заменяющее какое-либо значение, будь то число, массив, строка или еще какой-нибудь тип. Переменные используются для следующих целей:

  • Временное хранение данных.
  • Манипуляция хранимыми значениями.
  • Возможность многократного использования.
  • Простота обслуживания.
  • Повышение читаемости программы.

С понятием переменная чаще всего связываются такие понятия, как область видимости переменной, идентификаторы, ее тип и имя.

Типы переменных PL/SQL

PL/SQL, как и любой другой язык программирования, оперирует различными типами данных (табл. 15.1). Переменные PL/SQL:

  • Скалярные ( Scalar ) - скалярные типы данных содержат одно значение. К скалярным типам данных относятся все основные типы данных сервера Oracle, за исключением Boolean , которые не могут быть назначены для столбцов.
  • CLOB (character large object) - позволяет хранить большие блоки символьных данных;
  • BLOB ( binary large objects) - служит для хранения больших бинарных объектов;
  • BFILE ( binary file ) - служит для хранения больших бинарных объектов за пределами Базы Данных;
  • NCLOB (national-language character large objects) - служит для хранения больших single-byte или fixed-width NCHAR Unicode данных;
  • EXPR - любое значение, которое подходит по смыслу и типу данных.
Примечание: в PL/SQL также используются связываемые переменные (bind variable) и переменные операционной системы, но они не относятся к PL/SQL.
Объявление переменных

Все переменные PL/SQL необходимо объявлять в декларативном разделе - DECLARE . Рассмотрим синтаксис объявления переменной:

Identifier - имя переменной. После объявления имени переменой на нее можно ссылаться по имени из любой части программы.

CONSTANT - это переменная, значение которой нельзя изменить. Эта переменная должна быть инициализирована. Инициализация в данном контексте означает, что значение переменной при создании должно быть определенно, то есть значение этой переменной необходимо присвоить в разделе DECLARE . Инициализация переменной производится с помощью оператора присвоения (:=) или ключевого слова DEFAULT .

Datatype - определяет тип данных: скалярный, составной, ссылочный и LOB.

NOT NULL - ограничение, которое говорит о том, что значение переменой не может быть пустым. Эта переменная должна быть инициализирована.

Рассмотрим пример объявления некоторых типов переменных.

  1. Создайте новую форму и сохраните под именем Var.fmb.
  2. Перейдите в узел "Блоки Данных". Правым щелчком мыши вызовите всплывающее меню и выберите пункт "Редактор Разметки".
  3. Разместите новую кнопку на канве. После того как вы разместите кнопку на канве, Oracle Forms автоматически создаст блок.
  4. Выделите кнопку и вызовите всплывающее меню. Во всплывающем меню выберите пункт Универсальные триггеры | WHEN-BUTTON-PRESSED . В появившемся PL/SQL-редакторе наберите и скомпилируйте нижеприведенный код:
  • Height - переменная численного типа с пятью знаками до запятой и двумя после, хранит значение высоты;
  • Age - переменная численного типа без определения разряда, хранит значение возраста;
  • Weight - константа численного типа. Значение инициализации 74.5;
  • Name - переменная символьного типа , хранит значение имени. Максимальный размер - десять символов;
  • S_name CHAR (20) - переменная символьного типа , хранит значение фамилии. Максимальный размер - двадцать символов;
  • F_name - значение символьного типа . Не может быть пустым, инициализировано значением "Васильевич";
  • Man - переменная логического типа , инициализирована в TRUE ; значение TRUE или FALSE указывать без кавычек. Переменная типа Boolean может принимать только три типа значений:
    • TRUE ;
    • FALSE ;
    • NULL .

    В PL/SQL существует множество зарезервированных слов (табл. 2), которые не могут быть использованы для объявления переменных. Также не следует называть переменные именами столбцов. Ниже приведен пример неправильного объявления переменных:

    Объявление переменных с атрибутом %TYPE

    Префикс %TYPE используется для объявления переменных, ассоциированных с ранее объявленными переменными или столбцами Базы Данных. Основное преимущество префикса в том, что при объявлении переменная, которая впоследствии будет ассоциирована со столбцом Базы Данных, должна быть точно объявлена (имя, разряд) во избежание ошибок. Вы не можете помнить все значения типов данных столбцов таблицы, разрядность численных типов и размерность символьных полей, поэтому понимание использования этого префикса очень важно. Ниже приведен синтаксис и пример объявления префикса:

    t_city - переменная типа city . Переменная символьного типа , хранит значение - "Мариуполь";

    pr_key - хранит значение столбца таблицы about.pr_key .

    Примечание: NOT NULL столбцы не могут быть объявлены с префиксом %TYPE .
    Область видимости переменной

    Область видимости переменной - это область, в которой она определена. В большинстве случаев все переменные имеют единую область видимости. Переменная может быть локальной, глобальной или одновременно и той и другой. Локальная переменная - это переменная, локальная для блока, в котором она объявлена. Глобальная переменная - это переменная, действующая для всех вложенных блоков , которые находятся внутри блока, где она объявлена. Если на одном из уровней вложенности эту переменную переопределить, то она станет глобальной для всех нижестоящих уровней. Блоку, стоящему на одном уровне вложенности с другим, нельзя ссылаться на переменную, объявленную в этом блоке.

    В этом разделе мы рассмотрели основные типы данных, применяемых в PL/SQL, а также правила и способы их объявления.

    Обращение к элементам Oracle Forms в операторах PL/SQL

    Для того чтобы обращаться к элементам, блокам, окнам и параметрам, нужно перед названием объекта поставить двоеточие. Ниже приведены основные примеры обращения к объектам Oracle Forms :

    • :parameter.param_name - обращение к параметру. Слово parameter обязательно.
    • :block_name.item_name - обращение к элементу блока. Block_name - это идентификатор блока данных, которому принадлежит элемент, к коему мы обращаемся. Если в форме элемент один, то название блока можно будет опустить, в противном случае вы получите ошибку - "Неверная переменная привязки".
    • :block - обращение к блоку. В этом случае никаких вспомогательных префиксов не требуется.
    • :column_name - обращение к элементу. Если элемент в форме один, к нему можно обращаться без указания имени блока.
    • :system.variable_name - обращение к системной переменной . Слово SYSTEM является обязательным.
    • :global.global_name - обращение к глобальной переменной. Слово global является обязательным.
    Косвенное обращение к элементам

    В Oracle Forms существует два вида непрямого обращения к элементам:

    Процедура COPY

    COPY - копирует указанное значение в указанный элемент. Ниже рассмотрено два вида обращения к элементу.

    : about.age:=20 - это прямое обращение, элементу age присваивается значение 20.

    COPY(20, 'about.age') - непрямое обращение, в элемент age помещается значение 20.

    Функция NAME_IN

    NAME_IN - возвращает содержимое элемента или переменной. Эта функция может быть вложена в другие функции. Ниже приведены примеры обращения к элементам с помощью функции NAME_IN :

    Функция NAME_IN может использоваться совместно с процедурой COPY , например, копирование в элемент REF указанного значения:

    Косвенное обращение часто используется в программных модулях и библиотеках, где прямое обращение к элементам нежелательно или недопустимо.

    Комментарии

    Каждая программа, претендующая на простоту, изящность и понимание, должна содержать пояснительный текст - комментарии. Для того чтобы программа была понятной и доступной, не всегда хватает исчерпывающих имен переменных или именованных блоков, поэтому в PL/SQL, как и в других языках программирования, можно использовать комментарии. В PL/SQL существует два вида комментариев:

    Однострочные комментарии

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

    однострочного комментария, который объясняет назначение процедуры sum_price :

    Многострочные комментарии

    В случае когда необходимо закомментировать большой фрагмент программы, расстановка однострочных комментариев займет приличное время, так как они удобны скорее для небольших фрагментов кода. Многострочный комментарий полезен для написания больших пояснений к тексту программы. В многострочном комментарии текст размещается между парой символов (/*) и (*/) - весь текст, размещенный между этой парой символов считается закомментированным. Ниже приведен пример многострочного комментария:

    Используйте комментарии, это поможет не только вам ориентироваться в вашем же коде, но и тем разработчикам, которым, возможно, придется дорабатывать или изучать вашу программу.

    Маленькое руководство по отлавливанию ошибок в Oracle PLSQL.
    Описание как использовать в Oracle (PLSQL) функции SQLERRM и SQLCODE для отлова ошибок EXCEPTION, с описанием синтаксиса и примером.

    Функция SQLCODE возвращает код ошибки связанный с последним возникшим исключением (ошибкой)
    Функция SQLERRM — не имеет параметров.

    Обычно обработка исключений EXCEPTION выглядит следующим образом:


    Варианты основных возможных ошибок:

    DUP_VAL_ON_INDEX
    ORA-00001
    При попытке произвести вставку INSERT или изменение UPDATE данных которое создает дублирующую запись нарушающую уникальный индекс (unique index).

    TIMEOUT_ON_RESOURCE
    ORA-00051
    Происходит когда ресурс над которым производится операция заблокирован и произошел сброс по таймауту.

    TRANSACTION_BACKED_OUT
    ORA-00061
    Произошёл частичный откат транзакции.

    INVALID_CURSOR
    ORA-01001
    Попытка использовать курсор которого не существует. Может происходить если вы пытаетесь использовать FETCH курсор или закрыть CLOSE курсор до того как вы этот курсор открыли OPEN.

    NOT_LOGGED_ON
    ORA-01012
    Попытка произвести действия не залогинившись.

    LOGIN_DENIED
    ORA-01017
    Неудачная попытка залогиниться, в доступе отказано, не верный пользователь или пароль.

    NO_DATA_FOUND
    ORA-01403
    Что то из перечисленного: Попытка произвести вставку SELECT INTO несуществующего набора значений (select — ничего не возвращает). Попытка доступа к неинициализированной строке/записи в таблице. Попытка чтения записи после окончания файла при помощи пакета UTL_FILE.

    TOO_MANY_ROWS
    ORA-01422
    Попытка вставить значение в переменную при помощи SELECT INTO и select вернул более чем одно значение.

    ZERO_DIVIDE
    ORA-01476
    Попытка деления на ноль.

    INVALID_NUMBER
    ORA-01722
    Попытка выполнить SQL запрос который производит конвертацию строки (STRING) в число (NUMBER) при этом такое преобразование невозможно.

    STORAGE_ERROR
    ORA-06500
    Либо нехватка памяти, либо ошибка в памяти.

    PROGRAM_ERROR
    ORA-06501
    Внутренняя программная ошибка рекомендуется с такой ошибкой обращаться в службу поддержки Oracle.

    VALUE_ERROR
    ORA-06502
    Попытка выполнить операцию конвертации данных которая закончилась с ошибкой (например: округление, преобразование типов, и т.п.).

    CURSOR_ALREADY_OPEN
    ORA-06511
    Вы пытаетесь открыть курсор который уже открыт.

    Маленькое руководство по отлавливанию ошибок в Oracle PLSQL.
    Описание как использовать в Oracle (PLSQL) функции SQLERRM и SQLCODE для отлова ошибок EXCEPTION, с описанием синтаксиса и примером.

    Функция SQLCODE возвращает код ошибки связанный с последним возникшим исключением (ошибкой)
    Функция SQLERRM — не имеет параметров.

    Обычно обработка исключений EXCEPTION выглядит следующим образом:


    Варианты основных возможных ошибок:

    DUP_VAL_ON_INDEX
    ORA-00001
    При попытке произвести вставку INSERT или изменение UPDATE данных которое создает дублирующую запись нарушающую уникальный индекс (unique index).

    TIMEOUT_ON_RESOURCE
    ORA-00051
    Происходит когда ресурс над которым производится операция заблокирован и произошел сброс по таймауту.

    TRANSACTION_BACKED_OUT
    ORA-00061
    Произошёл частичный откат транзакции.

    INVALID_CURSOR
    ORA-01001
    Попытка использовать курсор которого не существует. Может происходить если вы пытаетесь использовать FETCH курсор или закрыть CLOSE курсор до того как вы этот курсор открыли OPEN.

    NOT_LOGGED_ON
    ORA-01012
    Попытка произвести действия не залогинившись.

    LOGIN_DENIED
    ORA-01017
    Неудачная попытка залогиниться, в доступе отказано, не верный пользователь или пароль.

    NO_DATA_FOUND
    ORA-01403
    Что то из перечисленного: Попытка произвести вставку SELECT INTO несуществующего набора значений (select — ничего не возвращает). Попытка доступа к неинициализированной строке/записи в таблице. Попытка чтения записи после окончания файла при помощи пакета UTL_FILE.

    TOO_MANY_ROWS
    ORA-01422
    Попытка вставить значение в переменную при помощи SELECT INTO и select вернул более чем одно значение.

    ZERO_DIVIDE
    ORA-01476
    Попытка деления на ноль.

    INVALID_NUMBER
    ORA-01722
    Попытка выполнить SQL запрос который производит конвертацию строки (STRING) в число (NUMBER) при этом такое преобразование невозможно.

    STORAGE_ERROR
    ORA-06500
    Либо нехватка памяти, либо ошибка в памяти.

    PROGRAM_ERROR
    ORA-06501
    Внутренняя программная ошибка рекомендуется с такой ошибкой обращаться в службу поддержки Oracle.

    VALUE_ERROR
    ORA-06502
    Попытка выполнить операцию конвертации данных которая закончилась с ошибкой (например: округление, преобразование типов, и т.п.).

    CURSOR_ALREADY_OPEN
    ORA-06511
    Вы пытаетесь открыть курсор который уже открыт.

    Читайте также: