4

Java Webアプリケーション内でSQLを呼び出すと、Oracle10gのバグに関する大きな問題が断続的に発生します。11gにすぐにパッチを適用したり、アップグレードしたりすることはできません。これは、最初の「ばかげた」オラクルサポートの応答のようです。回避策はありますが、Javaコード内のPreparedStatements内でこれを行うのに問題があります。

実際のエラーは次のとおりです。

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

バグは次のとおりです。Oracleバグ12419392

回避策が実行されています

alter session set "_hash_join_enabled" = FALSE;

バグを誘発するSQLを実行する前に。ただし、従来、PreparedStatementは1つのSQLを取り込んでいます。

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

次のようなPreparedStatement呼び出しを1つ持つことは可能ですか?

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

または、一連の連続したPreparedStatementsを次々に実行するだけでこれが可能ですか?

クリスマスが迫ったり、サポートが減ったりするなど、これを手に入れるのに最適な時期ではないので、誰かが助けてくれることを本当に望んでいます。ありがとう。

編集:@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
4

1 に答える 1

1

わかった。私の主な質問に対する答えはNOです。次のようにPreparedStatementを作成することはできません。

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

個々のステートメントを実行して、SQLの1ビットに対して一時的にセッションを変更することは機能しましたが、合意はひどいようであり、応答が許容できないほど遅くなりました。オプションはパッチまたはアップグレードのようです。または、no_use_hashヒントを調べてください(これも遅いと思います)。コードを見ていきます。

于 2011-12-10T09:32:04.217 に答える