PreparedStatement и Oracle 10g ошибка - PullRequest
4 голосов
/ 09 декабря 2011

У меня есть большая, но ВРЕМЕННАЯ проблема с ошибкой в ​​Oracle 10g, когда мы вызываем некоторый SQL в веб-приложении Java.Мы не можем быстро исправить или обновить до 11g - что кажется первым «глупым» ответом службы поддержки оракула.Есть обходной путь, но у меня возникают проблемы с этим в PreparedStatements в моем Java-коде.

Фактическая ошибка:

ORA-00600: internal error code, arguments: [kcblasm_1]

Ошибка: Ошибка Oracle 12419392

Обходной путь выполняется

alter session set "_hash_join_enabled" = FALSE;

, прежде чем мы запустим наш вызывающий ошибки SQL.Однако традиционно PreparedStatement принимает один единственный фрагмент SQL:

PreparedStatement stmt = con.prepareSelect("sql statement2");

Возможно ли иметь один вызов PreparedStatement, который выглядит следующим образом:

PreparedStatement stmt = con.prepareSelect("sql statement1; sql statement2;");

Или это возможно простозапускать серию последовательных PreparedStatements один за другим?

Не лучшее время, чтобы получить это с надвигающимся Xmas и сниженной поддержкой и т. д. и т. д., и я действительно надеюсь, что кто-то может помочь.Спасибо.

Редактировать : @jonearles попросил код, так что вот, если он используется.Возможно, это очень специфично для нашего проекта, но кто-то может заметить явную проблему, вызывающую ошибки:

SELECT DISTINCT qm.validator_id,
  qm.QM_ID,
  u.EMAIL,
  qm.creation_dt,
  qm.emailed,
  qm.valid,
  qm.resolved,
  qm.new_obs_id,
  o.*,
  nests.*,
  s.*,
  l.*,
  latc.TENKM
FROM query_man qm,
  obs o,
  obs_aux_aon nests,
  sub s,
  location l,
  l_atlas_tetrad_coverage latc,
  users u
WHERE qm.OBS_ID         = o.OBS_ID
AND o.SUB_ID            = s.SUB_ID
AND u.user_id           = qm.user_id
AND o.obs_id            = nests.obs_id(+)
AND s.LOC_ID            = l.LOC_ID
AND latc.ATLAS_REGION   = 'NKNE'
AND (LENGTH (l.gridref) = 6
AND (SUBSTR(l.gridref,1,3)
  || SUBSTR(l.gridref,5,1)) = latc.TENKM
OR LENGTH (l.gridref)       = 4
AND l.gridref               = latc.TENKM)
AND qm.RESOLVED            IS NULL
ORDER BY latc.tenkm,
  l.tetrad

1 Ответ

1 голос
/ 10 декабря 2011

OK.Ответ на мой основной вопрос - НЕТ, вы не можете создать PreparedStatement следующим образом:

PreparedStatement stmt = con.prepareSelect("sql statement1; sql statement2;");

Выполнение отдельных операторов для временного изменения сеанса для одного бита SQL работало, но согласие кажется ужасным и также неприемлемымзамедленный ответ.Варианты, кажется, исправления или обновления, или посмотрите на подсказку no_use_hash (которая, я думаю, будет слишком медленной).Посмотрим на код.

...