Oracle 12C:插入值后返回记录

Posted

技术标签:

【中文标题】Oracle 12C:插入值后返回记录【英文标题】:Oracle 12C:Return the record after insert values 【发布时间】:2014-02-10 07:51:53 【问题描述】:

我想获取在 C# 中插入表格的值,如下所示:

begin
insert into bk_library(floor,section) values('foo2','bar') 
returning id into :outid;
select *from bk_library where id=:outid;
end;

很遗憾,我失败了

错误信息:Kiss.Linq.Linq2Sql.Test.EntryPoint.TestInsertReturnId: Oracle.DataAccess.Client.OracleException:ORA-06550:第 3 行,第 3 列 1: PLS-00428: 在这个 SELECT 语句中需要一个 INTO 子句


    [Test]
    public void TestInsertReturnId()
    
        int ret = 0;
        string connstring = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pdborcl)));User Id=system;Password=****;";

        string sql = @"insert into bk_library(floor,section) values('foo','bar') returning id into :outid";
         sql = getSqlString();
        using (DbConnection conn = new OracleConnection(connstring))
        
            conn.Open();
            DbCommand command = conn.CreateCommand();
            command.CommandType = CommandType.Text;
            command.CommandText = sql;

            OracleParameter lastId = new OracleParameter(":outid", OracleDbType.Int32);
            lastId.Direction = ParameterDirection.Output;
            command.Parameters.Add(lastId);
            ret = command.ExecuteNonQuery();

               // this code work fine ,now I want to get the entire record
            LogManager.GetLogger<EntryPoint>().Info("The new id =0", lastId.Value.ToString()); 

            conn.Close();
        
        Assert.AreNotEqual(ret, 0);
    

【问题讨论】:

您真正想做的是什么?您刚刚在数据库中创建了“行”并且已经拥有数据,为什么还要再次获取它?也许看看 Entity Framework 或 LinqToSql? 在这种情况下,表的主列是身份(oracle-base.com/articles/12c/…插入一个我不知道id的值,现在我想获取整个记录。 是的,但是你从查询中得到了 id,为什么你需要整条记录?既然你没有使用任何建模框架? 【参考方案1】:

ParameterDirection 应该是ReturnValue

lastId.Direction = ParameterDirection.ReturnValue;

【讨论】:

我错了,这段代码" LogManager.GetLogger().Info("The new id =0", lastId.Value.ToString()); "工作正常,我可以获取 id,现在我想获取整个记录,而不仅仅是 ID。【参考方案2】:

来自http://arjudba.blogspot.ch/2008/07/pls-00428-into-clause-is-expected-in.html?m=1>

您需要写SELECT * INTO some_variable FROM bk_library 而不是SELECT * FROM bk_library,因为我假设您想以某种方式存储检索到的数据。因此,您需要声明一个新变量some_variable(我假设为字符串类型)并如上所述修改您的 SELECT 语句。然后语句中的数据将存储在您的新变量中。

希望对你有帮助

【讨论】:

谢谢,你启发了我,我像这样改变我的 sql:声明 idnum 整数;开始插入 bk_library(floor,section) values('foo2','bar') 返回 id 到 :outid;从 bk_library 中选择 id 到 idnum 其中 id=:outid;结尾;现在我想获取所有列的值,我该怎么做? 见oracle.com/technetwork/issue-archive/2012/12-may/… 谢谢,现在我有了这个 sql:declare bk_library_shadow bk_library%ROWTYPE;开始插入 bk_library(floor,section) values('foo2','bar') 返回 id 到 :outid; select * into bk_library_shadow from bk_library where id=:outid;结束;

以上是关于Oracle 12C:插入值后返回记录的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle 12c 函数返回多个值

oracle数据库,表中有id(自增字段,主键), insert 语句插入一条记录后要求,返回当前插入记录的id値。

带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回啥数据类型?

ORACLE 创建的函数 可以返回两个值吗,该怎么做?

在查询中比较 oracle 日期时间失败并且不返回任何记录

Oracle:使用 select 插入不返回批量收集新插入的 id