使用 c# 和 OCI 中的 RETURNING INTO 子句在 Oracle 上创建行 ID 的正确方法是啥:

Posted

技术标签:

【中文标题】使用 c# 和 OCI 中的 RETURNING INTO 子句在 Oracle 上创建行 ID 的正确方法是啥:【英文标题】:What is the correct way to get created row Id on Oracle using the RETURNING INTO clause in c# and OCI:使用 c# 和 OCI 中的 RETURNING INTO 子句在 Oracle 上创建行 ID 的正确方法是什么: 【发布时间】:2014-04-29 02:41:04 【问题描述】:

我有以下语句来插入行并获取插入的 Id 或行:

    int returnId;
    string sql = "INSERT INTO table_name (a, b, c) VALUES (1, 2, 3) RETURNING ID INTO :returnId;";

    OracleCommand command = conn.CreateCommand();
    command.CommandText = sql;

    Console.WriteLine ("The row created has a Id = " + returnId);

这不起作用。我还尝试了以下变体:

        string sql = "INSERT INTO table_name (a, b, c) VALUES (1, 2, 3) RETURNING ID;";
        OracleCommand command = conn.CreateCommand();
        command.CommandText = sql;

        int rowsUpdated = command.ExecuteNonQuery();

        if (rowsUpdated != 1)
            return;

        OracleDataReader reader = command.ExecuteReader();
        while (reader.Read())
        
            string id = (string)reader["ID"];
            Console.WriteLine ("The row created has a Id = " + returnId);
        

这将2行插入数据库,阅读器为空。

那么,以编程方式使用 RETURNING INTO 子句获取创建的行 ID 的正确方法是什么。

感谢您的帮助。

【问题讨论】:

How to get the generated id from an inserted row using ExecuteScalar? 的可能重复项 【参考方案1】:

您的返回子句很好,但您的 C# 代码全错了。您需要使用 Parameters 属性 - 在此处阅读:http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters%28v=vs.110%29.aspx

例如:

command.Parameters.Add("returnId", OracleType.Number).Direction = ParameterDirection.Output;

执行查询后检查command.Parameters["returnId"].Value

【讨论】:

我正在尝试更改代码,这是一条线索,但不起作用... OracleType 是 OracleDbType(int32 或十进制),我找不到 ParameterDirection.Output...

以上是关于使用 c# 和 OCI 中的 RETURNING INTO 子句在 Oracle 上创建行 ID 的正确方法是啥:的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 是不是支持 SQL 语句中的 RETURNING?

PostgreSQL v12.6 中的 PLpgSQL INSERT-RETURNING-INTO 错误?

使用 RETURNING INTO 子句和 BULK COLLECT 时如何返回整行

Java JDBC 如何使用 RETURNING 语句处理更新查询

如何使用 terraform 在 OCI 中的现有默认路由表中添加新规则

如何在 PostgreSQL 中使用 RETURNING 和 ON CONFLICT?