Oracle - ynjch97/YNJCH_WIKI GitHub Wiki

1. Oracle μ„€μΉ˜

  • μ°Έκ³  : https://backendcode.tistory.com/266
  • ν•˜λ‹¨μ˜ λ°μ΄ν„°λ² μ΄μŠ€ > Database Enterprise/Standard Edition 클릭
  • Oracle Database Enterprise Edition > Oracle Database 19c for Microsoft Windows x64 (64-bit) ZIP λ‹€μš΄λ‘œλ“œ 및 μ••μΆ• ν•΄μ œ
  • Oracle ν™˜κ²½ λ³€μˆ˜ μ„€μ •
    • μ‚¬μš©μž λ³€μˆ˜ > ORACLE_BASE: C:\Users\YNJCH\Oracle\Oracle / ORACLE_HOME: C:\Users\YNJCH\Oracle\Oracle\product\19.3.0\dbhome
  • setup.exe μ‹€ν–‰ (κ΄€λ¦¬μž κΆŒν•œμœΌλ‘œ μ‹€ν–‰ - 54% 멈좀 ν˜„μƒ λ°©μ§€)
  • 단일 μΈμŠ€ν„΄μŠ€ λ°μ΄ν„°λ² μ΄μŠ€ 생성 및 ꡬ성 > μ„œλ²„ 클래슀 > ν‘œμ€€ μ„€μΉ˜ > 가상 계정 μ‚¬μš©
    • Oracle Base : C:\Users\YNJCH\Oracle\Oracle
    • μ €μž₯ μ˜μ—­ μœ ν˜• : 파일 μ‹œμŠ€ν…œ
    • μ „μ—­ λ°μ΄ν„°λ² μ΄μŠ€ 이름 : orcl
    • λΉ„λ°€λ²ˆν˜Έ : 1111
  • Oracle κΈ°λ³Έ Port : 1521 / SID : orcl
  • μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ μ„€μΉ˜ 및 접속 μ™„λ£Œ 확인
sqlplus system/1111
  • μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ κΈ°λ³Έ μ„€μ • 확인
-- SID ν™•μΈν•˜κΈ°
select name from v$database;
-- Port 번호 ν™•μΈν•˜κΈ°
select dbms_xdb.gethttpport() from dual;
-- 1521이 μ•„λ‹ˆλ©΄ Port 번호λ₯Ό 1521둜 λ³€κ²½
exec dbms_xdb.sethttpport(포트번호);

1-1. Oracle μ„€μΉ˜ μ‚­μ œ

  • C:\Users\YNJCH\Oracle\Oracle\WINDOWS.X64_193000_db_home\deinstall > deinstall.bat
    • [LISTENER]μ—μ„œ ꡬ성을 ν•΄μ œν•  단일 μΈμŠ€ν„΄μŠ€ λ¦¬μŠ€λ„ˆ λͺ¨λ‘ μ§€μ • β†’ 아무값도 μž…λ ₯ν•˜μ§€ μ•Šκ³  μ—”ν„°λ₯Ό μž…λ ₯ν•œλ‹€.
    • 이 Oracle ν™ˆμ— κ΅¬μ„±λœ λ°μ΄ν„°λ² μ΄μŠ€ 이름 λͺ©λ‘μ„ μ§€μ •ν•˜μ‹­μ‹œμ˜€. [ORCL] β†’ ORCL μž…λ ₯
    • λ°μ΄ν„°λ² μ΄μŠ€μ˜ 진단 λŒ€μƒ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ‹­μ‹œμ˜€. [C:\app\hojun.jung\diag\rdbms\orcl] β†’ μžμ‹ μ˜ orcl 경둜 μž…λ ₯ ( C:\app\hojun.jung\diag\rdbms\orcl )
    • ASM|FS λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ €μž₯ μ˜μ—­ μœ ν˜•μ„ μ§€μ •ν•˜μ‹­μ‹œμ˜€. β†’ FS μž…λ ₯
    • 곡유 파일 μ‹œμŠ€ν…œμ— λ°μ΄ν„°λ² μ΄μŠ€ 파일이 μ‘΄μž¬ν•  경우 디렉토리 λͺ©λ‘μ„ μ§€μ •ν•˜μ‹­μ‹œμ˜€. 'ORCL' ν•˜μœ„ 디렉토리가 발견될 경우 μ‚­μ œλ©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•Šμ„ 경우 μ§€μ •λœ 디렉토리가 μ‚­μ œλ©λ‹ˆλ‹€. λ˜λŠ” 전체 κ²½λ‘œμ™€ ν•¨κ»˜ λ°μ΄ν„°λ² μ΄μŠ€ 파일 λͺ©λ‘μ„ μ§€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. β†’ 곡백 ν›„ μ—”ν„°
    • ν”Œλž˜μ‹œ 볡ꡬ μ˜μ—­ μœ„μΉ˜(파일 μ‹œμŠ€ν…œμ— κ΅¬μ„±λœ 경우)λ₯Ό μ§€μ •ν•˜μ‹­μ‹œμ˜€. 'ORCL' ν•˜μœ„ 디렉토리가 발견될 경우 μ‚­μ œλ©λ‹ˆλ‹€. β†’ κ·Έλƒ₯ μ—”ν„°
    • λ°μ΄ν„°λ² μ΄μŠ€ spfile μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ‹­μ‹œμ˜€. β†’ 곡백 ν›„ μ—”ν„°
    • κ³„μ†ν•˜κ² μŠ΅λ‹ˆκΉŒ(y - 예, n - μ•„λ‹ˆμ˜€)? [n] β†’ y μž…λ ₯
  • 경둜 λ‚΄ 폴더 및 파일 μ‚­μ œ C:\Users\YNJCH\Oracle\oradiag_ynjch\diag\clients
  • λ ˆμ§€μŠ€νŠΈλ¦¬ νŽΈμ§‘κΈ° μ‚­μ œ
    • HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE μ‚­μ œ
    • HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Service\Oralce ν‚€μ›Œλ“œ μ‚­μ œ
    • HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Service\Oracle ν‚€μ›Œλ“œ μ‚­μ œ
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Oracle ν‚€μ›Œλ“œ μ‚­μ œ
    • HKEY_CLASSES_ROOTμ—μ„œ Ora둜 μ‹œμž‘λ˜λŠ” λͺ¨λ“  것 μ‚­μ œ
  • μ„œλΉ„μŠ€ μ‚­μ œ
sc delete OracleJobSchedulerORCL
sc delete OracleOraDB19Home1TNSListener
sc delete OracleRemExecServiceV2
sc delete OracleServiceORCL
sc delete OracleVssWriterORCL

2. μ‚¬μš©μž 생성 및 κΆŒν•œ λΆ€μ—¬

  • Oracle μ„€μΉ˜ 및 λ°μ΄ν„°λ² μ΄μŠ€ 생성 이후, μ‚¬μš©μž 생성 단계
  • κ΄€λ¦¬μž κΆŒν•œμœΌλ‘œ cmd μ°½ μ‹€ν–‰
