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来自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数据库,表中有id(自增字段,主键), insert 语句插入一条记录后要求,返回当前插入记录的id値。
带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回啥数据类型?