Это происходит, когда сеанс, отличный от сеанса, используемого для изменения таблицы, удерживает блокировку, вероятно, из-за DML (обновление / удаление / вставка). Если вы разрабатываете новую систему, вполне вероятно, что вы или кто-то из вашей команды выдает оператор обновления, и вы можете прервать сеанс без особых последствий. Или вы можете выполнить фиксацию из этого сеанса, когда узнаете, у кого открыт сеанс.
Если у вас есть доступ к системе администратора SQL, используйте ее, чтобы найти нарушающий сеанс. И, возможно, убить его.
Вы можете использовать v $ session и v $ lock и другие, но я предлагаю вам Google, как найти этот сеанс, а затем как его убить.
В производственной системе это действительно зависит. Для оракула 10g и старше вы можете выполнить
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
В отдельном сеансе, но подготовьте следующее на случай, если это займет слишком много времени.
alter system kill session '....
Это зависит от того, какая у вас система, более старые системы с большей вероятностью не будут фиксировать каждый раз. Это проблема, так как могут быть давно стоящие замки. Таким образом, ваша блокировка предотвратит любые новые блокировки и будет ждать блокировки, которая знает, когда она будет снята. Вот почему у вас есть другое заявление готово. Или вы можете поискать сценарии PLSQL, которые автоматически выполняют похожие действия.
В версии 11g появилась новая переменная среды, которая устанавливает время ожидания. Я думаю, что это, вероятно, делает что-то похожее на то, что я описал. Имейте в виду, что проблемы с блокировкой не исчезают.
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
Наконец, возможно, лучше подождать, пока в системе останется мало пользователей, выполняющих такое обслуживание.