如何在 Oracle 查询中参数化等待时间 "Select-For-Update"
How to parameterize waiting-time in Oracle Query "Select-For-Update"
在我的程序中,我 运行 一个 "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: missing or invalid WAIT interval
我的问题:
我必须做一个 String.Format()
还是我做错了什么?
您不能参数化 WAIT
,因为它需要 整数文字。您可以使用字符串连接或插值来构建查询:
int waitfor = 2;
cmd.CommandText = $"SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT {waitfor}";
请注意,此技术是解决方法(可能 SQL 用户输入注入)。仅当没有其他选项且参数不能被用户篡改或已正确清理时才应使用它。
在我的程序中,我 运行 一个 "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: missing or invalid WAIT interval
我的问题:
我必须做一个 String.Format()
还是我做错了什么?
您不能参数化 WAIT
,因为它需要 整数文字。您可以使用字符串连接或插值来构建查询:
int waitfor = 2;
cmd.CommandText = $"SELECT col1 FROM table1 WHERE col2 = :COL2 AND rownum = 1 FOR UPDATE WAIT {waitfor}";
请注意,此技术是解决方法(可能 SQL 用户输入注入)。仅当没有其他选项且参数不能被用户篡改或已正确清理时才应使用它。