LastUpdate: 2019/08/03 23:26:05

戻る

SHIFT the Oracle - Oracle DBA, Oracle SQL and PL/SQL Tips
http://www.shift-the-oracle.com/


001 タイプリブ
002 SQL*PLUSの起動を便利にする方法
003 SQLの文法ヘルプ
004 オラクルデータベース自体の作成の仕方
005 ORA-01536
006 OracleServerManagerによる、オラクルの起動/停止
007 NET8の設定の実際
008 表定義〜ユーザー設定までの流れ
009 VisualBasicからoo4oのバインド変数を用いて、SQLを使用する例
010 SQLPlusはCOMMITが必要ですよ
011 SQLPlusで、バインド変数を作成する方法
012 SQLPlus前のコマンドを繰り返す方法
013 オラクルがデッドロックを検出した時のアプリの要件は?
014 AccessからODBCリンクでORA-01722
015 ダイナセットからのデータ取得の高速化について
016 oo4oのバージョンはどうすればわかる?
017 oo4oの日本語ヘルプ
018 oo4o NocacheでNextReadすると、EOFが正しく返さない!
019 FetchLimitはレジストリからしか変更できないの?
020 読み取り一貫性とは?
021 Microsoft系との接続モデル
022 Insert文どうしの排他
023 9.1.x系で、GUIからテーブルを作ったりするユーティリティーはどこから起動する?
024 自分のスキーマが無いぞ〜
025 Pro*Cってどうやるの?
026 SQLPlusで外部ファイルから実行する方法
027 オラクルのテストデータをAccess以外で作成したい
028 oo4oから読み取り専用トランザクションを使用する場合の注意
029 WindowsクライアントからSolaris Oracleに接続するとき
030 oo4o 配列バインドを使ったdeleteは注意
031 SQLトレース
032 クライアントのログファイルの出力先について
033 エクスポート インポート
034 ORA-12535 エラー
035 AutoCommit で はめられた
036 LAN障害であっても、オラクルサーバー側ではセッションは残る?
20050105 〜 の文字化けの話
20050107 リスナーの起動に失敗してしまう
20050107-2 キャラクタセットの選択指針
20050109 初期化ファイルはどこにある?
20050415 テーブル名の文字数制限は?
20050802 ORA-12545
20050803 データベースリンク
20060803 文字の長さの宣言 バイト長?文字数?
20070223 スナップショットとシノニム
20070302 Select forupdate のオプション
20080423 ライセンスフリーのオラクル
20080423 ORACLE 11G
20080516 VARCHAR2 と NULL と 長さゼロの文字列
20080612 接続文字列
20080612 SQL*Loader
20080616 TNSPING
20080616 スマートクライアントがうまくつながらない
20080619 Sql*Plus で ログを出力
20080619 SQL*Plus で CSV出力
20081215 ORA-28001 パスワードが期限切れです
20090615_Ubuntuに_Oracleサーバーをインストールしてみる
20090617_インスタントクライアントのインストール
20091025_接続数の話_
20100112_SQL*Plus_いろいろ
20100820_Data_Pump_Export
20101031_統計情報_
20110529_オラクルサーバーにつながらない
20110629_SYSDATE_の値をテスト的に変更したい
20190803 ORA-12514 リスナー経由で接続できない
20190803 expdp impdp
20190803 表領域の作成

001    タイプリブ

Oip20.Tlbである。しかし、マニュアルには、早期バインディングはあまり好ましくない事が書いてある。

 

Oracle8.1.6現在のoo4oのタイプリプは以下のものである。

別の資料によると、タイプライブラリを参照設定して、早期バインディングを行った方が早い。が、タイプリブのバージョンアップが発生すると、タイプライブラリの参照設定のしなおし、及びリコンパイルが発生してしまう。よってこれが唯一で最大の問題点とあった。

016 oo4oのバージョンはどうすればわかる?

なるほど。2002/07/31

 

oo4o 3.7のマニュアルに、以下の記述を見つけた。

OO4O バージョン2.3.x(2.3.4 以下)ではタイプ・ライブラリとの互換性がありませんでした。この問題は、現在のリリースでは修正されています。OO4O バージョン2.3.x(2.3.4 以下)とのアーリー・バインディングを使用するアプリケーションは、コンパイルし直す必要があります。

ということは、現在のバージョンでは、早期バインディングを行っても、将来的にリコンパイルする必要が無いと言うことかな〜?

2002/08/07


002    SQL*PLUSの起動を便利にする方法

ショートカットを以下の様に変更する。

例)C:\ORANT\BIN\PLUS33W.EXE "APSYS/SYSTEM @1KOKI"
    APSYSはユーザー名
    SYSTEMはパスワード
    1KOKIは接続文字列
である。


003    SQLの文法のヘルプ ファイル

オラクル7.x の時についていた、ヘルプファイルです。

SQLHELP.HLP (938KB)


004    オラクルデータベース自体の作成の仕方

R8.1.6

Datebase Configuration Assistant からおこなうとGUIベースでできるので楽です。
ひとつのサーバーに、複数のSIDを構築するときなどは、ここから行います。

2001/04/11


実際に作ってみよう

9,2i

今回の例は、キャラクタセットがEUCタイプのものに調整してみます


汎用に最適化された事前構成済データベースを選択します


すでに、ORAという名前で構築済なので、EUCという事がわかるように命名した
SIDは英数字のみで、記号はムリだそうです


テスト用で自分しか使用しないので、専用サーバーにする。


〜対応のEUCに設定します
他はディフォルトのまま


そのまま


終了は作成オプションの設定を終了することであり、これから実際のデータベースの作成に入ります

設定内容の表示が行われます

作成中となります。 15:25スタート

あれ?

権限が不足しているそうな?

ネットを検索してみるとどうも REMOTE_LOGIN_PASSWORDFILE というキーワードが出てくる。

上記ダイアログからOKをクリックして、少し戻って、初期化ファイルを見てみると、

EXCLUSIVEになっている。現在自分は、オラクルにログインしていいるつもりはないんだけど…

http://tsubosak.hp.infoseek.co.jp/2-10/9-column.html

どうも、REMOTE_LOGIN_PASSWORDFILE = exclusive の時は、パスワードファイルの設定が必要なようです。
これは、今後の課題として、NONEにすれば、無視されるようなので

と設定しなおして、再び挑戦!


まだでる 01031


チェックをはずしてみたら…ダメ

DBを作成するユーティリティコンソールの事を DBCA というらしい。
ネット/オラクルテックネットを眺めたが、良い事例がなく、断念。

同様のケースを、別のPCで行ったところ、全く問題なくインスタンスの追加生成ができた事から
オラクルそのもののインストールをしなおしたら、インスタンスの再生成ができた!


005    ORA-01536

「SQL実行エラー, ORA-01536: 表領域 INTRA1に対して割り当てられた領域を使い果たしました」
は、通常増分値がMAXまで行われた時のメッセージだが、ユーザーの表領域に対する割り当て権限にも関係している場合がある。

初歩的なミスとして、

CREATE USER "INTRA1" 
PROFILE "DEFAULT" 
IDENTIFIED BY "password
DEFAULT TABLESPACE "INTRA1" 
TEMPORARY TABLESPACE "TEMP" 
QUOTA UNLIMITED ON INTRA1            ←これをつけないと、エラーになる
                              (この例では無制限割り当てにした)
ACCOUNT UNLOCK;
GRANT "CONNECT" TO "INTRA1";


006    Oracle Server Managerによる、オラクルの起動/停止 ver8.1.6

コマンドプロントよりサーバーマネージャーを起動する

svrmgrl

サーバーマネージャーが起動させる。

Oracle Server Manager Release 3.1.6.0.0 - Production

