役立つSQL技 for オラクル
索引
・【テーブル構造取得】
・【インデックス情報を取得】
・【ビューの定義情報取得】
・【マテリアライズド・ビューの定義情報取得】
・【基本的な再帰(ANSI SQL)】
・【連続レコード発生】
・【CSV形式のデータを各フィールドに分解】
・【カラムのコメントを取得】
・【全角文字を半角文字に変換】
・【SID 取得】
・【ユーザー名 取得】
・【アプリケーション 取得】
・【セッション情報 取得】
・【実行中のSQL取得(のぞき見)】
・【実行中のSQL取得(集約)】
・【実行中のSQL取得(集約)古いやり方Oracleの制約により完全な復元が困難】
・【セッション実行状況取得】
・【実行中のSQLの実行計画を取得】
・【実行プラン取得(コミットコントロールの元で実施がおすすめ、取得完了後にロールバックが必要、消し忘れを防ぐ)】

索引へ

【テーブル構造取得】

SELECT distinct
/* テーブル構造取得 */
 a.TABLE_NAME 
,a.COLUMN_ID 
,a.COLUMN_NAME 
,a.DATA_TYPE 
,a.DATA_LENGTH 
,a.DATA_PRECISION 
,a.DATA_SCALE 
,case when a.NULLABLE = 'Y' then 'NULL' when a.NULLABLE = 'N' then 'NOT NULL' end as NULLS 
,a.CHARACTER_SET_NAME 
,cast(substr(b.COMMENTS,1,128) as varchar2(255)) as COMMENTS 
FROM ALL_TAB_COLUMNS a 
left outer join USER_COL_COMMENTS b 
on a.TABLE_NAME = b.TABLE_NAME 
and a.COLUMN_NAME = b.COLUMN_NAME 
WHERE 1=1
--and   a.TABLE_NAME like 'xxxxxxxxxx' 
ORDER BY a.TABLE_NAME,a.COLUMN_ID
TABLE_NAMEに指定したテーブルの構造を取得

索引へ

【インデックス情報を取得】

SELECT
/* インデックス情報を取得 */
 ALL_IND_COLUMNS.TABLE_NAME
,ALL_IND_COLUMNS.INDEX_NAME
,ALL_IND_COLUMNS.COLUMN_POSITION
,SUBSTR(ALL_IND_COLUMNS.COLUMN_NAME,1,64) as COLUMN_NAME
,ALL_INDEXES.UNIQUENESS
from ALL_IND_COLUMNS
left outer join ALL_INDEXES
on  ALL_INDEXES.OWNER      = ALL_IND_COLUMNS.INDEX_OWNER
and ALL_INDEXES.INDEX_NAME = ALL_IND_COLUMNS.INDEX_NAME
where 1=1
--and TABLE_NAME = 'xxxxxxxxxx'
ORDER BY
 ALL_IND_COLUMNS.INDEX_OWNER
,ALL_IND_COLUMNS.TABLE_NAME
,ALL_IND_COLUMNS.INDEX_NAME
,ALL_IND_COLUMNS.COLUMN_POSITION
TABLE_NAMEと関係のあるインデックス情報を取得します

索引へ

【ビューの定義情報取得】

select
/* ビューの定義情報取得 */
 OWNER
,VIEW_NAME
,TEXT
,TEXT_VC
,TEXT_LENGTH
,length(TEXT_VC)
,ORIGIN_CON_ID
from ALL_VIEWS
where 1=1
order by
 OWNER
,VIEW_NAME
ビューの定義情報を取得します、
4000バイト以下であれば「TEXT_VC」の内容でOK
4001バイト以上かつ「ORIGIN_CON_ID=3」であれば「TEXT」の内容を使うのがおすすめ

索引へ

【マテリアライズド・ビューの定義情報取得】

select
/* マテリアライズド・ビューの定義情報取得 */
 OWNER
,MVIEW_NAME
,QUERY
from ALL_MVIEWS
where 1=1
マテリアライズド・ビューの定義情報を取得します、

索引へ

【基本的な再帰(ANSI SQL)】

--select
/* 基本的な再帰(ANSI SQL) */
with ListNo(p)
as
(
  select 1 as p from dual
  union all
  select p+1 from ListNo
  where p < 5
)
select p from ListNo
Oracle Database 11g R2 以降でのバージョンでのみ実行可能(らしい?)

索引へ

【連続レコード発生】

select
 RowNum 
from dual
connect by Level <= 100
1〜100の番号を持つレコードを発生させています
年間の日付を作る時などに便利
↓↓↓こんな感じ↓↓↓
select
/* 連続レコード発生 */
cast('20120101' as date) + RowNum-1 as 日付 
from dual
where cast('20120101' as date) + RowNum-1 < cast('20130101' as date)
connect by Level <= 400

索引へ

【CSV形式のデータを各フィールドに分解】

