Как параметризовать время ожидания в Oracle Query "Select-For-Update" - PullRequest
0 голосов
/ 23 января 2019

В моей программе я запускаю «выбрать для обновления» - Запрос вот так:

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: отсутствует или недействителен интервал ожидания

Мой вопрос:

Должен ли ясделать String.Format() или я что-то не так?

1 Ответ

0 голосов
/ 26 января 2019

Вы не можете параметризовать WAIT, потому что для этого требуется целочисленный литерал .Вы можете построить свой запрос с помощью конкатенации или интерполяции строк:

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

Обратите внимание, что этот метод обходен (возможен SQL-инъекция для пользовательского ввода).Его следует использовать только в том случае, если нет другой опции, и параметр не может быть изменен пользователем или правильно очищен.

...