Copyright (c) 1997, 1999, Oracle Corporation. All Rights Reserved.

Oracle8i Release 8.1.6.0.0 - Production
JServer Release 8.1.6.0.0 - Production

SVRMGR>


停止の仕方

停止や開始を行うには、SYSDBAモードで接続する必要があるので注意。

SVRMGR> connect system/manager as sysdba
接続されました。
SVRMGR> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
Oracleインスタンスが停止しました。
SVRMGR>

 

開始の仕方

SVRMGR> startup
Oracleインスタンスが起動しました。
システム・グローバル領域合計 228508940バイト
Fixed Size 70924バイト
Variable Size 78782464バイト
Database Buffers 149577728バイト
Redo Buffers 77824バイト
データベースがマウントされました。
データベースがオープンされました。
SVRMGR>

サーバーマネージャーの終了の仕方 

SVRMGR> quit
Sever Managerを終了しました。
c:\>

007    NET8の設定の実際

NET8は、OracleServerとクライアントをネィティブに接続するための機能である。
この設定はServer側とクライアント側の両側で必要になる。

そもそもなぜ、設定が必要かというと、クライアント側からOracleに接続するときに、
どのマシンで稼働してるのか?、そのマシンの中のどのOracleインスタンスか?を認識する必要があるからである。

通常Oracleインスタンスを設定したとき、<オラクルホーム>\NET80\ADMIN\Tnsnames.oraに必要な情報が書かれているので、
必要な所だけを、クライアントの<オラクルホーム>\NET80\ADMIN\Tnsnames.oraにも設定してやれば良い訳である。

例)

# 8.0.5用----------
ORACLE.WORLD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = pc1)(PORT = 1521))
    (CONNECT_DATA = (SID = ORCL))
  )

# 8.1.6用----------
PC1.WORLD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = pc1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PC1.WORLD)
    )
  )

この例は、自宅マシンのクライアントの設定の例である。
クライアント側は、8.1.6用で構築してあるが、8.0.5にも接続可能な設定の例である。

ちなみに、8.1.6のTnsnames.oraの在処は、C:\Oracle\Ora81\network\ADMIN\である。

2001/06/12


008    表定義〜ユーザー設定までの流れ

まず、表領域を作成する。

CREATE TABLESPACE "INTRA1" 
LOGGING DATAFILE 'C:\ORACLE\ORADATA\INTRA1\INTRA1.ora' 
SIZE 100M EXTENT MANAGEMENT LOCAL;

次にユーザーを登録する。

CREATE USER "INTRA1" 
PROFILE "DEFAULT" 
IDENTIFIED BY "INTRA1_PASS" 
DEFAULT TABLESPACE "INTRA1" 
TEMPORARY TABLESPACE "TEMP" 
QUOTA UNLIMITED ON INTRA1 
ACCOUNT UNLOCK;
GRANT "CONNECT" TO "INTRA1";


表領域INTRA1 に対しては、無制限に使用できるようにした。
(QUOTA UNLIMITED ON INTRA1) 

最後に、テスト用のテーブルの作成してみる。

