не удалось выполнить собственный запрос на массовые манипуляции - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь реализовать метод доступа к данным «если существует, обновить, в противном случае вставить» в NHibernate. Моя база данных - Oracle 10g.

Я получаю эту ошибку "не удалось выполнить собственный запрос на массовые манипуляции" при попытке запустить этот код, если я запускаю вставку или обновляю по отдельности, она работает просто отлично.

Спасибо!

string sql = @"DECLARE
                CntOfRow Number(10,0);
              BEGIN
                    SELECT count(*)
                    INTO CntOfRow
                    FROM Table1
                    WHERE 
                        QueID=:QueID

                    IF CntOfRow=0 THEN
                        INSERT INTO Table1 ...;
                    ELSE
                        UPDATE Table1 ... ;
                    END IF;
                END;";


            INHibernateSession session = NHibernateSessionManager.Instance.Session;

            try
            {
                session.BeginTransaction();
                ISQLQuery query = session.GetISession().CreateSQLQuery(sql.Replace(System.Environment.NewLine, " "));
                query.SetParameter("QueID", queID);
                query.ExecuteUpdate();
                session.CommitTransaction();
            }
            catch (Exception ex)
            {
                session.RollbackTransaction();
                throw;
            }

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Я не знаю, почему вы получаете эту ошибку, но вместо этого вы можете попробовать этот более простой блок PL / SQL:

BEGIN
    INSERT INTO Table1 ...;
EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        UPDATE Table1 ... ;
END;";
1 голос
/ 11 ноября 2009

Вы, похоже, пропускаете ; после SELECT

Эта ссылка также может быть вам интересна.

Что касается вставки / обновлениясм. заявление MERGE.Это работает так:

MERGE INTO t1 dest
USING (SELECT 1 pk, 11 i FROM dual) src
   ON (dest.pk = src.pk)
 WHEN NOT MATCHED THEN INSERT (dest.pk, dest.i) VALUES (src.pk, src.i)
 WHEN MATCHED THEN UPDATE SET dest.i = src.i;

Также смотрите эту тему

0 голосов
/ 24 декабря 2010

Перейдите к клиенту Oracle, такому как Toad или SQL Editor, и попробуйте выполнить процедуру с теми же параметрами, которые вы отправляете через Hibernate.

В моем случае Oracle выдавал ошибку вроде:

11:50:57 ORA-01403: no data found

Причиной был выбор внутри процедуры / функции. Затем улучшите процедуру / функцию, чтобы перехватить эти исключения.

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