2009-11-10 88 views
3

我試圖在NHibernate中實現「if exists,update,otherwise,insert」數據訪問方法。我的數據庫是Oracle 10g。無法執行本機批量操作查詢

當我嘗試運行此代碼時,如果運行插入或更新individualy,它可以正常工作,但我卻遇到了「無法執行本機批量操作查詢」錯誤。

謝謝!

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

回答

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

+0

合併爲我的案件工作。謝謝! 僅供參考,失蹤;我不是問題的原因,在我的完整的SQL,換句話說,我使用的SQL是有效的。不知怎的,NHibernate不喜歡它。 – nandin 2009-11-11 13:55:38

+0

在您提供的第一個鏈接中,有一個非常有用的註釋:**觀察InnerException屬性**。 – 2011-10-15 18:08:13

2

我不知道爲什麼你得到這個錯誤,但你可以試試這個簡單的PL/SQL塊來代替:

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

這個SQL的效果更好,因爲如果另一個會話已經創建但未提交有問題的記錄,插入將等待鎖定。一旦提交,它將下載到異常處理程序。在原始中,select不會等待鎖,並且不會返回一行。然後它會落入插入路徑,該路徑將等待鎖定,並在其他會話提交時出錯。 也查看MERGE語句。 – 2009-11-10 21:38:52

+0

它也行不通,不知何故NHibernate總是刪除;從更新聲明。 這次我得到不同的錯誤 Oracle.DataAccess.Client.OracleException ORA-06550:第1行,第1749列:\ nPL/SQL:ORA-00933:SQL命令未正確結束\ nORA-06550:第1行1123列:\ n – nandin 2009-11-10 21:49:50

0

轉到像蟾蜍或SQL編輯器的Oracle客戶端,並嘗試與您通過Hibernate發送相同的參數執行該過程。

在我的情況中,Oracle被扔一個錯誤,如:

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

的原因是程序/功能的一個選擇的內部。然後改進程序/功能來捕捉這些例外情況。

相關問題