Oracle

★少量のデータをINSERTする場合

_Insert_InitData.bat或いは_Insert_InitData.sh

sqlplus <USER>/<PASSWORD>@<INSTANCE> @_Insert_InitData.sql

_Insert_InitData.sql

SET ECHO OFF;

SPOOL _Insert_InitData.log;

@Insert_TABLE_A.sql

@Insert_TABLE_B.sql

...

@Insert_TABLE_Z.sql

COMMIT;

SPOOL OFF;

EXIT;

Insert_TABLE_A.sql

INSERT INTO TABLE_A (ID, NAME, REGIST_DATE) VALUES ('01', 'Andy', TO_DATE('2012/04/11 09:20:46', 'YYYY/MM/DD HH24:MI:SS'));

...

定義済みテーブル

使用例:テーブルのカラム名を取得

SELECT C.*

FROM USER_TAB_COLUMNS C, USER_TABLES T

WHERE C.TABLE_NAME = T.TABLE_NAME

ORDER BY C.TABLE_NAME

ORDER BY

AAA DESC NULLS FIRST -- NULLは最初

BBB ASC NULLS LAST -- NULLは最後

★重複行を最速に削除

DELETE

FROM

EMP E

WHERE

E.ROWID > (

SELECT

MIN(X.ROWID)

FROM

EMP X

WHERE

X.EMP_NO = E.EMP_NO

);

★削除について

DROP TABLE XXX CASCADE CONSTRAINTS; 制約(PK,FKなど)も同時削除

DROP TABLE XXX CASCADE CONSTRAINTS PURGE; ごみ箱に入れず即座に削除

FLASHBACK TABLE XXX TO BEFORE DROP; 消したテーブルを復元

SHOW RECYCLEBIN

PURGE RECYCLEBIN; ユーザー「ごみ箱」の全体を空にする

PURGE DBA_RECYCLEBIN; システム「ごみ箱」の全体を空にする

サンプル

DROP TABLE XXX CASCADE CONSTRAINTS;

-- Oracle 10g以降

PURGE TABLE XXX;

CREATE TABLE XXX

(

USER_ID VARCHAR2(8) NOT NULL,

DEPT_NO VARCHAR2(3),

USER_NAME VARCHAR2(32),

CREATED_DATE DATE DEFAULT SYSDATE,

MODIFIED_DATE DATE

);

ALTER TABLE XXX ADD CONSTRAINT XXX_PK PRIMARY KEY (USER_ID);

★sqlplusについて

バッチ実行

XXX.bat↓

sqlplus /nolog @XXX.sql > log.txt

XXX.sql↓

connect <USER>/<PASSWORD>@//localhost:1521/xe

@YYY.sql

...

commit;

exit

YYY.sql↓

set echo on

set define off

set sqlblanklines on

...

ユーザ設定

SQL>conn system/oracle

SQL>create user andy identified by "andy" default tablespace users temporary tablespace temp quota unlimited on users;

SQL>grant connect to andy;

SQL>grant create andy table to andy;

SQL>grant create andy view to andy;

SQL>grant create andy index to andy;

SQL>grant create andy synonym to andy;

SQL>grant create andy sequence to andy;

SQL>drop user andy cascade;

★多量のデータをINSERTする場合

_start.dat

PAUSE

CALL _Insert_InitData.bat user password testdb

PAUSE

_Insert_InitData.bat

SET CTL_DIR=C:\data\ctl

SET LOG_DIR=C:\data\log

sqlldr userid=%1/%2@%3 control='%CTL_DIR%\TABLE_A.ctl' log='%LOG_DIR%\TABLE_A.log'

sqlldr userid=%1/%2@%3 control='%CTL_DIR%\TABLE_B.ctl' log='%LOG_DIR%\TABLE_B.log'

...

sqlldr userid=%1/%2@%3 control='%CTL_DIR%\TABLE_Z.ctl' log='%LOG_DIR%\TABLE_Z.log'

TABLE_A.ctl

OPTIONS

(

MULTITHREADING=TRUE,

PARALLEL=TRUE,

ERRORS=-1,

)

LOAD DATA

INFILE 'C:\data\csv\TABLE_A.csv'

BADFILE 'C:\data\log\TABLE_A.bad'

DISCARDFILE 'C:\data\log\TABLE_A.dis'

APPEND INTO TABLE TABLE_A

FIELDS TERMINATED BY ','

TRAILING NULLCOLS

(

ID

, NAME CHAR NULLIF (NAME=BLANKS)

, REGIST_DATE DATE "YYYY/MM/DD HH24:MI:SS" NULLIF (REGIST_DATE=BLANKS)

)

TABLE_A.csv

01,Andy,2012/04/11 09:20:46

...

★CASE vs DECODE

CASE:WHEN句でEXISTS、比較条件、IN、BETWEEN、LIKEなどの演算子は使用可能

DECODE:演算子は使用不可

CASE sex

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '不明'

END

DECODE(sex, '1', '男', '2', '女', '不明')

CASE address

WHEN address IS NULL THEN '未登録'

ELSE '登録済'

END

DECODE(address, NULL, '未登録', '登録済')

★Oracleエラー対策

>ORA-12638:資格証明の取り出しに失敗しました

1.sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES=(NTS)

SQLNET.AUTHENTICATION_SERVICES=(NONE)

2.ORA_DBAグループにWindowsログインユーザが属する必要

★ソート関数

①:rownum或いはrow_number() OVER(ORDER BY item)

②:row_number() OVER(PARTITION BY item ORDER BY item)

③:rank() OVER(ORDER BY item)

④:dense_rank() OVER(ORDER BY item)