--select
/* CSV形式のデータを各フィールドに分解 */
with dt as (
select '123,456,789,"ABC","E,"","",FG","HIJ",0' as csv from dual union all
select '000,456,789,"ABC","E,"","",FG","HIJ",0' as csv from dual union all
select '999,456,789,"ABC","E,"","",FG","HIJ",0' as csv from dual union all
select '789,456,789,"ABC","E,"","",FG","HIJ",0' as csv from dual union all
select '123,456,789,"ABC","E,"","",FG","HIJ",0' as csv from dual
),
dta as (
  select
   r 
  ,csv
  ,no
  ,substr(csv,no,1) as c
  from (select RowNum as r,','||csv||',' as csv from dt) dt
  left outer join (select RowNum as no from dual connect by Level <= 400) b
  on no <= length(csv)
)
select
 R
,CSV
,max(case when G_SEQ = 001 then CSV_ZZZ end) as val001
,max(case when G_SEQ = 002 then CSV_ZZZ end) as val002
,max(case when G_SEQ = 003 then CSV_ZZZ end) as val003
,max(case when G_SEQ = 004 then CSV_ZZZ end) as val004
,max(case when G_SEQ = 005 then CSV_ZZZ end) as val005
,max(case when G_SEQ = 006 then CSV_ZZZ end) as val006
,max(case when G_SEQ = 007 then CSV_ZZZ end) as val007
,max(case when G_SEQ = 008 then CSV_ZZZ end) as val008
,max(case when G_SEQ = 009 then CSV_ZZZ end) as val009
,max(case when G_SEQ = 010 then CSV_ZZZ end) as val010
,max(case when G_SEQ = 011 then CSV_ZZZ end) as val011
,max(case when G_SEQ = 012 then CSV_ZZZ end) as val012
,max(case when G_SEQ = 013 then CSV_ZZZ end) as val013
,max(case when G_SEQ = 014 then CSV_ZZZ end) as val014
,max(case when G_SEQ = 015 then CSV_ZZZ end) as val015
from (
  select
   R
  ,CSV
  ,NO
  ,ROW_NUMBER() OVER (PARTITION BY R,CSV ORDER BY NO) as G_SEQ
  ,CSV_ZZZ
  ,NEXT_NO
  from (
    select
     R
    ,CSV
    ,NO
    ,ROW_NUMBER() OVER (PARTITION BY R,CSV,(no + length(CSV_ZZZ)) ORDER BY NO) as g_seq
    ,cast(replace(replace(replace(substr(CSV_ZZZ,2),'""','^%%^'),'"',''),'^%%^','"') as varchar(50)) as CSV_ZZZ
    ,no + length(CSV_ZZZ) as next_no
    from (
      select 
       R
      ,substr(CSV,2,length(CSV)-2) as CSV
      ,NO
      ,case
       when substr(csv,no,2) = ',"' then substr(csv,no,instr(replace(substr(csv,no),'""','^^'),'",')) 
       else                              substr(csv,no,instr(replace(substr(csv,no+1),'""','^^'),','))
       end as CSV_zzz
      from dta a
      where substr(csv,no,1) = ','
    ) a
  ) a
  where g_seq = 1
)
group by
 R
,CSV
order by 1,2,3
1つのフィールドに入っているCSV形式のデータを個別のフィールドに分解し格納
上記のSQLはそのまま実行できます。
上記SQL with句の「dt」ビューを実際のテーブルに置き換えればフィールド分割可能

索引へ

【カラムのコメントを取得】

SELECT distinct 
/* カラムのコメントを取得 */
 a.TABLE_NAME 
,a.COLUMN_NAME 
,cast(substr(b.COMMENTS,1,128) as varchar2(255)) as COMMENTS 
FROM ALL_TAB_COLUMNS a 
left outer join USER_COL_COMMENTS b 
on  a.TABLE_NAME  = b.TABLE_NAME 
and a.COLUMN_NAME = b.COLUMN_NAME 
WHERE a.TABLE_NAME like '%xxxxx%' 
ORDER BY
 a.TABLE_NAME
,a.COLUMN_ID 





索引へ

【全角文字を半角文字に変換】

