Skip to content

Oracle

Install

Oracle 12c + CentOS 7

Oracle 12c + Oracle Linux7.1

Virtual Box

Docker

起動・停止

環境変数

SQL*Plus

set head off      -- テーブルヘッダ非表示
set pagesize 0    -- カラム名なし
set lin 300       -- コンソール横幅
set verify off    -- 置換旧新非表示
set feedback off  -- 1行が作成〜
set define off    -- 置換変数'&'無効

コマンドプロンプト

-- Shift JIS
set NLS_LANG=Japanese_Japan.JA16SJIS

-- UTF-8
set NLS_LANG=Japanese_Japan.AL32UTF8
- ターミナルの文字コードにも注意 - ConEmu | Unicode Support

SQL

調査

スキーマ一覧

select username from dba_users;

テーブルの存在確認

select table_name from user_tables where table_name like 'TBL%';

Row count of all tables

select table_name, num_rows from user_tables order by 2 desc;

定義情報

select * from USER_TABLES;
select * from USER_VIEWS;
select * from USER_SYNONYMS;
select * from USER_TRIGGERS;
select * from USER_SEQUENCES;
select * from USER_PROCEDURES;
select * from USER_SOURCE;

select * from DBA_TABLES where OWNER = 'SCOTT';
select * from DBA_VIEWS where OWNER = 'SCOTT';
select * from DBA_SYNONYMS where OWNER = 'SCOTT';
select * from DBA_TRIGGERS where OWNER = 'SCOTT';
select * from DBA_SEQUENCES where OWNER = 'SCOTT';
select * from DBA_PROCEDURES where OWNER = 'SCOTT';
select * from DBA_SOURCE where OWNER = 'SCOTT';

ファイル出力

spool log.txt
spool off

コマンドプロントのコマンド実行

SQL> host dir

件数制限

where ROWNUM = 1

パスワード期限切れ(ORA-28001)

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

alter user USR identified by PWD;
alter user USR account unlock;

パスワード期限切れ予告(ORA-28002)

ORA-28002: パスワードは、n日以内に期限切れになります。

-- デフォルトプロファイルのパスワード有効期限を無期限に設定
alter profile default limit password_life_time unlimited;

Invalid objects

select object_name, status from user_objects where status <> 'VALID';

TNS Listener

コマンド

> lsnrctl start  リスナーの開始

> lsnrctl stop   リスナーの停止

listener.ora (Sample)

# listener.ora Network Configuration File: D:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = ORCL)
      (ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
    )
  )

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

ADR_BASE_LISTENER = D:\oracle

ORA-12514

sqlplus system/system

SQL> (接続成功)


sqlplus system/system@orcl

ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません
  • SID_LIST_LISTENER セクションの追記
    • SID: ORCL と紐付いていないためエラーが起きる。
      Oracleインストール時、リスナー構築の実行タイミングによって発生することがある。

ORA-12162

ORA-12170

ERROR:
ORA-12170: TNS: 接続タイムアウトが発生しました。
ポートの問題の可能性。1521はリスナーにつなぐためだけのものなので、それだけでは足りない。

ORA-12541

ERROR:
ORA-12541: TNS: リスナーがありません
(HOST = localhost)となっていたら、コンピュータ名を設定する。
※外から見てこのOracleサーバが特定できる必要がある

UTL_FILE_DIR

設定変更

alter system set UTL_FILE_DIR='*'

設定確認

select name, value from V$PARAMETER2 where name='utl_file_dir';

権限付与

grant execute on utl_file to USERNAME;

ディレクトリオブジェクト

存在確認 ※SYSTEMユーザで実行

select * from DBA_DIRECTORIES;

作成

create directory NAMEOF_DATAPUMP_DIR as 'C:¥datapump';

権限付与

grant read, write on directory NAMEOF_DATAPUMP_DIR to USERNAME;

権限付与されているもの一覧 ※確認したいユーザで実行

select * from ALL_DIRECTORIES;

テーブル定義情報取得SQL

SELECT
   B.TABLE_TYPE  AS "種別"
  ,C.TABLE_NAME  AS "テーブル名"
  ,B.COMMENTS    AS "テーブルコメント"
  ,U.COMMENTS    AS "カラムコメント"
  ,C.COLUMN_NAME AS "カラム名"
  ,C.DATA_TYPE   AS "データ型"
  ,CASE
     WHEN C.DATA_TYPE = 'NUMBER' THEN '' || C.DATA_PRECISION || ',' || C.DATA_SCALE || ''
     WHEN C.CHAR_USED = 'C'      THEN '' || C.CHAR_LENGTH    || ''
     WHEN C.CHAR_USED = 'B'      THEN '' || C.CHAR_LENGTH    || ''
     ELSE NULL
   END AS "桁数"
  ,DECODE(P.POSITION, NULL, NULL, 'PK') AS "PK"
  ,DECODE(C.NULLABLE,'N','Yes',NULL) AS "NOTNULL"
--  ,T.TABLESPACE_NAME
FROM
  USER_TAB_COLUMNS C
  LEFT OUTER JOIN USER_TABLES T
    ON (C.TABLE_NAME = T.TABLE_NAME)
  LEFT OUTER JOIN USER_COL_COMMENTS U
    ON (U.TABLE_NAME=C.TABLE_NAME AND U.COLUMN_NAME = C.COLUMN_NAME)
  LEFT OUTER JOIN USER_TAB_COMMENTS B
    ON (B.TABLE_NAME=C.TABLE_NAME)
  LEFT OUTER JOIN USER_CONS_COLUMNS P
    ON (P.TABLE_NAME=C.TABLE_NAME AND P.COLUMN_NAME = C.COLUMN_NAME AND P.POSITION IS NOT NULL)
WHERE
  C.TABLE_NAME not like 'SYS_EXPORT_SCHEMA%'
--  AND C.TABLE_NAME like :tbl_nm
ORDER BY
    B.TABLE_TYPE
  , C.TABLE_NAME
  , C.COLUMN_ID
/

Tips

is_numeric / is_number 関数

といったものは存在しない。やろうとしたのは、文字用のカラムで合計を取得しようとしたところ数値以外の文字列が混入したので取り除こうとした。 対処としては気休め程度に以下の条件を指定。おそらく先頭文字列のコードで判断している。

where chr(48) < ITEM and ITEM < chr(57)