スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Oracleの新機能「Partitioned Outer Join」


Oracle 10gから新機能「Partitioned Outer Join」が使えるようになっているという。

Oracle 10gの新機能「Partitioned Outer Join」(外部結合で行の補完)(1/3):CodeZine

うーむ、違いはなんとなく分かるけど、
どのような状況で使うことになるのかがいまいちイメージできんな。

今度の開発ではOracle 10gを使うことになりそうなので、
そのときが来るまで覚えておくことにしよう。

スポンサーサイト

SI Object Browserでのエクスポート時にORA-06550発生


SI Object Browserでデータエクスポートを行おうとしたところ、
ORA-06550が発生してエクスポートできなかった。

エクスポートダイアログの結果ログに、以下のようにエラーが出力された:

EXP-00056: Oracleエラー6550が発生しました。
ORA-06550: 行1、列41:
PLS-00302: コンポーネントSET_NO_OUTLINESを宣言してください。
ORA-06550: 行1、列15:
PL/SQL: Statement ignored
EXP-00000: エラーが発生したためエクスポートを終了します。


検索してみると、意外に間単に原因が分かった。

Oracle Technology Network (OTN) Japan - 掲示板 : EXP実行でSET_NO_OUTLINE ...

Oracleの上位バージョンから下位バージョンに接続して
データエクスポートをすることはできないとのこと。

もっと具体的に言うと、上位バージョンのexp.exeを使って
下位バージョンのOracleのデータをエクスポートしようとすると、
exp.exeが必要としてる宣言など(ディクショナリ?)が
下位バージョンのOracleに存在しないためにエラーになるのだそうだ。

確かにこのエラーが起きたときは、
Oracle 10gのClientからOracle 9iに接続していた。

exp.exeとかimp.exeは対象とするOracleのバージョンに
合ったファイルを使う必要があるようだ。


ORA-00600が発生して解決できた具体例1


あるシステム屋によるJava開発の記録 ORA-00600の対処法ついて
で書いたように、ORA-00600は一度発生してしまうと解決するには
サポートに問い合わせるか他の実現方法に変更するかなどの手段しかなく、
なかなか厄介なエラーだ。

今までぼくも何度となくこのエラーに出くわしたことがあるが、
実際に解決できた例もあるので、記録しておこうと思う。


Oracleのオプティマイザがあほになっている


データの登録・更新・削除が繰り返し行われているテーブルでは
その度にインデックスの再構築も行われている。
これが何らかの理由でうまく行われないと(これが問題なんだけど…)、
オプティマイザがSQLの実行計画を正しく作成できなくなって
ORA-00600が発生してしまうことがある。

この場合は、問題が発生していると思われるテーブルとかスキーマに対して、
ANALYZEコマンドを実行してインデックスなどの
統計情報を再取得させると解決する。
SQL Plusなどのツールでもいいし、
OEM(Oracle Enterprise Manager)の画面からも実行できる。

◆ 関連リンク
オプティマイザについて:
オプティマイザの判断ミスを疑ってみよう(1/3) - @IT
スキーマ統計情報の収集について:
スキーマ統計情報 - オラクル・Oracleをマスターするための基本と仕組み


データ一括削除:DROP&CREATEとTRUNCATEとDELETE


ある環境のデータを一度まっさらにして、
別環境のデータを投入するというのをたまにやっている。

これをやる方法として、以下の方法がある:
(1) テーブルのDROP&CREATEを行う
(2) テーブルに対してTRUNCATEを行う
(3) テーブルの全データをDELETEする

この中で、(1) DROP&CREATE が一番速度的には速いと思う。
さらに一度テーブルをDROPすることでテーブルが再構成されるので
表領域の断片化の解消にもなると思われる。
ただ、ストアドプロシージャなどが参照しているテーブルのDROP&CREATEを行うと
ORA-00600が発生するケースもあったため、
行うのであれば関係するストアドを一度削除してから行う方がいい。

(2) TRUNCATE が一番現実的だろうと思う。
TRUNCATEはDDLであり、UNDOも生成せずインデックスもリセットするだけなので、
DELETEに比べて速度も出るし、
テーブル本体やPK,インデックスの定義はそのまま残るので
上記のストアドの問題も起こらない。

(3) DELETE は、TRUNCATEと違ってDMLであるため、
ロールバックに対応するためにUNDOを生成し、
インデックスも整合性をとりながら1件ずつ削除していくため、
TRUNCATEより相当時間がかかってしまう。


TRUNCATEの構文は以下の通り:
TRUNCATE TABLE [TABLE_NAME];
COMMITはいらない = ロールバックできないのでご注意を。

◆ 参考リンク
TRUNCATE と DELETE の違い - オラクル・Oracleをマスターするための基本と仕組み


ORA-00600の対処法ついて


Oracleを使っていると、たまにORA-00600が発生することがある。
エラーは以下のような形式で出力される:
ORA-00600: 内部エラー・コード、引数: [string],[string],[string],[string],[string],[string],[string],[string]

