読者です 読者をやめる 読者になる 読者になる

Oracle関連メモ

主に9i向け。

SQL*Plusのバッチ実行向けコマンド

-- 行長さ指定。実フィールドサイズより少し大きくするのが理想。少なすぎると折り返してしまい、多すぎると無駄に空白が付く
set linesize 500
-- ページ内行数(ヘッダを表示する間隔)の指定。最初だけ出したいので、最大値に設定
set pagesize 50000
-- 各カラムを区切る文字の指定。Excelに貼り付けやすいよう、タブ文字にしている
set colsep " "
-- 出力先ファイルの指定
spool RunSQL.txt

select *
from ...
;

spool off
exit;

プランテーブル作成

実行計画用のオブジェクト・プランテーブルの作成手順。
1.SQL*PLUS を SYS ユーザーで実行します。
2.PLAN_TABLE を作成するスクリプトを実行します。
SQL> @c:\orant\rdbms80\admin\utlxplan.sql
SQL> @c:\oracle\ora90\rdbms\admin\utlxplan.sql
3.PLAN_TABLE が全てのユーザーで参照可能となるように権限を付与します。
SQL> grant all on plan_table to public;
4.PUBLIC シノニムを作成します。
SQL> create public synonym plan_table for sys.plan_table;

キャラクタセットの確認方法

http://www.jsys-products.com/support/faq/precise_i3_a2.html#PRE0058
インストール時に選択したキャラクタセットの確認方法。

データ削除時、インデックス再構成

レコードを削除してもインデックスは残っているので、検索時に無駄な走査を行うことになる。
alter index <インデックス名> rebuild
でインデックスの再構成を行う。Deleteで削除した場合で、Truncateでは不要。

接続先設定

サービス名に"."(ピリオド)を含むデータベースの場合、Net8 Configurationで設定しようとすると、サービス名の入力でエラーになって進めない。
そのため、手動で設定ファイルに書く。
C:\Oracle\Ora81\network\ADMIN\tnsnames.ora
C:\Oracle\Ora90\network\ADMIN\tnsnames.ora
以下のような感じの定義を追加する。
<定義名> =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = <ホスト名またはIPアドレス>)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = <サービス名>)
)
)

フィールド値をブランクにすると、NULLになる

フィールド値にブランクをセットした場合、値はどうなるのか?
http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001Feb/msg00247.html
update tableA set fieldB = ''
(fieldBはCHARまたはVARCHAR2)とすると、
select * from tableA where fieldB = ''
では引っかからず、
select * from tableA where fieldB is null
としなければならない。
DB2などでは、ブランクとNULLが区別されたはず。

Pentium 4 vs Oracle Universal Installer

Pentium 4マシンで、Oracle製品のインストーラが動作しない問題。OracleページにFAQあり。
(無理やり)インストール済みのインストーラを動かし直したい時は、起動オプションに -nojit をつける、など。

SQL*PlusへSYSDBA権限でログイン

こんな感じのバッチファイル・ショートカットを作って叩く。
C:\oracle\ora92\bin\sqlplusw.exe "sys/change_on_install@[SERVICE_NAME] as sysdba"

Oracle全文検索

Oracle Text」なる、Oracle9iの新機能?
7の頃からある?CONTEXT検索 :
create index CI_PLAN_MITU_DETAIL1
on PLAN_MITU_DETAIL(HINBAN_CD)
indextype IS CTXSYS.CONTEXT
parameters('lexer j_lexer');
のようにしてCONTEXT索引(インデックス)を作成してから、
select manage_no, hinban_cd, score(1)
from plan_mitu_detail
where contains(hinban_cd, '101', 1) > 0
のようにして検索する。
インデックスは
DR$<インデックス名>$[IKNR]
のテーブルに格納されるよう。
実際、Namazu (Kakasi)みたいに単語が分割されて格納されるよう。 あまりメジャーな機能でないのは、どこか重大な欠点でも?