最近のトラックバック

最近のコメント

2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« 32bit Windowsに4GB以上のRAMを搭載することは | トップページ | DB_NAMEとInstance_Nameの違い »

2008年5月12日 (月)

ORA-920、ORA-2063

データベースリンクを経由してリモートテーブルにアクセスするSQLを実行すると発生するエラーの一つ。

BugNo. 4257473 障害内容:ORA-920 can occur for SQL over a database link
 →10.1.0.5のPSRで解消

データベースリンク経由のテーブルへアクセスするSQLを実行した際、Oracleのほうで適当にSQLを変更してLNNVL()という関数を使用して実行するようにしてしまうケースがある(多分、WHERE句にOR条件とかいろいろ組み合わせるとそうなるのかも)。そして、そのLNNVL()関数でバインド変数が利用されるように変更されてると、このエラーが起こるそうな。
→tkprofでみると、自分が実行したSQLがどのように変換されたかがわかる

パッチ以外の回避方法は
・リモートのテーブルをローカルに持ってくる
・driving_site ヒント(/*+ driving_site(<リモート表>) */ )を利用する
  このヒントを使うと、ローカル表の検索結果をリモートに渡し、表結合をリモートで実行させその結果を受け取るようにできるらしい

select /*+ driving_site(b) */ a.deptno  from (select deptno from emp@dblink where empno<9000) b, dept a
where b.deptno = a.deptno and a.deptno < 30 ;

↓上記SQLがこんなふうになるそうな

select /*+ driving_site(b) */ a.deptno from emp@dblink b, dept a
where b.deptno = a.deptno and a.deptno < 30 and b.empno < 9000;

だけど、バインド変数が使われてると無効らしい。

« 32bit Windowsに4GB以上のRAMを搭載することは | トップページ | DB_NAMEとInstance_Nameの違い »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/181317/41184846

この記事へのトラックバック一覧です: ORA-920、ORA-2063:

« 32bit Windowsに4GB以上のRAMを搭載することは | トップページ | DB_NAMEとInstance_Nameの違い »