ORA-00600は"Oracleにとって想定外のエラー"ということになっていて、
使っている側からすると、"Oracleのバグ"ではないかと思えるようなものもある。

ORA-00600が発生してしまうと、
(1) Oracleサポートに問い合わせるか、
(2) 何とか自分で解決するか、
(3) 別の実現方法に変更するか
しかないと思われる。

続きを読む


Oracle XE 以外の有償DBの無償版


現在、開発でOracle XEを使用している。
本番機でOracleの製品版を使用しているためで、
容量制限がある以外はほぼ製品版と同じであるため、重宝している。

他の有償DB(DB2とかSQL Serverとか)のことは正直よく知らなかったのだが、
これらにも無償版があるようだ。

無償データベースの王座をかけた戦い:ITpro
広告広場(www.mrbnet.co.jp)


また、元々無償のDBだったMySQLは無償と有償に分かれている。

「MySQLは有償のEnterpriseと無償のCommunity Serverに分かれる」---MySQL社長:ITpro


Oracle XE でORA-01652発生


Oracle XE に対してObject Browserでテーブルの項目追加をしようとしたら、
ORA-01652が発生した。
ORA-01652: 一時セグメントを拡張できません

原因は以下の通りだと思われる:

Object Browserでテーブル項目追加をしようとすると、
自動的に「テーブル名 + mmddhh24miss」の名前でバックアップテーブルを作成し、
項目を追加したテーブルは空になるという動きをする。

このとき裏で
CREATE TABLE SCHEMA_NAME.TABLE_NAME_mmddhh24miss
AS SELECT * FROM SCHEMA_NAME.TABLE_NAME
のようなSQLが実行されていて、ここで一時セグメントが必要になる。

で、Oracle XE では容量に4GBの上限があるはずで、
上記作業をした時点でこの上限いっぱいいっぱいのデータをインポートしてしまっていたため、
一時セグメントを拡張できずにエラーになったのだと推測される。

設定を確認してみたが、
表領域は全て"AUTOEXTEND ON MAXSIZE UNLIMITED"となっていたので、
Oracle XE の容量制限に引っかかったんだと思われる。


ちなみに、ORA-01652はDISTINCTとかGROUP BYなどを
使用したSELECT文でも起こりうるようで、
これをEXISTSを使うように変更するとこのエラーは起きなくなるとのこと。


UNION句でORA-01789発生


OracleでSQLのUNION句を使用していて、
UNION句前後のSQLの項目数が一致しないと以下のエラーが出力される:

ORA-01789: query block has incorrect number of result columns
     問合せブロックにある結果の列数が正しくありません

項目数を一致させればOK。

項目数は合っていてもデータ型が一致していないと以下のエラーとなる:

ORA-01790: expression must have same datatype as corresponding expression
     式には対応する式と同じデータ型を持つ必要があります


■ 関連リンク
UNION と UNION ALL 集合演算子 (SHIFT the Oracle)


SQLの予約語を使用してORA-00928発生


テーブルの別名に"MINUS"を使ったSQLを実行したところ、ORA-00928が発生した:

ORA-00928: missing SELECT keyword
        SELECTキーワードがありません。

"MINUS"は、二つのテーブルの差を取得する予約語だというのに、
うっかり使ってしまっていた。

----------

そういえば、実際のSQLで、"MINUS"とか"INTERSECT"とかって使ったことないなぁ。
# UNION, UNION ALLはあるけど。

この辺も意識するともうちょっと効率のよいSQLが書ける気がしないでもない。


OracleのIMPコマンドでIMP-00032, IMP-00008が発生した


DMPファイルを使ってデータインポートをしようとしたところ、
相当時間をかけた挙句IMP-00032, IMP-00008が発生してインポートできなかった。
※ 他にもいくつかエラーあり

IMP-00000~IMP-00401
IMP-00032 (SHIFT the Oracle)

SHIFT the Oracleのページにもあるように、
インポートのバッファサイズが小さすぎたようだったので、
これをデフォルトの 4096(バイト?) から1.5倍の 6144 に変更することで
正常にインポートできるようになった。
# 作業はObject Browserを使って行った。

デフォルトの設定のままでもできることもあったのだが、
データ量が増えてデフォルトのバッファサイズでは処理できなくなってしまったのだろうと思う。


おそらくこれと全く同じ問題・解決方法:

インポートエラー(IMP-00032)の回避方法を教えて下さい


Adsense
ブログ内検索
カテゴリー
最近の記事
カレンダー
09 | 2017/10 | 11
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 - - - -
月別アーカイブ
feedmeter & あわせて読みたい
フィードメーター - あるシステム屋によるJava開発の記録
あわせて読みたいブログパーツ
プロフィール

kamii

Author:kamii
ピタゴラスイッチ好きなシステム開発屋@二児の父です。

メールフォーム

名前:
メール:
件名:
本文:

カウンター
checker
ページランク


ブログチャート
現在時刻
全エントリ表示

全てのエントリを表示する

RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。