CREATE TABLE TEST_TBL(
KEY1 NUMBER,
DATA1 VARCHAR2(100),
CONSTRAINT PK_KEY1 PRIMARY KEY(KEY1) 

TABLESPACE INTRA1 ;

2001/06/13


11.2.0.1

コマンドプロンプトにて


sqlplus /nolog

conn / as sysdba

CREATE USER testuser
IDENTIFIED BY testpasswrod
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

GRANT DBA TO testuser ;

GRANT UNLIMITED TABLESPACE TO testuser ;

パスワードの有効期限の確認方法


select *  
from dba_profiles 
where resource_name = 'PASSWORD_LIFE_TIME';

defaultプロファイルのパスワードの有効期限を無制限に変更する


alter profile default limit password_life_time unlimited;


009    VisualBasicからoo4oのバインド変数を用いて、SQLを使用する例

    Dim strBnd          As String
    Dim strBnd_date     As String
    Dim strSQL          As String

    '**** 文字列型の場合	
    strBnd = "YM"
    With gOraDatabase
        .Parameters.Remove strBnd
        .Parameters.Add strBnd, ORAPARM_INPUT
        .Parameters(strBnd).ServerType = ORATYPE_CHAR
        .Parameters(strBnd).Value = strIraiYM
    End With

    'SQLの投入
    strSQL = "SELECT COUNT(cf_iraituki) FROM hikiotosi_kekka_t" & _
             " WHERE nengetu = :" & strBnd


    '**** 日付型の場合	
    strBnd_date= "date"
    With gOraDatabase
        .Parameters.Remove strBnd_date
        .Parameters.Add strBnd, ORAPARM_INPUT
        .Parameters(strBnd_date).ServerType = ORATYPE_DATE
        .Parameters(strBnd_date).Value = NOW   '←日付型で入れるのがポイント
    End With
    
    'SQLの投入
    strSQL = "SELECT COUNT(cf_iraituki) FROM hikiotosi_kekka_t" & _
             " WHERE kousinbi = :" & strBnd_date
		
    Set objDyna = gOraDatabase.CreateDynaset(strSQL, ORADYN_READONLY)

    'バインド変数の解放
    gOraDatabase.Parameters.Remove strBnd
    gOraDatabase.Parameters.Remove strBnd_date

 

2001/07/03


010    SQL Plus はCOMMITが必要ですよ

SQL Plusは、データの追加・更新・削除を行ったとき、COMMITを発行しないと、確定されていないので、注意。

ただし、SQL Plusを終了した時は、暗黙のCOMMITが発行されているようである。

2001/07/04

exit は exit commit の省略形である。

rollbackして終了したいときは、 exit rollback

Oracle 11g R2から、 EXITCOMMTシステム変数が追加され、 exitするときの、トランザクションの扱いを変更できるらしい。初期値はcommitである。


011    SQL Plus で、バインド変数を作成する方法

SQL> VARIABLE WK_A VARCHAR2(20); 

2001/08/05


012    SQL Plus 前のコマンドを繰り返す方法

R [return]で直前のコマンドを再投入してくれる

SQL> R
1* select * from msiten

TORIH SITEN SITENNAME REVISION TIMESTAM
----- ----- ---------------------------------------- ---------- --------
T0001 00001 大阪支店5 5 01-11-15
T0001 00002 京都支店 1 01-10-24
T0001 00003 滋賀支店 1 01-10-24
T0002 00001 北大阪支店 1 01-10-24
T0002 00002 南大阪支店 1 01-10-24
T0002 00003 奈良支店 1 01-10-24
T0002 00004 名古屋支店 1 01-10-24
T0002 00005 広島支店 1 01-10-24

8行が選択されました。

2001/11/15


013   オラクルがデッドロックを検出した時のアプリの要件は

実行時エラーがアプリ側に渡ってくるとき、ロールバックされているわけではない。再びロックを試みるか、ロールバックするかはアプリ側に決定権がある。

伊藤氏談。

2002/02/13


014   AccessからODBCリンクでORA-01722

原因はよくわからんです。なんで?日付項目を更新しようとした時に良く出ます。

Windows2000Professional + Acsess2000 で出た。

不完全回避方法1
日付項目以外の項目も一緒に変更する。→不思議とうまくいく。

上記より確実と思われる方法
ODBCドライバをオラクル製からMicrosoft製に変えたら回避された。

2002/02/14


015   ダイナセットからのデータ取得の高速化について

画面にデータを貼り付けるためには、VBの変数にダイナセットの列名を代入することになりますが
そのときに、列名を直接記述するのではなくて、SET文で変数を作りそれに列名を割り当て
VBの変数に代入させるほうがよいです。

Do Until objDs.Eof
	lstRows.Additem objDs("FAQID")
	objDs.DbMoveNext
Loop

	上記の書き方はそのままダイナセットの列名を使用しています。
	資料によると 速度は61.3件/秒です。

Do Until objDs.Eof
	lstRows.Additem objDs("FAQID").Value
	objDs.DbMoveNext
Loop
	
	次はただVALUEを使用したのみです。これだけで
	83.8件/秒です

Set objFld = objDs("FAQID")
Do Until objDs.Eof
	lstRows.Additem objFld
	objDs.DbMoveNext
Loop
	
	次は変数参照にしたものです。761件/秒です。

VBではピリオドの数を減らす方針でコーディングすると
速度があがります。特にループの中で参照している
オブジェクトに適用するのみでも改善されます。

上記についてはOO4Oのヘルプに書いてあるので見てください。
技術動向の中です。

2002/07/19


016   oo4oのバージョンはどうすればわかる?

Universal Installerを起動して下記の記述を見てみてください。これは、8.1.6の例です。

3.xでは、バージョン番号の上位3桁が対応RDBMSのバージョン、
下2桁がOO4Oのバージョンを示すそうなのです。
 例えば、次のバージョンは、対応Net8が違うだけで機能的には同一です。
– 8.0.5.3.4 (8.0.5対応版)
– 8.1.5.3.4 (8.1.5対応版)

これをふまえると、上記の例では、8.1.6用のversion3.6という位置づけになります。

2002/08/07


017 oo4oの日本語ヘルプ

ここにあった(Oracle Objects for OLE(OO4O)R8.1.6.3.7)

http://otn.oracle.co.jp/software/tech/windows/ole/816/oo4o81638_dl.html

CDROMにもあるらしい!→ ¥oo4o_Help

オラクルの標準インストールでは、英語版のヘルプがローカルハードディスクにインストールされるので、入れ替えると良いでしょう。

標準インストールした時の存在ディレクトリ C:\Oracle\Ora81\Mshelp\

2002/08/07


018 oo4o NocacheでNextReadすると、EOFが正しく返さない!

以下のようなLOOPを行った時に、EOF=Trueになるのが、1回遅れる事があった。


    Set OraDynaset = OraDatabase.CreateDynaset("SELECT * FROM TEST_TBL1", ORADYN_NOCACHE )
    Do Until (OraDynaset.EOF)
        OraDynaset.MoveNext
    Loop

oo4oのバージョンを8.1.6.3.6から8.1.6.3.13に変更したら、正しく動いた。

参考

本現象は既知の不具合に該当しております。
この不具合は、フェッチする件数が、FETCHLIMITプロパティに設定されている値と同数、またはその倍数である場合FETCHの最終行を2度返却してしまうという不具合です。
Oracle Objects for OLE(以下OO4O) 8.1.6.3.7 以降にて修正が行われています。

FETCHLIMITプロパティは、レジストリに設定されていますのでご確認下さい。
設定個所は以下です。
   HKEY_LOCAL_MACHINE\SOFTOWARE\ORACLE\OO4O 

2002/08/08


019 FetchLimitはレジストリからしか変更できないの?

oo4oのパフォーマンスチューニングを見ると、FetchLimitを増やせば良いと書いてあるが、OraDatabaseオブジェクトのFetchLimitプロパティを増やしても、結果が全く変わらなかった。
一方レジストリの内容を変更したら、少々早くなった。

どうも、プログラムからFetchLimitを操作するには、
OraDatabase.CreateCustomDynaset
をしようすると良いみたいだ。

2002/08/08


020 読み取り一貫性とは?

非常に時間のかかるSELECT〜FETCHを行っている間に、他のユーザーから更新・コミットがされても、SELECTした時点のデータが保証される事。

http://www.insight-tec.com/jp/html/ora3/back/back51.html

2002/08/09

あるトランザクションAのおこなった行の更新後からそのロールバックまでの間に、別のトランザクションBが同一行を読み出して取り消されたはずのデータを読み込んでしまう場合.
あるトランザクションBが行を読み出したあとからロールバックやコミットをしない間に、別のトランザクションAが同一行を更新または削除後コミットし、再びトランザクションBが同じ行を読み出したときに前回とは違う結果になってしまう場合.
あるトランザクションBが特定の条件を満たす(複数)行を読み出したのちロールバックやコミットをしない間に、別のトランザクションAがその条件を満たす行を挿入コミットし、再びトランザクションBが同一条件で行の読み出しをしたときに前回と違う結果になってしまう場合.

前提条件
SET TRANSACTION文は、基本的にトランザクションの先頭に記述しなければなりませんが、例外もあります。

構文


キーワードとパラメータ

READ ONLY 現行トランザクションを読み取り専用トランザクションとします。
READ WRITE 現行トランザクションを読み書き両用トランザクションとします。
USE ROLLBACK SEGMENT 現行トランザクションを、指定したロールバック・セグメントに割り当てます。このオプションの場合でも、現行トランザクションを読み書き両用トランザクションとします。

単一のSET TRANSACTION文または同じトランザクション内の異なる文に、READ ONLYオプションとUSE ROLLBACK SEGMENT句を両方指定することはできません。読み取り専用トランザクションはロールバック情報を生成しないため、ロールバック・セグメントは割り当てられません。

使用上の注意
SET TRANSACTION文によって実行されるオペレーションは、現行トランザクションにのみ影響します。他のユーザーや他のトランザクションに影響はありません。COMMITまたはROLLBACK文を発行すると、ユーザーのトランザクションは終了します。また現行トランザクションは、データ定義言語文が実行される前後に暗黙にコミットされることにも注意してください。

読み取り専用トランザクションの設定
トランザクションのデフォルトでは、文レベルの読み取り一貫性が維持されています。READ WRITEオプション付きのSET_ TRANSACTION文を実行することによって、この状態を明示的に指定することができます。
READ ONLYオプション付きのSET TRANSACTION文を実行することによって、トランザクション・レベルの読み取り一貫性の設定が可能です。トランザクションにREAD ONLYを設定した後、そのトランザクション内の以降の問合せすべては、トランザクションが開始される前にコミットされた変更しか参照しなくなります。他のユーザーが同じ表を更新している時に、1つ以上の表に対して複数の問合せを実行するレポートの場合、この読み取り専用トランザクションは非常に便利です。

読み取り専用トランザクションには、次の文のみを使用できます。

・ SELECT(FOR UPDATE句を指定した文を除く)
・ LOCK TABLE
・ SET ROLE
・ ALTER SESSION
・ ALTER SYSTEM

FOR_ UPDATE句を指定したINSERT、UPDATE、DELETE、SELECT文を使用することはできません。またデータ定義言語文によって、読み取り専用トランザクションは終了します。
読み取り専用トランザクションによる読み取り一貫性は、文レベルの読み取り一貫性と同じです。デフォルトにより、各文を発行した時点のデータの一貫性ビューが使用されます。読み取り専用トランザクションでは、SET TRANSACTION READ ONLY文を発行した時点のデータの一貫性ビューが使用されます。読み取り一貫性を実現する読み取り専用トランザクションは、ローカル問合せと同様に分散問合せによってアクセスされたすべてのノード向けとなっています。
トランザクション・レベルの読み取り一貫性と、同一トランザクションの文レベルの読み取り一貫性との間の切り替えは不可能です。SET TRANSACTION文は、トランザクションの最初の文としてのみ実行することができます。

例1 以下は、ある企業が所有する船舶とコンテナの数を月末の夜中にカウントする例です。このレポート作成のプロセスは、船舶やコンテナを追加または削除している他のユーザーのプロセスには影響しません。

COMMIT
SET TRANSACTION READ ONLY
SELECT COUNT(*) FROM ship
SELECT COUNT(*) FROM container
COMMIT


最後のCOMMIT文は、データベースに対する永久的な変更を行うためのものではなく、読み取り専用トランザクションを終了するためのものであることに注意してください。


更新を伴うトランザクション単位の読み取り一貫性

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;

で、実現できるよ。

ただし、自分のセッションより、後に開始されたトランザクションが更新してしまった場合は、シリアライズできない…旨のエラーが発生するのでそれをハンドリングする実装が必要となるので注意。(ORA-08177)

つまり、昔の一時点のスナップショットを前提にして更新を行うわけなので、他から更新されていると、昔のスナップショットは意味が無いものになってしまうという事。

テーブルをロックしているわけではないからね!他から更新できるのさ。

2004/09/03


021 Microsoft系との接続モデル

2002/09/02


022 Insert文どうしの排他

同一キーを複数端末からINSERTした時、衝突がおきる。先行INSERTしたトランザクションがCOMMITされるかROLLBACKされるか不明なので、後からINSERTは、待たされた(SQLPlusの場合)

SessionA SessionB 備考
BEGIN TRANSACTION    
INSERT 100    
INSERT 200 BEGIN TRANSACTION  
  INSERT 200 SessionBが待たされた
COMMIT   200が確定
  重複エラー エラーになる。
     

 

SessionA SessionB 備考
BEGIN TRANSACTION    
INSERT 100 BEGIN TRANSACTION  
  INSERT 200  
INSERT 200   SessionAが待たされた
  INSERT 100 SessionBが待たされた
INSERT 200
デッドロック検知
  INSERT 200は無視された
COMMIT   100だけ確定
  INSERT 100が
重複エラー
エラーになる。
  COMMIT 200だけ確定

2002/09/18


023 9.1.x系で、GUIからテーブルを作ったりするユーティリティーはどこから起動する?

以前は DBA Studio という名前でしたが、
Enterprise Manager Console という名前に変わっているようです。

2002/12/16


024 自分のスキーマが無いぞ〜

ひとつも自分管理のオブジェクトを作っていないときは表示されないようです。他のスキーマー配下からでも表などを作ってしまいましょう。

SCOTTの配下のフォルダから右クリックで「表の作成」を選択

スキーマーに自分のスキーマ名を入れると、ほらこの通り。

2002/12/16


025 Pro*Cってどうやるの?

Pro*C奮戦記

2002/12/16


026 SQLPlusで外部ファイルから実行する方法

クリエイトテーブル文など長いsql文をカット&ペーストで貼り付けると、バッファ不足により途中までしかできな事が多い。一番簡単な回避策は、外部のテキストファイルにしたものをSQLPlusから読み込ませて実行するとよい。

C:\UUU\TABLE.SQL-------

CREATE TABLE TEST_TABLE(
....
);
/   ←実行の意味

----------------

SQLPlusにて

SQL>@C:\UUU\TABLE.SQL [enter]

2003/01/27


027 オラクルのテストデータをAccess以外で作成したい

テストデータなどを作成するとき、ExcelとAccessを使用して作るととってもラクなんだけど、空白値がうまく入らないとか、いろいろ諸問題がある。Access以外の方法を模索してみる

1オラクルのデータマネージャを使用する方法

オラクル純正だから安定してるんだけど、行の複写とかできないのが痛いねー

2VBのIDEのデータビューを使用する方法

アイコンを選択

データリンクを選択状態にして、赤枠のアイコンをクリック

Oracle Provider for OLE DB を選択して[次へ]を選択

オラクルへの接続情報を入力します。
データソースとはいつも入れているリスナー名ですね。
「パスワードを保存する」にチェックをつけると、いちいち聞いてこなくなります。

接続テストで「成功がでればOK」

あとは、テーブルのアイコンをクリックすれば、...

アクセスそっくりの見慣れた画面が立ち上がります。

2002/02/17


028 oo4oから読み取り専用トランザクションを使用する場合の注意

判ったぞ!→035

単純に実装するとReadTransactionが利かない


   'うまくいかない例
    Oo4o.ExecuteSQL "SET TRANSACTION READ ONLY"
    Oo4o.CommitTrans

ExcuteSQLは、明示的なトランザクション中でない時は、暗黙のトランザクションが発生しているようだ。さらに、OO4O上でBeginTranが呼び出されていないのでエラーになる。これを回避する為に次のようにすると良い。


   'うまく行く例

    Oo4o.BeginTrans
    Oo4o.ExecuteSQL "SET TRANSACTION READ ONLY"

    .....処理......

    Oo4o.ExecuteSQL "COMMIT"
    Oo4o.CommitTrans

2003/02/20


029 WindowsクライアントからSolaris Oracleに接続するとき

コード変換そのものは、自動でやってくれるが、どのコードからどのコードへ変換するのかについては、設定が必要らしい。
設定の概念は、クライアント自身の環境は何であるかを明示的に示す事である。

具体的には環境変数を以て行う。

NLS_LANG = Japanese_Japan.JA16SJIS  と設定すれば良い。

インターネットでは、レジストリも変更も必要らしいと書いてあったが、サーバーの事か。詳細はまだ調べていない。

http://www.datadirect.co.jp/support/samplekb.html

2003/02/21

参照→NLS_CHARACTERSET 設定内容の確認方法



030 oo4o 配列バインドを使ったdeleteは注意

バグなのかどうかまではわからなかった

削除対象のレコードが複数あり、削除するキーをあらかじめ配列バインドにて運用しようとした。
すると、削除対象のキーが無いと、配列処理に失敗したと、エラーを言うてくる。

まずは現象の報告のみ。

2003/03/06


031 SQLトレース

SQLのチューニングや解析の常套手段として、トレースログをとっておいて、それを元にどうするかという基礎資料を入手することができる。

手順1 処理時間情報も出力されるようにする

SQL> ALTER SESSION SET TIMED_STATISTICS=TRUE;

 

手順2

ログファイルは、通常未出力の状態になっている。これを出力状態にするには少なくとも2種類方法がある。

方法1
初期化ファイルにSQLトレースを出力するように設定する方法

sql_trace = true
を初期化ファイルに追加して、オラクルを再起動すれば良いらしい。
しかしこの方法は、該当のオラクルインスタンスに接続する全てのセッションが、トレースログの出力対象になってしまうので、パフォーマンスに悪影響を及ぼすので注意するよう、マニュアルに書いてある。

方法2
セッション単位に設定する方法

セッションをコネクトしたのち、次のようなSQLを発行すれば良い
SQL> alter session set sql_trace = true;
セッションが終了するまで、有効である。

トレースログファイルの出力先

初期化ファイルに以下の様な記述を追加して、再起動すれば良いらしい
user_dump_dest=/output directory Name
しかし、うまくいかなかった。

初期値では以下の所に出力されているようだ。
oracle_home/rdbms/log/
例)
/opt/app/oracle/product/9.0.1/rdbms/log

 

