Причина получения ORA-01422: точная выборка возвращает количество запрошенных строк - PullRequest
1 голос
/ 15 августа 2011

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

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 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 причины, или как их исправить.

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

Спасибо

Ответы [ 3 ]

6 голосов
/ 15 августа 2011

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);

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

4 голосов
/ 15 августа 2011

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

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

0 голосов
/ 15 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...