2015年1月25日日曜日

ORA-01795: リストに指定できる式の最大数は1000です

先日、自社に帰社したら、別の現場の方から
「OracleではIN句が1000個までしか指定できないので、回避策は無いか」
といった相談を受けました。

たとえば、こんなSQLで考えてみました。
select bonus from salary
 where empno in (select empno from employee where prefecture = 'CHIBA');

このとき、千葉県の社員が1000人を超えるとORA-01795が発生します。


さて、どうやってSQLを書き変えましょうか。
IN句を書かずにこう書いてみます。

select bonus from salary,employee
 where employee.prefecture = 'CHIBA' and salary.empno = employee.empno;

EXIST句で書く方法もあります。

select bonus from salary
 where exists
 ( select empno from employee
   where prefecture = 'CHIBA'
   and salary.empno = employee.empno);

AccessでSQL実行してみましたが、問題無く動きました。
IN句とEXIST句の書き換えが難なくできるようになりたいものです。

2015年1月10日土曜日

ORA-01111 : name for data file XX is unknown

新年あけましておめでとうございます。今年も宜しくお願い致します。

さて、年初よりDataGuardと格闘をしております。
先日、訳あってスタンバイデータベースをリカバリしていたら、こんなエラーが出てしまい、ハマってしまいました。

ORA-01111: name for data file 47 is unknown ? rename to correct file
ORA-01110: data file 47: ‘/u01/app/oracle/product/11.2.0/db_1/dbs/UNNAMED00047′
ORA-01157: cannot identify/lock data file 47 ? see DBWR trace file

プライマリ側でデータファイルが追加になったのですが、スタンバイデータベースに表領域作成がされないため、
データベースが困っている状態のようです。

こんなときは、表領域を作成する必要があります。

alter database create datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/UNNAMED00047'
as '+DATA/sakedb/aquavit.dbf';

データファイルが作成できたら、あとはrecover standby databaseでスタンバイデータベースを復旧できます。