首页 > 解决方案 > 如何在 Oracle 查询“Select-For-Update”中参数化等待时间

问题描述

在我的程序中,我运行“选择更新”-这样的查询:

OracleConnection con = GenerateConnection();

OracleCommand cmd = con.CreateCommand();

cmd.CommandText = "SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT 2";
cmd.Parameters.Add(new OracleParameter(":COL2 ", "some value"));

string myValue = Convert.ToString(cmd.ExecuteScalar());

这工作得很好。现在我想参数化等待获得锁的时间(一些集成测试应该等待更长时间,因为测试环境较慢)。

因此,我尝试了这个:

OracleConnection con = GenerateConnection();

OracleCommand cmd = con.CreateCommand();

cmd.CommandText = "SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT :WAITFOR";
cmd.Parameters.Add(new OracleParameter(":COL2 ", "some value"));
cmd.Parameters.Add(new OracleParameter(":WAITFOR", 2));

string myValue = Convert.ToString(cmd.ExecuteScalar());

不幸的是我明白了:

ORA-30005: WAIT 间隔丢失或无效

我的问题:

我必须做一个String.Format()还是我做错了什么?

标签: c#oracleparametersodp.net

解决方案


您不能参数化WAIT,因为它需要整数文字。您可以使用字符串连接或插值构建查询:

int waitfor = 2;
cmd.CommandText = $"SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT {waitfor}";

请注意,这种技术是变通方法(用户输入可能的 SQL 注入)。只有在没有其他选项并且参数不能被用户篡改或已正确清理时才应使用它。


推荐阅读