C:\Windows\system32> sqlplus

μ‚¬μš©μžλͺ… μž…λ ₯: SYSTEM
λΉ„λ°€λ²ˆν˜Έ μž…λ ₯: [λΉ„λ°€λ²ˆν˜Έ μž…λ ₯]

2-1. μ‚¬μš©μž 생성

  • μ‚¬μš©μž ID와 PWλ₯Ό μž…λ ₯
CREATE USER [ID] IDENTIFIED BY [PW];
-- μƒμ„±λœ μ‚¬μš©μž 확인
SELECT USERNAME FROM DBA_USERS;
-- μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ λ³€κ²½
ALTER USER [ID] IDENTIFIED BY [PW];
  • μƒμ„±λœ μ•„μ΄λ””λ‘œ μ ‘μ†ν•˜μ—¬ SHOW USER; μž…λ ₯ μ‹œ, μ‚¬μš©μž 확인 κ°€λŠ₯
    • sqlplus μ—μ„œλŠ” CONN [ID] λ₯Ό μ΄μš©ν•΄ SYSTEM κ³„μ •μ—μ„œ 타 κ³„μ •μœΌλ‘œ 접속 κ°€λŠ₯

2-1-1. μ‚¬μš©μž μ‚­μ œ

  • CASCADE : μ‚¬μš©μžμ™€ 객체λ₯Ό λͺ¨λ‘ μ‚­μ œν•  경우
DROP USER [ID] ['CASCADE'];

2-2. κΆŒν•œ λΆ€μ—¬

  • λΆ€μ—¬ν•  κΆŒν•œμ„ 콀마(,)둜 κ΅¬λΆ„ν•˜μ—¬ λ‚˜μ—΄
  • WITH ADMIN OPTION : ν˜„μž¬ GRANT 문을 톡해 뢀여받은 κΆŒν•œμ„ λ‹€λ₯Έ μ‚¬μš©μžμ—κ²Œ λΆ€μ—¬ν•  수 μžˆλŠ” κΆŒν•œμ„ λΆ€μ—¬
    • ν˜„μž¬ μ‚¬μš©μž κΆŒν•œμ΄ 사라져도 κΆŒν•œμ„ μž¬λΆ€μ—¬ν•œ λ‹€λ₯Έ μ‚¬μš©μž κΆŒν•œμ€ μœ μ§€λ¨
GRANT [κΆŒν•œ] TO [ID] [WITH ADMIN OPTION]; /* GRANT CONNECT, RESOURCE, DBA TO [ID]; */

2-2-1. κΆŒν•œ μ’…λ₯˜

  • CONNECT : 접속 κΆŒν•œ
  • RESOURCE : 객체 및 데이터 μ‘°μž‘ κΆŒν•œ
    • μ‹œμŠ€ν…œ κΆŒν•œμ˜ 일정 뢀뢄을 λΆ€μ—¬
    • CREATE TABLE, CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TRIGGER, CREATE TYPE λΆ€μ—¬ κ°€λŠ₯
  • DBA : DB μ‹œμž‘, μ’…λ£Œ κΆŒν•œμ„ μ œμ™Έν•œ λͺ¨λ“  μ‹œμŠ€ν…œ κΆŒν•œ
    • μœ μ € 생성 및 κΆŒν•œ λΆ€μ—¬, μŠ€ν‚€λ§ˆ 였브젝트 생성, μˆ˜μ •, μ‚­μ œ λ“±

2-2-2. κΆŒν•œ μ·¨μ†Œ

REVOKE [κΆŒν•œ] FROM [ID];  /* REVOKE CONNECT, RESOURCE, DBA FROM [ID]; */

2-2-3. 객체 κΆŒν•œ λΆ€μ—¬

  • 객체 κΆŒν•œ : 콀마(,)둜 κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬ κΆŒν•œμ„ λΆ€μ—¬ν•˜κ±°λ‚˜ ALL PRIVILEGES λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λ“  κΆŒν•œ λΆ€μ—¬
GRANT [객체 κΆŒν•œ/ALL PRIVILEGES]
ON [μŠ€ν‚€λ§ˆ, 객체 이름]
TO [ID]
[WITH GRANT OPTION];

-- μ˜ˆμ‹œ) ynjchμ—κ²Œ USER_INFO ν…Œμ΄λΈ”μ˜ SELECT, INSERT κΆŒν•œ λΆ€μ—¬
GRANT SELECT, INSERT ON USER_INFO TO ynjch;

2-3. 적용 사항 확인

  • μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ commit ν›„, μƒμ„±λœ μ‚¬μš©μž 확인
COMMIT;
SELECT * FROM ALL_USERS;

3. ν…Œμ΄λΈ”

3-1. ν…Œμ΄λΈ” 생성

CREATE TABLE [ν…Œμ΄λΈ”λͺ…] 
(
    [컬럼λͺ…] NUMBER(10) NOT NULL 
    , [컬럼λͺ…] VARCHAR2(20)
);
-- μ‚­μ œ : DROP TABLE USER_INFO;

3-1-1. κΈ°λ³Έν‚€ 생성

  • ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λ©΄μ„œ PK μ§€μ • (컬럼 μ˜†μ— μ˜΅μ…˜ μΆ”κ°€)
CREATE TABLE TAB1(
    COL1 NUMBER NOT NULL PRIMARY KEY,
    COL2 VARCHAR2(10)
);
  • ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λ©΄μ„œ PK μ§€μ • (ν•˜λ‹¨μ— μ œμ•½ 쑰건 μΆ”κ°€)
CREATE TABLE TAB1(
    COL1 NUMBER NOT NULL,
    COL2 VARCHAR2(10),
    CONSTRAINT PK_TAB1 PRIMARY KEY(COL1)
    -- CONSTRAINT [PKλͺ…] PRIMARY KEY([PK 컬럼λͺ…])
);
  • ν…Œμ΄λΈ” 생성 ν›„ PK μ§€μ •
ALTER TABLE TAB1
ADD CONSTRAINT PK_TAB1 PRIMARY KEY(COL1);

3-1-2. κΈ°λ³Έν‚€ μ‚­μ œ

ALTER TABLE TAB1
DROP CONSTRAINT PK_TAB1;

3-1-3. μ™Έλž˜ν‚€ 생성

  • ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜λ©΄μ„œ FK μ§€μ •
/*
CREATE TABLE TAB1(
    COL1 NUMBER NOT NULL PRIMARY KEY,
    COL2 VARCHAR2(10)
);
*/
CREATE TABLE TAB2 (
    COL3 NUMBER NOT NULL PRIMARY KEY,
    COL4 NUMBER NOT NULL,
    COL5 VARCHAR2(10),
    CONSTRAINT FK_TAB2 FOREIGN KEY(COL4) REFERENCES TAB1 (COL1)
    -- CONSTRAINT [FKλͺ…] FOREIGN KEY([FK 컬럼λͺ…]) REFERENCES [PKκ°€ μžˆλŠ” ν…Œμ΄λΈ”] ([PK 컬럼λͺ…])
);
  • ν…Œμ΄λΈ” 생성 ν›„ FK μ§€μ •
