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
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インストール時、リスナー構築の実行タイミングによって発生することがある。
- SID:
ORA-12162¶
ORA-12170¶
ERROR: ORA-12170: TNS: 接続タイムアウトが発生しました。
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)