Причина получения ORA-01422: точная выборка возвращает больше запрошенного количества строк

Вопрос:Итак, я работаю над установщиком, где установщик подключается к базе данных и создает таблицы и заполняет их. Каждый аспект этого работает правильно, за исключением случаев, когда я пытаюсь добавить строки в таблицу certian. declare retVal INTEGER; rptID INTEGER; catID INTEGER; wsID INTEGER; paramID INTEGER; dtID INTEGER; begin select PK into catID from RPT_CATEGORY where KEYVALUE

Вопрос:

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

declare retVal INTEGER; rptID INTEGER; catID INTEGER; wsID INTEGER; paramID INTEGER; dtID INTEGER; begin select PK into catID from RPT_CATEGORY where KEYVALUE = ‘ProductivityReportsCategory’; select PK into rptID from RPT_REPORT where KEYVALUE = ‘ProductivitySummaryReport2’; select PK into wsID from RPT_WEBSVC where KEYVALUE = ‘NotApplicable’ and category_fk = catID;

Операторы select, которые заполняют базу данных, выглядят следующим образом:

select PK into wsID from RPT_WEBSVC where KEYVALUE = ‘GetMachineNameList’ and category_fk = catID; paramID := RPT_CONFIGURATION.ADD_PARAMETER( rptID, wsID, dtID, ‘Machine’, ‘parameters.GetProductivityDataSet3.inserterid’, 4, NULL, NULL, NULL, 0, 0, 0, ‘Y’, ‘Y’, ‘N’, ‘N’, ‘Y’ );

Есть еще 13 операторов выражений, структурированных таким образом (я не буду добавлять их, поскольку они все одинаковы, и единственное различие – это сохраненные значения, которые будут входить в таблицу.)

Моя проблема в том, что когда я запускаю установщик, я получаю эту ошибку в журналах после завершения:

ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 30

Что я хотел бы знать, в чем именно причина этой ошибки, и каковы были бы способы исправить эту ошибку?

Я провел некоторое исследование по этой теме и нашел, что это общая тема моего поиска:

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

2. Данные были взломаны, а не используются API, так что проверка была нарушена;

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

Я уверен, что это не # 2, но я не совсем понимаю, что именно означают другие 2 причины или как их исправить.

Любая помощь или предложения приветствуются.

Спасибо

Лучший ответ:

ORA-01422: точная выборка возвращает больше запрошенного количества строк

Это исключение возникает всякий раз, когда выполняется инструкция SELECT INTO и находит более одной строки. Оператор SELECT INTO ожидает найти ровно одну строку, не более или менее – в противном случае возникает исключение.

В вашем примере:

select PK into wsID from RPT_WEBSVC where KEYVALUE = ‘GetMachineNameList’ and category_fk = catID;

Кажется, что должна быть только одна строка за (KEYVALUE, CATEGORY_FK) комбинация, но на самом деле это не так. Если должно быть только одно, то таблица должна иметь уникальное ограничение для этих столбцов:

alter table RPT_WEBSVC add constraint RPT_WEBSVC_UK unique (KEYVALUE, CATEGORY_FK);

Это помешает кому-то (или некоторому процессу) снова добавить ту же строку. Конечно, вам нужно будет удалить дубликаты таблицы, прежде чем вы сможете добавить это ограничение.

Ответ №1

Это означает, что оператор “SELECT INTO” возвращает более одной строки. Это утверждение требует, чтобы запрос возвращал только одну строку. В противном случае вы должны использовать цикл курсора для обработки строк.

Проверьте свои операторы select в SQL * Plus, чтобы узнать, какой из них является нарушающим запрос.

Ответ №2

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

Оцените статью
Добавить комментарий