LastUpdate: 2024/07/14 12:20:20
戻る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 表領域の作成
20240714 無償のオラクル
Oip20.Tlbである。しかし、マニュアルには、早期バインディングはあまり好ましくない事が書いてある。
Oracle8.1.6現在のoo4oのタイプリプは以下のものである。
別の資料によると、タイプライブラリを参照設定して、早期バインディングを行った方が早い。が、タイプリブのバージョンアップが発生すると、タイプライブラリの参照設定のしなおし、及びリコンパイルが発生してしまう。よってこれが唯一で最大の問題点とあった。
なるほど。2002/07/31
oo4o 3.7のマニュアルに、以下の記述を見つけた。
OO4O バージョン2.3.x(2.3.4 以下)ではタイプ・ライブラリとの互換性がありませんでした。この問題は、現在のリリースでは修正されています。OO4O バージョン2.3.x(2.3.4 以下)とのアーリー・バインディングを使用するアプリケーションは、コンパイルし直す必要があります。
ということは、現在のバージョンでは、早期バインディングを行っても、将来的にリコンパイルする必要が無いと言うことかな〜?
2002/08/07
ショートカットを以下の様に変更する。
例)C:\ORANT\BIN\PLUS33W.EXE "APSYS/SYSTEM @1KOKI"
APSYSはユーザー名
SYSTEMはパスワード
1KOKIは接続文字列
である。
オラクル7.x の時についていた、ヘルプファイルです。
SQLHELP.HLP (938KB)
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で行ったところ、全く問題なくインスタンスの追加生成ができた事から
オラクルそのもののインストールをしなおしたら、インスタンスの再生成ができた!
「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";
コマンドプロントよりサーバーマネージャーを起動する
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:\> |
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
まず、表領域を作成する。
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;
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
SQL Plusは、データの追加・更新・削除を行ったとき、COMMITを発行しないと、確定されていないので、注意。
ただし、SQL Plusを終了した時は、暗黙のCOMMITが発行されているようである。
2001/07/04
exit は exit commit の省略形である。
rollbackして終了したいときは、 exit rollback
Oracle 11g R2から、 EXITCOMMTシステム変数が追加され、 exitするときの、トランザクションの扱いを変更できるらしい。初期値はcommitである。
SQL> VARIABLE WK_A VARCHAR2(20); |
2001/08/05
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
実行時エラーがアプリ側に渡ってくるとき、ロールバックされているわけではない。再びロックを試みるか、ロールバックするかはアプリ側に決定権がある。
伊藤氏談。
2002/02/13
原因はよくわからんです。なんで?日付項目を更新しようとした時に良く出ます。
Windows2000Professional + Acsess2000 で出た。
不完全回避方法1
日付項目以外の項目も一緒に変更する。→不思議とうまくいく。
上記より確実と思われる方法
ODBCドライバをオラクル製からMicrosoft製に変えたら回避された。
2002/02/14
画面にデータを貼り付けるためには、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
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
ここにあった(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
以下のような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
oo4oのパフォーマンスチューニングを見ると、FetchLimitを増やせば良いと書いてあるが、OraDatabaseオブジェクトのFetchLimitプロパティを増やしても、結果が全く変わらなかった。
一方レジストリの内容を変更したら、少々早くなった。
どうも、プログラムからFetchLimitを操作するには、
OraDatabase.CreateCustomDynaset
をしようすると良いみたいだ。
2002/08/08
非常に時間のかかる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
2002/09/02
同一キーを複数端末から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
以前は DBA Studio という名前でしたが、
Enterprise Manager Console という名前に変わっているようです。
2002/12/16
ひとつも自分管理のオブジェクトを作っていないときは表示されないようです。他のスキーマー配下からでも表などを作ってしまいましょう。
SCOTTの配下のフォルダから右クリックで「表の作成」を選択
スキーマーに自分のスキーマ名を入れると、ほらこの通り。
2002/12/16
2002/12/16
クリエイトテーブル文など長いsql文をカット&ペーストで貼り付けると、バッファ不足により途中までしかできな事が多い。一番簡単な回避策は、外部のテキストファイルにしたものをSQLPlusから読み込ませて実行するとよい。
C:\UUU\TABLE.SQL-------
CREATE TABLE TEST_TABLE(
....
);
/ ←実行の意味
----------------
SQLPlusにて
SQL>@C:\UUU\TABLE.SQL [enter]
2003/01/27
テストデータなどを作成するとき、ExcelとAccessを使用して作るととってもラクなんだけど、空白値がうまく入らないとか、いろいろ諸問題がある。Access以外の方法を模索してみる
1オラクルのデータマネージャを使用する方法
オラクル純正だから安定してるんだけど、行の複写とかできないのが痛いねー
2VBのIDEのデータビューを使用する方法
アイコンを選択
データリンクを選択状態にして、赤枠のアイコンをクリック
Oracle Provider for OLE DB を選択して[次へ]を選択
オラクルへの接続情報を入力します。
データソースとはいつも入れているリスナー名ですね。
「パスワードを保存する」にチェックをつけると、いちいち聞いてこなくなります。
接続テストで「成功がでればOK」あとは、テーブルのアイコンをクリックすれば、...
アクセスそっくりの見慣れた画面が立ち上がります。
2002/02/17
単純に実装すると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
コード変換そのものは、自動でやってくれるが、どのコードからどのコードへ変換するのかについては、設定が必要らしい。
設定の概念は、クライアント自身の環境は何であるかを明示的に示す事である。
具体的には環境変数を以て行う。
NLS_LANG = Japanese_Japan.JA16SJIS と設定すれば良い。
インターネットでは、レジストリも変更も必要らしいと書いてあったが、サーバーの事か。詳細はまだ調べていない。
http://www.datadirect.co.jp/support/samplekb.html
2003/02/21
バグなのかどうかまではわからなかった
削除対象のレコードが複数あり、削除するキーをあらかじめ配列バインドにて運用しようとした。
すると、削除対象のキーが無いと、配列処理に失敗したと、エラーを言うてくる。
まずは現象の報告のみ。
2003/03/06
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
VB-oo4oなどで実装してオラクルに対して、リスナー名のミスなどにより接続できなかった時など、カレントフォルダ内に sqlnet.log などが出力されることがある。明示的に設定しないと、カレントフォルダに出力されるらしい。
明示的に指定する場合は、sqlnet.ora に
LOG_DIRECTORY_CLIENT = C:\AAA\AAA などと指定すれば良いようです。
Oracle8i Net8 管理者ガイド リリース8.1 エラー情報のロギング 参照
2003/07/11
インポート/エクスポートは、主に、テーブルなどを物理的に複写したりする時に用いると便利である。インポート先にテーブルが無くても生成してくれる。新たに環境を起こすときなどに、利用する。
一方、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
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
テーブルロックをかけたのに、ロックが効かない! なんでだ?トランザクション継続中であるぞ!!
原因:OraDatabase.AutoCommit プロパティは 、True が初期値
OraSession.BeginTrans を使用している時は気づかないが、
OraDatabase.ExecuteSQL ("SET TRANSACTION READ WRITE") にて トランザクションを切った場合は、即時コミットしていまっているので、トランザクションは継続していない!
AutoCommit は falseの方が無難です!
2004/09/10
表をロックした状態で、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
これは、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を確認する。
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
久しぶりにオラクルを起動しようしたら、本体は上がるのに、リスナーが起動しない。起動してもスグに停止してしまう。
リスナーのログは
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に変えれば、無事起動できました
|
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
下記の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 |
このキャラクタセットは、データベースインスタンスの生成時にしか設定できない。
マニュアルには(Oracle9i Database for Windows インストレーション・ガイド リリース2
J06477-01.pdf)に
%ORACLE_BASE%¥admin¥DB_NAME¥pfile
とある。自分のマシンの場合は
C:\oracle\admin\ora\pfile\init.ora.0112005143611
30文字です。項目名も30文字までです。
ORA-12545 ターゲット・ホストまたはオブジェクトが存在しないため、接続に失敗しました
のメッセージが表示され、オラクルサーバーに接続できなくなった。
原因
C:\WINDOWS\system32\drivers\etc\hosts にて
aaa→localhost としていたが、この設定を削除した。しかし、リスナー関連の設定ファイルは aaaにて記述していた。
解決方法
tnsnames.ora listener.ora のホスト名をlocalhostに設定しなおした。
複数のデータベースインスタンス間でデータのやりとりを行う事ができる方式。オラクル固有の手法
オブジェクトブラウザでも容易に設定できる。
りンク先のテーブル名@データベースリンク名 でアクセスができるらしい。
テーブル宣言を行う時に、char型や、varchar2型を使用する場合の長さはどうなるか?
オラクル10のマニュアルを見てみると、どちらでも設定可能なようである。
個別に設定したり、全体で設定したりできるようだ
CHAR
列およびVARCHAR2
列の長さは、バイト数または文字数として指定できます。NCHAR
列およびNVARCHAR2
列の長さは、必ず文字単位で指定し、1つの文字が複数バイトで構成される場合にUnicodeデータを格納するために適した長さにします。
次のリストに、列の長さを指定する際の考慮事項を示します。
id VARCHAR2(32 BYTE)
id
列に格納されるのは、32バイト以内のシングルバイト・データのみです。
name VARCHAR2(32 CHAR)
name
列には、データベース・キャラクタ・セットによるデータが格納されます。データベース・キャラクタ・セットでマルチバイト・キャラクタが許可される場合は、32文字を32バイトを超える長さで格納できます。
biography NVARCHAR2(2000)
biography
列では、Unicodeで表現可能な任意の言語による2000文字を表すことができます。エンコーディングは各国語キャラクタ・セットに応じて異なりますが、データベース・キャラクタ・セットがシングルバイトの場合も、列にはマルチバイト値を格納できます。
comment VARCHAR2(2000)
comment
が2000バイトとして表されるか2000文字として表されるかは、初期化パラメータNLS_LENGTH_SEMANTICS
によって決まります。
マルチバイトのデータベース文字コード体系を使用する場合は、文字データ型の列を持つ表のために必要となる領域を慎重に検討してください。データベースの文字コード体系がシングルバイトである場合、1つの列内のバイト数と文字数は同じです。ただし、マルチバイトの場合は、通常このような対応はありません。1つの文字は、マルチバイト・コード体系と、シフトイン/シフトアウト制御コードの有無に応じて、1バイトで構成される場合と、複数バイトで構成される場合があります。バッファのオーバーフローを回避するため、データベース・キャラクタ・セットと異なるUnicodeエンコーディングを使用する可能性がある場合、データをNCHAR
またはNVARCHAR2
として指定します。
スナップショット | シノニム | |||
即時での更新反映 | × | マスタ表のcommitとは同期しない。リフレッシュ処理が必要。 | ○ | データの実体は1つのため、完全同期が可能。 |
相互更新 | × | マスタ側は即時更新可能だが、スナップショット側はリフレッシュを行わないとマスタ側の変更は反映されない。 | ○ | シノニムに対してデータの変更を行うとデータの実体が更新されるため、相互の更新が可能。 |
処理速度 | ○ |
スナップショット側にも実態があるため、ローカルで処理が完結する。リフレッシュ以外ではリモートDBへの通信が発生しないため、処理は高速。 また、スナップショットに対して索引を作成することも可能。 |
× | シノニムに対してデータアクセスを行うと、リモートDBにアクセスするため、スナップショットと比較すると処理は低速になる。 また、索引は実表の索引が使用される。 |
処理負荷 | ○ | 実体がマスタとスナップショットの2つになるため、処理負荷は分散される。 | × | 実体は1つなので、処理負荷は集中する。 |
冗長性 | ○ | 片側のデータベースに障害が発生した場合でも、もう片側のサーバでのデータ参照は可能。 | × | 実体を持っている側のデータベース障害が発生すると、データの参照はできなくなる。 |
データ容量 | × | 実体が複数存在するため、スナップショット1つにつき、マスタ表と同容量のディスクが必要。 | ○ | 実体が1つのため、シノニム側ではほとんど容量を必要としない。 |
ダウンロード先
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
紹介記事など
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
ORACLEにおいては、VARCHAR2 の項目に、“” を入れると、NULLと同等になる。
よって、NOT NULL制約のついたVARCHAR2には、“” は格納できない事になる
これまで、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以外の方法で接続したい場合は、この方法は使えない。
SQL Loaderは、Oracleにデータを転送する際に、大変有益なユーティリティーである。速度は、非常に高速である。
Loader系の覚え書きは、以下のページにまとめて記述する。
オラクルサーバーにつながるかどうかを調べるのに、有益なコマンドである
ODBC経由でつながらないとき
WindowsXPではうまくいくのに、Windows2000では つながらなかったとき
mfc71.dll 、msvcp71.dll msvcr71.dll が、PCに存在しているかを疑え。Windows2000では 上記のDLLは存在していない事がある。存在しない時は、system32などに、配置する事
例
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などでは 使用できない
例
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 ;ABCD3;1,1,1,1 ;2,3a 2; ;AAA 1;ABCD ;ABCD
ObjectBrowserから 久々にログインしようとしたら、パスワードの期限切れ とのメッセージが表示されてしまい、ログインできない。どうしようか?
とりあえずの回避方法
コマンドプロントから ログインを試みる
>sqlplus USERID/PASSWORD@CONNECTIONSTRING
すると
ERROR:
ORA-28001: パスワードが期限切れです。
パスワードを変更しています。
新規パスワード: ←入力する
新規パスワードを再入力してください:←入力する
パスワードが変更されました。
Oracle Database 11g Release 11.1.0.6.0 - Production
に接続されました。
SQL>
パスワードの有効期限を無期限にする方法とかも、知っておく必要があるねぇ
リポジトリを追加すれば、簡単にインストールできるらしい
その後の環境設定にちょいと手間取ったがなんとかできた
アプリケーションの開発及び試作目的ならば使えるクライアント
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.JA16SJISTILDEUTFでアクセスしたい場合は
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>
成功!
現在のプロセス、セッションの最大値を得る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
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 off20080619_Sql*Plus_で_ログを出力
20080619_SQL*Plus_で_CSV出力
データをExportするユーティリティ Oracle10gから登場した。
Data Pump Exportで 抽出したデータは Data Pump Import のみからロード可能である
統計情報の収集タイミングを知る
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;
以下の事柄について、疑ってみること。
初期値では有効になっている場合が多く、1521番が閉じている。この場合
ORA-12170: TNS: 接続タイムアウトが発生しました。
が発生する場合がある。
oracleServer側で 受信 TCP 1521 を あける必要がある。
変更する時(指定した固定値になる)
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
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
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
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
https://cosol.jp/techdb/2019/05/use_oracle_database_no_charge/
Oracle Databaseを無償で使う方法いろいろ
ここでは、無償で使えるOracleの内、商用利用も可能なExpress Editionを利用してみる。
Oracle Database Express Edition (XE) Downloads | Oracle 日本
管理者権限でインストールする必要あり
ALTER PROFILE DEFAULT LIMIT password_life_time unlimited;
その後、systemのパスワードを再設定しておくこと
sqlplus / as sysdba
alter user SYSTEM identified by password ;
ユーザー作成をしておく(参考までに)