3

我必须根据表中列 c1 的特定值将一些数据更新到数据库中,现在我必须为 c1 的各种值做同样的事情,但我不能使用 if/else,因为我的情况太多了想一个使用游标的解决方案,但我对它们没有太多经验(或者根本没有任何经验)请帮助我。

我有:

  • 桌子TAB1
  • 值对列表 (V1, V2)
  • 为列表运行的 SQL 语句

    UPDATE TAB1 SET C1=V2 where C1=V1
    
4

3 回答 3

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 ;
于 2013-01-02T09:56:46.347 回答
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
于 2013-01-02T11:42:26.263 回答
-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;
            }

        } 
于 2013-01-02T10:14:30.533 回答