ALTER TABLE TAB2
ADD CONSTRAINT FK_TAB2 FOREIGN KEY(COL4) REFERENCES TAB1 (COL1);

3-1-4. μ™Έλž˜ν‚€ μ‚­μ œ

ALTER TABLE TAB2
DROP CONSTRAINT FK_TAB2;

3-1-5. μ œμ•½μ‘°κ±΄ 확인

SELECT * FROM ALL_CONSTRAINTS WHERE TABLE_NAME = '[ν…Œμ΄λΈ”λͺ…]';

-- κΈ°λ³Έν‚€(PK) 정보 쑰회
SELECT A.TABLE_NAME
     , A.CONSTRAINT_NAME
     , B.COLUMN_NAME     
     , B.POSITION
  FROM ALL_CONSTRAINTS  A
     , ALL_CONS_COLUMNS B
 WHERE A.TABLE_NAME      = '[ν…Œμ΄λΈ”λͺ…]'
   AND A.CONSTRAINT_TYPE = 'P' 
   AND A.OWNER           = B.OWNER
   AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
 ORDER BY B.POSITION;

3-2. 컬럼 데이터 νƒ€μž…

3-2-1. 문자 데이터 νƒ€μž…

  • CHAR(n) : 고정길이 문자(μ΅œλŒ€ 2000byte, λ””ν΄νŠΈκ°’ 1byte)
  • VARCHAR2(n) : 가변길이 문자(μ΅œλŒ€ 4000byte, λ””ν΄νŠΈκ°’ 1byte)
  • NCHAR(n) : 고정길이 μœ λ‹ˆμ½”λ“œ 문자(μ΅œλŒ€ 2000byte, λ””ν΄νŠΈκ°’ 1byte, λ‹€κ΅­μ–΄ μž…λ ₯ κ°€λŠ₯)
  • NVARCHAR(n) : 가변길이 μœ λ‹ˆμ½”λ“œ 문자(μ΅œλŒ€ 2000byte, λ””ν΄νŠΈκ°’ 1byte, λ‹€κ΅­μ–΄ μž…λ ₯ κ°€λŠ₯)
  • LONG : μ΅œλŒ€ 2GB 크기의 가변길이 λ¬Έμžν˜•
  • CLOB : λŒ€μš©λŸ‰ ν…μŠ€νŠΈ 데이터 νƒ€μž…(μ΅œλŒ€ 4GB)
  • NCLOB : λŒ€μš©λŸ‰ ν…μŠ€νŠΈ μœ λ‹ˆμ½”λ“œ 데이터 νƒ€μž…(μ΅œλŒ€ 4GB)

3-2-2. 숫자 데이터 νƒ€μž…

  • NUMBER(P,S) : κ°€λ³€μˆ«μž(μ΅œλŒ€ 22byte, P : 1~38, λ””ν΄νŠΈκ°’ 38 / S : -84~127, λ””ν΄νŠΈκ°’ 0)
  • FLOAT(P) : NUMBER 의 ν•˜μœ„ νƒ€μž…(μ΅œλŒ€ 22byte, μ΄μ§„μˆ˜ κΈ°μ€€, P : 1~128, λ””ν΄νŠΈκ°’ 128)
  • BINARY_FLOAT : 32λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ  수(μ΅œλŒ€ 4byte)
  • BINARY_DOUBLE : 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ  수(μ΅œλŒ€ 8byte)

3-2-3. λ‚ μ§œ 데이터 νƒ€μž…

  • DATE : μ—°, μ›”, 일, μ‹œ, λΆ„, μ΄ˆκΉŒμ§€ μž…λ ₯(BC 4712λ…„ 1μ›” 1일뢀터 9999λ…„ 12μ›” 31일)
  • TIMESTAMP : μ—°, μ›”, 일, μ‹œ, λΆ„, 초 + λ°€λ¦¬μ΄ˆκΉŒμ§€ μž…λ ₯ κ°€λŠ₯

3-2-4. LOB 데이터 νƒ€μž…

  • λŒ€μš©λŸ‰ 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 데이터 νƒ€μž…μ„ LOB(Large Object) 이라고 함
  • CLOB : λ¬Έμžν˜• λŒ€μš©λŸ‰ 객체 고정길이와 가변길이 λ¬Έμžμ§‘ν•© 지원
  • NCLOB : μœ λ‹ˆμ½”λ“œλ₯Ό μ§€μ›ν•˜λŠ” λ¬Έμžν˜• λŒ€μš©λŸ‰ 객체
  • BLOB : μ΄μ§„ν˜• λŒ€μš©λŸ‰ 객체(κ·Έλž˜ν”½, 이미지, λ™μ˜μƒ λ“±μ˜ 데이터 μ €μž₯ μ‹œ μ‚¬μš©)
  • BFILE : λŒ€μš©λŸ‰ 이진 νŒŒμΌμ— λŒ€ν•œ μœ„μΉ˜, 이름 μ €μž₯

3-3. 컬럼 μ œμ–΄

  • 컬럼 μΆ”κ°€ : ALTER TABLE [ν…Œμ΄λΈ”λͺ…] ADD([컬럼λͺ…] ([λ°μ΄ν„°νƒ€μž…], [μ‚¬μ΄μ¦ˆ]));
  • 컬럼 μˆ˜μ • : ALTER TABLE [ν…Œμ΄λΈ”λͺ…] MODIFY([컬럼λͺ…] ([λ°μ΄ν„°νƒ€μž…], [μ‚¬μ΄μ¦ˆ]));
  • 컬럼 μ‚­μ œ : ALTER TABLE [ν…Œμ΄λΈ”λͺ…] DROP COLUMN [컬럼λͺ…];
  • 컬럼λͺ… λ³€κ²½ : ALTER TABLE [ν…Œμ΄λΈ”λͺ…] RENAME COLUMN [κΈ°μ‘΄ 컬럼λͺ…] TO [λ³€κ²½ 컬럼λͺ…];
ALTER TABLE TAB1 ADD (COL1 NUMBER(10,0)); 

3-3-1. 컬럼 μˆœμ„œ μ œμ–΄

  • COL2, COL3 컬럼 뒀에 μΆ”κ°€λœ COL1 μ»¬λŸΌμ„ COL2 μ•žμœΌλ‘œ μœ„μΉ˜μ‹œν‚€κ³  싢을 λ•Œ
  • COL2 μ΄ν•˜μ˜ μ»¬λŸΌλ“€μ„ λͺ¨λ‘ INVISIBLE μ²˜λ¦¬ν–ˆλ‹€κ°€ VISIBLE μ²˜λ¦¬ν•¨μœΌλ‘œμ„œ μˆœμ„œ μ œμ–΄ κ°€λŠ₯