実際の出力先の確認方法

SQL> SHOW PARAMETERS USER_DUMP_DEST

 

ここには、セッション単位のxxxxx.trcファイルがたくさん存在している。このままだとわかりにくいので人間が読みやすい様にフォーマットしてくれるユーティリティーがオラクルに存在している。

使用方法がいまいち不明だが、
tkprof xxxx.trc outputfile.prf 

で動くらしい。SQLPlusから起動するのかよく分からなかったが、tkprof.exeがC:\oracle\ora92\bin\フォルダに存在していたので、それを使用したら動いた。

オラクルのマニュアルにトレースログやtkprofの詳細な利用法が書いてある様なので、ご一読を

2003/05/23


まとめるとこんな感じ

SQL> ALTER SESSION SET TIMED_STATISTICS=TRUE;
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
SQL> (ここで、解析したいSQLを実行します)
SQL> ALTER SESSION SET SQL_TRACE=FALSE;

SQL> SHOW PARAMETERS USER_DUMP_DEST;

C:\> tkprof xxxx.trc outputfile.prf 

2010/11/01


032 クライアントのログファイルの出力先について

VB-oo4oなどで実装してオラクルに対して、リスナー名のミスなどにより接続できなかった時など、カレントフォルダ内に sqlnet.log  などが出力されることがある。明示的に設定しないと、カレントフォルダに出力されるらしい。

