无法执行本机批量操作查询

时间:2009-11-10 16:56:47

标签: oracle nhibernate

我正在尝试在NHibernate中实现“if exists,update,否则,插入”数据访问方法。我的数据库是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 个答案:

答案 0 :(得分:2)

我不知道你为什么会收到这个错误,但你可以试试这个更简单的PL / SQL块:

BEGIN
    INSERT INTO Table1 ...;
EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        UPDATE Table1 ... ;
END;";

答案 1 :(得分:1)

您似乎在;

之后缺少SELECT

This link也可能对你感兴趣。

关于插入/更新,请参阅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;

另见this topic

答案 2 :(得分:0)

转到Toad或SQL Editor之类的Oracle客户端,尝试使用通过Hibernate发送的相同参数执行该过程。

在我的情况下,Oracle抛出的错误如下:

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

原因是程序/功能内部的选择。然后改进程序/功能以捕获这些异常。