ALTER TABLE TAB1 MODIFY COL2 INVISIBLE;
ALTER TABLE TAB1 MODIFY COL3 INVISIBLE;
ALTER TABLE TAB1 MODIFY COL2 VISIBLE;
ALTER TABLE TAB1 MODIFY COL3 VISIBLE;

4. μ‹œν€€μŠ€

4-1. μ‹œν€€μŠ€ 생성

CREATE SEQUENCE [μ‹œν€€μŠ€λͺ…]
START WITH 1   /* μ‹œμž‘κ°’ */
INCREMENT BY 1  /* 증가값 */
MINVALUE 1 /* μ΅œμ†Œκ°’ */
MAXVALUE 10000000 /* μ΅œλŒ€κ°’ */
CYCLE /* μ‹œν€€μŠ€ μ΅œλŒ€κ°’ 도달 μ‹œ μ΅œμ†Œκ°’λΆ€ν„° λ‹€μ‹œ μ‹œμž‘ν• μ§€ μ—¬λΆ€ (CYCLE, NOCYCLE) */
NOCACHE /* CACHE μ‚¬μš© μ—¬λΆ€ (CACHE, NOCACHE) */
;

4-2. μ‹œν€€μŠ€ 쑰회

  • μ‹œν€€μŠ€ 정보λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜, μ‹œν€€μŠ€ 일련번호λ₯Ό μ‘°νšŒν•  수 있음
  • 증가 없이 ν˜„μž¬ μ‹œν€€μŠ€ μˆœλ²ˆμ„ κ°€μ Έμ˜€λ €λ©΄ [μ‹œν€€μŠ€λͺ…].CURRVAL μ‚¬μš©
SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = '[μ‹œν€€μŠ€λͺ…]';
SELECT [μ‹œν€€μŠ€λͺ…].CURRVAL FROM DUAL;
SELECT [μ‹œν€€μŠ€λͺ…].NEXTVAL FROM DUAL;

4-2-1. μ‹œν€€μŠ€λ₯Ό μ΄μš©ν•œ INSERT

INSERT INTO [ν…Œμ΄λΈ”λͺ…] values([μ‹œν€€μŠ€λͺ…].NEXTVAL, 'test');

4-3. μ‹œν€€μŠ€ μˆ˜μ •

  • μ‹œν€€μŠ€ 순번 μ΄ˆκΈ°ν™” μ‹œ μ•„λž˜ λ‚΄μš© μž…λ ₯
ALTER SEQUENCE [μ‹œν€€μŠ€λͺ…] INCREMENT BY -1000;
ALTER SEQUENCE [μ‹œν€€μŠ€λͺ…] INCREMENT BY 1;
  • μ‹œν€€μŠ€ 증가값, μ΅œλŒ€κ°’ 등을 μ‘°μ •ν•  수 있음
ALTER SEQUENCE [μ‹œν€€μŠ€λͺ…] INCREMENT BY [증가값];
ALTER SEQUENCE [μ‹œν€€μŠ€λͺ…] MAXVALUE [μ΅œλŒ€κ°’];

4-4. μ‹œν€€μŠ€ μ‚­μ œ

DROP SEQUENCE [μ‹œν€€μŠ€λͺ…];

5. 인덱슀(Index)

  • 데이터λ₯Ό λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ μ£Όμ†Œ 체계
  • 속도 ν–₯상을 μœ„ν•΄ μ‚¬μš©λ¨
    • Full Scan 으둜 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό κ°€μ Έμ˜€λŠ” 방법이 μ•„λ‹Œ ROOT - BRANCH - LEAF - DATA BLOCK 총 4번의 IOλ₯Ό 톡해 μ ‘κ·Ό κ°€λŠ₯
  • λͺ¨λ“  ν…Œμ΄λΈ”μ—λŠ” ROWID 컬럼이 μ‘΄μž¬ν•˜λ©°, μΈλ±μŠ€λŠ” ROWIDλ₯Ό 톡해 DATA BLOCK에 μ ‘κ·Ό
    • ROWID = FILE 번호 + BLOCK 번호 + ROW 번호

5-1. 인덱슀 ꡬ쑰

  • ROOT, BRANCH, LEAF둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” 계측적 ꡬ쑰
    • 였라클 μ„œλ²„μ—μ„œ FULL SCAN보닀 INDEX SCAN이 μœ λ¦¬ν•˜λ‹€κ³  νŒλ‹¨λ˜μ—ˆμ„ λ•Œ INDEX의 ROOTλΆ€ν„° 찾음
    • ROOTμ—λŠ” BRANCH λΈ”λŸ­μ˜ μ‹œμž‘μ  정보λ₯Ό, BRANCHμ—λŠ” LEAF λΈ”λŸ­μ˜ μ‹œμž‘μ  정보λ₯Ό, LEAFμ—λŠ” λ°μ΄ν„°μ˜ ROWIDλ₯Ό μ•Œ 수 있음
    • 찾고자 ν•˜λŠ” λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό λΉ λ₯΄κ²Œ 검색 κ°€λŠ₯ !인덱슀 ꡬ쑰

5-2. 인덱슀 속도

  • 였라클 μ„œλ²„λŠ” FULL SCAN, INDEX SCAN 쀑 더 μœ λ¦¬ν•œ λ°©λ²•μœΌλ‘œ Scan μž‘μ—…μ„ μ§„ν–‰
  • INDEX 생성 μ‹œ μ €μž₯ 곡간이 ν•„μš” (λ§Žμ€ μ»¬λŸΌμ„ 인덱슀 μ„€μ •ν•œλ‹€κ³  쒋은 것은 μ•„λ‹˜)
    • 지속적인 INSERTκ°€ μ΄λ£¨μ–΄μ§€λŠ” ν…Œμ΄λΈ”μ€ 인덱슀의 크기도 컀짐
  • SELECT κ΅¬λ¬Έμ—μ„œ 검색 속도λ₯Ό ν–₯μƒμ‹œμΌœμ£ΌλŠ” μ—­ν• 

5-2-1. 인덱슀 μ‚¬μš©

  • κ²€μƒ‰ν•˜λ €λŠ” λͺ¨λ“  데이터가 κ³ μœ ν•œ κ°’(PK)이면 κ°€μž₯ μ΅œμ ν™”λœ μƒνƒœ
  • WHERE μ ˆμ— μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ»¬λŸΌμ€ ꡳ이 인덱슀 생성할 ν•„μš”κ°€ μ—†μŒ
    • μ€‘λ³΅λ˜λŠ” 데이터여도 WHERE μ ˆμ— 자주 μ‚¬μš©λ˜λŠ” 컬럼이라면 INDEX SCAN 이 효과적
  • λŒ€λŸ‰μ˜ 데이터 쀑 적은 μ–‘μ˜ 데이터(νŠΉμ • 쑰건)κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©

5-3. 인덱슀 생성 및 쑰회

  • 인덱슀 생성
CREATE INDEX 인덱슀λͺ…
ON μŠ€ν‚€λ§ˆλͺ….ν…Œμ΄λΈ”λͺ…(컬럼1, 컬럼2, ...);
  • 인덱슀 쑰회
