【问题标题】:asp.net : INSERT in oracle table only if the clause WHERE of the UPDATE find zero recordsasp.net:仅当 UPDATE 的 WHERE 子句找到零记录时才在 oracle 表中插入
【发布时间】:2014-12-31 09:08:11
【问题描述】:

我正在开发一个 asp.net 应用程序。我想知道如何更新 oracle 表记录的字段,如果记录不存在,则插入它。

我有一个包含以下字段 NAME 和 SURNAME 的表格。

我想将 SURNAME 更改为 NAME 等于="name" 的记录的“new_surname”。但是,如果表中没有任何记录包含字段 NAME 等于名称,我想插入一条新记录(SURNAME=new_surname 和 NAME=name)。

这是我的代码:

        OracleConnection connection = new OracleConnection(connectionstring);
        try
        {
            connection.Open();
            OracleCommand command = connection.CreateCommand();
            string sql = "UPDATE TABLE SET SURNAME=\'new_surname\' WHERE NAME=\'name\'";


                command.CommandText = sql;
                command.ExecuteNonQuery();

            connection.Close();
        }
        catch (Exception exp)
        {

        }

只有当更新找到与“where”子句匹配的零记录时,是否有一种最佳方法来执行插入操作。我正在考虑首先对匹配“where”子句的记录进行选择计数,然后如果我发现零个结果我会做一个插入,如果我发现至少一个结果我会做一个更新。但我觉得这个解决方案有点重。

【问题讨论】:

标签: c# asp.net oracle


【解决方案1】:

您可以将查询修改为:

string sql = @"IF EXISTS (SELECT * FROM \'Given Table\' WHERE NAME=\'name\') THEN
BEGIN
--your update query
END
ELSE
BEGIN
-- your Insert Query
END
END IF";

【讨论】:

  • 我想知道投反对票的原因。我相信我会学到一些新东西。原因可以帮助我理解我错在哪里。
  • 不是我的反对意见,但您确定 Oracle 允许这种语法吗?我的知识像这篇文章一样生疏community.oracle.com/thread/321710?start=0&tstart=0
  • 非常感谢。我肯定学到了一些新东西。一旦我能够访问 Oracle 系统,我就会检查语法。再次感谢您的参考文章。
  • 很抱歉错过了投反对票的理由。但是,是的,这是因为答案不是有效的 Oracle 语法。它引发错误PLS-00204: function or pseudo-column 'EXISTS' may be used inside a SQL statement only。其次,它使数据库比所需的工作更难,因为每次它首先执行 SELECT,然后执行 UPDATE 或 INSERT。那是 always 两个操作。有结合 UPDATE 和 INSERT 的答案,有时只执行两个操作,以及@Steve 给出的更好的 MERGE 答案,它在单个 SQL 操作中完成整个事情。
  • 嗯...非常感谢。看来我今天学到了两个新东西。将尝试确保我给出的答案在发布之前得到正确验证。超
【解决方案2】:

无法测试,但你可以试试这个

using(OracleConnection connection = new OracleConnection(connectionstring))
using(OracleCommand command = connection.CreateCommand())
{
    connection.Open();
    string sql = @"MERGE INTO TABLE t USING dual on(name='name')
                   WHEN NOT MATCHED THEN INSERT (name, surname) values ('name', 'new_surname')
                   WHEN MATCHED THEN UPDATE SET surname = 'new_surname'";
    command.CommandText = sql;
    command.ExecuteNonQuery();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2013-05-03
    • 2010-10-23
    相关资源
    最近更新 更多