2013-04-10 3 views
-1

Когда я запускаю следующую вставку в оператор select, я получаю ORA 00937, потому что нижеприведенный запрос не может иметь дело с одним из подборов на таблице APPLICATIONS. Я не хочу жестко указывать эту ценность. Какие-либо предложения?ORA 00937 при использовании INSERT INTO SELECT

Заранее спасибо.

insert into CONFIGURATION_PARAMETER_VALUES 
(ID 
, NAME 
, DESCRIPTION 
, DATA_TYPE 
, VALUE_STRING 
, VALUE_INTEGER 
, VALUE_DATE 
, VALUE_FLOAT 
, VALUE_TIMESTAMP 
, APPLICATION_ID 
, DELETED 
) 
select NVL(MAX(ID),0)+1 
     , 'Alert_Statuses_AllExceptNoStatus' 
     , 'Suspicious' 
     , 'String' 
     , 'RBS_EIM_AL_008' 
     , null 
     , null 
     , null 
     , null 
     , (select ID from APPLICATIONS where name = 'Rabobank v 1.0.0.0') 
     , 'N' 
    from CONFIGURATION_PARAMETER_VALUES 
+0

Возможно, что ваш подзапрос возвращает более одного значения. Итак, попробуйте свой подзапрос, подобный этому выберите MAX (ID) из ПРИЛОЖЕНИЙ, где name = 'Rabobank v 1.0.0.0' – IndoKnight

ответ

1

Если это не слишком поздно, я предлагаю реализации SEQUENCE вместо подсчета голосов. Вы не можете получить строгий числовой порядок (может быть пробелов), но вы получите уникальное значение каждый раз, когда:

CREATE SEQUENCE Config_Parm_Values_Seq START WITH <1 + your current max ID>; 

Также обратите внимание, что ваш INSERT, как она стоит сейчас будет вести себя следующим образом:

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

Таким образом, даже если вы не используете последовательность, я бы рассмотреть «старый добрый» INSERT вместо с INSERT ... SELECT. В этом примере используется следующая последовательность:

insert into CONFIGURATION_PARAMETER_VALUES 
(ID 
, NAME 
, DESCRIPTION 
, DATA_TYPE 
, VALUE_STRING 
, VALUE_INTEGER 
, VALUE_DATE 
, VALUE_FLOAT 
, VALUE_TIMESTAMP 
, APPLICATION_ID 
, DELETED 
) VALUES (
     Config_Parm_Values_Seq.NEXTVAL -- Use seqname.nextval to get 
             -- the next value from the sequence 
     , 'Alert_Statuses_AllExceptNoStatus' 
     , 'Suspicious' 
     , 'String' 
     , 'RBS_EIM_AL_008' 
     , null 
     , null 
     , null 
     , null 
     , (select MAX(ID) from APPLICATIONS where name = 'Rabobank v 1.0.0.0') 
     , 'N') 
+0

Это также полезное решение. Единственное, что я сомневаюсь, - это использование последовательности. Идеально использовать последовательность. Но, заполнив таблицу, я не знаю, как это будет работать. Даже когда пользователь выполняет «SELECT MAX (ID) +1 FROM ...», запрос возвращает ошибку. – Rachcha

+0

Спасибо @ Rachcha - Я согласен с вашей оценкой, что последовательность идеальна, хотя она может быть не совсем подходящей здесь Я уверен, что 'SELECT MAX (ID) +1 ...' можно отлаживать и работать, возможно, с помощью NVL или какого-либо другого резервного. Затем снова, если несколько пользователей пытаются запустить не- Последовательность «INSERT» в то же время приведет к дублированию ID? Я всегда использовал последовательности, поэтому я действительно не знаю, что произойдет. –

+0

@ Rachcha - спасибо за улов на 'NEXTVAL'. Ошибка новичков с моей стороны, я думаю, мне нужна еще одна чашка кофе :) Я пытался принять ваши изменения, но не мог понять, как это сделать, поэтому я просто набрал его вручную. –

0

Проблема заключается в вашей SELECT инструкции, где вы используете SELECT NVL(MAX(ID), 0) + 1. Поскольку вы используете функцию MAX в списке SELECT, вы должны использовать GROUP BY, который здесь не является решением.

использовать что-то вроде следующего:

insert into CONFIGURATION_PARAMETER_VALUES 
(ID 
, NAME 
, DESCRIPTION 
, DATA_TYPE 
, VALUE_STRING 
, VALUE_INTEGER 
, VALUE_DATE 
, VALUE_FLOAT 
, VALUE_TIMESTAMP 
, APPLICATION_ID 
, DELETED 
) 
select (SELECT MAX(ID) FROM configuration_parameter_values) + 1 
     -- above line instead of NVL(MAX(ID),0)+1 
     -- You can also put NVL function around the subquery. 
     , 'Alert_Statuses_AllExceptNoStatus' 
     , 'Suspicious' 
     , 'String' 
     , 'RBS_EIM_AL_008' 
     , null 
     , null 
     , null 
     , null 
     , (select ID from APPLICATIONS where name = 'Rabobank v 1.0.0.0') 
     -- Warning: The above subquery can generate a TOO_MANY_ROWS exception. 
     -- Use the solution in the other answer to avoid this. 
     , 'N' 
    from CONFIGURATION_PARAMETER_VALUES 
+0

Эй, спасибо за ваш ответ, но ваш запрос дает ORA-00001: уникальное ограничение (CFG_PARAM_VAL_PK) нарушено – user2263807

+0

Это в столбце 'CONFIGURATION_PARAMETER_VALUES.ID'? – Rachcha

+0

Или, возможно, вы можете попробовать «SELECT NVL ((SELECT MAX (ID) +1 FROM configuration_parameter_values), 1)' – Rachcha

Смежные вопросы