明示的に指定する場合は、sqlnet.ora に

LOG_DIRECTORY_CLIENT = C:\AAA\AAA などと指定すれば良いようです。

Oracle8i Net8 管理者ガイド リリース8.1   エラー情報のロギング 参照

2003/07/11


033 エクスポート インポート

インポート/エクスポートは、主に、テーブルなどを物理的に複写したりする時に用いると便利である。インポート先にテーブルが無くても生成してくれる。新たに環境を起こすときなどに、利用する。

一方、SQL-Loaderは、既に構築されているテーブルにデータを流し込む時によく用いる。SQL-Loaderは、テーブルをクリエイトする能力は無く、一般的にCSV形式のデータを読み込む時に便利なものである。

SQL-Loaderは、制御ファイルを要求するが、Oracleの標準機能では生成できない。が、ObjectBrowserなどのツールを使うと制御ファイルを含むLoader用ファイルを生成してくれる。

エクスポート:下記のように打ち込むと簡易ヘルプが表示される。

C:\>exp -help

外部ファイルから各種条件を与える事ができる
exp username/password  PARFILE=filename

インポート:下記のように打ち込むと簡易ヘルプが表示される。

C:\>imp -help

パラメタファイルの一例


FILE=EXPDAT.DMP
fromuser=scott1
touser=scott
ignore=y

マニュアルは、「ユーティリティ・ガイド」を参照の事。

imp とか exp だけで実行しても、実際はガイダンスが導いてくれるので、その方が楽といえば楽です。

2004/02/12


インポートってトランザクション効くの?

マニュアル「ユーティリティ・ガイド」によると、インポートパラメタファイルにCOMMIT パラメータがある

COMMIT=N (ディフォルト)
各表はロードされた後にのみコミットされ、エラーが発生した場合はロールバックを実行してから次のオブジェクトに進む。

COMMIT=Y
各行の挿入後に表がコミットされる。

複数の表をインポートする時の全体的なロールバックは不可能なようである。

2004/09/22


034 ORA-12535 エラー

oo4oの実装形式で、ORA-12535のエラーが出る事があった。

エラーメッセージを調べると

TNS-12535 TNS: 操作はタイムアウトしました。
原因: 要求された接続は、LISTENER.ORA 内のCONNECT_TIMEOUT パラメータに指
定されたタイムアウト時間内に完了できませんでした。このエラーはTNSLSNR から戻
されます。
処置: CONNECT_TIMEOUT を、無制限待機を意味する0 に再構成するか、
CONNECT_TIMEOUT をより高い値に再構成してください。あるいは、タイムアウト
が長すぎる場合には、トレースをオンにして詳細を調べてください。

とあった。実際の原因は、クライアント側OSの起動時に、即接続しにいこうとした時だった。

クライアントのトレースをオンにする方法

D:\oracle\ora92\network\admin\sqlnet.ora


# SQLNET.ORA Network Configuration File: D:\oracle\ora92\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)

trace_level_client = ADMIN
trace_directory_client = D:\oracle\ora92\network\trace

赤字を追加する必要がある。
なお、trace_directory_clientは、環境変数オラクルホームが設定されていれば不要であるが、設定されていない場合には必要になる。

詳細は、Oracle8i Net8 管理者ガイド リリース8.1.pdf
sqlnet.ora ファイルのパラメータ

などを参照の事。

で、実際の対応は、リトライ処理を行った。

2004/02/27


035 AutoCommit で はめられた〜

テーブルロックをかけたのに、ロックが効かない! なんでだ?トランザクション継続中であるぞ!!

原因:OraDatabase.AutoCommit プロパティは 、True が初期値

OraSession.BeginTrans を使用している時は気づかないが、

OraDatabase.ExecuteSQL ("SET TRANSACTION READ WRITE") にて トランザクションを切った場合は、即時コミットしていまっているので、トランザクションは継続していない!

AutoCommit は falseの方が無難です!

2004/09/10


036 LAN障害であっても、オラクルサーバー側ではセッションは残る?

表をロックした状態で、LANの障害などが発生し、クライアント側からオラクルにアクセスにできなくなったとしよう。
この状態で、V$SESSIONテーブルを見ると、該当のセッションは、INACTIVEの状態でセッションが残っている。

よって、テーブルはロックされたままになっている。

しばらく放置してみると…ロックされたまんまだなぁ。 →回避方法あり!

ゴミとなったセッションを強制終了させる為のSQLは以下の通り

ALTER SYSTEM KILL SESSION ' SID ,SERIAL# '  

ex: ALTER SYSTEM KILL SESSION '10 ,1234'

SID、SERIAL# は、セッションを識別する情報である。これらの情報は、V$SESSION テーブルから取得する。

終了させれたセッションがロックしていたテーブルは解放される。が、V$SESSIONテーブルには、statusが KILLED の状態でしばらく残る。
その後、不定な間隔で、KILLEDな情報は消えるようだ。

V$SESSION を見るときは、KILLED な 行は、無効な行として除外する必要があり。

http://www2u.biglobe.ne.jp/~netoasis/pickup/oracle/oracle_use.htm

2004/09/15


回線障害でゴミとなったセッションのお掃除方法

サーバー側のsqlnet.ora に次の1行を追加すべし

SQLNET.EXPIRE_TIME = 1

意味:約1分間隔で、クライアント側とのライフチェックを行う。クライアント側が死んでいた場合は、セッションを無効にし、使用していた各種リソースを解放する。つまり、トランザクションはロールバックされ、ロックテーブルも解放される。

初期設定は 0 で、この機能は無効になっているように思える。

Oracle8i Net8 管理者ガイド リリース8.1 に載っていた。

この件に関する参考情報
http://kamoland.com/oracle/lockfree.html
http://www20.big.or.jp/~o-shin/bbs/bender/dbms/pslg947.html

2004/09/16


20050105 〜 の文字化けの話

これは、Oracle9.0.1.4.0以上、Oracle9.2以上とWindowsとで、SJISとUnicode間の変換を行う時の、Unicodeの対応が異なる為に発生します。Windows上のUnicodeに対応するように、Oracleには”JA16SJISTILDE”、”JA16EUCTILDE”があります。
oo4o(Oracle Objects for OLE)の場合、INSERTの場合は問題が発生しませんが、SELECTなどの時には問題が発生します。

クライアント側ではレジストリキー名 HKEY_LOCAL_MACHIN\SOFTWARE\ORACLE\HOMEx、値の名前 NLS_LANG の値を”JAPANESE_JAPAN.JA16SJISTILDE”などにすると解消されます。

その他のミドルウエアでは、クライアントを修正すると共に、データベースのCHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”にする必要があります。

データベース作成後にCHARACTER SETを変更するには、変換後のキャラクタ・セットがスーパーセットでなくてはなりませんが、CHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”はスーパーセットではないため、データベースの作成し直しが発生します。スーパーセットについてはマニュアルを参照してください。

結果として、Windows環境の場合、CHARACTER SETを”JA16SJISTILDE”、NLS_LANGはサーバもクライアントも”JAPANESE_JAPAN.JA16SJISTILDE”にしないと文字化けは防げないようです。

また、データベースのキャラクタ・セットとクライアントのキャラクタ・セットが同一の場合、文字コード変換は行われません。

