Вопрос:
Итак, я работаю над установщиком, где установщик подключается к базе данных и создает таблицы и заполняет их.
Каждый аспект этого работает правильно, за исключением случаев, когда я пытаюсь добавить строки в таблицу 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 как причину проблемы здесь. Не видя всех утверждений, трудно сказать, какой из этих запросов может возвращать несколько строк, но это хорошее место для запуска, поскольку база данных схемы могут меняться…