SELECT
    A.TABLE_OWNER
    , A.TABLE_NAME 
    , A.INDEX_NAME 
    , A.COLUMN_NAME 
FROM ALL_IND_COLUMNS A 
WHERE A.TABLE_NAME = 'ν…Œμ΄λΈ”λͺ…'
ORDER BY A.INDEX_NAME, A.COLUMN_POSITION

5-4. 인덱슀 μš©λŸ‰ 쑰회

  • DBA_SEGMENTS 에 INDEX, TABLE 을 λ„£μ–΄ 인덱슀, ν…Œμ΄λΈ”μ˜ μš©λŸ‰ 쑰회 κ°€λŠ₯
  • SEGMENT_NAME 에 인덱슀λͺ… λ˜λŠ” ν…Œμ΄λΈ”λͺ… 기재
/* μœ μ €, 인덱슀 별 μš©λŸ‰ 확인 */	
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,SUM(BYTES)/1024/1024 AS MB	
FROM DBA_SEGMENTS	
WHERE SEGMENT_TYPE='INDEX' -- TABLE or INDEX
AND OWNER = '[μŠ€ν‚€λ§ˆλͺ…]'
AND SEGMENT_NAME = '[인덱슀λͺ… λ˜λŠ” ν…Œμ΄λΈ”λͺ…]'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE;	

6. ν…Œμ΄λΈ” 및 컬럼 정보

  • ν˜„μž¬ λ°μ΄ν„°λ² μ΄μŠ€ 쑰회 : SELECT NAME FROM V$DATABASE;
-- OBJECT 쑰회
SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = [였브젝트λͺ…];
-- SYNONYM 쑰회
SELECT * FROM ALL_SYNONYMS WHERE SYNONYM_NAME = [μ‹œλ…Έλ‹˜λͺ…];
-- INDEX 쑰회
SELECT * FROM USER_INDEXES WHERE INDEX_NAME = [인덱슀λͺ…];
-- INDEX μ—΄ 쑰회
SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = [인덱슀λͺ…];
-- μ œμ•½μ‘°κ±΄μ΄ μžˆλŠ” μ—΄ 쑰회
SELECT * FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = [μ œμ•½μ‘°κ±΄λͺ…];
-- λ·° ν…Œμ΄λΈ” 쑰회
SELECT * FROM USER_VIEWS WHERE VIEW_NAME = [λ·°ν…Œμ΄λΈ”λͺ…];

6-1. ν…Œμ΄λΈ” 정보 쑰회

  • ν…Œμ΄λΈ” λͺ©λ‘ 쑰회
SELECT * FROM ALL_TABLES;
SELECT * FROM DBA_TABLES;
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE';
  • μ ‘μ†ν•œ κ³„μ •μ˜ ν…Œμ΄λΈ” λͺ©λ‘ 쑰회
SELECT * FROM TABS;
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';
SELECT * FROM USER_TABLES;
-- νŠΉμ • ν…Œμ΄λΈ” 쑰회
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE '%%';

6-2. 컬럼 정보 쑰회

SELECT * FROM COLS WHERE TABLE_NAME LIKE '%%';
SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME LIKE '%%'; /* λ˜λŠ” USER_TAB_COLUMNS */

6-3. ν…Œμ΄λΈ” 및 컬럼 μ½”λ©˜νŠΈ

COMMENT ON TABLE [ν…Œμ΄λΈ”λͺ…] IS 'μ½”λ©˜νŠΈ';
COMMENT ON COLUMN [ν…Œμ΄λΈ”λͺ…].[컬럼λͺ…] IS 'μ½”λ©˜νŠΈ';
  • μ½”λ©˜νŠΈ 쑰회
-- ν…Œμ΄λΈ” μ½”λ©˜νŠΈ 쑰회
SELECT * FROM ALL_TAB_COMMENTS
WHERE TABLE_NAME LIKE '%USER_INFO%';

-- ν…Œμ΄λΈ” 컬럼 μ½”λ©˜νŠΈ 쑰회
SELECT * FROM ALL_COL_COMMENTS
WHERE TABLE_NAME LIKE '%USER_INFO%';

6-3-1. ν…Œμ΄λΈ”, 컬럼 정보 쑰회 쿼리

SELECT 
    TC.TABLE_NAME
    , TC.COMMENTS
    , CC.COLUMN_NAME
    , CC.COMMENTS
    , C.DATA_TYPE
    , C.DATA_LENGTH
    , C.NULLABLE
    , C.DATA_DEFAULT
FROM ALL_TAB_COMMENTS TC
LEFT JOIN ALL_TAB_COLUMNS C
ON TC.OWNER = C.OWNER
    AND TC.TABLE_NAME = C.TABLE_NAME
LEFT JOIN ALL_COL_COMMENTS CC
ON TC.OWNER = CC.OWNER
    AND TC.TABLE_NAME = CC.TABLE_NAME
    AND C.COLUMN_NAME = CC.COLUMN_NAME
WHERE TC.TABLE_NAME LIKE '[ν…Œμ΄λΈ”λͺ…]';

7. 데이터 λ³€ν™˜

7-1. λ¬Έμžμ—΄ 숫자 λ³€ν™˜

  • TO_NUMBER() : λ¬Έμžμ—΄μ„ μ •μˆ˜, μ‹€μˆ˜λ‘œ λ³€ν™˜
  • CAST() : 자릿수λ₯Ό μ •μ˜ν•˜μ—¬ μ •μˆ˜, μ‹€μˆ˜λ‘œ λ³€ν™˜
SELECT TO_NUMBER('123') FROM DUAL; /* 123 */
SELECT CAST('123' AS NUMBER(3)) FROM DUAL; /* 123 */
SELECT TO_NUMBER('123.5') FROM DUAL; /* 123.5 */
SELECT CAST('123.55' AS NUMBER(3)) FROM DUAL; /* 124 */
SELECT CAST('123.55' AS NUMBER(5, 2)) FROM DUAL; /* 123.55 */

7-1-1. λ¬Έμžμ—΄ 숫자 λ³€ν™˜ 였λ₯˜ 처리

  • λ¬Έμžμ—΄μ— λ³€ν™˜ λΆˆκ°€ν•œ λ¬Έμžκ°€ ν¬ν•¨λ˜μ–΄ 있으면 였λ₯˜κ°€ λ°œμƒν•¨
SELECT TO_NUMBER('13,000,000') FROM DUAL;
  • REPLACE() ν•¨μˆ˜ λ˜λŠ” REGEXP_REPLACE() μ •κ·œμ‹ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή λ¬Έμžμ—΄ 제거
  • REGEXP_REPLACE() λŠ” Oracle 10g 이상뢀터 μ‚¬μš© κ°€λŠ₯
