Во-первых, какая версия Oracle?
Хорошо, я вижу пару проблем с вашим описанием. Когда вы говорите «повесить», это действительно зависание? Может ли это вращаться?
Кроме того, во-вторых, вы говорите "... он зависает после prepare ()". Означает ли это, что он зависает после вызова метода prepare () или после возврата из prepare ()?
Он висит в базе данных, и ваша клиентская программа ожидает завершения вызова базы данных?
Вам нужно запустить программу, затем посмотреть на V $ SESSION, определить SID, соответствующий сеансу базы данных вашей программы, и посмотреть, что он делает. Посмотрите на столбец СОБЫТИЕ в V $ SESSION. Кроме того, посмотрите на столбец STATUS, чтобы узнать, находится ли сеанс в данный момент в вызове базы данных (ACTIVE) или ожидает, пока клиентская программа вызовет базу данных (INACTIVE).
Сообщите некоторую информацию обратно, и я смогу предоставить дополнительную информацию.
Надеюсь, это поможет.