CHARACTER SETの移行方法

CHARACTER SETがJA16SJIS環境にてExportする。
CHARACTER SETがJA16SJISTILDEのデータベースを作成する。
1.で作成したExportファイルをNLS_LANGをJA16SJISとしてImportする。
Import完了後、NLS_LANGをJA16SJISTILDEとする。
NLS_LANGはWindowsの環境変数でも設定可能。
 コマンドプロンプトから
  set NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE
 と入力する。

CHARACTER SET
Oracle内部に格納する時に使用される文字コード体系。WindowsではJA16SJISかJA16SJISTILDEとなる。(OSに合わせる)

NLS_LANG
データベースから取り出した文字データをどのような文字コードで変換するかを設定する。

データベースのキャラクタ・セットを確認するには、
ディクショナリ・ビューNLS_DATABASE_PARAMETERSを確認する。
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
動的パフォーマンス・ビューV$NLS_PARAMETERSを確認する。

20050107-2 キャラクタセットの選択指針

http://www.venus.dti.ne.jp/~yoshi-o/RDB/Oracle-Beans_dictionary.html

ORACLEデータ取得時の文字化け
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200311_03110167.html

NLS_CHARACTERSET 設定内容の確認方法


20050107 リスナーの起動に失敗してしまう

久しぶりにオラクルを起動しようしたら、本体は上がるのに、リスナーが起動しない。起動してもスグに停止してしまう。

リスナーのログは
C:\oracle\ora92\network\log\listener.log
である。そこを見たら

pid=3656で起動しました
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
リスニング・エラーです: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SPPC-107)(PORT=1521)))
TNS-12545: 接続に失敗しました。ターゲット・ホストまたはオブジェクトが存在しません。
TNS-12560: TNS: プロトコル・アダプタ・エラー
TNS-00515: 接続に失敗しました。ターゲット・ホストまたはオブジェクトが存在しません。
32-bit Windows Error: 1001: Unknown error
リスニングしていません: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
 

どうやら、以前、実験で変えたままだったようです。

C:\oracle\ora92\network\admin\listener.ora

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
)
 

赤字の箇所をLocalhostに変えれば、無事起動できました


20050107-2 キャラクタセットの選択指針

 

(表)Oracle9iで指定できる、日本語が扱える主要キャラクタ・セット
キャラクタセット 文字コード 備考
JA16SJIS シフトJIS  
JA16EUC 日本語EUC  
JA16SJISTILDE シフトJIS ウェーブ・ダッシュ(〜)問題が起り得る環境で使用。R9.0.1.4以上で指定可
JA16EUCTILDE 日本語EUC
UTF8 UnicodeのUTF-8エンコーディングの緩やかなインプリ Unicodeで古いオラクルとの互換性を重視する場合に利用
AL32UTF8 UnicodeのUTF-8エンコーディングの厳密なインプリ(Oracle9iR1よりサポート) Oracle9iでUnicodeを扱う際の基本

http://otndnld.oracle.co.jp/skillup/oracle9i/1_1/

20050105 〜 の文字化けの話

 

サーバー/クライアントのNLS_LANG をJA16SJISTILDE にしなくてはならないようだ。

Windowsの場合、
環境変数 NLS_LANG に、 JAPANESE_JAPAN.JA16SJISTILDE  を設定する事。

これで、oo4oを経由して取得する時もバケなくなくなった 2005/01/11

http://ash.or.jp/db/ora_nls.htm


NLS_CHARACTERSET 設定内容の確認方法

下記のSQL文を投入すれば確認できる

select * from NLS_DATABASE_PARAMETERS ;

NLS_CALENDAR GREGORIAN
NLS_CHARACTERSET JA16SJIS
NLS_COMP BINARY
NLS_CURRENCY $
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_DUAL_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_LANGUAGE AMERICAN
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_NCHAR_CONV_EXCP FALSE
NLS_NUMERIC_CHARACTERS .,
NLS_RDBMS_VERSION 9.2.0.1.0
NLS_SORT BINARY
NLS_TERRITORY AMERICA
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
PARAMETER VALUE

2005/01/11

データベースに、文字列を格納する時のキャラクタセット

NLS_CHARACTERSET データベース・キャラクタ・セット
CHAR  VARCHAR2
NLS_NCHAR_CHARACTERSET 各国文字キャラクタ・セット
NCHAR NVARCHAR2

このキャラクタセットは、データベースインスタンスの生成時にしか設定できない。


20050109 初期化ファイルはどこにある?

マニュアルには(Oracle9i Database for Windows インストレーション・ガイド リリース2 J06477-01.pdf)に
%ORACLE_BASE%¥admin¥DB_NAME¥pfile

とある。自分のマシンの場合は

C:\oracle\admin\ora\pfile\init.ora.0112005143611


20050415 テーブル名の文字数制限は?

30文字です。項目名も30文字までです。


20050802 ORA-12545

ORA-12545 ターゲット・ホストまたはオブジェクトが存在しないため、接続に失敗しました

のメッセージが表示され、オラクルサーバーに接続できなくなった。

原因

C:\WINDOWS\system32\drivers\etc\hosts にて

aaa→localhost としていたが、この設定を削除した。しかし、リスナー関連の設定ファイルは aaaにて記述していた。

解決方法

tnsnames.ora listener.ora のホスト名をlocalhostに設定しなおした。


20050803 データベースリンク

複数のデータベースインスタンス間でデータのやりとりを行う事ができる方式。オラクル固有の手法

オブジェクトブラウザでも容易に設定できる。

りンク先のテーブル名@データベースリンク名  でアクセスができるらしい。

詳細はこちらへ
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19224-02/ds_concepts.htm#684674

 


20060803 文字の長さの宣言 バイト長?文字数?

テーブル宣言を行う時に、char型や、varchar2型を使用する場合の長さはどうなるか?

オラクル10のマニュアルを見てみると、どちらでも設定可能なようである。

個別に設定したり、全体で設定したりできるようだ

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_v11/appdev.102/B19248-02/adfns_sqltypes.htm#243866

 

CHAR列およびVARCHAR2列の長さは、バイト数または文字数として指定できます。NCHAR列およびNVARCHAR2列の長さは、必ず文字単位で指定し、1つの文字が複数バイトで構成される場合にUnicodeデータを格納するために適した長さにします。

次のリストに、列の長さを指定する際の考慮事項を示します。

マルチバイトのデータベース文字コード体系を使用する場合は、文字データ型の列を持つ表のために必要となる領域を慎重に検討してください。データベースの文字コード体系がシングルバイトである場合、1つの列内のバイト数と文字数は同じです。ただし、マルチバイトの場合は、通常このような対応はありません。1つの文字は、マルチバイト・コード体系と、シフトイン/シフトアウト制御コードの有無に応じて、1バイトで構成される場合と、複数バイトで構成される場合があります。バッファのオーバーフローを回避するため、データベース・キャラクタ・セットと異なるUnicodeエンコーディングを使用する可能性がある場合、データをNCHARまたはNVARCHAR2として指定します。

 


20070223 スナップショットとシノニム

  スナップショット シノニム
