我想知道如果采取下述方案是可能的:ODP.NET UPDATE ... RETURNING INTO ...多行,参数类型
我实现一个简单的数据输入应用程序。每个可编辑记录驻留在一个表中。用户必须同时编辑多个记录(以减少数据输入时间)。我现在试图做的是在记录中实现某种锁定机制。
我想到的第一件事是执行(ExecuteNonQuery)UPDATE some_table SET status ='locked'WHERE rownum = 1返回ID INTO:locked_id与输出参数,给我锁定记录的ID。我可以执行另一个SELECT语句来读取我想要的任何其他信息,并以此ID为基础。
虽然上述方法似乎适用于单个锁定记录,但我不知道如何为多个返回的行执行此操作。 - 如果在上例中WHERE子句是“rownum < 4”而不是“rownum = 1”?
我的OracleParameter应该是什么样子? 当我指定我会返回Oracle参数是这样的(可与单排),
OracleParameter p = cmd.Parameters.Add("ID", OracleDbType.Int32, 10, 0, ParameterDirection.Output);
ORA-24369中给出。我尝试使用ArrayBindCount和数组作为参数的.Value属性,但无济于事。
另外,你是否发现锁定的整个特定方式有什么根本错误?
谢谢
编辑:一些澄清 - 1.有一个名为USER_NAME列,可容纳例如登录的用户名 - 我更新与锁定UPDATE 2.沿有另一列,我称之为locked_timestamp,持有当记录被锁的时间。可能会有一个后台进程在夜间运行,并将锁定的记录重置为“解锁” - 因为这种情况不会频繁发生,并且由于崩溃等情况而保持“锁定”的记录比例很小比较的编辑记录 3.并发更新都应该是由Oracle自动处理量,是的,我每次更新过程中使用的交易 - 因此几乎没有什么机会,一个记录被通过同时两个用户锁定 - 或者说是我听到的(会尝试了这一点,一旦我找到了如何更新... RETURNING ..多行)
因为代码结束有点尴尬,我的主要结论是使用预编译的PL/SQL过程 - 获得的好处是SQL代码将被预先存储,它将更加结构化并且锁定逻辑将驻留在数据库中。该过程也可以编码以返回锁定记录的数量,以及规避可怕的ORA-22054异常 – 2012-04-18 15:05:34