2013-01-02 36 views
3

我必須根據表中列c1的特定值將某些數據更新到數據庫中,現在我必須對各種值執行相同操作爲C1,但我不能使用if/else因爲有太多的情況下,我想到了使用遊標的解決方案,但我沒有太多的經驗與他們(或任何有關事宜)plz幫助我。如何使用不同的數據運行相同的sql很多次

我:

  • TAB1
  • 值對(V1,V2)
  • SQL語句的列表爲列表運行

    UPDATE TAB1 SET C1=V2 where C1=V1 
    
+0

*** *** SQL僅僅是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品...許多東西都是特定於供應商的 - 所以我們真的需要知道您使用的數據庫系統**(以及哪個版本) ... –

+0

oracle sql developer – MozenRath

+0

值對的列表是否也會在表中顯示? – rene

回答

2

如果這是一個一次性的

1 2 
3 4 

...到...

:工作那麼一個體面的基於列的文本編輯器,你可以修改從設置你的數據
select 1 v1 2 v2 from dual union all 
select 3 v1 4 v2 from dual union all 

...等,然後用它作爲合併聲明將避免需要處理更新的一部分加入基數檢查

merge into tab1 using (
select 1 v1 2 v2 from dual union all 
select 3 v1 4 v2 from dual union all 
...) src 
on (src.v1 = tab1.c1) 
when ... etc 
3

你不此操作不需要光標。如果你在一個表中的值對,只需使用:

UPDATE 
    (SELECT t.C1, vp.V2 
    FROM 
     TAB1 t 
     JOIN 
     ValuePairs vp 
      ON t.C1 = vp.V1 
) tmp 
SET C1 = V2 ; 

如果這只是一個列表,你可以使用派生表:

UPDATE 
    (SELECT t.C1, vp.V2 
    FROM 
     TAB1 t 
     JOIN 
     (SELECT 1 V1, 2 V2 FROM dual 
     UNION ALL 
      SELECT 2, 3 FROM dual 
     -- ... 

     UNION ALL 
      SELECT 19, 23 FROM dual 
     ) vp 
      ON t.C1 = vp.V1 
) tmp 
SET C1 = V2 ; 
+0

我沒有它在一張桌子上,但在我的記事本 – MozenRath

+0

@MozenRath爲什麼不把你的記事本列表保存到臨時表,並遵循ypercube的方式(他寫的更新或合併)? – DazzaL

+0

嗯...只是意識到沒有簡單的方法:P。將臨時創建一個表。儘管想避免這種情況,但我只需稍後刪除它 – MozenRath

-1
you can try like this without creating the table. 

    bytes = readFile(FilenamewithPath); 
    file = Encoding.ASCII.GetString(bytes); 
    public static byte[] readFile(bool delFileOnRead, string fileNameWithPath) 
    { 
    try { 
       FileStream fsSource = new FileStream(fileNameWithPath, FileMode.Open, FileAccess.Read); 
       byte[] retVal = new byte[fsSource.Length]; 
       int numBytesToRead = (int)fsSource.Length; 
       int numBytesRead = 0; 
       while (numBytesToRead > 0) 
       { 
        int n = fsSource.Read(retVal, numBytesRead, numBytesToRead); 
        if (n == 0) 
         break; 
        numBytesRead += n; 
        numBytesToRead -= n; 
       } 
       fsSource.Close(); 
       fsSource.Dispose(); 
       if (delFileOnRead) 
       { 
        File.Delete(fileNameWithPath); 
       } 
       return retVal; 
      } 
      catch(Exception ex) { 
       throw ex; 
      } 

     } 
相關問題