即時での更新反映 × マスタ表のcommitとは同期しない。リフレッシュ処理が必要。 データの実体は1つのため、完全同期が可能。
相互更新 × マスタ側は即時更新可能だが、スナップショット側はリフレッシュを行わないとマスタ側の変更は反映されない。 シノニムに対してデータの変更を行うとデータの実体が更新されるため、相互の更新が可能。
処理速度 スナップショット側にも実態があるため、ローカルで処理が完結する。リフレッシュ以外ではリモートDBへの通信が発生しないため、処理は高速。
また、スナップショットに対して索引を作成することも可能。
× シノニムに対してデータアクセスを行うと、リモートDBにアクセスするため、スナップショットと比較すると処理は低速になる。
また、索引は実表の索引が使用される。
処理負荷 実体がマスタとスナップショットの2つになるため、処理負荷は分散される。 × 実体は1つなので、処理負荷は集中する。
冗長性 片側のデータベースに障害が発生した場合でも、もう片側のサーバでのデータ参照は可能。 × 実体を持っている側のデータベース障害が発生すると、データの参照はできなくなる。
データ容量 × 実体が複数存在するため、スナップショット1つにつき、マスタ表と同容量のディスクが必要。 実体が1つのため、シノニム側ではほとんど容量を必要としない。
         
         

 


20080423 ライセンスフリーのオラクル

ダウンロード先
http://www.oracle.com/technology/products/database/xe/index.html

ダウンロード方
http://www.dbonline.jp/oracleinstall/install/index1.html

インストール先がデフォルトならリスナの設定ファイルは C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN にある。

無料で使えて良いことばかりかと思っていたら…いろいろありそうである。

Oracle Database XE is available in two character set and language configurations:
オラクルDatabase XEは2文字集合と言語構成で利用可能です:
 

Universal  は  AL32UTF8 のみ?

できない事はないみたいだ
http://weyk.air-nifty.com/none/2007/01/oraclexeja16sji_7d01.html

http://javasystem.blog4.fc2.com/blog-entry-6.html


20080423 ORACLE 11G

紹介記事など
http://www.atmarkit.co.jp/fdb/rensai/dbwatch2007/dbwatch200708_1.html

ダウンロード
Oracle Database 11g Release 1 (11.1.0) for Microsoft Windows (32-bit) 30日間トライアル版
http://www.oracle.com/technology/global/jp/software/products/database/index.html

マニュアル
http://www.oracle.com/technology/global/jp/documentation/index.html

11Gの各バージョンの違い
http://www.oracle.com/lang/jp/database/product_editions.html

 

OCIや、ODBC、SqlPlusで ただ、つなぎたいだけだったら…
インスタントクライアント のダウンロード
http://www.oracle.com/technology/global/jp/tech/oci/instantclient/instantclient.html

 


20080516 VARCHAR2 と NULL と 長さゼロの文字列

ORACLEにおいては、VARCHAR2 の項目に、“” を入れると、NULLと同等になる。

よって、NOT NULL制約のついたVARCHAR2には、“” は格納できない事になる


20080612 接続文字列

これまで、userid/password@識別子 としていた。識別子は tnsnames.ora に連携する名前であったが…。

じつは、tnsnames.ora での連携は必須ではない。

tnsnames.ora

sppc-095 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.12)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orasjis2)
    )
  )

sqlplus shodai/password@sppc-095  としていたのを

sqlplus shodai/password@192.168.1.12:1521/orasjis2  と、記述する事も可能である

sqlplus だけでなく、SI Object Browser  など、接続文字列を入れる所であるならば、この記述方法は、どこでも使えるようである。

補足。PROTOCOL指定はTCPを暗黙指定としているので、TCP以外の方法で接続したい場合は、この方法は使えない。


20080612 SQL*Loader

SQL Loaderは、Oracleにデータを転送する際に、大変有益なユーティリティーである。速度は、非常に高速である。

Loader系の覚え書きは、以下のページにまとめて記述する。

SQL*Loader 覚え書き


20080616 TNSPING

オラクルサーバーにつながるかどうかを調べるのに、有益なコマンドである


20080616 スマートクライアントがうまくつながらない

ODBC経由でつながらないとき

WindowsXPではうまくいくのに、Windows2000では つながらなかったとき
mfc71.dll 、msvcp71.dll msvcr71.dll が、PCに存在しているかを疑え。

Windows2000では 上記のDLLは存在していない事がある。存在しない時は、system32などに、配置する事


20080619 SQL*Plus で ログを出力

DEFINE OS_ERROR = 2
WHENEVER OSERROR EXIT OS_ERROR ROLLBACK
WHENEVER SQLERROR EXIT 1 ROLLBACK
spool c:\LOGFILE.log
select sysdate from dual;
COMMIT; 
spool off

spool は SQL*Plus のコマンド命令である。ObjectBrowserなどでは 使用できない


20080619 SQL*Plus で CSV出力

	set pagesize 0
	set trimspool on
	set feedback off
	set colsep ';'
	spool c:\aaa\test.txt 
	select test01.*  from test01; 
	spool off 

データに カンマ ,  が入っている場合を想定して、 あえて、項目の区切文字を セミコロン ; を採用している。

解説

set pagesize 0 ページ区切文字を表示させないようにする
これを指定しないと、ページの先頭行毎に列ヘッダを表示させないようにする。
set trimspool on 行の右端のスペースを除去する
set feedback off 「xx行選択されました」メッセージを表示させないようにする。
set colsep ';' 項目間の区切文字を設定。
spool c:\aaa\test.txt c:\aaa\test.txt に ログをスプールするようにする。
拡張子をcsvにすると、エクセルで開く時に無条件にカンマ区切りとして開いてしまう。開くときの条件を詳細に設定したいならば、拡張子はcsv以外にするのが良い。
spool off スプール出力をやめる。このコマンドが発行されるか、SQL*Plusが終了するまで、スプールされ続けられる事になる
   

出力内容

SQL> 	select test01.*  from test01;
         3;1,1,1,1   ;2,3a
         2;          ;AAA
         1;ABCD      ;ABCD
SQL> 	spool off

先頭行と末尾行に データ以外の行が出力されてしまう。これを自動で除去する方法は見つけられなかった。→見つけた プロントプトを表示させない方法

また、カラムヘッダを出力するには、pasesize に 任意の行数を設定し、かつ set heading on を設定すれば良いのだが、pagesize行数毎に ヘッダが出力されてしまうので好ましくない。


プロントプトを表示させない方法 その1

SQL*Plusの起動オプションに サイレントモード -s というのがある。 sqlplus -s iii/ppp@ooo これで、実行してみると

C:\>SQLPLUS -S IIII/PPPP@OOOO
        set pagesize 0
        set trimspool on
        set feedback off
        set colsep ';'
        spool c:\aaa\test.txt
        select test01.*  from test01;
         3;1,1,1,1   ;2,3a
         2;          ;AAA
         1;ABCD      ;ABCD
        spool off
SELECT * FROM TEST01
;
         3;1,1,1,1   ;2,3a
         2;          ;AAA
         1;ABCD      ;ABCD

c:\aaa\test.txt

         3;1,1,1,1   ;2,3a
         2;          ;AAA
         1;ABCD      ;ABCD

 


20081215 ORA-28001 パスワードが期限切れです

ObjectBrowserから 久々にログインしようとしたら、パスワードの期限切れ とのメッセージが表示されてしまい、ログインできない。どうしようか?

とりあえずの回避方法

コマンドプロントから ログインを試みる

    >sqlplus USERID/PASSWORD@CONNECTIONSTRING

すると

ERROR:
ORA-28001: パスワードが期限切れです。


パスワードを変更しています。
新規パスワード:  ←入力する
新規パスワードを再入力してください:←入力する
パスワードが変更されました。


Oracle Database 11g Release 11.1.0.6.0 - Production
に接続されました。
SQL>

パスワードの有効期限を無期限にする方法とかも、知っておく必要があるねぇ


20090615 Ubuntuに Oracleサーバーをインストールしてみる

リポジトリを追加すれば、簡単にインストールできるらしい

その後の環境設定にちょいと手間取ったがなんとかできた

UbuntuにXEをインストールしてみる


20090617 インスタントクライアントのインストール

アプリケーションの開発及び試作目的ならば使えるクライアント