--select
with 変換表
as
(
      select cast(' ' as varchar2(2)) as 全角,cast(' '  as varchar2(2)) as 半角 from dual
union select cast('ァ' as varchar2(2)) as 全角,cast('ァ'  as varchar2(2)) as 半角 from dual
union select cast('ア' as varchar2(2)) as 全角,cast('ア'  as varchar2(2)) as 半角 from dual
union select cast('ィ' as varchar2(2)) as 全角,cast('ィ'  as varchar2(2)) as 半角 from dual
union select cast('イ' as varchar2(2)) as 全角,cast('イ'  as varchar2(2)) as 半角 from dual
union select cast('ゥ' as varchar2(2)) as 全角,cast('ゥ'  as varchar2(2)) as 半角 from dual
union select cast('ウ' as varchar2(2)) as 全角,cast('ウ'  as varchar2(2)) as 半角 from dual
union select cast('ェ' as varchar2(2)) as 全角,cast('ェ'  as varchar2(2)) as 半角 from dual
union select cast('エ' as varchar2(2)) as 全角,cast('エ'  as varchar2(2)) as 半角 from dual
union select cast('ォ' as varchar2(2)) as 全角,cast('ォ'  as varchar2(2)) as 半角 from dual
union select cast('オ' as varchar2(2)) as 全角,cast('オ'  as varchar2(2)) as 半角 from dual
union select cast('カ' as varchar2(2)) as 全角,cast('カ'  as varchar2(2)) as 半角 from dual
union select cast('ガ' as varchar2(2)) as 全角,cast('ガ' as varchar2(2)) as 半角 from dual
union select cast('キ' as varchar2(2)) as 全角,cast('キ'  as varchar2(2)) as 半角 from dual
union select cast('ギ' as varchar2(2)) as 全角,cast('ギ' as varchar2(2)) as 半角 from dual
union select cast('ク' as varchar2(2)) as 全角,cast('ク'  as varchar2(2)) as 半角 from dual
union select cast('グ' as varchar2(2)) as 全角,cast('グ' as varchar2(2)) as 半角 from dual
union select cast('ケ' as varchar2(2)) as 全角,cast('ケ'  as varchar2(2)) as 半角 from dual
union select cast('ゲ' as varchar2(2)) as 全角,cast('ゲ' as varchar2(2)) as 半角 from dual
union select cast('コ' as varchar2(2)) as 全角,cast('コ'  as varchar2(2)) as 半角 from dual
union select cast('ゴ' as varchar2(2)) as 全角,cast('ゴ' as varchar2(2)) as 半角 from dual
union select cast('サ' as varchar2(2)) as 全角,cast('サ'  as varchar2(2)) as 半角 from dual
union select cast('ザ' as varchar2(2)) as 全角,cast('ザ' as varchar2(2)) as 半角 from dual
union select cast('シ' as varchar2(2)) as 全角,cast('シ'  as varchar2(2)) as 半角 from dual
union select cast('ジ' as varchar2(2)) as 全角,cast('ジ' as varchar2(2)) as 半角 from dual
union select cast('ス' as varchar2(2)) as 全角,cast('ス'  as varchar2(2)) as 半角 from dual
union select cast('ズ' as varchar2(2)) as 全角,cast('ズ' as varchar2(2)) as 半角 from dual
union select cast('セ' as varchar2(2)) as 全角,cast('セ'  as varchar2(2)) as 半角 from dual
union select cast('ゼ' as varchar2(2)) as 全角,cast('ゼ' as varchar2(2)) as 半角 from dual
union select cast('ソ' as varchar2(2)) as 全角,cast('ソ'  as varchar2(2)) as 半角 from dual
union select cast('ゾ' as varchar2(2)) as 全角,cast('ゾ' as varchar2(2)) as 半角 from dual
union select cast('タ' as varchar2(2)) as 全角,cast('タ'  as varchar2(2)) as 半角 from dual
union select cast('ダ' as varchar2(2)) as 全角,cast('ダ' as varchar2(2)) as 半角 from dual
union select cast('チ' as varchar2(2)) as 全角,cast('チ'  as varchar2(2)) as 半角 from dual
union select cast('ヂ' as varchar2(2)) as 全角,cast('ヂ' as varchar2(2)) as 半角 from dual
union select cast('ッ' as varchar2(2)) as 全角,cast('ッ'  as varchar2(2)) as 半角 from dual
union select cast('ツ' as varchar2(2)) as 全角,cast('ツ'  as varchar2(2)) as 半角 from dual
union select cast('ヅ' as varchar2(2)) as 全角,cast('ヅ' as varchar2(2)) as 半角 from dual
union select cast('テ' as varchar2(2)) as 全角,cast('テ'  as varchar2(2)) as 半角 from dual
union select cast('デ' as varchar2(2)) as 全角,cast('デ' as varchar2(2)) as 半角 from dual
union select cast('ト' as varchar2(2)) as 全角,cast('ト'  as varchar2(2)) as 半角 from dual
union select cast('ド' as varchar2(2)) as 全角,cast('ド' as varchar2(2)) as 半角 from dual
union select cast('ナ' as varchar2(2)) as 全角,cast('ナ'  as varchar2(2)) as 半角 from dual
union select cast('ニ' as varchar2(2)) as 全角,cast('ニ'  as varchar2(2)) as 半角 from dual
union select cast('ヌ' as varchar2(2)) as 全角,cast('ヌ'  as varchar2(2)) as 半角 from dual
union select cast('ネ' as varchar2(2)) as 全角,cast('ネ'  as varchar2(2)) as 半角 from dual
union select cast('ノ' as varchar2(2)) as 全角,cast('ノ'  as varchar2(2)) as 半角 from dual
union select cast('ハ' as varchar2(2)) as 全角,cast('ハ'  as varchar2(2)) as 半角 from dual
union select cast('バ' as varchar2(2)) as 全角,cast('バ' as varchar2(2)) as 半角 from dual
union select cast('パ' as varchar2(2)) as 全角,cast('パ' as varchar2(2)) as 半角 from dual
union select cast('ヒ' as varchar2(2)) as 全角,cast('ヒ'  as varchar2(2)) as 半角 from dual
union select cast('ビ' as varchar2(2)) as 全角,cast('ビ' as varchar2(2)) as 半角 from dual
union select cast('ピ' as varchar2(2)) as 全角,cast('ピ' as varchar2(2)) as 半角 from dual
union select cast('フ' as varchar2(2)) as 全角,cast('フ'  as varchar2(2)) as 半角 from dual
union select cast('ブ' as varchar2(2)) as 全角,cast('ブ' as varchar2(2)) as 半角 from dual
union select cast('プ' as varchar2(2)) as 全角,cast('プ' as varchar2(2)) as 半角 from dual
union select cast('ヘ' as varchar2(2)) as 全角,cast('ヘ'  as varchar2(2)) as 半角 from dual
union select cast('ベ' as varchar2(2)) as 全角,cast('ベ' as varchar2(2)) as 半角 from dual
union select cast('ペ' as varchar2(2)) as 全角,cast('ペ' as varchar2(2)) as 半角 from dual
union select cast('ホ' as varchar2(2)) as 全角,cast('ホ'  as varchar2(2)) as 半角 from dual
union select cast('ボ' as varchar2(2)) as 全角,cast('ボ' as varchar2(2)) as 半角 from dual
union select cast('ポ' as varchar2(2)) as 全角,cast('ポ' as varchar2(2)) as 半角 from dual
union select cast('マ' as varchar2(2)) as 全角,cast('マ'  as varchar2(2)) as 半角 from dual
union select cast('ミ' as varchar2(2)) as 全角,cast('ミ'  as varchar2(2)) as 半角 from dual
union select cast('ム' as varchar2(2)) as 全角,cast('ム'  as varchar2(2)) as 半角 from dual
union select cast('メ' as varchar2(2)) as 全角,cast('メ'  as varchar2(2)) as 半角 from dual
union select cast('モ' as varchar2(2)) as 全角,cast('モ'  as varchar2(2)) as 半角 from dual
union select cast('ャ' as varchar2(2)) as 全角,cast('ャ'  as varchar2(2)) as 半角 from dual
union select cast('ヤ' as varchar2(2)) as 全角,cast('ヤ'  as varchar2(2)) as 半角 from dual
union select cast('ュ' as varchar2(2)) as 全角,cast('ュ'  as varchar2(2)) as 半角 from dual
union select cast('ユ' as varchar2(2)) as 全角,cast('ユ'  as varchar2(2)) as 半角 from dual
union select cast('ョ' as varchar2(2)) as 全角,cast('ョ'  as varchar2(2)) as 半角 from dual
union select cast('ヨ' as varchar2(2)) as 全角,cast('ヨ'  as varchar2(2)) as 半角 from dual
union select cast('ラ' as varchar2(2)) as 全角,cast('ラ'  as varchar2(2)) as 半角 from dual
union select cast('リ' as varchar2(2)) as 全角,cast('リ'  as varchar2(2)) as 半角 from dual
union select cast('ル' as varchar2(2)) as 全角,cast('ル'  as varchar2(2)) as 半角 from dual
union select cast('レ' as varchar2(2)) as 全角,cast('レ'  as varchar2(2)) as 半角 from dual
union select cast('ロ' as varchar2(2)) as 全角,cast('ロ'  as varchar2(2)) as 半角 from dual
union select cast('ヮ' as varchar2(2)) as 全角,cast('ワ'  as varchar2(2)) as 半角 from dual
union select cast('ワ' as varchar2(2)) as 全角,cast('ワ'  as varchar2(2)) as 半角 from dual
union select cast('ヰ' as varchar2(2)) as 全角,cast('イ'  as varchar2(2)) as 半角 from dual
union select cast('ヱ' as varchar2(2)) as 全角,cast('エ'  as varchar2(2)) as 半角 from dual
union select cast('ヲ' as varchar2(2)) as 全角,cast('ヲ'  as varchar2(2)) as 半角 from dual
union select cast('ン' as varchar2(2)) as 全角,cast('ン'  as varchar2(2)) as 半角 from dual
union select cast('ヴ' as varchar2(2)) as 全角,cast('ヴ' as varchar2(2)) as 半角 from dual
union select cast('ヵ' as varchar2(2)) as 全角,cast('カ'  as varchar2(2)) as 半角 from dual
union select cast('ヶ' as varchar2(2)) as 全角,cast('ケ'  as varchar2(2)) as 半角 from dual
union select cast('!' as varchar2(2)) as 全角,cast('!'  as varchar2(2)) as 半角 from dual
union select cast('”' as varchar2(2)) as 全角,cast('"'  as varchar2(2)) as 半角 from dual
union select cast('#' as varchar2(2)) as 全角,cast('#'  as varchar2(2)) as 半角 from dual
union select cast('$' as varchar2(2)) as 全角,cast('$'  as varchar2(2)) as 半角 from dual
union select cast('%' as varchar2(2)) as 全角,cast('%'  as varchar2(2)) as 半角 from dual
union select cast('&' as varchar2(2)) as 全角,cast('&'  as varchar2(2)) as 半角 from dual
union select cast('’' as varchar2(2)) as 全角,cast('''' as varchar2(2)) as 半角 from dual
union select cast('(' as varchar2(2)) as 全角,cast('('  as varchar2(2)) as 半角 from dual
union select cast(')' as varchar2(2)) as 全角,cast(')'  as varchar2(2)) as 半角 from dual
union select cast('*' as varchar2(2)) as 全角,cast('*'  as varchar2(2)) as 半角 from dual
union select cast('+' as varchar2(2)) as 全角,cast('+'  as varchar2(2)) as 半角 from dual
union select cast(',' as varchar2(2)) as 全角,cast(','  as varchar2(2)) as 半角 from dual
union select cast('−' as varchar2(2)) as 全角,cast('-'  as varchar2(2)) as 半角 from dual
union select cast('.' as varchar2(2)) as 全角,cast('.'  as varchar2(2)) as 半角 from dual
union select cast('/' as varchar2(2)) as 全角,cast('/'  as varchar2(2)) as 半角 from dual
union select cast('0' as varchar2(2)) as 全角,cast('0'  as varchar2(2)) as 半角 from dual
union select cast('1' as varchar2(2)) as 全角,cast('1'  as varchar2(2)) as 半角 from dual
union select cast('2' as varchar2(2)) as 全角,cast('2'  as varchar2(2)) as 半角 from dual
union select cast('3' as varchar2(2)) as 全角,cast('3'  as varchar2(2)) as 半角 from dual
union select cast('4' as varchar2(2)) as 全角,cast('4'  as varchar2(2)) as 半角 from dual
union select cast('5' as varchar2(2)) as 全角,cast('5'  as varchar2(2)) as 半角 from dual
union select cast('6' as varchar2(2)) as 全角,cast('6'  as varchar2(2)) as 半角 from dual
union select cast('7' as varchar2(2)) as 全角,cast('7'  as varchar2(2)) as 半角 from dual
union select cast('8' as varchar2(2)) as 全角,cast('8'  as varchar2(2)) as 半角 from dual
union select cast('9' as varchar2(2)) as 全角,cast('9'  as varchar2(2)) as 半角 from dual
union select cast(':' as varchar2(2)) as 全角,cast(':'  as varchar2(2)) as 半角 from dual
union select cast(';' as varchar2(2)) as 全角,cast(';'  as varchar2(2)) as 半角 from dual
union select cast('<' as varchar2(2)) as 全角,cast('<'  as varchar2(2)) as 半角 from dual
union select cast('=' as varchar2(2)) as 全角,cast('='  as varchar2(2)) as 半角 from dual
union select cast('>' as varchar2(2)) as 全角,cast('>'  as varchar2(2)) as 半角 from dual
union select cast('?' as varchar2(2)) as 全角,cast('?'  as varchar2(2)) as 半角 from dual
union select cast('@' as varchar2(2)) as 全角,cast('@'  as varchar2(2)) as 半角 from dual
union select cast('A' as varchar2(2)) as 全角,cast('A'  as varchar2(2)) as 半角 from dual
union select cast('B' as varchar2(2)) as 全角,cast('B'  as varchar2(2)) as 半角 from dual
union select cast('C' as varchar2(2)) as 全角,cast('C'  as varchar2(2)) as 半角 from dual
union select cast('D' as varchar2(2)) as 全角,cast('D'  as varchar2(2)) as 半角 from dual
union select cast('E' as varchar2(2)) as 全角,cast('E'  as varchar2(2)) as 半角 from dual
union select cast('F' as varchar2(2)) as 全角,cast('F'  as varchar2(2)) as 半角 from dual
union select cast('G' as varchar2(2)) as 全角,cast('G'  as varchar2(2)) as 半角 from dual
union select cast('H' as varchar2(2)) as 全角,cast('H'  as varchar2(2)) as 半角 from dual
union select cast('I' as varchar2(2)) as 全角,cast('I'  as varchar2(2)) as 半角 from dual
union select cast('J' as varchar2(2)) as 全角,cast('J'  as varchar2(2)) as 半角 from dual
union select cast('K' as varchar2(2)) as 全角,cast('K'  as varchar2(2)) as 半角 from dual
union select cast('L' as varchar2(2)) as 全角,cast('L'  as varchar2(2)) as 半角 from dual
union select cast('M' as varchar2(2)) as 全角,cast('M'  as varchar2(2)) as 半角 from dual
union select cast('N' as varchar2(2)) as 全角,cast('N'  as varchar2(2)) as 半角 from dual
union select cast('O' as varchar2(2)) as 全角,cast('O'  as varchar2(2)) as 半角 from dual
union select cast('P' as varchar2(2)) as 全角,cast('P'  as varchar2(2)) as 半角 from dual
union select cast('Q' as varchar2(2)) as 全角,cast('Q'  as varchar2(2)) as 半角 from dual
union select cast('R' as varchar2(2)) as 全角,cast('R'  as varchar2(2)) as 半角 from dual
union select cast('S' as varchar2(2)) as 全角,cast('S'  as varchar2(2)) as 半角 from dual
union select cast('T' as varchar2(2)) as 全角,cast('T'  as varchar2(2)) as 半角 from dual
union select cast('U' as varchar2(2)) as 全角,cast('U'  as varchar2(2)) as 半角 from dual
union select cast('V' as varchar2(2)) as 全角,cast('V'  as varchar2(2)) as 半角 from dual
union select cast('W' as varchar2(2)) as 全角,cast('W'  as varchar2(2)) as 半角 from dual
union select cast('X' as varchar2(2)) as 全角,cast('X'  as varchar2(2)) as 半角 from dual
union select cast('Y' as varchar2(2)) as 全角,cast('Y'  as varchar2(2)) as 半角 from dual
union select cast('Z' as varchar2(2)) as 全角,cast('Z'  as varchar2(2)) as 半角 from dual
union select cast('[' as varchar2(2)) as 全角,cast('['  as varchar2(2)) as 半角 from dual
union select cast('¥' as varchar2(2)) as 全角,cast('\'  as varchar2(2)) as 半角 from dual
union select cast(']' as varchar2(2)) as 全角,cast(']'  as varchar2(2)) as 半角 from dual
union select cast('^' as varchar2(2)) as 全角,cast('^'  as varchar2(2)) as 半角 from dual
union select cast('_' as varchar2(2)) as 全角,cast('_'  as varchar2(2)) as 半角 from dual
union select cast('‘' as varchar2(2)) as 全角,cast('`'  as varchar2(2)) as 半角 from dual
union select cast('a' as varchar2(2)) as 全角,cast('a'  as varchar2(2)) as 半角 from dual
union select cast('b' as varchar2(2)) as 全角,cast('b'  as varchar2(2)) as 半角 from dual
union select cast('c' as varchar2(2)) as 全角,cast('c'  as varchar2(2)) as 半角 from dual
union select cast('d' as varchar2(2)) as 全角,cast('d'  as varchar2(2)) as 半角 from dual
union select cast('e' as varchar2(2)) as 全角,cast('e'  as varchar2(2)) as 半角 from dual
union select cast('f' as varchar2(2)) as 全角,cast('f'  as varchar2(2)) as 半角 from dual
union select cast('g' as varchar2(2)) as 全角,cast('g'  as varchar2(2)) as 半角 from dual
union select cast('h' as varchar2(2)) as 全角,cast('h'  as varchar2(2)) as 半角 from dual
union select cast('i' as varchar2(2)) as 全角,cast('i'  as varchar2(2)) as 半角 from dual
union select cast('j' as varchar2(2)) as 全角,cast('j'  as varchar2(2)) as 半角 from dual
union select cast('k' as varchar2(2)) as 全角,cast('k'  as varchar2(2)) as 半角 from dual
union select cast('l' as varchar2(2)) as 全角,cast('l'  as varchar2(2)) as 半角 from dual
union select cast('m' as varchar2(2)) as 全角,cast('m'  as varchar2(2)) as 半角 from dual
union select cast('n' as varchar2(2)) as 全角,cast('n'  as varchar2(2)) as 半角 from dual
union select cast('o' as varchar2(2)) as 全角,cast('o'  as varchar2(2)) as 半角 from dual
union select cast('p' as varchar2(2)) as 全角,cast('p'  as varchar2(2)) as 半角 from dual
union select cast('q' as varchar2(2)) as 全角,cast('q'  as varchar2(2)) as 半角 from dual
union select cast('r' as varchar2(2)) as 全角,cast('r'  as varchar2(2)) as 半角 from dual
union select cast('s' as varchar2(2)) as 全角,cast('s'  as varchar2(2)) as 半角 from dual
union select cast('t' as varchar2(2)) as 全角,cast('t'  as varchar2(2)) as 半角 from dual
union select cast('u' as varchar2(2)) as 全角,cast('u'  as varchar2(2)) as 半角 from dual
union select cast('v' as varchar2(2)) as 全角,cast('v'  as varchar2(2)) as 半角 from dual
union select cast('w' as varchar2(2)) as 全角,cast('w'  as varchar2(2)) as 半角 from dual
union select cast('x' as varchar2(2)) as 全角,cast('x'  as varchar2(2)) as 半角 from dual
union select cast('y' as varchar2(2)) as 全角,cast('y'  as varchar2(2)) as 半角 from dual
union select cast('z' as varchar2(2)) as 全角,cast('z'  as varchar2(2)) as 半角 from dual
union select cast('{' as varchar2(2)) as 全角,cast('{'  as varchar2(2)) as 半角 from dual
union select cast('|' as varchar2(2)) as 全角,cast('|'  as varchar2(2)) as 半角 from dual
union select cast('}' as varchar2(2)) as 全角,cast('}'  as varchar2(2)) as 半角 from dual
union select cast(' ̄' as varchar2(2)) as 全角,cast('~'  as varchar2(2)) as 半角 from dual
)
,pos as 
(
select
 RowNum as p 
,RowNum+1 as nx 
from dual
connect by Level <= 300
)
,args as
(
select 'タダsyuu' as in_val from dual
)
select
 cast(replace(VAL,'^','') as varchar(64)) out_val 
from (
  select
   p
  ,nx
  ,ROW_NUMBER() OVER (PARTITION BY in_val ORDER BY p desc) as n
  ,sys_connect_by_path(nvl(半角,substr(in_val,p,1)),'^') as val 
  from args
  cross join pos
  left outer join 変換表
  on 全角 = substr(in_val,p,1)
  where p<=length(in_val)
  start with p=1
  connect by prior nx = p
) a
where n =1
上記のSQLはそのまま実行できます。
in_valに全角文字を含む文字列を設定すれば半角に変換された文字列が取得できます
UTL_I18N.TRANSLITERATE関数が少々遅いようなのでSQLのみで変換可能にしてみました
iPad等では半角カタカナの入力ができないようなので検索の際半角に変換するのに使えるかも、

索引へ

【SID 取得】

select LPAD(' ',3-length(SID),' ')||SID||' '||OSUSER as SID from V$SESSION




索引へ

【ユーザー名 取得】

select distinct OSUSER as OSUSER from V$SESSION




索引へ

【アプリケーション 取得】

select distinct PROGRAM as PROGRAM from V$SESSION




索引へ

【セッション情報 取得】

select SID,USERNAME,OSUSER,MACHINE,PROGRAM,LOGON_TIME from V$SESSION




索引へ

【実行中のSQL取得(のぞき見)】

select 
 sid 
,piece 
,osuser 
,username 
,MACHINE 
,PROGRAM 
,LOGON_TIME 
,replace(replace(sql_text,CHR(13)||CHR(10),CHR(10)),CHR(10),CHR(13)||CHR(10)) as sql_text 
from v$session s 
left outer join V$SQLTEXT_WITH_NEWLINES t 
on s.sql_address =t.address 
where 1=1
--and sid=  " + SIDStr + " 
and sid=  623 
order by 
 sid 
,address 
,piece 





索引へ

【実行中のSQL取得(集約)】

--select 
with sql_T 
as 
( 
  select 
   sid 
  ,piece 
  ,osuser 
  ,username 
  ,MACHINE 
  ,PROGRAM 
  ,LOGON_TIME 
  ,replace(replace(sql_text,CHR(13)||CHR(10),CHR(10)),CHR(10),CHR(13)||CHR(10)) as sql_text 
  from v$session s 
  left outer join V$SQLTEXT_WITH_NEWLINES t 
  on s.sql_address =t.address 
  where 1=1 
  --and sid= " + SIDStr + " 
  --and sid= 748 
) 
SELECT 
 sid 
--,piece 
,osuser 
,username 
,MACHINE 
,PROGRAM 
,LOGON_TIME 
,LISTAGG(sql_text, '') WITHIN GROUP (ORDER BY piece) sql_text 
FROM sql_T 
where sql_text is not null
GROUP by 
 sid 
--,piece 
,osuser 
,username 
,MACHINE 
,PROGRAM 
,LOGON_TIME 





索引へ

【実行中のSQL取得(集約)古いやり方Oracleの制約により完全な復元が困難】

--select
with sql_T
as
(
  select 
   sid 
  ,piece 
  ,piece + 1 as Next_piece
  ,osuser 
  ,username 
  ,MACHINE 
  ,PROGRAM 
  ,LOGON_TIME 
  ,replace(replace(replace(sql_text,CHR(13)||CHR(10),CHR(10)),CHR(10),CHR(13)||CHR(10)),'^','@#@') as sql_text 
  from v$session s 
  left outer join V$SQLTEXT_WITH_NEWLINES t 
  on s.sql_address =t.address 
  where 1=1
  --and sid=  " + SIDStr + " 
  --and sid=  748 
)
,cat_sql
as
(
  select
   sid 
  ,piece 
  ,Next_piece
  ,osuser 
  ,username 
  ,MACHINE 
  ,PROGRAM 
  ,LOGON_TIME 
  ,sql_text 
  ,Level
  ,sys_connect_by_path(sql_text,'^#^') as Path
  from sql_T
  start with piece = 0
  connect by
      prior next_piece = piece
  and prior SID = SID
)
select
 replace(replace(PATH,'^#^',''),'@#@','^')
from cat_sql
where exists(
select
 1
from (
  select
    SID
   ,max(PIECE) as max_PIECE
  from sql_T
  group by
   SID
  ) ex
  where ex.SID     = cat_sql.SID
  and ex.max_PIECE = cat_sql.PIECE
)




索引へ

【セッション実行状況取得】

select 
 a.SID 
,to_char(cast(b.SOFAR/b.TOTALWORK*100 as number(3,0))         ,   '990')||'%'  as 状況 
,to_char(24*60*60*to_number(b.LAST_UPDATE_TIME - b.START_TIME),'99,990')||'秒' as 経過時間 
,cast(substr(b.MESSAGE,1,255) as varchar2(255)) as 実施内容 
from V$SESSION a 
left outer join V$SESSION_LONGOPS b 
on a.PREV_SQL_ADDR = b.SQL_ADDRESS 
where 1=1
--and  a.SID = " + SIDStr +  L" 
and b.TIME_REMAINING > 0 





索引へ

【実行中のSQLの実行計画を取得】

SELECT  
 b.SID 
,b.OSUSER 
,ID 
,cast( 
 substr( 
 LPAD(' ',DEPTH*2,' ') 
 ||case 
 when OPTIMIZER = 'ANALYZED'                             then '<'||OBJECT_NAME||'>' 
 when OPTIMIZER is null      and OBJECT_NAME is not null then '<'||OBJECT_NAME||'>' 
 when OPTIMIZER is null                                  then NULL 
 else null 
 end  
 ||' ' 
 ||case 
 when OPTIMIZER = 'ANALYZED'                         then OPERATION||' '||NVL2( OPTIONS, OPTIONS, null ) 
 when OPTIMIZER is null      and OPTIONS is not null then OPERATION||'('||OPTIONS||')' 
 when OPTIMIZER is null                              then OPERATION 
 else OPERATION 
 end 
 || 
 case 
 when OPTIMIZER <> 'ANALYZED' and OPTIMIZER is not null then '(Optimizer='||OPTIMIZER||')' 
 end 
 ,1,150) 
 as varchar2(100) 
 ) as 計画 
,COST 
,BYTES 
,OPTIMIZER 
FROM v$sql_plan a 
left outer join v$session b 
on  b.SQL_HASH_VALUE = a.hash_value 
and b.SQL_ADDRESS = a.address 
where 1=1 
and a.child_number = 0 
--and b.SID = " + SIDStr + " 
and b.SID is not null
ORDER BY a.ADDRESS, a.HASH_VALUE, a.CHILD_NUMBER, a.ID 




索引へ

【実行プラン取得(コミットコントロールの元で実施がおすすめ、取得完了後にロールバックが必要、消し忘れを防ぐ)】

--実行プラン取得の手順1
EXPLAIN PLAN 
SET STATEMENT_ID = (select username||to_char(sysdate,'yyyymmddhhmiss') from user_users)   --ユニークとなるキーを指定
INTO PLAN_TABLE FOR 
 select * from ALL_VIEWS          --実行計画を取得したいSQLを指定
 
--実行プラン取得の手順2
SELECT 
  case when id=0 then '' else LPAD(' ',2*(level-1)) end 
  ||case  
  when OPTIMIZER = 'ANALYZED'                             then '<'||OBJECT_NAME||'>'  
  when OPTIMIZER is null      and OBJECT_NAME is not null then '<'||OBJECT_NAME||'>'  
  when OPTIMIZER is null                                  then NULL  
  else null  
  end   
  ||' '  
  ||case  
  when OPTIMIZER = 'ANALYZED'                         then OPERATION||' '||NVL2( OPTIONS, OPTIONS, null )  
  when OPTIMIZER is null      and OPTIONS is not null then OPERATION||'('||OPTIONS||')'  
  when OPTIMIZER is null                              then OPERATION  
  else OPERATION  
  end  
  ||  
  case  
  when OPTIMIZER <> 'ANALYZED' and OPTIMIZER is not null then '(Optimizer='||OPTIMIZER||')'  
  end as 計画 
FROM plan_table
CONNECT BY PRIOR id = parent_id
             AND PRIOR TIMESTAMP = TIMESTAMP
             AND statement_id    = (select username||to_char(sysdate,'yyyymmddhhmiss') from user_users) --1で指定したキーを指定
START       WITH id              = 0
             AND statement_id    = (select username||to_char(sysdate,'yyyymmddhhmiss') from user_users) --1で指定したキーを指定






































901