starzware

ITスキル

Oracle

TIPS
件数を絞り込む

ROWNUMを使用して件数を絞り込む
[例]SELECT * FROM EMP WHERE ROWNUM<=100 -- 結果を100件以内とする
月の最終日を取得

SELECT LAST_DAY(SYSDATE) FROM DUAL
数値項目のLIKE

NUMBER列にLIKEした時、いい感じで調整してくれる
カラム QTY
値 20.00, 0.05

以下のいずれの条件でもOK
WHERE QTY LIKE 20
WHERE QTY LIKE 20.00
WHERE QTY LIKE '20%'
WHERE QTY LIKE 20||'%'
WHERE QTY LIKE 0.05
WHERE QTY LIKE .05
WHERE QTY LIKE '0.05%'
WHERE QTY LIKE '0.0%'
管理系SQL

USER_TAB_COLUMNS  : テーブル.カラム情報
USER_TAB_COMMENTS : テーブルのコメント情報
USER_COL_COMMENTS : テーブル.カラムのコメント情報
USER_SOURCE       : ソース関連(PLSQL/FUNCTIONなど)
ファイル作成できるディレクトリの取得

SELECT NAME, VALUE FROM V$PARAMETER2 WHERE NAME='utl_file_dir'
日付の書式
YYYY西暦年 4桁
YY西暦年 下2桁
EEYY和暦年 平成10
EYY和暦年の省略形 H10
MM月(01〜12)
DD日(1〜31)
DDD年の始めからの日数(1〜366)
DY曜日を漢字に変換 日、月、火・・・・・
HH, HH12時間(1〜12)
HH24時間(1〜24)
MI分(0〜59)
SS秒(0〜59)
リコンパイル用SQLを作成する

SELECT
  'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;' AS oname
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND   OBJECT_TYPE != 'PACKAGE BODY'
-- AND object_name LIKE '%xxxxx%'
UNION
SELECT
  'ALTER PACKAGE ' || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE BODY; ' AS oname
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
AND   OBJECT_TYPE = 'PACKAGE BODY'
階層問い合わせ

SELECT
  last_name,
  employee_id,
  manager_id,
  LEVEL,
  SYS_CONNECT_BY_PATH(last_name, '/') "Path"
FROM employees
START WITH employee_id = 100 --(....and )
CONNECT BY PRIOR employee_id = manager_id --(....and )
ORDER SIBLINGS BY last_name
PGA使用量確認SQL

SELECT
  a.SCHEMANAME,
  b.PGA_USED_MEM,
  b.PGA_ALLOC_MEM,
  b.PGA_FREEABLE_MEM,
  b.PGA_MAX_MEM
FROM V$SESSION a, V$SESSION b
WHERE a.TYPE  = 'USER'
AND   a.PADDR = b.ADDR
PGA領域の変更

[UNIX]/dev/shmの値を変更する必要あり
  [/dev/shm] > [memory_max_target]
変更方法)
  sqlplus sys as sysdba
  SQL> ALTER SYSTEM SET memory_max_target='メモリサイズ' SCOPE=SPFILE;
  SQL> SHUTDOWN immediate
  SQL> startup
TABが含まれているかを確認する

select * from data_table where nvl(instr(a.field01,chr(9)),0)>0
参照しているかを確認する(PLSQL->PLSQLでINVALIDになるものを判断する)

select * from USER_SOURCE a
where a.TYPE in ('PACKAGE','PACKAGE BODY') and a.TEXT like '%xxxxxxxxx%'
テーブル一覧

SELECT * FROM ALL_TABLES
現在時刻とフォーマット

-- CURRENT_TIMESTAMPはSYSDATEでも良いがこちらのほうが標準
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL
impdp/expdp(Oracle10g以降)

# インポート
impdp user/password@接続文字列 SCHEMAS=xxxxx directory=DATA_PUMP_DIR logfile=xxxx dumpfile=xxxx TABLE_EXISTS_ACTION=REPLACE
# エクスポート
expdp user/password@接続文字列 SCHEMAS=xxxxx directory=DATA_PUMP_DIR logfile=xxxx dumpfile=xxxx

# デフォルトのDATA_PUMP_DIRの場所を表示する
SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DATA_PUMP_DIR';
アーカイブモードの確認と変更

アーカイブモードの確認
SELECT LOG_MODE FROM V$DATABASE;
アーカイブモードの変更
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG; -- アーカイブモードに変更
ALTER DATABASE NOARCHIVELOG; -- ノーアーカイブモードに変更
ALTER DATABASE OPEN;
アーカイブファイルの操作(RMANでの操作)

(RMANを起動)
RMAN TARGET /
(DBをMOUNTモードで起動) #DBに接続できない場合
RMAN> STARTUP MOUNT;
(アーカイブログファイルの確認)
RMAN> LIST ARCHIVELOG ALL;
[OS上でアーカイブファイルを削除した場合]
(OS上で削除したアーカイブログファイルをOracleの情報から削除するためチェックをつける) 
RMAN> CROSSCHECK ARCHIVELOG ALL;
(CROSSCHECKでチェックをつけたファイルを削除)
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
[RMANでアーカイブファイルを削除する場合]
RMAN> DELETE ARCHIVELOG ALL;
(DBをOPENモードに変更)
RMAN> ALTER DATABASE OPEN;
ORA-19809エラーと対処

Oracleのカバリ・ファイルの制限超過(アーカイブファイル)
  条件
   ARCHIVELOGモードの場合
   (対:NOARCHIVELOGモード)
  事象
   DB接続不能になる
   [ORA-00257]アーカイブ・エラーです。解除されるまで内部接続のみにしてください。
  調査
   alertログを確認する
    <ORACLEORACLEインストールフォルダ>/diag/rdbms/<SID>/<SID>/trace/alert_<SID>.log
  エラーコード
   [ORA-19809]リカバリ・ファイルの制限を超えています
   [ORA-19804]XXXバイトのディスク領域をXXXバイト制限から再利用できません
  原因
    フラッシュリカバリ領域の使用率が100%
     V$RECOVERY_FILE_DESTのSPACE_LIMIT(設定値)とSPACE_USED(使用)が同値状態
  対応
   フラッシュ・リカバリ領域にある不要なファイルを削除する
    RMANのDELETEコマンドを使用してフラッシュ・リカバリ領域にある不要なファイルを削除
   DB_RECOVERY_FILE_DEST_SIZE の値を大きくする
     ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = xxxG;
SQL Plusのオプション

[ログインなし起動] - 起動時にユーザ/パスワードを指定しないことによりhistoryに残さないようにする
sqlplus /nolog