http://www.oracle.com/technology/global/jp/tech/oci/instantclient/instantclient.html

Windows 32bit版を試してみる

Microsoft Windows 32-bit を選択
http://www.oracle.com/technology/global/jp/software/tech/oci/instantclient/10104/instantclient_win_dl.html

Instant Clientパッケージ - 基本         instantclient-basic-win32-10.2.0.3-20061115.zip
Instant Clientパッケージ - SQL*Plus  instantclient-sqlplus-win32-10.2.0.3-20061115.zip
を取得

Instant Clientパッケージ - 基本のインストール

zipファイルを任意のフォルダで解凍する
    →フォルダ instantclient_10_2 ができあがる。

上記のフォルダを適切に配置する(漢字を含まないフォルダが好ましいらしい)

上記フォルダへのPATHを通す
    →システム環境変数 Path

クライアントの言語設定を
NLS_LANG として、環境変数に登録する

通常のWindowsの場合は
    JAPANESE_JAPAN.JA16SJISTILDE

UTFでアクセスしたい場合は
     JAPANESE_JAPAN.AL32UTF8

Instant Clientパッケージ - SQL*Plus のインストール

zipファイルを任意のフォルダで解凍する
    →フォルダ instantclient_10_2 ができあがる。

基本パッケージのフォルダに、展開されたファイルを配置する


接続の確認

DOSプロントより…

C:\>sqlplus system/hoge@xxx.xxx.xxx.xxx:1521/XE

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Jun 17 02:31:54 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SQL>

成功!


20091025 接続数の話

これ以上、接続できなくなった原因をしらべてみたい

現在のプロセス、セッションの最大値を得るSQL

select name, type, value
from V$SYSTEM_PARAMETER
where name = 'processes' or name='sessions'

NAME TYPE VALUE
processes 3 40
sessions 3 49

現在使われているセッションの状況を知るSQL

SELECT
sess.process, sess.status, sess.username, sess.schemaname
FROM
v$session sess
--WHERE
-- sess.type = 'USER'

 

 

processes 3 40
sessions 3 49
 

同時接続数に関するキーワード

参考

Oracle Database 概要 10gリリース2(10.2) プロセス・アーキテクチャ:
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02/process.htm

インスタンスとプロセス
http://www.shift-the-oracle.com/oracle/process-instance-oracle-server.html

Oracleインスタンスを構成するプロセス
http://jibun.atmarkit.co.jp/lskill01/rensai/bdbap04/bdbap02.html

 

テーブル v$session


20100112 SQL*Plus いろいろ

SQL*Plus - オラクル・Oracle SQL*Plus リファレンス
http://www.shift-the-oracle.com/sqlplus/


データの内容を、見やすくダンプ

set pagesize 0
set linesize 32676
set trimout on

select * from tabs; 
set pagesize 0
set linesize 32676
set trimspool on
spool c:\aaa\test.txt 

select * from tabs; 

spool off 

20080619_Sql*Plus_で_ログを出力
20080619_SQL*Plus_で_CSV出力
 



20100820 Data Pump Export

データをExportするユーティリティ Oracle10gから登場した。

Data Pump Exportで 抽出したデータは Data Pump Import のみからロード可能である

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19211-01/dp_export.html

 


20101031 統計情報

統計情報の収集タイミングを知る

sqlPlus上で以下のコマンドを実行

SQL> SHOW PARAMETERS STATISTICS_LEVEL
NAME                 TYPE     VALUE
-------------------- -------- ------------------------------
statistics_level     string   TYPICAL

が「TYPICAL」または「ALL」の場合に、自動で統計情報が収集されている

統計情報がいつ収集されたか

SELECT TABLE_NAME NAME, LAST_ANALYZED FROM USER_TABLES
NAME LAST_ANALYZED
EMP 2010/11/1 3:06
TBL1 2010/11/1 3:06
TBL1_0928031111 2010/11/1 3:06
TBL2 2010/11/1 3:06
TBL2_0928030545 2010/11/1 3:06

統計情報の収集

BEGIN
	--テーブル単位の収集
	DBMS_STATS.GATHER_TABLE_STATS (
		OWNNAME       => 'ユーザ名'
		,TABNAME      => 'テーブル名'
		,METHOD_OPT   => 'FOR ALL INDEXED'
		,CASCADE      => TRUE
	);
END;

BEGIN
	--スキーマ単位の収集
	DBMS_STATS.GATHER_SCHEMA_STATS (
		 OWNNAME => 'ユーザ名'
		,OPTIONS => 'GATHER'
	);
END;

20110529 オラクルサーバーにつながらない

以下の事柄について、疑ってみること。

オラクルサーバー側で、ファイアフォールが有効になっていないか?

初期値では有効になっている場合が多く、1521番が閉じている。この場合
ORA-12170: TNS: 接続タイムアウトが発生しました。
が発生する場合がある。
oracleServer側で TCP 1521 を あける必要がある。


20110629 SYSDATE の値をテスト的に変更したい

変更する時(指定した固定値になる)

ALTER SYSTEM SET FIXED_DATE = '2011-12-31-23:59:59' SCOPE=MEMORY;

戻すとき

ALTER SYSTEM SET FIXED_DATE = none SCOPE=MEMORY;

設定内容を確認するとき(sqlplusからのみ有効)

SHOW PARAMETER FIXED_DATE

NAME                                                  TYPE
------------------------------------ ----------------------
VALUE
------------------------------
fixed_date                                              string
NONE

これは、未設定の場合

 

http://d.hatena.ne.jp/learn/20090330
http://www.shift-the-oracle.com/debugging-tips/fixed_date.html


20190803 ORA-12514 リスナー経由で接続できない

11.2.0.1

オラクルサーバーを構築した。
sqlplus system/**** では接続できるが、
sqlplus system/****@orcl では ORA-12514 にて接続できない
sqlplus system/****@192.168.0.x:1521/orcl でも ORA-12514 にて接続できない

インストール後に生成されたリスナー関連のファイル


sqlnet.ora----------------

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)


listener.ora-------------

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\app\shodai\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\shodai\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = D:\app\shodai

tnsnames.ora--------------

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Net Configuration Assistantなどを使って、つながるように調整した後


sqlnet.ora----------------

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (EZCONNECT, TNSNAMES)


listener.ora-------------

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\app\shodai\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\shodai\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = GX520)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = D:\app\shodai


tnsnames.ora--------------

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = GX520)(PORT = 1521))


ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.8)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

他、リスナー関連情報の取得の仕方

lsnrctl
lsnrctl start
lsnrctl reload
lsnrctl stop
lsnrctl status

サービス名の取得の仕方
show parameter service_name


20190803 expdp impdp

https://www.shift-the-oracle.com/utility/datapump/expdp-impdp-option.html

https://shimi-dai.com/oracle-directory-object/


ディレクトリオブジェクトの作成


create or replace directory expdmp AS 'D:\app\expdmp' 

ディレクトリオブジェクトへ読み書き権限の付与
(自分自身に対してできないときは、sysmteなどから行いましょう)


grant read, write on directory expdmp to testuser

ディレクトリオブジェクトの一覧


select * from dba_directories

impの例
複数行に分けて記述する場合、windowsの場合は^をつける。Linuxの場合は \


impdp testuser/testpassword@orcl ^
directory=expdmp ^
dumpfile=testdata.dmp ^
 logfile=testdata.imp.log ^
table_exists_action=replace

20190803 表領域の作成

https://www.projectgroup.info/tips/Oracle/SQL/SQL000007.html

11.2.0.1

create tablespace INDX
datafile 'D:\APP\SHODAI\ORADATA\ORCL\INDX01.DBF' 
SIZE 100M AUTOEXTEND ON NEXT 500K MAXSIZE UNLIMITED

戻る