【ORACLE】セッションが実行中のSQLを調べる
ここに挙げたやり方に則り
実際によく使ってる簡易的にセッションの情報を取得するSQL。
リンク先で挙げたようなV$SESSIONとV$SESSION_LONGOPSに加えて
V$SQLを結合してSQL_FULLTEXTを取得します
(そのセッションがどんなSQL投げてるのか調べる)。
ここに挙げたやり方に則り
実際によく使ってる簡易的にセッションの情報を取得するSQL。
リンク先で挙げたようなV$SESSIONとV$SESSION_LONGOPSに加えて
V$SQLを結合してSQL_FULLTEXTを取得します
(そのセッションがどんなSQL投げてるのか調べる)。
javaでHTTP接続するプログラムのサンプル。
// ①URLを生成
// ②接続してHttpURLConnectionを生成
HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
// ③InputStreamからレスポンスをもらう
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"Shift-JIS"));
// ④まわす
while(br.ready()) {
System.out.println(br.readLine());
}
// ⑤とじる
con.disconnect();
br.close();
JDBCで接続してSQL発行するプログラムのサンプル。(データソースを使う)
その辺探せばどこにでもあるけど個人の備忘録として。
// ①データソースの生成
OracleConnectionPoolDataSource opds = new OracleConnectionPoolDataSource();
// ②DBのURLを設定
opds.setURL("jdbc:oracle:thin:@192.168.0.100:1521:TESTDB");
// ③DB接続ユーザーを設定
opds.setUser("TESTDBUSER");
// ④DB接続パスワードを設定
opds.setPassword("TESTDBPASS");
// ⑤Connection生成
Connection con = opds.getConnection();
// ⑥Statement生成
Statement st = con.createStatement();
// ⑦SQL実行+ResultSetをもらう
ResultSet rs = st.executeQuery("SELECT ID,NAME FROM EMP");
// ⑧とりあえず全フェッチ
while(rs.next()) {
//何もしない
}
// ⑨close
st.close();
rs.close();
con.close();
テーブルの容量はDBA_SEGMENTS.BYTESに格納されているので、
SEGMENT_NAMEにテーブル名を与えればゲットすることが出来る
SELECT SEGMENT_NAME,BYTES
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = :TAB_NAME
BYTESは単位が本当に「バイト」なので、
キロバイトにするなら÷1024
メガバイトにするなら÷(1024^2)
ギガバイトにするなら÷(1024^3)
をする必要がある。
取得してきた後にEXCELとか電卓とかで計算してもいいけど
面倒な場合は取得するときに割ればよい。
SELECT SEGMENT_NAME ,BYTES ,BYTES/1024 K_BYTES ,BYTES/1024/1024 M_BYTES ,BYTES/1024/1024/1024 G_BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME = :TAB_NAME
なお、パーティション表の場合は、
SEGMENT_NAMEがテーブル名
PARTITION_NAMEがパーティション名になり、
単にSEGMENT_NAMEだけ与えただけではパーティションの数だけ結果が返ってくる。
SELECT項目にPARTITION_NAMEを加えた方が良い。
続きがあります
1つのトランザクション内で
DBリンク経由等から異なるインスタンスのデータを"参照"(SELECT)した場合、
そのトランザクションは「分散トランザクション」になる。
通常のJDBCからの接続(OracleDataSourceとか)でもそうなる。
ただOracleXADataSourceからConnectionつくると
「別インスタンスの」という条件を満たさなくても分散トランザクションになる。
UNIXのwhileはこんな感じで書く。
while [ 判定文 ]
do
#処理を記述
done
while :
do
#処理を記述
done
後者の方は判定文がないので無限ループになる。
意図的に中でbreakしないと抜けられない。
ただ個人的にはよく後者の方を使う。