-- 직접 ν•΄λ‹Ή λ¬Έμžμ—΄μ„ 제거 (λ§ˆμ§€λ§‰ 인자 μƒλž΅ κ°€λŠ₯)
SELECT REPLACE(REPLACE('* 13,000,000', ','), '*') FROM DUAL;
-- μ •κ·œμ‹μœΌλ‘œ 숫자(μ†Œμˆ˜μ , 음수 포함) μ™Έ 문자 λͺ¨λ‘ 제거
SELECT REGEXP_REPLACE('* -13,000,000', '[^0-9.-]', '') FROM DUAL;

7-1-2. λ¬Έμžμ—΄ 숫자 λ³€ν™˜ κ°€λŠ₯ μ—¬λΆ€ 체크

  • TRANSLATE('λ¬Έμžμ—΄', 'λŒ€μƒλ¬Έμž', 'λ³€ν™˜λ¬Έμž') : λ¬Έμžμ—΄ μΉ˜ν™˜ ν•¨μˆ˜(Oracle 8i 이상 μ‚¬μš© κ°€λŠ₯)
    • λŒ€μƒλ¬Έμžμ™€ λ³€ν™˜λ¬Έμžκ°€ 1:1둜 λ³€ν™˜λ˜λ©°, λŒ€μƒλ¬Έμžμ—λŠ” μžˆμ§€λ§Œ λ³€ν™˜λ¬Έμžμ— μ—†λŠ” λ¬ΈμžλŠ” 제거됨
    • μ•„λž˜μ˜ 경우 λŒ€μƒλ¬Έμž 'A'λŠ” κ·ΈλŒ€λ‘œ 'A'둜 λ³€ν™˜λ˜μ§€λ§Œ, μˆ«μžμ™€ λΆ€ν˜Έλ“€μ€ λ³€ν™˜λ¬Έμžμ— μ—†κΈ° λ•Œλ¬Έμ— 제거됨
SELECT 
    CASE WHEN TRANSLATE('-123.456', 'A1234567890.+-', 'A') IS NULL 
    THEN TO_NUMBER('-123.456') END
FROM DUAL;
  • REGEXP_INSTR('λ¬Έμžμ—΄', 'νŒ¨ν„΄') : νŠΉμ • νŒ¨ν„΄μ΄ μΆœν˜„ν•˜λŠ” 첫 μœ„μΉ˜ 값을 λ°˜ν™˜(Oracle 10g 이상 μ‚¬μš© κ°€λŠ₯)
SELECT 
    CASE WHEN REGEXP_INSTR('-123.456','^[+-]?\d*(\.?\d*)$') = 1 /* 숫자일 경우 1 λ°˜ν™˜ */
    THEN TO_NUMBER('-123.456') END
FROM DUAL;
  • VALIDATE_CONVERSION() : Oracle 12c λΆ€ν„° 생긴 ν˜•λ³€ν™˜ 체크 ν•¨μˆ˜
SELECT 
    CASE WHEN VALIDATE_CONVERSION('-123.456' AS NUMBER) = 1
    THEN TO_NUMBER('-123.456') END
FROM DUAL;

7-1-3. λ¬Έμžμ—΄ 숫자 λ³€ν™˜ 였λ₯˜ λŒ€μ²˜

  • ν˜•λ³€ν™˜ 였λ₯˜ λ°œμƒ μ‹œ μ§€μ •ν•œ λŒ€μ²΄ 값을 좜λ ₯ν•˜λ„λ‘ 함
SELECT 
    TO_NUMBER('12345' DEFAULT -1 ON CONVERSION ERROR) AS res1 /* 12345 */
    , TO_NUMBER('12345A' DEFAULT -1 ON CONVERSION ERROR) AS res2 /* -1 */
    , CAST('12345' AS NUMBER(10) DEFAULT -1 ON CONVERSION ERROR) AS res3 /* 12345 */
    , CAST('12345A' AS NUMBER(10) DEFAULT -1 ON CONVERSION ERROR) AS res4 /* -1 */
FROM DUAL;

7-1-4. λ¬Έμžμ—΄λ‘œ 숫자 쑰회

  • TO_CHAR([컬럼λͺ…], [포맷]) ν•¨μˆ˜ 이용
SELECT TO_CHAR('123', 'FM00000') FROM DUAL; /* 00123 */
SELECT TO_CHAR('100000', 'FM999,999,999,999') FROM DUAL; /* 100,000 */
SELECT TO_CHAR('100000', 'FML999,999,999') FROM DUAL; /* οΏ¦100,000 */
SELECT TO_CHAR('3.1415926', 'FM990.99') FROM DUAL; /* 3.14 */

7-2. λ¬Έμžμ—΄ λ‚ μ§œ λ³€ν™˜

  • ν˜„μž¬ μΌμ‹œ 좜λ ₯ : SELECT SYSDATE FROM DUAL;
  • TO_DATE([λ¬Έμžμ—΄], [λ‚ μ§œ 포맷]) λ₯Ό μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ λ‚ μ§œ λ°μ΄ν„°λ‘œ λ³€ν™˜ κ°€λŠ₯
    • λ‚ μ§œ 포맷은 λŒ€μ†Œλ¬Έμž ꡬ뢄 μ—†μŒ
    • 12μ‹œκ°„ λ‹¨μœ„λŠ” HH, 24μ‹œκ°„ λ‹¨μœ„λŠ” HH24둜 ν‘œκΈ°
SELECT 
    TO_DATE('2022-08-12 13:50:00', 'YYYY-MM-DD HH24:MI:SS')
    , TO_DATE('11.08.2022', 'DD.MM.YYYY')
    , TO_DATE('220810', 'YYMMDD')
FROM DUAL;
  • μ‹œμŠ€ν…œ μ„€μ • λ‚ μ§œ ν˜•μ‹κ³Ό λ™μΌν•˜λ©΄ λ‚ μ§œ 포맷을 μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ 됨
SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT'; /* κ²°κ³Ό : RR/MM/DD */
SELECT TO_DATE('2022/08/12') FROM DUAL; /* 정상 좜λ ₯ */
SELECT TO_DATE('12/08/2022') FROM DUAL; /* 였λ₯˜ λ°œμƒ */

7-2-1. λ¬Έμžμ—΄λ‘œ λ‚ μ§œ 쑰회

  • λ‹€μŒκ³Ό 같이 μ €μž₯ν•œ 데이터λ₯Ό 좜λ ₯
-- 데이터 INSERT
INSERT INTO TAB3 VALUES (TO_DATE('2022-08-12 13:50:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TAB3 VALUES (TO_DATE('2022-08-11', 'YYYY-MM-DD'));
  • λ‚ μ§œμ™€ μ‹œκ°„ 쑰회
    • FM μ‚¬μš©ν•˜μ—¬ λ‚ μ§œμ˜ '0' ν‘œκΈ° μƒλž΅ κ°€λŠ₯
SELECT TO_CHAR(COL4, 'YYYY-MM-DD HH24:MI:SS') FROM TAB3; 
    -- 2022-08-12 13:50:00 / 2022-08-11 00:00:00
SELECT TO_CHAR(COL4, 'YYYY-FMMM-DD') FROM TAB3;
    -- 2022-8-12 / 2022-8-11
  • μ˜€μ „, μ˜€ν›„ κ°’ 쑰회
    • TO_CHAR([컬럼λͺ…], 'AM') λ₯Ό μ„Έ 번째 인자 없이 μ‚¬μš© μ‹œ Oracle의 nls_date_language μ„€μ • ν˜•μ‹μ— λ§žλŠ” 데이터가 좜λ ₯됨
SELECT TO_CHAR(COL4, 'PM HH:MI:SS') FROM TAB3;
    -- μ˜€ν›„ 01:50:00 / μ˜€μ „ 12:00:00
SELECT TO_CHAR(COL4, 'AM', 'nls_date_language=american') FROM TAB3;
    -- PM / AM
SELECT TO_CHAR(COL4, 'AM', 'nls_date_language=korean') FROM TAB3;
    -- μ˜€ν›„ / μ˜€μ „
  • μš”μΌ κ°’ 쑰회
    • μΌμš”μΌλΆ€ν„° '1'으둜 μ‹œμž‘ν•˜λ©°, Oracle μ–Έμ–΄ 섀정에 λ§žλŠ” 데이터가 좜λ ₯됨
SELECT TO_CHAR(COL4, 'D') FROM TAB3;
    -- 6 / 5
SELECT TO_CHAR(COL4, 'DY') FROM TAB3;
    -- 금 / λͺ©
SELECT TO_CHAR(COL4, 'DAY') FROM TAB3;
    -- κΈˆμš”μΌ / λͺ©μš”일
  • 기타 쑰회
SELECT TO_CHAR(COL4, 'DDD') FROM TAB3; /* 224 (365일 κΈ°μ€€ 224일 μ§Έ) */
SELECT TO_CHAR(COL4, 'WW') FROM TAB3; /* 32 (1λ…„ κΈ°μ€€ 32μ£Ό μ§Έ) */
SELECT TO_CHAR(COL4, 'Q') FROM TAB3; /* 3 (3λΆ„κΈ°) */
SELECT TO_CHAR(COL4, 'MON') FROM TAB3; /* 8μ›” */
SELECT TO_CHAR(COL4, 'DL') FROM TAB3; /* 2022λ…„ 8μ›” 12일 κΈˆμš”μΌ */

7-2-2. λ‚ μ§œ 데이터

  • SYSDATE : λ…„μ›”μΌμ‹œλΆ„μ΄ˆ ν‘œν˜„
  • SYSTIMESTAMP : λ°€λ¦¬μ„Έμ»¨λ“œκΉŒμ§€ ν‘œν˜„ κ°€λŠ₯
    • 컬럼 데이터 νƒ€μž…μ„ TIMESTAMP둜 μ§€μ •ν•΄μ•Ό μ‚¬μš© κ°€λŠ₯
SELECT SYSDATE FROM DUAL; /* 22/08/18 */
SELECT TO_CHAR(SYSDATE, 'YYYY.MM.DD HH24:MI:SS') FROM DUAL; /* 2022.08.18 11:34:44 */
SELECT SYSTIMESTAMP FROM DUAL; /* 22/08/18 11:47:08.541000000 +09:00 */
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY.MM.DD HH24:MI:SS:FF') FROM DUAL; /* 2022.08.18 11:47:52:329000 */
  • λ‚ μ§œλ₯Ό λ”ν•˜κ±°λ‚˜ λΊ„ 수 있음
SELECT SYSDATE + 1 FROM DUAL; /* 22/08/19 */
SELECT TO_DATE('1997.10.16 15:00:30', 'YYYY.MM.DD HH24:MI:SS') + 3 FROM DUAL; /* 97/10/19 */
SELECT TO_CHAR(SYSDATE - 1/24 * 2, 'YYYY.MM.DD HH24:MI:SS') FROM DUAL; /* 2022.08.18 09:46:11 (2μ‹œκ°„ μ „) */
SELECT TO_CHAR(SYSDATE + 1/24/60, 'YYYY.MM.DD HH24:MI:SS') FROM DUAL; /* 2022.08.18 11:45:32 (1λΆ„ λ’€) */
SELECT TO_CHAR(SYSDATE + 1/24/60/60 * 8, 'YYYY.MM.DD HH24:MI:SS') FROM DUAL; /* 2022.08.18 11:45:32 (8초 λ’€) */

7-2-3. λ¬Έμžμ—΄ λ‚ μ§œ λ³€ν™˜ 였λ₯˜ 처리

  • REGEXP_INSTR() μ •κ·œμ‹ ν•¨μˆ˜ μ‚¬μš©(Oracle 10g 이상)
    • λ‚ μ§œ ν˜•μ‹ μ²΄ν¬λŠ” κ°€λŠ₯ν•˜μ§€λ§Œ, μœ νš¨ν•œ 값인지 νŒλ‹¨ν•˜μ§€ λͺ»ν•¨
  • VALIDATE_CONVERSION() ν˜•μ‹ 체크 ν•¨μˆ˜ μ‚¬μš©(Oracle 12c R2 이상)
    • λ‚ μ§œ ν˜•μ‹μ΄ 맞으면 '1', 틀리면 '0' λ°˜ν™˜
SELECT REGEXP_INSTR('2022-08-08', '^\d{4}-\d{2}-\d{2}') FROM DUAL;
SELECT VALIDATE_CONVERSION('2022-08-12' AS DATE, 'YYYY-MM-DD') FROM DUAL;
  • IS_DATE() μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ μ‚¬μš©
-- DATE ν˜•μ‹μ΄ λ§Ÿμ„ 경우 '1'을 λ°˜ν™˜ν•˜λ„λ‘ 함
CREATE FUNCTION IS_DATE(dStr VARCHAR2, dFormat VARCHAR2)
    RETURN NUMBER
IS
    resDate DATE;
BEGIN
    resDate := TO_DATE(dStr, dFormat);
    RETURN 1;
EXCEPTION
    WHEN OTHERS THEN
        RETURN 0;
END;
/

-- ν…ŒμŠ€νŠΈ
SELECT IS_DATE('2022-08-12', 'YYYY-MM-DD') FROM DUAL;
SELECT IS_DATE('2022-08-12', 'YYYYMMDD') FROM DUAL;

-- ν•¨μˆ˜ 쑰회
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION';
DROP FUNCTION IS_DATE_TEST7;

7-2-4. ν”„λ‘œμ‹œμ €μ—μ„œ λ‚ μ§œ λ³€ν™˜ 였λ₯˜ 처리

  • TO_DATE, TO_CHAR ν•¨μˆ˜ μ‚¬μš© μ‹œ 두 번째 인자인 λ‚ μ§œ 포맷을 μ§€μ •ν•˜μ§€ μ•Šμ„ 경우
    • ORA-01861: literal does not match format string(λ¦¬ν„°λŸ΄μ΄ ν˜•μ‹ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠμŒ) 였λ₯˜ λ°œμƒ
    • TO_DATE('2023-09-22', 'YYYY-MM-DD') 이와 같이 λ‚ μ§œ 포맷 μ§€μ • ν•„μš”

8. νŠΈλžœμž­μ…˜

  • 일관성 μžˆλŠ” μƒν˜Έμž‘μš©μ„ μœ„ν•œ λ‹¨μœ„
  • λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ€ ACID(Atomicity, Consistency, Isolation, Durability)λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ νŠΈλžœμž­μ…˜μ„ 논리적 μž‘μ—… λ‹¨μœ„λ‘œ μ‚¬μš©
  • νŠΈλžœμž­μ…˜μ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€λŠ” 항상 일관성 μžˆλŠ” μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό 함

8-1. COMMIT

  • λ°μ΄ν„°λ² μ΄μŠ€ 연산이 μ •ν™•νžˆ μ’…λ£Œλ˜μ–΄ λ³€κ²½ 내역을 μ‹€μ œ λ°μ΄ν„°λ² μ΄μŠ€μ— 반영
  • μ»€λ°‹ν•˜κΈ° μ „, μ„œλ²„μ— λ‘€λ°± μ„Έκ·Έλ¨ΌνŠΈ 버퍼가 λ§Œλ“€μ–΄μ§€λ©° 영ν–₯ 받은 행듀이 LOCK 됨
    • SELECT문을 μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜μ˜ 효과λ₯Ό λ³Ό 수 있음
  • 컀밋 ν›„, 영ν–₯ 받은 행에 수용된 LOCK이 ν•΄μ œλ˜λ©° μ„œλ²„ λ‚΄λΆ€ νŠΈλžœμž­μ…˜ ν…Œμ΄λΈ”μ΄ μ‹œμŠ€ν…œ λ³€κ²½ 번호λ₯Ό 생성, νŠΈλžœμž­μ…˜μ— λŒ€μž…, ν…Œμ΄λΈ”μ— μ €μž₯함

8-2. ROLLBACK

  • λ°μ΄ν„°λ² μ΄μŠ€ μ—°μ‚° 쀑 문제 λ°œμƒ μ§μ „μ˜ COMMIT μ§€μ κΉŒμ§€ 되돌림
  • ROLLBACK TO SAVEPOINTλ₯Ό μ΄μš©ν•΄ μΌλΆ€λ§Œ ROLLBACK κ°€λŠ₯
ROLLBACK [WORK] [TO [SAVEPOINT] μ„Έμ΄λΈŒν¬μΈνŠΈλͺ…];

8-2-1. SAVEPOINT

  • ROLLBACK μˆ˜ν–‰ μ‹œ λ§ˆμ§€λ§‰ COMMIT μ§€μ κΉŒμ§€ λ˜λŒμ•„κ°
  • SAVEPOINT μ§€μ •ν•˜λ©΄ κ·Έ λΆ€λΆ„μ—μ„œ νŠΈλžœμž­μ…˜ μ·¨μ†Œ κ°€λŠ₯

9. μ„Έμ…˜(Session)

  • μ„Έμ…˜μ€ μ‚¬μš©μžκ°€ 였라클 λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘μ†ν•˜μ—¬ μ’…λ£Œν•  λ•ŒκΉŒμ§€ 계속 μœ μ§€λ¨
  • 각 μ„Έμ…˜μ—λŠ” κ³ μœ ν•œ SID(Session identifier)와 SERIAL#(serial number)을 가짐
  • 락(Lock) : νŠΉμ • μ„Έμ…˜μ΄ ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό λ³€κ²½ν•˜κ³  COMMIT/ROLLBACK ν•˜κΈ° μ „κΉŒμ§€ λ‹€λ₯Έ μ„Έμ…˜μ΄ μ‘°μž‘ λΆˆκ°€λŠ₯ν•œ μƒνƒœ
  • λ°λ“œλ½(DeadLock) : ꡐ착 μƒνƒœ, 두 개 μ΄μƒμ˜ μž‘μ—…μ΄ μ„œλ‘œμ˜ νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ¬΄ν•œμ • λŒ€κΈ°ν•˜λŠ” μƒνƒœ

9-1. μ„Έμ…˜ 쑰회

  • ν˜„μž¬ 접속 수 : SELECT * FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ('processes', 'sessions', 'transactions');
  • μ„Έμ…˜ 확인 : SELECT * FROM V$SESSION;
  • μ„Έμ…˜ KILL : ALTER SYSTEM KILL SESSION '[SID], [SERIAL#]';

9-1-1. μ„Έμ…˜ μ‚¬μš© 쀑인 ν…Œμ΄λΈ” 쑰회

-- μ„Έμ…˜ μ‚¬μš© 쀑인 ν…Œμ΄λΈ” λͺ… 확인 κ°€λŠ₯
SELECT O.OBJECT_NAME, S.STATUS, S.SID, S.SERIAL#, P.SPID, S.PROGRAM, SQ.SQL_FULLTEXT, S.LOGON_TIME
FROM V$LOCKED_OBJECT L,
     DBA_OBJECTS O,
     V$SESSION S,
     V$PROCESS P,
     V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
  AND L.SESSION_ID = S.SID
  AND S.PADDR = P.ADDR
  AND S.SQL_ADDRESS = SQ.ADDRESS;
-- μ•„λž˜ μΏΌλ¦¬λ‘œλ„ 쑰회 κ°€λŠ₯
SELECT /*+ PARALLEL(64) */
  a.sid,       -- SID
  a.serial#,   -- μ‹œλ¦¬μ–Όλ²ˆν˜Έ
  a.status,    -- μƒνƒœμ •λ³΄
  a.process,   -- ν”„λ‘œμ„ΈμŠ€μ •λ³΄
  a.username,  -- μœ μ €
  a.osuser,    -- μ ‘μ†μžμ˜ OS μ‚¬μš©μž 정보
  b.sql_text,  -- sql
  c.program    -- 접속 ν”„λ‘œκ·Έλž¨
FROM
  v$session a,
  v$sqlarea b,
  v$process c
WHERE
  a.sql_hash_value=b.hash_value
  AND a.sql_address=b.address
  AND a.paddr=c.addr
  AND a.status='ACTIVE';

9-1-2. μ‹€ν–‰ 쀑인 쿼리의 μ§„ν–‰ μƒνƒœ 쑰회

  • SQL_ID λ₯Ό μ΄μš©ν•΄ SQL Monitoring List 쑰회
-- μ°ΎμœΌλ €λŠ” 쿼리의 SQL_ID 확인
select dbms_sqltune.report_sql_monitor_list(type=>'TEXT', report_level=>'ALL', active_since_sec=>60) as report from dual;
-- SQL_ID μž…ν˜ν•˜μ—¬ μ‹€ν–‰μƒνƒœ 확인 κ°€λŠ₯
select DBMS_SQLTUNE.report_sql_monitor(sql_id => '&sql_id', type=>'TEXT' , report_level => 'ALL') from dual;
  • DBA_SEGMENTS ν…Œμ΄λΈ”μ—μ„œ 쑰회
SELECT * FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'ν…Œμ΄λΈ”λͺ…';