All pages
1 of 93

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

μ°Έμ‘° μ•ˆλ‚΄μ„œ

μ‘°κ±΄ν•¨μˆ˜(Conditional Functions)

μ§‘κ³„ν•¨μˆ˜(Aggregate Functions)

λ‚ μ§œμ‹œκ°„ν•¨μˆ˜(DateTime Functions)

Misc ν•¨μˆ˜(Misc Functions)

Math ν•¨μˆ˜(Math Functions)

ν…μŠ€νŠΈ ν•¨μˆ˜(Text Functions)

ν™˜κ²½ ν•¨μˆ˜(Environment Functions)

SYSTIMESTAMP

Syntax


κ°œμš”

systimestamp ν•¨μˆ˜λŠ” ν˜„μž¬ λ¬Έ(statement)의 νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ„œλ²„μ˜ μ‹œκ°„λŒ€ κΈ°μ€€μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œλŠ” GetCurrentTimestamp()λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„œλ²„μ˜ νƒ€μž„μ‘΄μ— 맞좰 νƒ€μž„μŠ€νƒ¬ν”„ 값을 κ°€μ Έμ˜΅λ‹ˆλ‹€.


예제

SESSIONTIMEZONE

Syntax


κ°œμš”

sessiontimezone ν•¨μˆ˜λŠ” ν˜„μž¬ μ„Έμ…˜μ˜ νƒ€μž„μ‘΄μ„ ν…μŠ€νŠΈ κ°’μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œλŠ” show_timezone() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν˜„μž¬ μ„Έμ…˜μ˜ μ‹œκ°„λŒ€λ₯Ό μ‘°νšŒν•œ ν›„, 이λ₯Ό ν…μŠ€νŠΈλ‘œ λ³€ν™˜ν•΄ λ°˜ν™˜ν•©λ‹ˆλ‹€.


예제

SYSTIMESTAMP()
RETURNS timestamptz;
SELECT SYSTIMESTAMP();

         systimestamp          
-------------------------------
 2025-03-06 23:41:29.160617+09
(1 row)
SESSIONTIMEZONE()
RETURNS text;
select sessiontimezone();

 sessiontimezone 
-----------------
 Asia/Seoul
(1 row)

TO_YMINTERVAL


TO_YMINTERVAL은 λ¬Έμžμ—΄μ„ INTERVAL YEAR TO MONTH νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

MONTHS_BETWEEN


MONTHS_BETWEEN ν•¨μˆ˜λŠ” 두 λ‚ μ§œ(λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„) μ‚¬μ΄μ˜ κ°œμ›” 수λ₯Ό κ³„μ‚°ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

두 λ‚ μ§œμ˜ μ—°, μ›”, 일을 λΉ„κ΅ν•˜μ—¬ κ°œμ›” 차이λ₯Ό κ΅¬ν•˜λŠ”λ°, λ§Œμ•½ 두 λ‚ μ§œ λͺ¨λ‘ ν•΄λ‹Ή μ›”μ˜ λ§ˆμ§€λ§‰ 날이면 μ •μˆ˜ κ°œμ›” 수둜 κ³„μ‚°ν•©λ‹ˆλ‹€.

κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°μ—λŠ” 일(day) 차이λ₯Ό 31일둜 λ‚˜λˆˆ 값이 μ†Œμˆ˜μ  μ΄ν•˜λ‘œ 더해져 λ°˜ν™˜λ©λ‹ˆλ‹€. 즉, μ†Œμˆ˜μ  μ΄ν•˜ 값은 31일 κΈ°μ€€μœΌλ‘œ κ³„μ‚°λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

LNNVL


lnnvl ν•¨μˆ˜λŠ” μž…λ ₯된 λΆˆλ¦¬μ–Έ 값에 λŒ€ν•΄ λ°˜λŒ€ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

즉, μΈμžκ°€ trueλ©΄ falseλ₯Ό, falseλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ˜ν•œ, μΈμžκ°€ NULL이면 trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

NANVL


NANVL ν•¨μˆ˜λŠ” 첫 번째 μΈμžκ°€ NaN(Not a Number)이면 두 번째 μΈμžκ°’μ„ λ°˜ν™˜ν•˜κ³ , NaN이 μ•„λ‹ˆλ©΄ 첫 번째 μΈμžκ°’μ„ κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

두 번째 μΈμžκ°€ varchar κ°€ μ•„λ‹ˆλΌλ©΄, 첫 번째 μΈμžμ™€ νƒ€μž…μ΄ 동일해야 ν•©λ‹ˆλ‹€.

뢀동 μ†Œμˆ˜μ μ΄λ‚˜ μˆ«μžν˜• λ°μ΄ν„°μ—μ„œ NaN을 λ‹€λ₯Έ κ°’μœΌλ‘œ λŒ€μ²΄ν•  λ•Œ μ“°μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

NUMTOYMINTERVAL


NUMTOYMINTERVAL은 μž…λ ₯으둜 λ“€μ–΄μ˜¨ 값을 년도-달 ꡬ간 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

SYSDATE


sysdate ν•¨μˆ˜λŠ” μ„œλ²„ μ‹œκ°„λŒ€ κΈ°μ€€μ˜ ν˜„μž¬ λ¬Έ(statement) νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Oracle의 sysdate와 μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•˜λ©°, λ°˜ν™˜λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„λŠ” μ†Œμˆ˜ 자릿수λ₯Ό μ œκ±°ν•˜μ—¬ Oracle DATE νƒ€μž…μ²˜λŸΌ μ‚¬μš©λ©λ‹ˆλ‹€.


SQL ν•¨μˆ˜(SQL function) μ°Έμ‘° μ•ˆλ‚΄μ„œ

o2functions extension μ„€μΉ˜ ν›„ μ‹ κ·œ ν•¨μˆ˜λ“€μ΄ μΆ”κ°€λ˜λ©°, μ•„λž˜μ˜ 2κ°€μ§€ ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

μŠ€ν‚€λ§ˆ(κΈ°λ³Έ oracle)의 이름을 function μ•žμ— μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

μŠ€ν‚€λ§ˆ(κΈ°λ³Έ oracle)λ₯Ό κ°€μž₯ 높은 μš°μ„ μˆœμœ„ search_path둜 μ„€μ •ν•œ 경우, μŠ€ν‚€λ§ˆλ₯Ό μƒλž΅ν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

각 ν•¨μˆ˜λ“€ 사양은 μŠ€ν‚€λ§ˆλ₯Ό μƒλž΅ν•œ ν˜•νƒœλ‘œ κΈ°μˆ ν•©λ‹ˆλ‹€.

XML ν•¨μˆ˜(XML Functions)

Format ν•¨μˆ˜(Format Functions)

Syntax

κ°œμš”

예제

{schema_name}.{function_name}

-- μ˜ˆμ‹œ) o2views extension μ„€μΉ˜ ν›„, μƒˆλ‘œ μΆ”κ°€λœ sysdateλΌλŠ” ν•¨μˆ˜ μ‚¬μš©
-- select oracle.sysdate();

search_pathλ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ€ 경우

search_pathλ₯Ό μ„€μ •ν•œ 경우

LAST_DAY

Syntax


κ°œμš”

μ£Όμ–΄μ§„ λ‚ μ§œκ°€ μ†ν•œ λ‹¬μ˜ λ§ˆμ§€λ§‰ λ‚ μ§œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

DATE νƒ€μž…μ˜ 경우, λ‹¨μˆœνžˆ κ·Έ λ‹¬μ˜ λ§ˆμ§€λ§‰ 일자λ₯Ό κ³„μ‚°ν•˜λ©°, TIMESTAMPTZ νƒ€μž…μ˜ κ²½μš°μ—λŠ” λ‚ μ§œλ₯Ό μ ˆμ‚­ν•œ ν›„ μ›λž˜μ˜ μ‹œκ°„ 정보λ₯Ό κ²°ν•©ν•˜μ—¬ νƒ€μž„μŠ€νƒ¬ν”„ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

value

date, timestamptz νƒ€μž…μž…λ‹ˆλ‹€; λ§ˆμ§€λ§‰ λ‚ μ§œλ₯Ό ꡬ할 κΈ°μ€€ λ‚ μ§œμž…λ‹ˆλ‹€. timestamptz의 경우, ν•΄λ‹Ή λ‹¬μ˜ 첫 날을 κ΅¬ν•œ ν›„ ν•œ 달을 λ”ν•˜κ³  ν•˜λ£¨λ₯Ό λΉΌλŠ” λ°©μ‹μœΌλ‘œ κ³„μ‚°ν•©λ‹ˆλ‹€.


예제

TANH

Syntax


κ°œμš”

COSHλŠ” n의 hyperbolic cosineμž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

num

Numeric data typeμ΄κ±°λ‚˜ Numeric으둜 λ³€ν™˜λ  수 μžˆλŠ” data type을 인자둜 μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜ν™˜ νƒ€μž…μ€ 인자둜 μ£Όμ—ˆλ˜ numeric data typeκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


예제

HEXTORAW

Syntax


κ°œμš”

HEXTORAWλŠ” 16μ§„μˆ˜λ‘œ ν‘œν˜„λœ λ¬Έμžμ—΄μ˜ RAW 값을 κ΅¬ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str

16μ§„μˆ˜ ν˜•νƒœμ˜ λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.


예제

BIN_TO_NUM

Syntax


κ°œμš”

BIN_TO_NUMλŠ” bit vectorλ₯Ό ν•΄λ‹Ή μ •μˆ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

expr

exprλŠ” μˆ«μžν˜• νƒ€μž…μ΄λ‚˜ μˆ«μžν˜• νƒ€μž…μœΌλ‘œ λ³€ν™˜λ  수 μžˆλŠ” 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.expr의 λ°˜ν™˜ 값이 μˆ«μžν˜• νƒ€μž…μ΄ μ•„λ‹ˆλ©΄ μˆ«μžν˜• νƒ€μž…μœΌλ‘œ λ³€ν™˜ ν›„ μ •μˆ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•΄μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€. (trunc() 결과와 κ°™λ‹€)λ³€ν™˜ ν›„μ˜ μ •μˆ˜ 값은 0 λ˜λŠ” 1 이어야 ν•©λ‹ˆλ‹€.


예제

COSH

Syntax


κ°œμš”

COSHλŠ” n의 hyperbolic cosineμž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

num

Numeric data typeμ΄κ±°λ‚˜ Numeric으둜 λ³€ν™˜λ  수 μžˆλŠ” data type을 인자둜 μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜ν™˜ νƒ€μž…μ€ 인자둜 μ£Όμ—ˆλ˜ numeric data typeκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


예제

LENGTH

Syntax


κ°œμš”

LENGTH λŠ” μ£Όμ–΄μ§„ str의 길이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str

λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. CHAR, TEXT νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.


예제

κ΅¬μ„±μš”μ†Œ
μ„€λͺ…

years

0~177999999 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.

months

0~11 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€. ym_iso_format의 경우 0~999999999 μ‚¬μ΄μ˜ μ •μˆ˜κ°€ λ“€μ–΄μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.


sql_format

κ΅¬κ°„μ˜ 값을 λ°˜ν™˜ν•˜λŠ” text νƒ€μž…μ΄λ©°, λ‹€μŒκ³Ό 같은 포맷으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. '[+|-]years-months'

ym_iso_format

Syntax

κ°œμš”

νŒŒλΌλ―Έν„°

κ΅¬κ°„μ˜ 값을 λ°˜ν™˜ν•˜λŠ” text νƒ€μž…μ΄λ©° λ‹€μŒκ³Ό 같은 포맷으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. '[-]P[Y][M]'

κ΅¬μ„±μš”μ†Œ

예제

date2 / timestamptz2

date / timestamptz νƒ€μž…μž…λ‹ˆλ‹€; date1/timestamptz1κ³Ό 비ꡐ할 λŒ€μƒ λ‚ μ§œ (λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„) κ°’μž…λ‹ˆλ‹€.


date1 / timestamptz1

Syntax

κ°œμš”

νŒŒλΌλ―Έν„°

date / timestamptz νƒ€μž…μž…λ‹ˆλ‹€; λΉ„κ΅μ˜ 기쀀이 λ˜λŠ” λ‚ μ§œ (λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„) κ°’μž…λ‹ˆλ‹€.

예제


value

Syntax

κ°œμš”

νŒŒλΌλ―Έν„°

boolean νƒ€μž…μž…λ‹ˆλ‹€; 비ꡐ할 λΆˆλ¦¬μ•ˆ κ°’μž…λ‹ˆλ‹€. NULL이면 κ²°κ³ΌλŠ” trueμž…λ‹ˆλ‹€.

예제

검사할 숫자 κ°’(real, double precision, numeric)μž…λ‹ˆλ‹€; NaN이면 replacement κ°’ λ°˜ν™˜νž™ν•©λ‹ˆλ‹€.

replacement

valueκ°€ NaN 일 λ•Œ λŒ€μ‹  λ°˜ν™˜ν•  κ°’(varchar, real, double precision, numeric)μž…λ‹ˆλ‹€;varchar 일 경우, value의 νƒ€μž…μœΌλ‘œ μžλ™ μΊμŠ€νŒ… λ©λ‹ˆλ‹€.


Syntax

κ°œμš”

νŒŒλΌλ―Έν„°

value

예제


expr

λ³€ν™˜ν•  μž…λ ₯ κ°’μž…λ‹ˆλ‹€.

interval_unit

Syntax

κ°œμš”

νŒŒλΌλ―Έν„°

λ³€ν™˜μ˜ λ‹¨μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€. 'YEAR', 'MONTH' 쀑 ν•˜λ‚˜μ˜ κ°’λ§Œ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

예제

SYSDATE()
RETURN TIMESTAMP;
select sysdate();

       sysdate       
---------------------
 2025-03-06 22:39:05
(1 row)
-- ν˜„μž¬ 접속 μ„Έμ…˜μ—μ„œ μŠ€ν‚€λ§ˆ 'oracle'λ₯Ό κ°€μž₯ μš°μ„ μˆœμœ„ 높은 search_path둜 μ„€μ •
set search_path to oracle, public;

{function_name}

-- μ˜ˆμ‹œ) o2views extension μ„€μΉ˜ ν›„, μƒˆλ‘œ μΆ”κ°€λœ sysdateλΌλŠ” ν•¨μˆ˜ μ‚¬μš©
-- select sysdate();
LAST_DAY
(
  value  IN date
)
RETURNS date;

LAST_DAY
(
  value  IN TIMESTAMP with time zone
)
RETURNS TIMESTAMP without time zone;
-- DATE νƒ€μž… 예제: '2023-05-15'κ°€ μ†ν•œ λ‹¬μ˜ λ§ˆμ§€λ§‰ λ‚ μ§œ λ°˜ν™˜
SELECT LAST_DAY('2023-05-15'::date);
-- κ²°κ³Ό: '2023-05-31' (2023λ…„ 5μ›”μ˜ λ§ˆμ§€λ§‰ λ‚ )

  last_day  
------------
 2023-05-31
(1 row)

-- TIMESTAMPTZ νƒ€μž… 예제: '2023-05-15 14:30:00+09'κ°€ μ†ν•œ λ‹¬μ˜ λ§ˆμ§€λ§‰ λ‚ μ§œ λ°˜ν™˜
SELECT LAST_DAY('2023-05-15 14:30:00+09'::timestamptz);
-- κ²°κ³Ό: νƒ€μž„μŠ€νƒ¬ν”„ κ°’μœΌλ‘œ ν•΄λ‹Ή λ‹¬μ˜ λ§ˆμ§€λ§‰ λ‚ κ³Ό μ›λž˜ μ‹œκ°„ 정보가 κ²°ν•©λ˜μ–΄ λ°˜ν™˜λ¨

      last_day       
---------------------
 2023-05-31 14:30:00
(1 row)
COSH(num)
SELECT TANH(0);
 tanh 
------
    0
HEXTORAW
(
  str IN text
)
RETURNS bytea;
SELECT HEXTORAW('DB') AS col;
 col  
------
 \xdb
(1개 ν–‰)
BIN_TO_NUM
(
  expr1, expr2, ..., exprn IN numeric  -- variadic: treated as numeric[]
)
RETURNS numeric;
SELECT BIN_TO_NUM(1,0,1);
 bin_to_num 
------------
          5
(1개 ν–‰)

SELECT BIN_TO_NUM('1',0,1);
 bin_to_num 
------------
          5
(1개 ν–‰)

SELECT BIN_TO_NUM('2',0,1);
ERROR:  Invalid value in array, only 0 and 1 are allowed
COSH(num)
SELECT COSH(0);
 cosh 
------
    1
LENGTH(str)
 SELECT LENGTH('abc'::char(6));
 length 
--------
      6
(1 row)

 SELECT LENGTH(''::char(6));
 length 
--------
      6
(1 row)
TO_YMINTERVAL
(
  sql_format IN text -- format: '[+|-]years-months'
)
RETURNS interval;

TO_YMINTERVAL
(
  ym_iso_format IN text -- format: '[-]P[<years>Y][<months>M]'
)
RETURNS interval;
SELECT DATE '2008-03-20' + TO_YMINTERVAL('2-7') AFTER;
         after          
------------------------
 2010-10-20 09:00:00+09
(1개 ν–‰)

SELECT DATE '2008-03-20' + TO_YMINTERVAL('P2Y7M') AFTER;
         after          
------------------------
 2010-10-20 09:00:00+09
(1개 ν–‰)
MONTHS_BETWEEN
(
  date1  IN date,
  date2  IN date
)
RETURNS numeric;

MONTHS_BETWEEN
(
  timestamptz1  IN timestamptz,
  timestamptz2  IN timestamptz
)
RETURNS numeric;
# ν…ŒμŠ€νŠΈ 1
SELECT MONTHS_BETWEEN('2023-05-15'::date, '2022-01-10'::date);

  months_between  
------------------
 16.1612903225806
(1 row)

# ν…ŒμŠ€νŠΈ 2
SELECT MONTHS_BETWEEN('2023-05-15 12:00:00+09'::timestamptz, '2022-01-10 08:30:00+09'::timestamptz);

  months_between  
------------------
 16.1659946143627
LNNVL
(
  value  IN boolean
)
RETURNS boolean;
# ν…ŒμŠ€νŠΈ 1
SELECT LNNVL(true);  

 lnnvl 
-------
 f
(1 row)

# ν…ŒμŠ€νŠΈ 2
SELECT LNNVL(false);  

 lnnvl 
-------
 t
(1 row)

# ν…ŒμŠ€νŠΈ 3
SELECT LNNVL(NULL);  

 lnnvl 
-------
 t
(1 row)
NANVL
(
  value         IN { real, double precision, numeric },
  replacement   IN { varchar, real, double precision, numeric }
)
RETURNS { real, double precision, numeric };
# ν…ŒμŠ€νŠΈ 1
SELECT NANVL(3.14, 0.0); -- κ²°κ³Ό: 3.14 (3.14κ°€ NaN이 μ•„λ‹ˆλ―€λ‘œ μ›λž˜ κ°’ λ°˜ν™˜)

 nanvl 
-------
  3.14
(1 row)

# ν…ŒμŠ€νŠΈ 2
SELECT NANVL('NaN'::float4, 0.0); -- κ²°κ³Ό: 0.0 (첫 번째 값이 NaNμ΄μ–΄μ„œ λŒ€μ²΄κ°’ 0.0 λ°˜ν™˜)

 nanvl 
-------
     0
(1 row)
NUMTOYMINTERVAL
(
  expr             IN numeric,
  interval_unit    IN text
)
RETURNS interval;
SELECT NUMTOYMINTERVAL (10, 'YEAR');
 numtoyminterval 
-----------------
 10 years
(1개 ν–‰)

SELECT NUMTOYMINTERVAL (10, 'month');
 numtoyminterval 
-----------------
 10 mons
(1개 ν–‰)

SELECT NUMTOYMINTERVAL (0, 'month');
 numtoyminterval 
-----------------
 00:00:00
(1개 ν–‰)

μ•„ν‚€ν…μ²˜ κ°œμš”

PostgreSQL의 Extension μ†Œκ°œ

PostgreSQL은 ν™•μž₯성이 λ›°μ–΄λ‚œ μ˜€ν”ˆμ†ŒμŠ€ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ 잘 μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ…성을 μ΄λ£¨λŠ” λ°μ—λŠ” PostgreSQL의 κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ ν™•μž₯ν•  수 μžˆλŠ” Extension Frameworkκ°€ 큰 역할을 ν•©λ‹ˆλ‹€. Extension을 ν™œμš©ν•œ κΈ°λŠ₯ ν™•μž₯은 PostgreSQL의 λ‹€μ–‘ν•œ 데이터 νƒ€μž… 및 ν•¨μˆ˜ 지원을 κ°€λŠ₯ν•˜κ²Œ ν•˜λ©°, 더 λ‚˜μ•„κ°€ λ‚΄λΆ€ κΈ°λŠ₯의 κ°œμ„ λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

Extension의 μ€‘μš”ν•œ νŠΉμ§•μ€ PostgreSQL μΈμŠ€ν„΄μŠ€μ— λ™μ μœΌλ‘œ λ‘œλ”© λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 즉, PostgreSQLμ—μ„œλŠ” Extension을 톡해 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ μ†ŒμŠ€λ₯Ό λ‹€μ‹œ λΉŒλ“œν•˜κ±°λ‚˜ μ‹€ν–‰ νŒŒμΌμ„ ꡐ체할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€ 기동 μ‹œ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ ν•„μš”ν•œ Extension을 μ œμ™Έν•˜λ©΄, Extension을 μΆ”κ°€ν•  λ•Œ μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€μ‹œ κΈ°λ™ν•˜λŠ” 일도 ν•„μš” μ—†μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 점 λ•Œλ¬Έμ— PostgreSQLμ—μ„œλŠ” μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” μž‘μ—…μ΄ 맀우 κ°„νŽΈν•©λ‹ˆλ‹€.


O2 Extensions μ†Œκ°œ

O2λŠ” OpenSQL for Oracle의 μ•½μ–΄λ‘œ, Oracle 데이터 νƒ€μž…, λ·°, λ‚΄μž₯ ν•¨μˆ˜ 및 λ‚΄μž₯ νŒ¨ν‚€μ§€λ₯Ό ν˜Έν™˜ν•΄μ£ΌλŠ” Extension의 μ§‘ν•©μž…λ‹ˆλ‹€. O2λŠ” μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈμΈ Orafceλ₯Ό 기반으둜 μ‹œμž‘λ˜μ—ˆμ§€λ§Œ, λ‹€μ–‘ν•œ λ°©λ©΄μ—μ„œ λ§Žμ€ λ³€ν™”κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ›λž˜ ν•˜λ‚˜μ˜ Extension으둜 κ΄€λ¦¬λ˜μ—ˆλ˜ Orafceλ₯Ό μ—¬λŸ¬ 개의 Extension으둜 λΆ„λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

O2 Extensionsμ—λŠ” μ•„λž˜ Extension이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • O2Types: Oracle 데이터 νƒ€μž… ν˜Έν™˜ Extension

  • O2Views: Oracle λ·° ν˜Έν™˜ Extension

  • O2Functions: Oracle λ‚΄μž₯ ν•¨μˆ˜ ν˜Έν™˜ Extension

  • Package Extensions: Oracle λ‚΄μž₯ νŒ¨ν‚€μ§€ ν˜Έν™˜ Extension λͺ¨μŒ

    • DBMS_ALERT

    • DBMS_ASSERT

    • DBMS_OUTPUT

μ›λž˜ ν•˜λ‚˜μ˜ Extension으둜 κ΄€λ¦¬λ˜μ—ˆλ˜ Orafceλ₯Ό μ—¬λŸ¬ 개의 Extension으둜 λΆ„λ¦¬ν•˜μ—¬, 패치 μž‘μ—…μ˜ μœ μ—°μ„±μ„ 크게 ν–₯상 μ‹œμΌ°μŠ΅λ‹ˆλ‹€. λ˜ν•œ, 였랜 κΈ°κ°„ λ™μ•ˆ μ μ§„μ μœΌλ‘œ κ°œλ°œλ˜λ©΄μ„œ κ³΅ν†΅λœ μ»¨λ²€μ…˜μ΄λ‚˜ ν”„λ ˆμž„μ›Œν¬μ˜ λΆ€μž¬κ°€ λ¬Έμ œμ˜€λŠ”λ°, 이λ₯Ό ν†΅ν•©ν•˜λŠ” κ³Όμ •μ—μ„œ κ°œμ„ μ‹œμΌ°μŠ΅λ‹ˆλ‹€.


O2 Extensionμ—μ„œ μ œκ³΅ν•˜λŠ” λ‚΄μž₯ ν•¨μˆ˜λ‚˜ νŒ¨ν‚€μ§€λŠ” λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜(UDF)둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. PostgreSQL은 μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ SQL, PL/pgSQL뿐만 μ•„λ‹ˆλΌ C/C++, Python, Perl, Rust λ“± λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. O2 Extension은 특히 SQL 및 PL/pgSQL둜 μž‘μ„±λœ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ₯Ό C μ½”λ“œλ‘œ λ³€κ²½ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.

PostgreSQL Query μ‹€ν–‰ 엔진이 SQLμ΄λ‚˜ PL/pgSQL둜 μž‘μ„±λœ UDFλ₯Ό μ‹€ν–‰ν•  λ•Œ λ‚΄λΆ€μ μœΌλ‘œ μ»€μ„œλ₯Ό μƒμ„±ν•˜μ—¬ μ„œλΈŒμΏΌλ¦¬λ₯Ό μ‹€ν–‰ν•˜μ§€λ§Œ, C μ½”λ“œλ‘œ μž‘μ„±λœ ν•¨μˆ˜λŠ” 컴파일 된 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 직접 μ‹€ν–‰λ˜λ―€λ‘œ λΉ λ₯Έ μ„±λŠ₯을 보μž₯ν•©λ‹ˆλ‹€. λ˜ν•œ, C μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄ PostgreSQL 라이브러리λ₯Ό ν™œμš©ν•˜μ—¬ 더 μ •κ΅ν•˜κ³  μœ μ—°ν•œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

κΈ°μ‘΄ OrafceλŠ” ν•˜λ‚˜μ˜ Extension으둜 κ΄€λ¦¬λ˜μ—ˆκΈ° λ•Œλ¬Έμ—, 전체 κ΅¬ν˜„ 쀑 ν•˜λ‚˜μ˜ μš”μ†Œμ— λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ 전체 Extension을 μ—…λ°μ΄νŠΈν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. 반면, O2λŠ” μ—¬λŸ¬ 개의 Extension으둜 λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•¨μœΌλ‘œμ¨, λ¬Έμ œκ°€ λ°œμƒν•œ Extension만 κ΅μ²΄ν•˜λ©΄ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, DBMS_ALERTλ‚˜ DBMS_PIPE와 같이 곡유 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” νŒ¨ν‚€μ§€λŠ” shared_preload_libraries에 μΆ”κ°€ν•˜μ—¬ DB μΈμŠ€ν„΄μŠ€λ₯Ό 기동해야 ν•˜λŠ”λ°, O2의 경우 이듀 Extension이 λ³„λ„λ‘œ λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄ ν•„μš”ν•œ Extension만 shared_preload_libraries에 μΆ”κ°€ν•˜λ©΄ λ˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€. 이와 같은 κ°œμ„  사항듀은 O2 Extension이 PostgreSQL μ‚¬μš©μžλ“€μ—κ²Œ 더 κ°•λ ₯ν•˜κ³  μœ μ—°ν•œ Oracle ν˜Έν™˜ κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, O2 Extension의 λ„μž…μœΌλ‘œ 인해 μ„±λŠ₯, μœ μ—°μ„±, μ•ˆμ •μ„±μ΄ 크게 ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

TO_DSINTERVAL

Syntax

TO_DSINTERVAL
(
  sql_format IN text -- format: '[+|-]days hours:minutes:seconds[.frac_secs]'
)
RETURNS interval;

TO_DSINTERVAL
(
  ds_iso_format In text  -- format: '[-]P[<days>D][T[<hours>H][<minutes>M][<seconds>[.frac_secs]S]]'
)
RETURNS interval;

κ°œμš”

TO_DSINTERVAL은 λ¬Έμžμ—΄μ„ INTERVAL DAY TO SECOND νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

sql_format

ꡬ간 ν˜•νƒœμ˜ λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 포맷으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. '[+|-]days hours:minutes:seconds[.frac_secs]'

ds_iso_format

κ΅¬μ„±μš”μ†Œ
μ„€λͺ…

GREATEST

Syntex

GREATEST
(
  expr1       IN anynonarray,
  expr_array  IN variadic anyarray
)
RETURNS anynonarray;

κ°œμš”

GREATEST ν•¨μˆ˜λŠ” μ „λ‹¬λœ μΈμžλ“€ μ€‘μ—μ„œ κ°€μž₯ 큰 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ§Œμ•½ 인자 쀑 ν•˜λ‚˜λΌλ„ NULL이면, 전체 κ²°κ³Όκ°€ NULL이 λ©λ‹ˆλ‹€.

PostgreSQL κΈ°λ³Έ ν•¨μˆ˜λŠ” λͺ¨λ“  μΈμžκ°€ NULL일 λ•Œλ§Œ NULL을 λ°˜ν™˜ν•˜λŠ”λ°, 이 ν•¨μˆ˜λŠ” ν•˜λ‚˜λΌλ„ NULL이면 NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

expr1


LEAST

Syntax

LEAST
(
  expr1       IN anynonarray,
  expr_array  IN variadic anyarray
)
RETURNS anynonarray;

κ°œμš”

LEAST ν•¨μˆ˜λŠ” μ „λ‹¬λœ μΈμžλ“€ μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ§Œμ•½ 인자 쀑 ν•˜λ‚˜λΌλ„ NULL이면, 전체 κ²°κ³Όκ°€ NULL이 λ©λ‹ˆλ‹€.

PostgreSQL κΈ°λ³Έ ν•¨μˆ˜λŠ” λͺ¨λ“  μΈμžκ°€ NULL일 λ•Œλ§Œ NULL을 λ°˜ν™˜ν•˜λŠ”λ°, 이 ν•¨μˆ˜λŠ” ν•˜λ‚˜λΌλ„ NULL이면 NULL이 λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

expr1


SYS_EXTRACT_UTC

Syntax

SYS_EXTRACT_UTC
(
  time  IN timestamp with time zone
)
RETURNS timestamp without time zone;

SYS_EXTRACT_UTC
(
  time  IN timestamp without time zone
)
RETURNS timestamp without time zone;

κ°œμš”

μž…λ ₯받은 νƒ€μž„μŠ€νƒ¬ν”„(with/without time zone)λ₯Ό UTC κΈ°μ€€μ˜ νƒ€μž„μŠ€νƒ¬ν”„(without timezone)둜 λ³€ν™˜ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

TIMESTAMP(without time zone)의 경우, λͺ…μ‹œν•œ timezone 정보와 관계 없이 값을 μ„Έμ…˜μ˜ timezone을 κΈ°μ€€μœΌλ‘œ ν•΄μ„ν•œ ν›„, ν•΄λ‹Ή 값을 UTC κΈ°μ€€μ˜ νƒ€μž„μŠ€νƒ¬ν”„λ‘œ λ³€ν™˜ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

즉, λͺ…μ‹œν•œ timezone에 따라 ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 적용 ν•˜κ³  싢을 μ‹œ, λ°˜λ“œμ‹œ TIMESTAMPκ°€ μ•„λ‹Œ TIMESTAMPTZ νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

INSTR

Syntax

INSTR(string, substring [, position [, occurrence]])

κ°œμš”

INSTR ν•¨μˆ˜λŠ” stringμ—μ„œ substring을 κ²€μƒ‰ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이 검색 연산은 μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ—μ„œ substringκ³Ό 같은 길이의 ν•˜μœ„ λ¬Έμžμ—΄μ„ 순차적으둜 λΉ„κ΅ν•˜μ—¬ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.

검색은 μ•žμͺ½(순방ν–₯) λ˜λŠ” λ’€μͺ½(μ—­λ°©ν–₯)으둜 μˆ˜ν–‰λ˜λ©°, 각 비ꡐ λŒ€μƒ ν•˜μœ„ λ¬Έμžμ—΄μ€ 이전 ν•˜μœ„ λ¬Έμžμ—΄μ˜ 첫 번째 λ¬Έμžμ—μ„œ ν•œ κΈ€μžμ”© μ΄λ™ν•˜λ©° μ‹œμž‘λ©λ‹ˆλ‹€. λ§Œμ•½ λΆ€λΆ„ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” ν•˜μœ„ λ¬Έμžμ—΄μ„ 찾으면, ν•΄λ‹Ή λΆ€λΆ„ λ¬Έμžμ—΄μ˜ 첫 번째 문자의 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μΌμΉ˜ν•˜λŠ” substring이 μ—†μœΌλ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

LTRIM

Syntax

LTRIM(str [, char_set])

κ°œμš”

LTRIM 은 str의 μ™Όμͺ½μœΌλ‘œλΆ€ν„° char_set 내에 ν¬ν•¨λœ λͺ¨λ“  문자λ₯Ό μ œκ±°ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str

λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.


MOD

Syntax

MOD(num1, num2);

κ°œμš”

MODλŠ” num1을 num2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. num2이 0이면, num1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” num1 λ˜λŠ” num2κ°€ 음수면 전톡적인 Modulus ν•¨μˆ˜μ™€λŠ” λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

전톡적인 Modulus ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

num1 - num2 * FLOOR(num1/num2)

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

REGEXP_LIKE

Syntax

REGEXP_COUNT(str, pattern [, match_param])

κ°œμš”

REGEXP_LIKE λŠ” strκ³Ό μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ£Όμ–΄μ§„ νŒ¨ν„΄μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

POSIX μ •κ·œ ν‘œν˜„μ‹ ν‘œμ€€μ„ λ”°λ¦…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str


LPAD

Syntax

LPAD(expr1, num [, expr2])

κ°œμš”

LPAD λŠ” expr1의 μ™Όμͺ½μ— expr2λ₯Ό μ—°μ†μ μœΌλ‘œ 뢙이고, num만큼의 길이λ₯Ό κ°€μ§„ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ 문자 μ§‘ν•©μ—μ„œλŠ” λ°˜ν™˜ λ˜λŠ” λ¬Έμžμ—΄μ˜ 문자 μˆ˜μ™€ 길이가 λ™μΌν•˜μ§€λ§Œ, ν•œκΈ€κ³Ό 같은 λ©€ν‹° λ°”μ΄νŠΈ 문자 μ§‘ν•©μ˜ κ²½μš°μ—λŠ” 두 값이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

expr1


TO_TIMESTAMP_TZ

Syntax

TO_TIMESTAMP_TZ
(
  str  IN text,
  fmt  IN text
)
RETURNS timestamp with time zone;

κ°œμš”

μž…λ ₯된 λ¬Έμžμ—΄κ³Ό 포맷 λͺ¨λΈμ„ μ΄μš©ν•˜μ—¬ νƒ€μž„μŠ€νƒ¬ν”„ with time zone (timestamptz) κ°’μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

PostgreSQL λ‚΄μž₯ ν•¨μˆ˜to_timestamp ν•¨μˆ˜λ₯Ό ν™œμš©ν•΄ λ¬Έμžμ—΄μ„ μ§€μ •ν•œ ν˜•μ‹μ— 따라 νŒŒμ‹±ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό timestamptz νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

Oracleκ³Ό 달리 νƒ€μž… μ•ˆμ •μ„±μ„ μ§€ν‚€κΈ° μœ„ν•΄, λ‚ μ§œ νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

SINH

Syntax

SINH(num)

κ°œμš”

SINHλŠ” num의 hyperbolic sineμž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

num

Numeric data typeμ΄κ±°λ‚˜ Numeric으둜 λ³€ν™˜λ  수 μžˆλŠ” data type을 인자둜 μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜ν™˜ νƒ€μž…μ€ 인자둜 μ£Όμ—ˆλ˜ numeric data typeκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


BITAND

Syntax

BITAND(expr1, expr2)

κ°œμš”

BITAND 연산은 μž…λ ₯κ³Ό 좜λ ₯을 bit둜 이뀄진 λ²‘ν„°λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ΄λ•Œ 좜λ ₯은 μž…λ ₯을 λΉ„νŠΈ λ‹¨μœ„λ‘œ AND μ—°μ‚°ν•œ κ²ƒμ˜ κ²°κ³Όμž…λ‹ˆλ‹€.

BITANDλŠ” λ‹€μŒκ³Ό 같은 단계λ₯Ό 걸쳐 κ³„μ‚°λ©λ‹ˆλ‹€.

  1. 인자 AλŠ” SIGN(A) * FLOOR(ABS(A))둜 λŒ€μ²΄λ©λ‹ˆλ‹€.

  2. 인자 AλŠ” n-bit two's complement 이진 μ •μˆ˜ κ°’μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€. 2 λΉ„νŠΈ 값은 λΉ„νŠΈ λ‹¨μœ„ AND 연산을 톡해 ν•©μ³μ§‘λ‹ˆλ‹€.

  3. n-bit two's complement 값은 NUMBER으둜 λ‹€μ‹œ λ³€ν™˜λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

NLSSORT

Syntax

NLSSORT(str [, ' nlsparam '])

κ°œμš”

NLSSORT λŠ” str을 μ •λ ¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 문자 λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str

μ •λ ¬ν•˜κΈ° μœ„ν•œ λ¬Έμžμ—΄ κ°’μž…λ‹ˆλ‹€. TEXT, CHAR νƒ€μž…μ˜ 데이터가 올 수 μžˆμŠ΅λ‹ˆλ‹€.


TO_SINGLE_BYTE

Syntax

TO_SINGLE_BYTE
(
  str  IN text
)
RETURNS text;

κ°œμš”

μž…λ ₯된 닀쀑 λ°”μ΄νŠΈ λ¬Έμžμ—΄μ„ κ°€λŠ₯ν•œ 경우 ν•΄λ‹Ήν•˜λŠ” 단일 λ°”μ΄νŠΈ(ASCII) 문자둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

μž…λ ₯ λ¬Έμžμ—΄μ—μ„œ 닀쀑 λ°”μ΄νŠΈ λ¬Έμžκ°€ 미리 μ •μ˜λœ λ§€ν•‘ ν…Œμ΄λΈ”μ— μ˜ν•΄ 단일 λ°”μ΄νŠΈ κ°’(λŒ€κ°œ ASCII μ½”λ“œ 0x20 μ΄μƒμ˜ κ°’)으둜 μΉ˜ν™˜λ˜λ©°, λ³€ν™˜μ΄ λΆˆκ°€λŠ₯ν•œ λ¬ΈμžλŠ” μ›λž˜ κ·ΈλŒ€λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°
μ„€λͺ…

str

text νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  λŒ€μƒ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 닀쀑 λ°”μ΄νŠΈ λ¬Έμžλ“€μ΄ 단일 λ°”μ΄νŠΈ 문자둜 λ³€ν™˜λ©λ‹ˆλ‹€.


ROUND


ROUND ν•¨μˆ˜λŠ” λ‚ μ§œλ‚˜ νƒ€μž„μŠ€νƒ¬ν”„ 값을 μ£Όμ–΄μ§„ 포맷 λͺ¨λΈμ— 따라 λ°˜μ˜¬λ¦Όν•©λ‹ˆλ‹€.

즉, μ§€μ •ν•œ λ‹¨μœ„(예: μ—°, μ›”, λΆ„ λ“±)에 맞좰 λ‚ μ§œλ‚˜ μ‹œκ°„μ˜ 값을 μ‘°μ •ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

포맷 λ¬Έμžμ—΄(fmt)을 톡해 반올림 λ‹¨μœ„λ₯Ό μ§€μ •ν•  수 있으며, 값이 NULL이면 κ·ΈλŒ€λ‘œ NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

νƒ€μž„μŠ€νƒ¬ν”„ λ²„μ „μ˜ 경우, μ‹œκ°„ 뢀뢄을 λ°˜μ˜¬λ¦Όν•œ ν›„ μ΄ˆλŠ” 0으둜 μ„€μ •λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

NVL


NVL ν•¨μˆ˜λŠ” 두 인자 쀑 첫 번째 μΈμžκ°€ NULL이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜ν•˜κ³ , λ§Œμ•½ NULL이면 두 번째 인자의 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ™μΌν•œ νƒ€μž…μ˜ μΈμžμ— λŒ€ν•΄μ„œλ§Œ ν˜ΈμΆœλ˜μ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μΌ 경우 암묡적 ν˜• λ³€ν™˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

return νƒ€μž…μ€ 첫번째 인자의 νƒ€μž…μ„ λ”°λ¦…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

WM_CONCAT


κ·Έλ£Ή λ‚΄μ˜ μ—¬λŸ¬ ν…μŠ€νŠΈ 값을 ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ κ²°ν•©ν•˜λŠ” 집계 ν•¨μˆ˜μž…λ‹ˆλ‹€.

μž…λ ₯된 ν…μŠ€νŠΈ 값을 순차적으둜 κ²°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄μ„ μƒμ„±ν•©λ‹ˆλ‹€.

λ‚΄λΆ€ λ™μž‘ 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • μž…λ ₯ 값이 NULL인 경우 ν•΄λ‹Ή 값은 μ§‘κ³„μ—μ„œ μ œμ™Έν•©λ‹ˆλ‹€.

  • 첫 번째 값이 μž…λ ₯되면 μƒˆλ‘œμš΄ μƒνƒœ(λ¬Έμžμ—΄ 버퍼)κ°€ μƒμ„±ν•©λ‹ˆλ‹€.

LISTAGG


LISTAGG ν•¨μˆ˜λŠ” Oracle의 LISTAGG 집계 ν•¨μˆ˜λ₯Ό PostgreSQLμ—μ„œ κ΅¬ν˜„ν•œ ν™•μž₯ ν•¨μˆ˜μž…λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” κ·Έλ£Ή λ‚΄μ˜ μ—¬λŸ¬ ν…μŠ€νŠΈ 값을 ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ κ²°ν•©ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

REGEXP_REPLACE


REGEXP_COUNT λŠ” str λ‚΄μ—μ„œ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ£Όμ–΄μ§„ νŒ¨ν„΄μ„ 탐색해 λ‹€λ₯Έ λ¬Έμžμ—΄λ‘œ λŒ€μΉ˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

NUMTODSINTERVAL


μ£Όμ–΄μ§„ 숫자 값을 νŠΉμ • λ‹¨μœ„(예: 'DAY', 'HOUR', 'MINUTE', 'SECOND')둜 ν•΄μ„ν•˜μ—¬ INTERVAL νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

숫자 값은 μ •μˆ˜λΆ€μ™€ μ†Œμˆ˜λΆ€λ‘œ λ‚˜λ‰˜λ©°,

  • 'DAY'인 경우 μ •μˆ˜λΆ€λŠ” 일(day)둜, μ†Œμˆ˜λΆ€λŠ” 24λ₯Ό κ³±ν•΄ μ‹œκ°„, λΆ„, 초둜 λ³€ν™˜λ©λ‹ˆλ‹€.

  • 'HOUR'인 경우 μ •μˆ˜λΆ€λŠ” μ‹œκ°„(hour)둜, μ†Œμˆ˜λΆ€λŠ” 60을 κ³±ν•΄ λΆ„κ³Ό 초둜 λ³€ν™˜λ©λ‹ˆλ‹€.

REGEXP_SUBSTR


REGEXP_COUNT λŠ” str λ‚΄μ—μ„œ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ£Όμ–΄μ§„ νŒ¨ν„΄μ„ νƒμƒ‰ν•˜μ—¬ ν•΄λ‹Ή λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

결과의 νƒ€μž…μ€ str의 νƒ€μž…κ³Ό λ™μΌν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

REMAINDER


REMAINDER은 num1을 num2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

MODκ°€ FLOOR을 μ‚¬μš©ν•˜κ³  REMAINDER은 Bankers' Round λ°©μ‹μ˜ Roundλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 μ œμ™Έν•˜λ©΄ λΉ„μŠ·ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

RPAD


RPAD λŠ” expr1의 였λ₯Έμͺ½ expr2λ₯Ό μ—°μ†μ μœΌλ‘œ 뢙이고, num만큼의 길이λ₯Ό κ°€μ§„ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ 문자 μ§‘ν•©μ—μ„œλŠ” λ°˜ν™˜λ˜λŠ” λ¬Έμžμ—΄μ˜ 문자 μˆ˜μ™€ 길이가 λ™μΌν•˜μ§€λ§Œ, ν•œκΈ€κ³Ό 같은 λ©€ν‹° λ°”μ΄νŠΈ 문자 μ§‘ν•©μ˜ κ²½μš°μ—λŠ” 두 값이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

REGEXP_COUNT


REGEXP_COUNT λŠ” str λ‚΄μ—μ„œ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ£Όμ–΄μ§„ νŒ¨ν„΄μ΄ λͺ‡ λ²ˆμ΄λ‚˜ μΌμΉ˜ν•˜λŠ”μ§€ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

SUBSTR


SUBSTR 은 str λ‚΄μ˜ position μœ„μΉ˜λ‘œλΆ€ν„° length 길이의 λ¬Έμžμ—΄μ„ μΆ”μΆœν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

DUMP


DUMP λŠ” data type code, byte λ‹¨μœ„μ˜ 길이, expr 의 λ‚΄λΆ€ ν‘œν˜„μ„ κ°€μ§„ TEXTλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

기본적으둜, λ°˜ν™˜ 값은 character set 정보λ₯Ό κ°€μ§€κ³  μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

expr 의 character set 이름을 찾으렀면 return_fmt에 1000을 λ”ν•˜λ©΄ λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

EXISTSNODE


EXISTSNODEλŠ” XML λ¬Έμ„œμ—μ„œ μ§ˆμ˜ν•œ XPath에 ν•΄λ‹Ή λ…Έλ“œκ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. λ°˜ν™˜λ˜λŠ” 값은 integer νƒ€μž…μ΄λ©°, ν•΄λ‹Ή λ…Έλ“œκ°€ 있으면 1을 μ—†μœΌλ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

xpath_string μΈμžμ— λ¦¬ν„°λŸ΄ NULL이 μž…λ ₯된 경우, λ‹€λ₯Έ μΈμžλ“€μ΄ μœ νš¨ν•˜λ”λΌλ„ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šκ³  NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

ASCIISTR


ASCIISTR은 μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ„ λ°μ΄ν„°λ² μ΄μŠ€ 문자 μ§‘ν•©μ˜ μ•„μŠ€ν‚€ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. ASCII μ΄μ™Έμ˜ λ¬ΈμžλŠ” \xxxx ν˜•νƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€. xxxxλŠ” UTF-16 μ½”λ“œμž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

RTRIM


RTRIM 은 str의 였λ₯Έμͺ½μœΌλ‘œλΆ€ν„° char_set 내에 ν¬ν•¨λœ λͺ¨λ“  문자λ₯Ό μ œκ±°ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

RAWTOHEX


RAWTOHEXλŠ” λ¬Έμžμ—΄ raw 값을 16μ§„μˆ˜λ‘œ ν‘œν˜„λœ λ¬Έμžμ—΄λ‘œ λ°”κΎΈλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°
μ„€λͺ…

  • DBMS_PIPE

  • DBMS_RANDOM

  • DBMS_SCHEDULER

  • DBMS_SQL

  • DBMS_JOB

  • DBMS_RLS

  • UTL_FILE

  • O2 Extensions μž₯점과 κ°œμ„  사항

    SQL, PL/pgSQL둜 μž‘μ„±λœ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ₯Ό C μ½”λ“œλ‘œ λ³€κ²½

    Extension을 μ—¬λŸ¬ 개둜 λ‚˜λˆ„μ–΄ Blast Radius κ°μ†Œ

    μ„€μΉ˜ μ•ˆλ‚΄μ„œ

    νŒ¨ν‚€μ§€(Package) μ°Έμ‘° μ•ˆλ‚΄μ„œ

    νŒ¨ν‚€μ§€(Package) μ°Έμ‘° μ•ˆλ‚΄μ„œμž…λ‹ˆλ‹€.

    TroubleShooting

    O2 Extensions

    λ³Έ μ•ˆλ‚΄μ„œλŠ” OpenSQL을 μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžλ₯Ό λŒ€μƒμœΌλ‘œ κΈ°μˆ ν•©λ‹ˆλ‹€.

    O2 ExtensionsλŠ” TmaxTibero의 OpenSQLμ—μ„œλ§Œ μ§€μ›λ˜λŠ” ν™•μž₯ κΈ°λŠ₯μ΄λ―€λ‘œ, 이에 λŒ€ν•œ 기술 λ¬Έμ„œλŠ” OpenSQL 맀뉴얼에 'O2 Extensions' ν•­λͺ©μœΌλ‘œ ν†΅ν•©ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.

    frac_secs

    μ†Œμˆ˜μ  μ΄ν•˜ 초(second)의 κ°’μœΌλ‘œ, μ΅œλŒ€ 6자리 μ •λ°€λ„κΉŒμ§€ μ§€μ›λ©λ‹ˆλ‹€.

    ꡬ간 ν˜•νƒœμ˜ λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 포맷으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. '[-]P[D][T[H][M][[.frac_secs]S]]'

    days

    0~999999999 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.

    hours

    0~23 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.

    minutes, seconds

    0~59 μ‚¬μ΄μ˜ μ •μˆ˜μž…λ‹ˆλ‹€.

    κ΅¬μ„±μš”μ†Œ

    예제

    anynonarray νƒ€μž…μž…λ‹ˆλ‹€; 비ꡐ할 첫 번째 κ°’μž…λ‹ˆλ‹€. NULL이 μ•„λ‹ˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

    expr_array

    variadic anyarray νƒ€μž…μž…λ‹ˆλ‹€; μΆ”κ°€ μΈμžλ“€μ„ 담은 λ°°μ—΄μž…λ‹ˆλ‹€. λ°°μ—΄ μ•ˆμ— NULL이 있으면 전체 κ²°κ³Όκ°€ NULL이 λ©λ‹ˆλ‹€. λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” expr1의 νƒ€μž…κ³Ό 동일해야 ν•©λ‹ˆλ‹€.

    예제

    anynonarray νƒ€μž…μž…λ‹ˆλ‹€; 비ꡐ할 첫 번째 κ°’. NULL이 μ•„λ‹ˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

    expr_array

    VARIADIC anyarray νƒ€μž…μž…λ‹ˆλ‹€; μΆ”κ°€ μΈμžλ“€μ„ 담은 λ°°μ—΄μž…λ‹ˆλ‹€. λ°°μ—΄ μ•ˆμ— NULL이 있으면 전체 κ²°κ³Όκ°€ NULL이 λ©λ‹ˆλ‹€. λ°°μ—΄μ˜ μ›μ†Œλ“€μ˜ νƒ€μž…μ€ expr1κ³Ό 동일해야 ν•©λ‹ˆλ‹€.

    예제

    time

    timestamp, timestamptz νƒ€μž…μž…λ‹ˆλ‹€; UTC둜 λ³€ν™˜ν•  λŒ€μƒ νƒ€μž„μŠ€νƒ¬ν”„ κ°’μž…λ‹ˆλ‹€. timestamp의 경우, μ„Έμ…˜μ˜ μ‹œκ°„λŒ€λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λΆ€μ μœΌλ‘œ timestamptz둜 λ³€ν™˜ ν›„ UTC둜 λ³€κ²½λ©λ‹ˆλ‹€.

    예제

    string, substring

    λͺ¨λ‘ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ§Œμ•½ λ¬Έμžμ—΄ str λ‚΄μ—μ„œ λ¬Έμžμ—΄ substr 을 λ°œκ²¬ν•˜μ§€ λͺ»ν•˜λ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄μ˜ μœ„μΉ˜ 값은 1λΆ€ν„° μ‹œμž‘λ©λ‹ˆλ‹€.

    position

    0이 μ•„λ‹Œ μ •μˆ˜ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. (κΈ°λ³Έκ°’: 1) position이 μ£Όμ–΄μ§€λ©΄ λ¬Έμžμ—΄ str의 position μœ„μΉ˜μ—μ„œλΆ€ν„° 탐색을 μ‹œμž‘ν•©λ‹ˆλ‹€. λ§Œμ•½ position이 음수이면 λ¬Έμžμ—΄ str의 λ’€μ—μ„œλΆ€ν„° 탐색을 μ‹œμž‘ν•©λ‹ˆλ‹€.

    occurrence

    0이 μ•„λ‹Œ μ •μˆ˜ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. (κΈ°λ³Έκ°’: 1) occurrenceκ°€ μ£Όμ–΄μ§€λ©΄ 탐색 λ¬Έμžμ—΄ λ‚΄μ—μ„œ occurrenceλ²ˆμ§Έμ— λ‚˜νƒ€λ‚˜λŠ” λ¬Έμžμ—΄ substr의 μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. occurrenceλŠ” μ–‘μ˜ μ •μˆ˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

    예제

    char_set

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ§Œμ•½ νŒŒλΌλ―Έν„° char_set의 값이 μ—†μœΌλ©΄, κΈ°λ³Έκ°’μœΌλ‘œ 곡백 문자 ν•˜λ‚˜λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

    예제

    num1, num2

    num1μ΄λ‚˜ num2λŠ” μˆ«μžν˜• νƒ€μž…μ΄κ±°λ‚˜ μˆ«μžν˜• νƒ€μž…μœΌλ‘œ λ³€ν™˜λ  수 μžˆλŠ” νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. num1μ΄λ‚˜ num2은 두 νƒ€μž… 쀑 μˆ«μžν˜• μš°μ„ μˆœμœ„μ— 따라 더 높은 μˆœμœ„μ˜ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜κ³ , λ˜ν•œ κ·Έ νƒ€μž…μœΌλ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€

    예제

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    pattern

    μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    match_param

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ 검사할 방법을 μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 값을 μ‚¬μš©ν•  수 있고, μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • i : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • c : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.

    • n : 점(.)이 μ€„λ°”κΏˆ λ¬Έμžλ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

    • m : μž…λ ₯λ¬Έμžμ—΄μ΄ ν•œ 쀄 μ΄μƒμž…λ‹ˆλ‹€.

    • x : pattern의 곡백문자λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

    예제

    λ¬Έμžμ—΄ λ˜λŠ” CLOB νƒ€μž…, BLOB νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. expr1의 길이가 num 보닀 큰 경우 expr1μ—μ„œ μ™Όμͺ½λΆ€ν„° num만큼의 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    expr2

    λ¬Έμžμ—΄ λ˜λŠ” CLOB νƒ€μž…, BLOB νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. expr2κ°€ λͺ…μ‹œλ˜μ§€ μ•Šμ€ 경우 곡백 λ¬Έμžκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

    num

    num은 수치 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. num은 터미널에 좜λ ₯ λ˜λŠ” 길이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

    예제

    str

    text νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  λ‚ μ§œ/μ‹œκ°„ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

    fmt

    text νƒ€μž…μž…λ‹ˆλ‹€; μž…λ ₯ λ¬Έμžμ—΄μ˜ ν˜•μ‹μ„ λ‚˜νƒ€λ‚΄λŠ” 포맷 λͺ¨λΈμž…λ‹ˆλ‹€. (예: 'YYYY-MM-DD HH24:MI:SSOF' ) μ§€μ›ν•˜λŠ” 포멧 λͺ¨λΈμ€ PG 곡식 λ¬Έμ„œ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    * λ‚ μ§œ/μ‹œκ°„ 포멧 λͺ¨λΈ

    예제

    예제

    expr1, expr2

    μ •μˆ˜ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μΈμž 쀑 ν•˜λ‚˜λΌλ„ NULL이면 κ²°κ³ΌλŠ” NULLμΈμžλŠ” λ²”μœ„ -(2^(n-1)) ~ (2^(n-1) - 1) 내에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μΈμžκ°€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄, κ²°κ³ΌλŠ” undefinedλ‹€.* ν˜„μž¬ n은 64μž…λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    예제

    nls_param

    strλ₯Ό μ •λ ¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  문자 집합을 μ •μ˜ν•˜λŠ” νŒŒλΌλ―Έν„°μž…λ‹ˆλ‹€. TEXT, CHAR νƒ€μž…μ˜ 데이터가 올 수 μžˆμŠ΅λ‹ˆλ‹€. 'NLS_SORT=sort'와 같은 ν˜•μ‹μœΌλ‘œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ„Έμ…˜μ— μ •μ˜ 된 값을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    예제

    예제

    str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    raw

    λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    expr

    date, timestamp, timestamptz νƒ€μž…μž…λ‹ˆλ‹€; λ°˜μ˜¬λ¦Όν•  λŒ€μƒ λ‚ μ§œ λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„ κ°’μž…λ‹ˆλ‹€.

    fmt

    text νƒ€μž…μž…λ‹ˆλ‹€; 반올림 기쀀을 λ‚˜νƒ€λ‚΄λŠ” 포맷 λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 'YYYY', 'MM', 'DDD', 'HH24' λ“± λ‹€μ–‘ν•œ λ‹¨μœ„λ‘œ λ°˜μ˜¬λ¦Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 값이 NULL이면, κΈ°λ³Έκ°’μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄ μ›λž˜ 값을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜κ±°λ‚˜ 'DDD' (일 λ‹¨μœ„ 반올림)둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    expr2

    첫 번째 μΈμžκ°€ NULL일 경우 λ°˜ν™˜λ  κ°’μž…λ‹ˆλ‹€; 두 인자의 νƒ€μž…μ΄ λ‹€λ₯Ό 경우, μ μ ˆν•œ ν˜• λ³€ν™˜(예: ν…μŠ€νŠΈμ—μ„œ 숫자 λ˜λŠ” λ‚ μ§œλ‘œμ˜ λ³€ν™˜)이 μ‹œλ„λ  수 μžˆμŠ΅λ‹ˆλ‹€.


    expr1

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    평가할 첫 λ²ˆμ§Έμž…λ‹ˆλ‹€. 이 값이 NULL이 μ•„λ‹ˆλ©΄ κ·ΈλŒ€λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.

    예제

    이후 값이 μž…λ ₯되면 κΈ°μ‘΄ λ¬Έμžμ—΄ 뒀에 κΈ°λ³Έ κ΅¬λΆ„μž(콀마)κ°€ μΆ”λœ ν›„, ν•΄λ‹Ή 값이 μ΄μ–΄μ„œ κ²°ν•©ν•©λ‹ˆλ‹€.

  • 집계가 μ™„λ£Œλ˜λ©΄ λˆ„μ λœ λ¬Έμžμ—΄μ΄ μ΅œμ’… 결과둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • νŒŒλΌλ―Έν„°
    μ„€λͺ…

    expr

    text νƒ€μž…μž…λ‹ˆλ‹€; 집계할 ν…μŠ€νŠΈ κ°’μž…λ‹ˆλ‹€. NULL 값은 집계 μ‹œ μ œμ™Έλ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    text νƒ€μž…μž…λ‹ˆλ‹€; 각 ν…μŠ€νŠΈ κ°’ 사이에 μ‚½μž…ν•  κ΅¬λΆ„μžμž…λ‹ˆλ‹€. κ΅¬λΆ„μž 없이 ν˜ΈμΆœν•  경우 λ‚΄λΆ€μ μœΌλ‘œ κ΅¬λΆ„μž 없이 μ²˜λ¦¬ν•©λ‹ˆλ‹€.


    expression

    text νƒ€μž…μž…λ‹ˆλ‹€; 집계할 κ°’μœΌλ‘œ, NULL인 경우 ν•΄λ‹Ή 값은 λ¬΄μ‹œν•©λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    delimiter

    예제

    'MINUTE'인 경우 μ •μˆ˜λΆ€λŠ” λΆ„(minute)둜, μ†Œμˆ˜λΆ€λŠ” 60을 κ³±ν•΄ 초(second)둜 λ³€ν™˜λ©λ‹ˆλ‹€.

  • 'SECOND'인 경우 μž…λ ₯된 숫자 전체가 초(second)둜 ν•΄μ„λ©λ‹ˆλ‹€.

  • λ§Œμ•½ 잘λͺ»λœ λ‹¨μœ„κ°€ μ „λ‹¬λ˜λ©΄ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    number

    double precision νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  μ‹œκ°„ κ°’μž…λ‹ˆλ‹€. μ†Œμˆ˜λΆ€κ°€ μžˆμ„ 경우 ν•˜μœ„ λ‹¨μœ„(μ‹œκ°„, λΆ„, 초)둜 λ³€ν™˜λ©λ‹ˆλ‹€.

    unit

    text νƒ€μž…μž…λ‹ˆλ‹€;숫자 κ°’μ˜ λ‹¨μœ„λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μœ νš¨ν•œ λ‹¨μœ„λŠ” 'DAY', 'HOUR', 'MINUTE', 'SECOND'μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 'DAY'λ₯Ό μ§€μ •ν•˜λ©΄ μ†Œμˆ˜λΆ€κ°€ μ‹œκ°„, λΆ„, 초둜 μ°¨λ‘€λ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    num1, num2

    num1μ΄λ‚˜ num2λŠ” μˆ«μžν˜• νƒ€μž…μ΄κ±°λ‚˜ μˆ«μžν˜• νƒ€μž…μœΌλ‘œ λ³€ν™˜λ  수 μžˆλŠ” νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. num1μ΄λ‚˜ num2은 두 νƒ€μž… 쀑 μˆ«μžν˜• μš°μ„ μˆœμœ„μ— 따라 더 높은 μˆœμœ„μ˜ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜κ³ , λ˜ν•œ κ·Έ νƒ€μž…μœΌλ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    expr2

    λ¬Έμžμ—΄ λ˜λŠ” CLOB νƒ€μž…, BLOB νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. expr2κ°€ λͺ…μ‹œλ˜μ§€ μ•Šμ€ 경우 곡백 λ¬Έμžκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.

    num

    num은 수치 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. num은 터미널에 좜λ ₯λ˜λŠ” 길이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.


    expr1

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    λ¬Έμžμ—΄ λ˜λŠ” CLOB νƒ€μž…, BLOB νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. expr1의 길이가 num 보닀 큰 경우 expr1μ—μ„œ μ™Όμͺ½λΆ€ν„° num만큼의 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    예제

    μ •μˆ˜ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. position이 0보닀 μž‘μ€ 경우 str의 λ’€μ—μ„œλΆ€ν„° μΆ”μΆœλ©λ‹ˆλ‹€.

    length

    μ •μˆ˜ 값은 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ§Œμ•½ lengthκ°€ μ§€μ •λ˜μ§€ μ•ŠμœΌλ©΄ str의 position μœ„μΉ˜μ—μ„œλΆ€ν„° λ§ˆμ§€λ§‰κΉŒμ§€ λ¬Έμžμ—΄μ„ μΆ”μΆœν•˜λ©°, lengthκ°€ 1보닀 μž‘μœΌλ©΄ NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.


    str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. smallint, integer, bigint, decimal, numeric νƒ€μž…μ˜ μˆ«μžν˜• 데이터가 λ“€μ–΄μ˜€λ©΄ μžλ™μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœ ν›„ λ¬Έμžμ—΄λ‘œμ¨ μ²˜λ¦¬λ©λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    position

    예제

    expr

    λ¬Έμžμ—΄λ‘œ 올 수 μžˆλŠ” μž„μ˜μ˜ μ‹μž…λ‹ˆλ‹€.

    expr이 NULL인 경우 NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    return_fmt

    return_fmt은 λ°˜ν™˜ κ°’μ˜ νƒ€μž…μ„ μ§€μ •ν•˜λ©° λ‹€μŒ κ°’ 쀑 ν•˜λ‚˜λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

    • 8은 8μ§„λ²•μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    start_position

    μ‹œμž‘ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

    length

    ν‘œμ‹œν•  길이λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    • 10은 10μ§„λ²•μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • 16은 16μ§„λ²•μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • 17은 컴파일러의 문자 μ§‘ν•©μ—μ„œ 좜λ ₯ κ°€λŠ₯ν•œ 문자둜 해석될 수 μžˆλŠ” κ²½μš°μ—λ§Œ 좜λ ₯ 된 각 λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 일뢀 ASCII ν˜•μ‹μ˜ λ¬ΈμžλŠ” β€˜?’ λ‘œλ„ 좜λ ₯ 될 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•Šμ€ 경우 16μ§„λ²•μœΌλ‘œ 좜λ ₯λ©λ‹ˆλ‹€. λͺ¨λ“  NLS νŒŒλΌλ―Έν„°λŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€. return_fmtκ°€ 17인 DUMP ν•¨μˆ˜μ— λŒ€ν•΄ μ–΄λ–€ νŠΉμ • 좜λ ₯ 포맷에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    xpath_str

    μ§ˆμ˜ν•  XPath ν˜•νƒœμ˜ λ¬Έμžμ—΄ κ°’μž…λ‹ˆλ‹€.

    namespace_str

    XML λ¬Έμ„œμ—μ„œ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.


    xml

    질의의 λŒ€μƒμ΄ λ˜λŠ” XML λ¬Έμ„œλ‘œ, XML νƒ€μž…μž…λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. λ§Œμ•½ νŒŒλΌλ―Έν„° char_set의 값이 μ—†μœΌλ©΄, κΈ°λ³Έκ°’μœΌλ‘œ 곡백 문자 ν•˜λ‚˜λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.


    str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    char_set

    예제

    SELECT DATE '2008-03-20' - TO_DSINTERVAL('50 00:00:00') before;
             before         
    ------------------------
     2008-01-30 09:00:00+09
    (1개 ν–‰)
    
    SELECT DATE '2008-03-20' - TO_DSINTERVAL('P50DT0H0M0S') before;
             before         
    ------------------------
     2008-01-30 09:00:00+09
    (1개 ν–‰)
    # ν…ŒμŠ€νŠΈ 1
    SELECT GREATEST(5, 3, 9);
    
     greatest 
    ----------
            9
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    SELECT GREATEST('apple'::text, 'banana', 'cherry'); -- κ²°κ³Ό: cherry (λ¬Έμžμ—΄ μ‚¬μ „μˆœ 비ꡐ)
    
     greatest 
    ----------
     cherry
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 3
    SELECT GREATEST(10, NULL, 7); -- κ²°κ³Ό NULL
    
     greatest 
    ----------
             
    # ν…ŒμŠ€νŠΈ 1
    SELECT LEAST(5, 3, 9);
    
     least 
    -------
         3
    (1 row)
    
    
    # ν…ŒμŠ€νŠΈ 2
    SELECT LEAST('apple'::text, 'banana', 'cherry'); -- κ²°κ³Ό: apple (λ¬Έμžμ—΄ μ‚¬μ „μˆœ 비ꡐ)
    
     least 
    -------
     apple
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 3
    SELECT LEAST(10, NULL, 7); -- κ²°κ³Ό: NULL
    
     least 
    -------
          
    (1 row)
    # ν…ŒμŠ€νŠΈ 1
    SELECT SYS_EXTRACT_UTC('2023-06-01 12:34:56+07'::timestamptz);
    
       sys_extract_utc   
    ---------------------
     2023-06-01 05:34:56
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    -- μ„Έμ…˜ μ‹œκ°„λŒ€ '+9:00' κΈ°μ€€μœΌλ‘œ timestamptz λ³€ν™˜ ν›„ UTC둜 λ³€κ²½
    SELECT SYS_EXTRACT_UTC('2023-06-01 12:34:56'::timestamp);
    
       sys_extract_utc   
    ---------------------
     2023-06-01 03:34:56
    (1 row)
    SELECT INSTR('ABCDEABCDEABCDE', 'CD');
     instr 
    -------
         3
    SELECT LTRIM('ABCDEFGHIJKLMNOP', 'ABCDEF');
       ltrim    
    ------------
     GHIJKLMNOP
     (1 row)
    SELECT MOD(-11, 4), MOD(11, -4);
     mod | mod 
    -----+-----
      -3 |   3
    SELECT REGEXP_LIKE('Hello World', 'world', 'i');
     regexp_like 
    -------------
     t
    (1 row)
     SELECT LPAD('LPAD', 10, '-=');
        lpad    
    ------------
     -=-=-=LPAD
    (1 row)
    SELECT TO_TIMESTAMP_TZ('2023-06-01 12:34:56+09', 'YYYY-MM-DD HH24:MI:SSOF');
    
        to_timestamp_tz     
    ------------------------
     2023-06-01 12:34:56+09
    (1 row)
    SELECT SINH(0);
     sinh 
    ------
        0
    SELECT BITAND(6,3);
    
     bitand 
    --------
          2
    SELECT NAME FROM T ORDER BY NLSSORT(NAME);
     name 
    ------
     BAR
     FOO
    (2 rows)
    SELECT TO_SINGLE_BYTE('οΌ¨ο½…ο½Œο½Œο½, ο½—ο½ο½’ο½Œο½„!');
    -- 예제 결과: 'Hello, world!'
    
     to_single_byte 
    ----------------
     Hello, world!
    (1 row)
    ASCIISTR
    (
      str IN text
    )
    RETURNS text;
    SELECT ASCIISTR('Aν•œκΈ€B');
       asciistr   
    --------------
     A\D55C\AE00B
    (1개 ν–‰)
    RAWTOHEX
    (
      raw IN { bytea | text }
    )
    RETURNS text;
    SELECT RAWTOHEX('AB');
     rawtohex 
    ----------
     4142
    (1개 ν–‰)
    ROUND
    (
      expr  IN date [, fmt   IN text]
    )
    RETURN date;
    
    ROUND
    (
      expr  IN timestamp without time zone [, fmt   IN text]
    )
    RETURN timestamp without time zone;
    
    ROUND
    (
      expr  IN timestamp with time zone [, fmt   IN text]
    )
    RETURN timestamp with time zone;
    # ν…ŒμŠ€νŠΈ 1
    -- λ‚ μ§œ 반올림 예제: '2023-05-15' λ‚ μ§œλ₯Ό μ›” λ‹¨μœ„λ‘œ 반올림
    SELECT ROUND('2023-05-15'::date, 'MONTH');
    -- κ²°κ³Ό: ν•΄λ‹Ή μ›”μ˜ μ‹œμž‘μΌ λ˜λŠ” μ›”μ˜ νŠΉμ • κΈ°μ€€μΌλ‘œ μ‘°μ •λœ λ‚ μ§œ λ°˜ν™˜
    
       round    
    ------------
     2023-05-01
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    -- λ‚ μ§œ 반올림 예제 (포맷 λ―Έμ§€μ •): κΈ°λ³Έ 포맷('DDD')으둜 반올림
    SELECT ROUND('2023-05-15'::date);
    -- κ²°κ³Ό: '2023-05-15' λ‚ μ§œκ°€ 포맷 λͺ¨λΈμ— 따라 반올림된 κ²°κ³Ό λ°˜ν™˜
    
       round    
    ------------
     2023-05-15
    (1 row)
    
    
    # ν…ŒμŠ€νŠΈ 3
    -- νƒ€μž„μŠ€νƒ¬ν”„ 반올림 예제: '2023-05-15 14:35:20' νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ‹œκ°„ λ‹¨μœ„λ‘œ 반올림
    SELECT ROUND('2023-05-15 14:35:20'::timestamp, 'HH24');
    -- κ²°κ³Ό: '2023-05-15 15:00:00' (λΆ„κ³Ό μ΄ˆκ°€ 0으둜 쑰정됨)
    
            round        
    ---------------------
     2023-05-15 15:00:00
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 4
    -- νƒ€μž„μŠ€νƒ¬ν”„ with time zone 반올림 예제: κΈ°λ³Έ 포맷('DDD')으둜 반올림
    SELECT ROUND('2023-05-15 14:35:20+09'::timestamptz);
    -- κ²°κ³Ό: 포맷 λͺ¨λΈμ— 따라 반올림된 νƒ€μž„μŠ€νƒ¬ν”„ λ°˜ν™˜
    
             round          
    ------------------------
     2023-05-16 00:00:00+09
    (1 row)
    NVL(expr1, expr2)
    # ν…ŒμŠ€νŠΈ 데이터
    create table employees (first_name varchar, last_name varchar, salary integer, hire_date timestamptz);
    
    INSERT INTO employees (first_name, last_name, salary, hire_date) VALUES
    ('John', 'Doe', NULL, '2020-03-15 09:00:00'),
    (NULL, 'Smith', 62000, '2019-07-22 10:30:00'),
    ('Michael', 'Johnson', 72000, '2018-11-10 08:45:00'),
    ('Emily', 'Davis', 48000, '2021-05-01 12:00:00'),
    ('David', 'Wilson', 53000, '2017-09-17 14:20:00'),
    (NULL, 'Brown', NULL, '2016-12-05 09:15:00'),
    ('James', 'Taylor', NULL, '2015-06-30 16:45:00'),
    ('Jessica', 'Martinez', 68000, '2022-01-25 11:10:00'),
    (NULL, 'Anderson', 58000, '2020-10-05 13:35:00'),
    ('Laura', 'Thomas', 49500, '2023-08-12 08:00:00');
    
    
    # ν…ŒμŠ€νŠΈ 1
    # salary 값이 NULL이면 0 λ°˜ν™˜; first_name 값이 NULL이면 last_name λ°˜ν™˜;
    select NVL(salary,0), NVL(first_name, last_name) from employees ;
    
      nvl  |   nvl   
    -------+---------
     55000 | John
     62000 | Jane
     72000 | Michael
     48000 | Emily
     53000 | David
     60000 | Sarah
     75000 | James
     68000 | Jessica
     58000 | Daniel
     49500 | Laura
    (10 rows)
    
    WM_CONCAT
    (
      expr  IN text
    )
    RETURNS text;
    # ν…ŒμŠ€νŠΈ ν…Œμ΄λΈ”
    create table employees ( first_name varchar, last_name varchar );
    
    INSERT INTO employees (first_name, last_name) VALUES
    ('John', 'Doe'),
    ('Jane', 'Smith'),
    ('Michael', 'Johnson'),
    ('Emily', 'Davis'),
    ('David', 'Wilson'),
    ('Sarah', 'Brown'),
    ('James', 'Taylor'),
    ('Jessica', 'Martinez'),
    ('Daniel', 'Anderson'),
    ('Laura', 'Thomas');
    
    
    # ν…ŒμŠ€νŠΈ 1
    select wm_concat(last_name) from employees ;
    
                                  wm_concat                               
    ----------------------------------------------------------------------
     Doe,Smith,Johnson,Davis,Wilson,Brown,Taylor,Martinez,Anderson,Thomas
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    select wm_concat(first_name) from employees ;
    
                               wm_concat                            
    ----------------------------------------------------------------
     John,Jane,Michael,Emily,David,Sarah,James,Jessica,Daniel,Laura
    (1 row)
    LISTAGG( 
        [ ALL | DISTINCT ] 
        expression 
        [, delimite] 
    ) 
    [OVER ( [query_partition_clause] );
    RETURNS text;
    
    query_partition_caluse : 
    PARTITION BY
      { expr[, expr ]...
      | ( expr[, expr ]... )
      }
    # ν…ŒμŠ€νŠΈ ν…Œμ΄λΈ”
    create table employees ( first_name varchar, last_name varchar );
    
    INSERT INTO employees (first_name, last_name) VALUES
    ('John', 'Doe'),
    ('Jane', 'Smith'),
    ('Michael', 'Johnson'),
    ('Emily', 'Davis'),
    ('David', 'Wilson'),
    ('Sarah', 'Brown'),
    ('James', 'Taylor'),
    ('Jessica', 'Martinez'),
    ('Daniel', 'Anderson'),
    ('Laura', 'Thomas');
    
    
    # ν…ŒμŠ€νŠΈ 1
    select listagg(last_name, ',') from employees ;
    
                                   listagg                                
    ----------------------------------------------------------------------
     Doe,Smith,Johnson,Davis,Wilson,Brown,Taylor,Martinez,Anderson,Thomas
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    select listagg(last_name) from employees ;
                               listagg                           
    -------------------------------------------------------------
     DoeSmithJohnsonDavisWilsonBrownTaylorMartinezAndersonThomas
    (1 row)
    NUMTODSINTERVAL
    (
      number  IN double precision,
      unit    IN text
    )
    RETURNS interval;
    -- 1.5 DAYλŠ” 1일 12μ‹œκ°„μœΌλ‘œ λ³€ν™˜λ¨
    SELECT NUMTODSINTERVAL(1.5, 'DAY');
    
     numtodsinterval 
    -----------------
     1 day 12:00:00
    (1 row)
    
    -- 2.75 HOURλŠ” 2μ‹œκ°„ 45λΆ„μœΌλ‘œ λ³€ν™˜λ¨
    SELECT NUMTODSINTERVAL(2.75, 'HOUR');
    
     numtodsinterval 
    -----------------
     02:45:00
    (1 row)
    
    -- 30 MINUTEλŠ” 30λΆ„ 0초둜 λ³€ν™˜λ¨
    SELECT NUMTODSINTERVAL(30, 'MINUTE');
    
     numtodsinterval 
    -----------------
     00:30:00
    (1 row)
    
    -- 90 SECONDλŠ” 90초 κ·ΈλŒ€λ‘œ λ°˜ν™˜λ¨
    SELECT NUMTODSINTERVAL(90, 'SECOND');
    
     numtodsinterval 
    -----------------
     00:01:30
    (1 row)
    REMAINDER(num1, num2);
    SELECT REMAINDER(3,2);
     remainder 
    -----------
            -1
    RPAD(expr1, num [, expr2])
     SELECT RPAD('RPAD', 10, '-=');
        rpad    
    ------------
     RPAD-=-=-=
    (1 row)
    SUBSTR(str, position [, length])
    SELECT SUBSTR('ABCDEFG', 3, 2), SUBSTR('ABCDEFG', -3, 2);
     substr | substr 
    --------+--------
     CD     | EF
    DUMP(expr[, return_fmt [, start_position [, length ] ] ])
    SELECT DUMP('abc'::TEXT, 1016);
                       dump                   
    ------------------------------------------
     Typ=25 Len=3 CharacterSet=UTF8: 61,62,63
    (1 row)
    EXISTSNODE
    (
      xml IN xml,
      xpath_str IN text,
      namespace_str IN text DEFAULT NULL
    )
    RETURNS integer;
    select existsnode('<root><a>1</a><b>2</b></root>'::xml, '/root/a');
     existsnode 
    ------------
              1
    (1개 ν–‰)
    
    select existsnode('<root><a>1</a><b>2</b></root>'::xml, null);
     existsnode 
    ------------
               
    (1개 ν–‰)
    RTRIM(str [, char_set])
    SELECT RTRIM('ABCDEFGHIJKLMNOP', 'LMNOP');
        rtrim    
    -------------
     ABCDEFGHIJK
     (1 row)

    μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    replace_str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    position

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄ 검사λ₯Ό μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    occurrence

    μˆ«μžκ°’μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ λͺ‡ 번 검사할지λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    match_param

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ 검사할 방법을 μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 값을 μ‚¬μš©ν•  수 있고, μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • i : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • c : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.


    REGEXP_LIKE(str, pattern [, replace_str [, position [, occurrence [, match_param]]]])

    str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    pattern

    SELECT REGEXP_REPLACE('aaaaaaa','([[:alpha:]])', 'x');
     regexp_replace 
    ----------------
     xxxxxxx
    (1 row)

    예제

    pattern

    μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    position

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄ 검사λ₯Ό μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    occurrence

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄ 검사λ₯Ό μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    match_param

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ 검사할 방법을 μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 값을 μ‚¬μš©ν•  수 있고, μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • i : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • c : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.

    subexp

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ 0λΆ€ν„° 9κΉŒμ§€ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. subexp은 patternμ—μ„œ κ΄„ν˜Έλ‘œ 감싸진 각 그룹듀을 μ™Όμͺ½λΆ€ν„° 숫자둜 μ§€μ •ν•©λ‹ˆλ‹€.


    REGEXP_SUBSTR(str, pattern [, position [, occurrence [, match_param [, subexp]]]])

    str

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    SELECT REGEXP_COUNT('abcabcabc','abc', 2);
     regexp_count 
    --------------
                2
    (1 row)

    예제

    μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    position

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄ 검사λ₯Ό μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    match_param

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ 검사할 방법을 μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 값을 μ‚¬μš©ν•  수 있고, μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • i : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • c : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.


    REGEXP_COUNT(str, pattern [, position [, match_param]])

    str

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    pattern

    SELECT REGEXP_COUNT('abcabcabc','abc', 2);
     regexp_count 
    --------------
                2
    (1 row)

    예제

    νƒ€μž…(Type) μ°Έμ‘° μ•ˆλ‚΄μ„œ

    데이터 νƒ€μž…μ— λŒ€ν•œ μ°Έμ‘° μ•ˆλ‚΄μ„œμž…λ‹ˆλ‹€.

    O2types extension μ„€μΉ˜ ν›„ μ‹ κ·œ 데이터 νƒ€μž…λ“€μ΄ μΆ”κ°€λ˜λ©°, μ•„λž˜μ˜ 2κ°€μ§€ ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

    search_pathλ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ€ 경우

    μŠ€ν‚€λ§ˆ(κΈ°λ³Έ oracle)의 이름을 νƒ€μž… μ•žμ— μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

    {schema_name}.{type_name}
    
    -- μ˜ˆμ‹œ) o2types extension μ„€μΉ˜ ν›„, μƒˆλ‘œ μΆ”κ°€λœ dateλΌλŠ” νƒ€μž…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
    -- create table T (col1 oracle.date);
    

    search_pathλ₯Ό μ„€μ •ν•œ 경우

    μŠ€ν‚€λ§ˆ(κΈ°λ³Έ oracle)λ₯Ό κ°€μž₯ 높은 μš°μ„ μˆœμœ„ search_path둜 μ„€μ •ν•œ 경우, μŠ€ν‚€λ§ˆλ₯Ό μƒλž΅ν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    -- ν˜„μž¬ 접속 μ„Έμ…˜μ—μ„œ 슀미카 'oracle'λ₯Ό κ°€μž₯ μš°μ„ μˆœμœ„ 높은 search_path둜 μ„€μ •ν•©λ‹ˆλ‹€.
    set search_path to oracle, public;
    
    {type_name}
    
    -- μ˜ˆμ‹œ) o2types extension μ„€μΉ˜ ν›„, μƒˆλ‘œ μΆ”κ°€λœ dateλΌλŠ” νƒ€μž…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
    -- create table T (col1 date);

    μ•„λž˜ 사양듀은 μŠ€ν‚€λ§ˆλ₯Ό μƒλž΅ν•œ ν˜•νƒœλ‘œ κΈ°μˆ ν•©λ‹ˆλ‹€.

    DATE

    DATE νƒ€μž…μ€ νŠΉμ • λ‚ μ§œμ™€ 초 λ‹¨μœ„κΉŒμ§€μ˜ μ‹œκ°„μ„ ν‘œν˜„ν•˜λŠ” 데이터 νƒ€μž…μž…λ‹ˆλ‹€. TIMESTAMP(0)κ³Ό ν‘œν˜„ λ²”μœ„κ°€ λ™μΌν•©λ‹ˆλ‹€.

    DATE

    DATE νƒ€μž…μ€ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    • 연도, μ›”, 일, μ‹œ, λΆ„, 초λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ—°λ„λŠ” BC 4,713 ~ AD 294,276κΉŒμ§€ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ‹œκ°„μ€ 24μ‹œκ°„ λ‹¨μœ„λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.


    VARCHAR2 νƒ€μž…λ„ CHARACTER VARYING νƒ€μž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ¬Έμžμ—΄ 길이가 μΌμ •ν•˜μ§€ μ•Šμ€ κ°€λ³€ 길이λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

    VARCHAR2 νƒ€μž…μ€ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    • λ¬Έμžμ—΄μ€ μ΅œλŒ€ 10,485,760 byte(=10MB)κΉŒμ§€ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ³€ν™˜λœ λ¬Έμžμ—΄μ˜ 길이가 ν•΄λ‹Ή 크기λ₯Ό λ„˜μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

    • λ¬Έμžμ—΄μ˜ 크기λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ€ 경우 Postgresql native type인 TEXT 처럼 λ™μž‘ν•©λ‹ˆλ‹€.

    • λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” byteλ₯Ό κΈ°μ€€μœΌλ‘œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    λ‹€μŒμ€ VARCHAR2 νƒ€μž…μ„ μ„€λͺ…ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€.

    μœ„ μ˜ˆμ œμ—μ„œ 보듯이 EMP_NAME μ»¬λŸΌμ€ 10byte의 λ¬Έμžμ—΄ 길이λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 'Peter' λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆλ‹€λ©΄ 'Peter' λ¬Έμžμ—΄μ΄ μ €μž₯λ©λ‹ˆλ‹€. λ‹€μ‹œ 말해 EMP_NAME 컬럼의 λ¬Έμžμ—΄ κΈΈμ΄λŠ” 10byte둜 μ„ μ–Έλ˜μ—ˆμ§€λ§Œ μ‹€μ œλ‘œ μ €μž₯된 λ¬Έμžμ—΄ κΈΈμ΄λŠ” 5byteμž…λ‹ˆλ‹€. 이처럼 VARCHAR2 νƒ€μž…μ€ μ„ μ–Έλœ λ¬Έμžμ—΄ 길이의 λ²”μœ„ λ‚΄μ—μ„œ μž…λ ₯된 λ¬Έμžμ—΄ 길이와 λ™μΌν•œ 길이λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.


    NVARCHAR2 νƒ€μž…μ€ μœ λ‹ˆμ½”λ“œ λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ νƒ€μž…μž…λ‹ˆλ‹€. λ¬Έμžμ—΄ 길이가 μΌμ •ν•˜μ§€ μ•Šμ€ κ°€λ³€ 길이λ₯Ό κ°–λŠ”λ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    NVARCHAR2 νƒ€μž…μ€ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    • 기본적으둜 VARCHAR2 νƒ€μž…κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ, λ¬Έμžμ—΄μ˜ 길이가 문자 κΈ°μ€€μž…λ‹ˆλ‹€.

      λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜λŠ” νƒ€μž…μ˜ κΈΈμ΄λŠ” λ‹€κ΅­μ–΄ 문자 집합에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ UTF8인 κ²½μš°μ—” size의 μ΅œλŒ€ 3λ°°, UTF16인 κ²½μš°μ—” size의 μ΅œλŒ€ 2λ°°κ°€ λ©λ‹ˆλ‹€.

    • NVARCHAR2 νƒ€μž…μ˜ λ¬Έμžμ—΄μ˜ μ΅œλŒ€ κΈΈμ΄λŠ” 10,485,760μžμž…λ‹ˆλ‹€.

    • SQL λ¬Έμž₯μ—μ„œ NVARCHAR2 νƒ€μž…μ˜ 값을 ν‘œν˜„ν•  λ•Œμ—λŠ” 항상 μž‘μ€ λ”°μ˜΄ν‘œ(' ')λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.


    CLOB(Character Large Object)은 λŒ€μš©λŸ‰μ˜ λ¬Έμžμ—΄ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ 데이터 νƒ€μž…μž…λ‹ˆλ‹€.

    • λ‚΄λΆ€μ μœΌλ‘œ PostgreSQL의 text νƒ€μž…μ„ 기반으둜 ν•©λ‹ˆλ‹€.

    • μ΅œλŒ€ ν¬κΈ°λŠ” λ°”μ΄νŠΈμˆ˜ κΈ°μ€€μœΌλ‘œ μ•½ 1β€―GBμž…λ‹ˆλ‹€.

    • UTF-8 λ©€ν‹°λ°”μ΄νŠΈ 문자(예: ν•œκΈ€, 일본어, 이λͺ¨μ§€ λ“±)λ₯Ό μ‚¬μš©ν•  경우, μ΅œλŒ€ λ¬Έμžμ—΄ 길이가 μ‹±κΈ€λ°”μ΄νŠΈ 문자인 μ˜λ¬Έλ³΄λ‹€ 훨씬 더 μ μ–΄μ§ˆ 수 μžˆμŒμ— μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.


    BLOB(Binary Large Object)은 이진 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ Oracle의 데이터 νƒ€μž…μž…λ‹ˆλ‹€.

    BLOB은 일반적으둜 이미지, λ°”μ΄λ„ˆλ¦¬ 파일, μ‹€ν–‰ 파일 λ“± λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 이진 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

    • λ‚΄λΆ€μ μœΌλ‘œ PostgreSQL의 bytea νƒ€μž…μ„ 기반으둜 ν•©λ‹ˆλ‹€.

    • μ΅œλŒ€ ν¬κΈ°λŠ” PostgreSQL bytea νƒ€μž…μ˜ ν•œκ³„μ™€ λ™μΌν•˜κ²Œ μ•½ 1GBμž…λ‹ˆλ‹€.

    • 가곡 ν•¨μˆ˜, μ—°μ‚°μž 등은 기본적으둜 PostgreSQL bytea νƒ€μž…μ˜ 연산을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    TRUNC

    Syntax

    TRUNC
    (
      expr  IN date [, fmt   IN text]
    )
    RETURNS date;
    
    TRUNC
    (
      expr  IN timestamp without time zone [, fmt   IN text]
    )
    RETURNS timestamp without time zone;
    
    TRUNC
    (
      expr  IN timestamp with time zone [, fmt   IN text]
    )
    RETURNS timestamp with time zone;

    κ°œμš”

    TRUNC ν•¨μˆ˜λŠ” λ‚ μ§œλ‚˜ νƒ€μž„μŠ€νƒ¬ν”„ κ°’μ—μ„œ ν•˜μœ„ λ‹¨μœ„λ₯Ό μž˜λΌλ‚΄κ³ , μ§€μ •ν•œ 포맷 λͺ¨λΈμ— 맞좰 값을 자λ₯Έ(버림) κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    즉, κ°’μ˜ μ‹œκ°„ λ˜λŠ” λ‚ μ§œ λΆ€λΆ„μ—μ„œ μ†Œμˆ˜μ  μ΄ν•˜(λ˜λŠ” μ„ΈλΆ€ λ‹¨μœ„)λ₯Ό μ œκ±°ν•˜μ—¬, μ›ν•˜λŠ” λ‹¨μœ„(예: μ—°, μ›”, 일 λ“±)κΉŒμ§€λ§Œ λ‚¨κΉλ‹ˆλ‹€.

    λ§Œμ•½ 포맷 λ¬Έμžμ—΄(fmt)이 μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄, 기본적으둜 'DDD' (일 λ‹¨μœ„)둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

    νƒ€μž„μŠ€νƒ¬ν”„ λ²„μ „μ˜ 경우, λ‚΄λΆ€μ˜ μ‹œκ°„ 정보λ₯Ό ν•¨κ»˜ μ²˜λ¦¬ν•˜μ—¬ μ‹œκ°„ λ‹¨μœ„ μ΄ν•˜λ₯Ό μž˜λΌλ‚΄λ©°, 초 μ΄ν•˜ μ •λ³΄λŠ” 0으둜 섀정됩닀.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    NEXT_DAY

    Syntax

    NEXT_DAY
    (
      value          IN date,
      weekday        IN text
    )
    RETURNS date;
    
    NEXT_DAY
    (
      value          IN date,
      weekday_index  IN integer
    )
    RETURNS date;
    
    NEXT_DAY
    (
      value          IN TIMESTAMP WITH TIME ZONE,
      weekday        IN text
    )
    RETURNS TIMESTAMP without time zone;
    
    NEXT_DAY
    (
      value          IN TIMESTAMP WITH TIME ZONE,
      weekday_index  IN integer
    )
    RETURNS TIMESTAMP without time zone;

    κ°œμš”

    μ£Όμ–΄μ§„ λ‚ μ§œ 이후에 λ‚˜μ˜€λŠ” 첫 번째 νŠΉμ • μš”μΌμ˜ λ‚ μ§œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    λ¬Έμžμ—΄ ν˜•νƒœμ˜ μš”μΌ(예: 'Monday', 'Tue' λ“±) λ˜λŠ” μš”μΌ 인덱슀(1λΆ€ν„° 7, 1은 μΌμš”μΌ)λ₯Ό 인자둜 λ°›μ•„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

    TIMESTAMP WITH TIME ZONE νƒ€μž…μ˜ 경우, λ‚ μ§œ 계산 ν›„ μ›λž˜ μ‹œκ°„ 뢀뢄을 κ·ΈλŒ€λ‘œ μœ μ§€ν•˜μ—¬ νƒ€μž„μŠ€νƒ¬ν”„ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    value


    NVL2

    Syntax

    NVL2(expr1, expr2, expr3)

    κ°œμš”

    NVL2 ν•¨μˆ˜λŠ” 첫 번째 μΈμžκ°€ NULL이 아닐 경우 두 번째 인자의 값을 λ°˜ν™˜ν•˜κ³ , λ§Œμ•½ 첫 번째 μΈμžκ°€ NULL이면 μ„Έ 번째 인자의 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    두 λ²ˆμ§Έμ™€ μ„Έ 번째 μΈμžλŠ” λ™μΌν•œ λ²”μ£Όμ˜ νƒ€μž…μ΄μ–΄μ•Ό ν•˜λ©°, ν•„μš”ν•œ 경우 암묡적 ν˜• λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” 별도 λ³€ν˜• ν•¨μˆ˜κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    expr1

    평가할 첫 번째 κ°’μž…λ‹ˆλ‹€. 이 값이 NULL이 아닐 경우 두 번째 인자λ₯Ό λ°˜ν™˜ν•˜λŠ” 기쀀이 λ©λ‹ˆλ‹€.


    UNISTR

    Syntax

    UNISTR
    (
      str  IN text
    )
    RETURNS text;

    κ°œμš”

    μž…λ ₯된 ν…μŠ€νŠΈ λ‚΄μ˜ Unicode escape μ‹œν€€μŠ€λ₯Ό μ‹€μ œ Unicode 문자둜 λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    μ§€μ›ν•˜λŠ” escape ν˜•μ‹μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    • \XXXX : 4자리 16μ§„μˆ˜ ν˜•μ‹μž…λ‹ˆλ‹€

    • \uXXXX : 4자리 16μ§„μˆ˜ ν˜•μ‹μž…λ‹ˆλ‹€ (μ•žμ— 'u' 접두사가 λΆ™μŒ)

    • \+XXXXXX : '+' 기호 뒀에 6자리 16μ§„μˆ˜ ν˜•μ‹μž…λ‹ˆλ‹€

    • \UXXXXXXXX : 'U' 기호 뒀에 8자리 16μ§„μˆ˜ ν˜•μ‹μž…λ‹ˆλ‹€

    ν•¨μˆ˜λŠ” surrogate pair 처리λ₯Ό 톡해 μ˜¬λ°”λ₯Έ Unicode μ½”λ“œ 포인트둜 λ³€ν™˜ν•˜λ©°, 잘λͺ»λœ surrogate pairκ°€ κ°μ§€λ˜λ©΄ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

    'U+0000' λŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ μœ λ‹ˆμ½”λ“œ μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒκ³Ό 같은 μ˜ˆμ‹œλŠ” 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. \0000 , \u0000 , \+000000 , \U00000000

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    TO_DATE

    Syntax

    TO_DATE
    (
      str  IN text
    )
    RETURNS timestamp;
    
    TO_DATE
    (
      str  IN text,
      fmt  IN text
    )
    RETURNS timestamp;
    
    TO_DATE
    (
      num  IN integer,
      fmt  IN text
    )
    RETURNS timestamp;

    κ°œμš”

    ν…μŠ€νŠΈ(λ˜λŠ” μ •μˆ˜ν˜• 값을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ κ°’)λ₯Ό Oracle μŠ€νƒ€μΌμ˜ λ‚ μ§œ/μ‹œκ°„ ν˜•μ‹μ— 따라 TIMESTAMP(0)(λ°€λ¦¬μ„Έμ»¨λ“œ μ—†λŠ” μ‹œλΆ„μ΄ˆκΉŒμ§€μ˜ λ‚ μ§œ+μ‹œλΆ„μ΄ˆ) κ°’μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

    포맷 λͺ¨λΈ(fmt)이 제곡되면 ν•΄λ‹Ή ν˜•μ‹μ— 맞게 λ‚ μ§œλ₯Ό ν•΄μ„ν•˜λ©°, μ œκ³΅λ˜μ§€ μ•Šμ„ 경우 κΈ°λ³Έ ν˜•μ‹μ— 따라 λ³€ν™˜λ©λ‹ˆλ‹€.

    빈 λ¬Έμžμ—΄μ„ μž…λ ₯ν•˜λ©΄ NULL을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    Oracleκ³Ό 달리 νƒ€μž… μ•ˆμ •μ„±μ„ μ§€ν‚€κΈ° μœ„ν•΄, λ‚ μ§œ νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    REGEXP_INSTR

    Syntax

    REGEXP_COUNT(str, pattern [, position [, occurrence [, return_option [, match_param [, sub_expr}]]]])

    κ°œμš”

    REGEXP_INSTR λŠ” str λ‚΄μ—μ„œ μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μ£Όμ–΄μ§„ νŒ¨ν„΄μ΄ μΌμΉ˜ν•˜λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    λ§Œμ•½ strκ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    str


    MEDIAN

    MEDIAN 집계 ν•¨μˆ˜λŠ” κ·Έλ£Ή λ‚΄μ˜ κ°’λ“€ 쀑 쀑앙값(median)을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” 톡계 ν•¨μˆ˜μž…λ‹ˆλ‹€.

    Oracle의 MEDIAN ν•¨μˆ˜λ₯Ό μ°Έκ³ ν•˜μ—¬ PostgreSQLμ—μ„œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

    μ •μˆ˜ν˜•, μ‹€μˆ˜ν˜•, λ‚ μ§œ/μ‹œκ°„ νƒ€μž… 데이터 νƒ€μž…μ— λŒ€ν•΄ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

    λ‚΄λΆ€μ μœΌλ‘œ, MEDIAN ν•¨μˆ˜λŠ” 두 λ‹¨κ³„λ‘œ λ™μž‘ν•©λ‹ˆλ‹€.

    집계 단계

    • κ·Έλ£Ή λ‚΄μ˜ 값듀을 νƒ€μž…μ— λ§žλŠ” 벑터(리슀트 자료ꡬ쑰)에 μˆ˜μ§‘ν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€.

    TO_CHAR


    숫자, λ‚ μ§œ, νƒ€μž„μŠ€νƒ¬ν”„ λ˜λŠ” λ¬Έμžμ—΄ 값을 μ§€μ •ν•œ 포맷 λͺ¨λΈ(fmt)에 따라 λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

    포맷 λͺ¨λΈμ΄ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ 각 데이터 νƒ€μž…μ˜ κΈ°λ³Έ 좜λ ₯ ν˜•μ‹μ— 따라 λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

    μˆ«μžν˜•μ˜ 경우 μ •μˆ˜, λΆ€λ™μ†Œμˆ˜μ , 그리고 numeric 값을 포맷에 따라 λ³€ν™˜ν•˜λ©°,

    λ‚ μ§œμ™€ νƒ€μž„μŠ€νƒ¬ν”„λŠ” μ§€μ •λœ ν˜•μ‹(예: 'YYYY-MM-DD', 'HH24:MI:SS')으둜 λ³€ν™˜λ©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    Large Data 처리 κ°€μ΄λ“œ

    • 1GB μ΄ν•˜

    • TOAST에 μ˜μ‘΄ν•©λ‹ˆλ‹€.

      • PostgreSQL의 각 pageμ˜μ—­μ€ 일반적으둜 8kb의 κ³ μ •λœ 크기둜 λ˜μ–΄μžˆκ³  각 tuple이 μ—¬λŸ¬ νŽ˜μ΄μ§€μ— λ‚˜λ‰˜μ–΄ μ‘΄μž¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (맀우 큰 값을 λ°”λ‘œ μ €μž₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.)

    RAWTONHEX


    RAWTONHEXλŠ” λ¬Έμžμ—΄ raw 값을 16μ§„μˆ˜λ‘œ ν‘œν˜„λœ λ¬Έμžμ—΄λ‘œ λ°”κΎΈλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    n : 점(.)이 μ€„λ°”κΏˆ λ¬Έμžλ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • m : μž…λ ₯λ¬Έμžμ—΄μ΄ ν•œ 쀄 μ΄μƒμž…λ‹ˆλ‹€.

  • x : pattern의 곡백문자λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

  • n : 점(.)이 μ€„λ°”κΏˆ λ¬Έμžλ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • m : μž…λ ₯λ¬Έμžμ—΄μ΄ ν•œ 쀄 μ΄μƒμž…λ‹ˆλ‹€.

  • x : pattern의 곡백문자λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€λ‹€.

  • n : 점(.)이 μ€„λ°”κΏˆ λ¬Έμžλ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • m : μž…λ ₯λ¬Έμžμ—΄μ΄ ν•œ 쀄 μ΄μƒμž…λ‹ˆλ‹€.

  • x : pattern의 곡백문자λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

  • SQL λ¬Έμž₯μ—μ„œ VARCHAR2 νƒ€μž…μ˜ 값을 ν‘œν˜„ν•  λ•Œμ—λŠ” 항상 μž‘μ€ λ”°μ˜΄ν‘œ(' ')λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • Postgresql의 κΈ°λ³Έ λ™μž‘μ„ κ³ λ €ν•˜μ—¬, ORACLEκ³ΌλŠ” λ‹€λ₯΄κ²Œ 빈 λ¬Έμžμ—΄('')κ³Ό NULL을 λ‹€λ₯Έ κ°’μœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.

  • Postgresql의 κΈ°λ³Έ λ™μž‘μ„ κ³ λ €ν•˜μ—¬, ORACLEκ³ΌλŠ” λ‹€λ₯΄κ²Œ 빈 λ¬Έμžμ—΄('')κ³Ό NULL을 λ‹€λ₯Έ κ°’μœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.

    λ¬Έμžμ—΄ κ²°ν•© μ—°μ‚°μž ||λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • SQL λ¬Έμž₯μ—μ„œ CLOB νƒ€μž…μ˜ 값을 ν‘œν˜„ν•  λ•Œμ—λŠ” 항상 μž‘μ€λ”°μ˜΄ν‘œ(' ')λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • SQL λ¬Έμž₯μ—μ„œ BLOB νƒ€μž…μ˜ 값을 ν‘œν˜„ν•  λ•Œμ—λŠ” 항상 μž‘μ€λ”°μ˜΄ν‘œ(' ')λ₯Ό μ‚¬μš©ν•˜λ©°, 이진 데이터λ₯Ό 직접 SQL에 넣을 경우 μ΄μŠ€μΌ€μ΄ν”„ 처리(E’’)κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

    • 예) \xDEADBEEFλ₯Ό SQLμ—μ„œ ν‘œν˜„ν•˜λŠ” BLOB β†’ E'\\xDEADBEEF'::blob

    VARCHAR2

    NVARCHAR2

    CLOB

    νŠΉμ§•

    μ‚¬μš© μ˜ˆμ‹œ

    BLOB

    νŠΉμ§•

    μ‚¬μš© μ˜ˆμ‹œ

    expr

    date, timestamp, timestamptz νƒ€μž…μž…λ‹ˆλ‹€; μ ˆμ‚­(Truncation)ν•  λŒ€μƒ λ‚ μ§œ λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„ κ°’μž…λ‹ˆλ‹€. λ§Œμ•½ 이 값이 NULL이면 κ²°κ³Ό μ—­μ‹œ NULL이 λ©λ‹ˆλ‹€.

    fmt

    text νƒ€μž…μž…λ‹ˆλ‹€;

    λ‚ μ§œλ‚˜ νƒ€μž„μŠ€νƒ¬ν”„ 값을 μ–΄λŠ λ‹¨μœ„κΉŒμ§€ μ ˆμ‚­ν• μ§€λ₯Ό μ§€μ •ν•˜λŠ” 포맷 λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 'YYYY' (연도), 'MM' (μ›”), 'DDD' (일) λ“±μœΌλ‘œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 값이 NULL이면 κΈ°λ³Έκ°’(예: 'DDD')으둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

    예제

    date, timestamp νƒ€μž…μž…λ‹ˆλ‹€; 기쀀이 λ˜λŠ” λ‚ μ§œ κ°’μž…λ‹ˆλ‹€.

    weekday

    text νƒ€μž…μž…λ‹ˆλ‹€; 찾고자 ν•˜λŠ” μš”μΌμ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€. Oracle의 μš”μΌ ν‘œκΈ° κ·œμΉ™μ„ λ”°λ₯΄λ©°, μž…λ ₯된 λ¬Έμžμ—΄μ˜ μ•ž 3κΈ€μžλ§Œ μ‚¬μš©λ©λ‹ˆλ‹€. λ¬Έμžμ—΄ μ•ž 3κΈ€μžλŠ” λŒ€/μ†Œλ¬Έμž 상관없이 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. "sun", "mon", "tue", "wed", "thu", "fri", "sat"

    weekday_index

    integer νƒ€μž…μž…λ‹ˆλ‹€; 찾고자 ν•˜λŠ” μš”μΌμ˜ μΈλ±μŠ€μž…λ‹ˆλ‹€. μœ νš¨ν•œ 값은 1λΆ€ν„° 7κΉŒμ§€μ΄λ©°, 1은 μΌμš”μΌ, 2λŠ” μ›”μš”μΌ, …, 7은 ν† μš”μΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

    예제

    expr2

    첫 번째 μΈμžκ°€ NULL이 아닐 경우 λ°˜ν™˜λ  κ°’μž…λ‹ˆλ‹€.

    expr3

    첫 번째 μΈμžκ°€ NULL일 경우 λ°˜ν™˜λ  κ°’μž…λ‹ˆλ‹€;

    두 λ²ˆμ§Έμ™€ μ„Έ 번째 인자의 νƒ€μž…μ€ μΌμΉ˜ν•΄μ•Ό ν•˜λ©°, ν•„μš” μ‹œ ν˜• λ³€ν™˜μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

    예제

    str

    text νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  λŒ€μƒ ν…μŠ€νŠΈμž…λ‹ˆλ‹€. 이 λ¬Έμžμ—΄ λ‚΄μ˜ Unicode escape μ‹œν€€μŠ€λ“€μ΄ μ‹€μ œ Unicode 문자둜 μΉ˜ν™˜λ©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    예제

    str

    text νƒ€μž…μž…λ‹ˆλ‹€; λ‚ μ§œ 및 μ‹œκ°„ 정보λ₯Ό ν¬ν•¨ν•œ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 빈 λ¬Έμžμ—΄μ΄λ©΄ NULL둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

    num

    integer νƒ€μž…μž…λ‹ˆλ‹€; μ •μˆ˜ν˜• κ°’μœΌλ‘œ, λ‚΄λΆ€μ μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜μ–΄ λ‚ μ§œλ‘œ ν•΄μ„λ©λ‹ˆλ‹€.

    fmt

    text νƒ€μž…μž…λ‹ˆλ‹€; μž…λ ₯ λ¬Έμžμ—΄μ˜ λ‚ μ§œ/μ‹œκ°„ ν˜•μ‹μ„ μ§€μ •ν•˜λŠ” 포맷 λͺ¨λΈμž…λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, 'YYYY-MM-DD HH24:MI:SS'와 같이 μ‚¬μš©ν•©λ‹ˆλ‹€.

    μ§€μ›ν•˜λŠ” 포멧 λͺ¨λΈμ€ PG 곡식 λ¬Έμ„œ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    * λ‚ μ§œ/μ‹œκ°„ 포멧 λͺ¨λΈ

    예제

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    pattern

    μ •κ·œ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λœ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€. TEXT, CHAR의 νƒ€μž…μ΄ 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    position

    숫자 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄ 검사λ₯Ό μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    occurrence

    μˆ«μžκ°’μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ λͺ‡ 번 검사할지λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

    return_option

    μˆ«μžκ°’μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.

    • 0 : νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ˜ 처음 μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • 1 : νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄ λ‹€μŒ μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    match_param

    λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ νŒ¨ν„΄μ„ 검사할 방법을 μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 값을 μ‚¬μš©ν•  수 있고, μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • i : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • c : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€.

    • n : 점(.)이 μ€„λ°”κΏˆ λ¬Έμžλ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

    • m : μž…λ ₯λ¬Έμžμ—΄μ΄ ν•œ 쀄 μ΄μƒμž…λ‹ˆλ‹€.

    • x : pattern의 곡백문자λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

    sub_expr

    μˆ«μžκ°’μ„ λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μœΌλ‘œ 0λΆ€ν„° 9κΉŒμ§€ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. sub_expr은 patternμ—μ„œ κ΄„ν˜Έλ‘œ 감싸진 각 그룹듀을 μ™Όμͺ½λΆ€ν„° 숫자둜 μ§€μ •ν•©λ‹ˆλ‹€.

    예제

    raw

    λ¬Έμžμ—΄ 값을 λ°˜ν™˜ν•˜λŠ” μž„μ˜μ˜ μ—°μ‚°μ‹μž…λ‹ˆλ‹€.

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    예제

    SYS_GUID

    Syntax


    κ°œμš”

    SYS_GUIDλŠ” 16 λ°”μ΄νŠΈμ˜ RAW λ°μ΄ν„°λ‘œ κ΅¬μ„±λœ μ „μ—­ 고유 μ‹λ³„μžλ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    uuidλŠ” pseudorandom λ°©μ‹μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.


    예제

    NULL 값은 μ§‘κ³„μ—μ„œ λ¬΄μ‹œλ©λ‹ˆλ‹€.

    μ΅œμ’… 계산 단계

    • κ·Έλ£Ή λ‚΄ λͺ¨λ“  κ°’λ“€ μˆ˜μ§‘ μ™„λ£Œ μ‹œ μ΅œμ’…μ μœΌλ‘œ 쀑앙 값을 μ‚°μΆœν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€.

    • λ¨Όμ €, μ§‘κ³„λœ 벑터 λ‚΄μ˜ 값듀을 퀡 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.

    • μ§‘κ³„λœ κ°’μ˜ κ°œμˆ˜κ°€ ν™€μˆ˜μΈ 경우 쀑앙 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • μ§‘κ³„λœ κ°’μ˜ κ°œμˆ˜κ°€ 짝수인 경우 μ€‘μ•™μ˜ 두 κ°’μ˜ 평균을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

      • νƒ€μž„μ‘΄μ΄ μžˆλŠ” λ‚ μ§œ 및 μ‹œκ°„ κ΄€λ ¨ λ°μ΄ν„°μ˜ 경우, μ€‘μ•™μ˜ 두 값을 UTC둜 νƒ€μž„μ‘΄ λ³€κ²½ ν›„ 평균값 κ³„μ‚°ν•©λ‹ˆλ‹€.

      • UTC κΈ°μ€€μœΌλ‘œ 평균 κ°’ 계산 ν›„ 쀑앙 두 κ°’ 쀑 큰 κ°’μ˜ νƒ€μž„μ‘΄μ„ μ±„νƒν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    expression

    집계할 κ°’μœΌλ‘œ, μ•„λž˜μ™€ 같은 데이터 νƒ€μž…μ„ μ§€μ›ν•©λ‹ˆλ‹€. * μ •μˆ˜ν˜•: smallint, int, bigint

    • μ‹€μˆ˜ν˜•: real(float4), double precision

    • λ‚ μ§œ/μ‹œκ°„ν˜•: timestamp, timestamptz, time, timetz, date집계 μ‹œ NULL 값은 λ¬΄μ‹œλ˜λ©°, 각 νƒ€μž…μ— λ§žλŠ” λ‚΄λΆ€ 벑터에 값듀이 μ €μž₯λ©λ‹ˆλ‹€.

    • 짝수 개의 값이 μ§‘κ³„λœ 경우, μ€‘μ•™μ˜ 두 κ°’μ˜ 평균이 κ³„μ‚°λ˜μ–΄ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • λ‚΄λΆ€μ μœΌλ‘œ C μ½”λ“œμ—μ„œ qsort ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 값듀을 μ •λ ¬ν•©λ‹ˆλ‹€.

    • λ‚ μ§œ 및 μ‹œκ°„ κ΄€λ ¨ λ°μ΄ν„°μ˜ 경우, Oracle λ°©μ‹μ˜ 처리 λ‘œμ§μ— 따라 좔가적인 νƒ€μž„μ‘΄ 및 ν˜• λ³€ν™˜ 처리 μ§„ν–‰ν•©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    μ£Όμ˜μ‚¬ν•­

    예제

    CREATE TABLE T (a date);
    INSERT INTO T VALUES ('4713-01-01 01:11:30 BC');
    INSERT INTO T VALUES ('2023-03-19 13:29:30');
    VARCHAR2[(size)]
    EMP_NAME VARCHAR2(10)
    NVARCHAR(size)
    clob
    SELECT 'Hello, '::clob || 'World!'::clob;
    blob
    INSERT INTO files (data) VALUES (E'\\xDEADBEEF'::blob);
    # ν…ŒμŠ€νŠΈ 1
    -- λ‚ μ§œ μ ˆμ‚­: '2023-05-15'λ₯Ό μ›” λ‹¨μœ„λ‘œ μ ˆμ‚­ν•˜μ—¬, ν•΄λ‹Ή μ›”μ˜ 첫 날을 λ°˜ν™˜ν•¨
    SELECT TRUNC('2023-05-15'::date, 'MONTH');
    -- κ²°κ³Ό: '2023-05-01'
    
       trunc    
    ------------
     2023-05-01
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    -- λ‚ μ§œ μ ˆμ‚­: 포맷 λ―Έμ§€μ • μ‹œ, μ›λž˜ λ‚ μ§œκ°€ κ·ΈλŒ€λ‘œ λ°˜ν™˜λ¨
    SELECT TRUNC('2023-05-15'::date);
    -- κ²°κ³Ό: '2023-05-15'
    
       trunc    
    ------------
     2023-05-15\q
     
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 3
    -- νƒ€μž„μŠ€νƒ¬ν”„ μ ˆμ‚­: '2023-05-15 14:35:20'λ₯Ό μ‹œκ°„ λ‹¨μœ„λ‘œ μ ˆμ‚­ν•˜μ—¬, λΆ„κ³Ό 초λ₯Ό μ œκ±°ν•¨
    SELECT TRUNC('2023-05-15 14:35:20'::timestamp, 'HH24');
    -- κ²°κ³Ό: '2023-05-15 14:00:00'
    
            trunc        
    ---------------------
     2023-05-15 14:00:00
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 4
    -- timestamptz μ ˆμ‚­: '2023-05-15 14:35:20+09'의 경우, 포맷 λ―Έμ§€μ • μ‹œ κΈ°λ³Έ 포맷('DDD')으둜  μ ˆμ‚­λ¨
    SELECT TRUNC('2023-05-15 14:35:20+09'::timestamptz);
    -- κ²°κ³Ό: νƒ€μž„μŠ€νƒ¬ν”„ 값이 μ ˆμ‚­λœ κ²°κ³Ό λ°˜ν™˜ (일 λ‹¨μœ„λ‘œ μ ˆμ‚­)
    
             trunc          
    ------------------------
     2023-05-15 00:00:00+09
    (1 row)
    -- λ¬Έμžν˜• μš”μΌ 예제: '2023-05-15' μ΄ν›„μ˜ 첫 번째 Monday λ°˜ν™˜
    SELECT NEXT_DAY('2023-05-15'::date, 'Monday');
    
      next_day  
    ------------
     2023-05-22
    (1 row)
    
    -- 인덱슀 기반 μš”μΌ 예제: '2023-05-15' μ΄ν›„μ˜ 첫 번째 μ›”μš”μΌ(인덱슀 2) λ°˜ν™˜
    SELECT NEXT_DAY('2023-05-15'::date, 2);
    
      next_day  
    ------------
     2023-05-22
    (1 row)
    
    -- TIMESTAMP WITH TIME ZONE 예제 (λ¬Έμžν˜•):
    SELECT NEXT_DAY('2023-05-15 14:30:00+09'::timestamptz, 'Friday');
    
          next_day       
    ---------------------
     2023-05-19 14:30:00
    (1 row)
    
    -- TIMESTAMP WITH TIME ZONE 예제 (인덱슀):
    SELECT NEXT_DAY('2023-05-15 14:30:00+09'::timestamptz, 6);
    
          next_day       
    ---------------------
     2023-05-19 14:30:00
    (1 row)
    # ν…ŒμŠ€νŠΈ 데이터
    create table employees (
      first_name varchar,
      last_name varchar,
      salary integer,
      hire_date timestamptz,
      commission_pct integer,
      bonus integer,
      status varchar
    );
    
    INSERT INTO employees (first_name, last_name, salary, hire_date, commission_pct, bonus, status) VALUES
    ('John', 'Doe', 55000, '2020-03-15 09:00:00', NULL, 2000, 'Active'),
    ('Jane', 'Smith', 62000, '2019-07-22 10:30:00', 10, 3000, 'Active'),
    ('Michael', 'Johnson', 72000, '2018-11-10 08:45:00', 7, 2500, 'Inactive'),
    ('Emily', 'Davis', 48000, '2021-05-01 12:00:00', NULL, 1500, NULL),
    ('David', 'Wilson', 53000, '2017-09-17 14:20:00', 8, 2200, NULL),
    ('Sarah', 'Brown', 60000, '2016-12-05 09:15:00', 12, 2800, 'Active'),
    ('James', 'Taylor', 75000, '2015-06-30 16:45:00', NULL, 2600, 'Resigned'),
    ('Jessica', 'Martinez', 68000, '2022-01-25 11:10:00', 5, 1800, NULL),
    ('Daniel', 'Anderson', 58000, '2020-10-05 13:35:00', 6, 2000, 'Active'),
    ('Laura', 'Thomas', 49500, '2023-08-12 08:00:00', 4, 1200, 'Probation');
    
    # ν…ŒμŠ€νŠΈ 1
    -- commission_pct 값이 NULL이 μ•„λ‹ˆλ©΄ bonus 값을, NULL이면 0을 λ°˜ν™˜ν•¨
    SELECT NVL2(commission_pct, bonus, 0)
    FROM employees;
    
     nvl2 
    ------
        0
     3000
     2500
        0
     2200
     2800
        0
     1800
     2000
     1200
    (10 rows)
    
    # ν…ŒμŠ€νŠΈ 2
    -- 첫 번째 μΈμžκ°€ NULL이 μ•„λ‹ˆλ©΄ 두 번째 인자(예: 'Active')λ₯Ό, NULL이면 μ„Έ 번째 인자(예: 'Inactive')λ₯Ό λ°˜ν™˜ν•¨
    SELECT NVL2(status, 'Active', 'Inactive')
    FROM employees;
    
    
       nvl2   
    ----------
     Active
     Active
     Active
     Inactive
     Inactive
     Active
     Active
     Inactive
     Active
     Active
    (10 rows)
    -- 4자리 16μ§„μˆ˜ Unicode escapeλ₯Ό μ‚¬μš©ν•œ 예제 (예: \0041λŠ” 'A'둜 λ³€ν™˜)
    SELECT UNISTR('\0041\0042\0043');
    -- κ²°κ³Ό: 'ABC'
    
     unistr 
    --------
     ABC
    (1 row)
    
    -- λ‹€μ–‘ν•œ ν˜•μ‹μ˜ escape μ‹œν€€μŠ€λ₯Ό ν¬ν•¨ν•œ 예제
    SELECT UNISTR('\u0041 \+00420042 \U00000041');
    
      unistr  
    ----------
     A δˆ€42 A
    (1 row)
    
    
    select unistr('\0441\043B\043E\043D');
    
     unistr 
    --------
     слон
    (1 row)
    
    select unistr('d\u0061t\U00000061');
    
     unistr 
    --------
     data
    (1 row)
    
    -- 잘λͺ»λœ ν˜•μ‹ 예제
    SELECT unistr('wrong: \db99');
    ERROR:  invalid Unicode surrogate pair
    
    SELECT unistr('wrong: \db99\0061');
    ERROR:  invalid Unicode surrogate pair
    
    SELECT unistr('wrong: \+00db99\+000061');
    ERROR:  invalid Unicode surrogate pair
    
    SELECT unistr('wrong: \+2FFFFF');
    ERROR:  invalid Unicode escape value
    
    SELECT unistr('wrong: \udb99\u0061');
    ERROR:  invalid Unicode surrogate pair
    
    SELECT unistr('wrong: \U0000db99\U00000061');
    ERROR:  invalid Unicode surrogate pair
    
    SELECT unistr('wrong: \U002FFFFF');
    ERROR:  invalid Unicode escape value
    
    SELECT unistr('wrong: \0000');
    ERROR:  invalid Unicode code point
    
    SELECT unistr('wrong: \u0000');
    ERROR:  invalid Unicode code point
    
    SELECT unistr('wrong: \+000000');
    ERROR:  invalid Unicode code point
    
    SELECT unistr('wrong: \U00000000');
    ERROR:  invalid Unicode code point
    -- ν…μŠ€νŠΈμ™€ 포맷 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ λ‚ μ§œ/μ‹œκ°„ λ¬Έμžμ—΄μ„ TIMESTAMP둜 λ³€ν™˜
    SELECT TO_DATE('2023-06-01 12:34:56', 'YYYY-MM-DD HH24:MI:SS');
    
           to_date       
    ---------------------
     2023-06-01 12:34:56
    (1 row)
    
    -- ν…μŠ€νŠΈλ§Œ μ „λ‹¬ν•œ 경우 κΈ°λ³Έ λ³€ν™˜ ν˜•μ‹μ„ μ‚¬μš© (빈 λ¬Έμžμ—΄μ€ NULL λ°˜ν™˜)
    SELECT TO_DATE('2023-06-01 12:34:56');
    
           to_date       
    ---------------------
     2023-06-01 12:34:56
    (1 row)
    
    -- μ •μˆ˜ν˜• 값을 λ¬Έμžμ—΄λ‘œ ν•΄μ„ν•˜μ—¬ TIMESTAMP둜 λ³€ν™˜
    SELECT TO_DATE(20230601, 'YYYYMMDD');
    
           to_date       
    ---------------------
     2023-06-01 00:00:00
    (1 row)
    SELECT REGEXP_INSTR('abcabcabc','abc', 2);
     regexp_instr 
    --------------
                4
    (1 row)
    RAWTOHEX
    (
      raw IN { bytea | text }
    )
    RETURNS text;
    SELECT RAWTONHEX('AB');
     rawtohex 
    ----------
     4142
    (1개 ν–‰)
    SYS_GUID()
    SELECT SYS_GUID();
                  sys_guid              
    ------------------------------------
     \xc3a83bc2e6f845c8bdf884af0c0516ac
    (1 row)
    MEDIAN
    (
      expression  IN { smallint, int, bigint,
                        real, double precision,
                        timestamp, timestamptz, time, timetz, date }
    )
    RETURNS median;
    # ν…ŒμŠ€νŠΈ ν…Œμ΄λΈ”
    create table employees (name varchar, salary integer, hire_date timestamptz);
    INSERT INTO employees (name, salary, hire_date) VALUES
    ('John Doe', 55000, '2020-03-15 09:00:00'),
    ('Jane Smith', 62000, '2019-07-22 10:30:00'),
    ('Michael Johnson', 72000, '2018-11-10 08:45:00'),
    ('Emily Davis', 48000, '2021-05-01 12:00:00'),
    ('David Wilson', 53000, '2017-09-17 14:20:00'),
    ('Sarah Brown', 60000, '2016-12-05 09:15:00'),
    ('James Taylor', 75000, '2015-06-30 16:45:00'),
    ('Jessica Martinez', 68000, '2022-01-25 11:10:00'),
    ('Daniel Anderson', 58000, '2020-10-05 13:35:00'),
    ('Laura Thomas', 49500, '2023-08-12 08:00:00');
    
    
    -- μ •μˆ˜ν˜• λ°μ΄ν„°μ˜ 쀑앙값 계산 예제
    SELECT MEDIAN(salary) FROM employees;
    
     median 
    --------
      59000
    (1 row)
    
    
    -- λ‚ μ§œν˜• λ°μ΄ν„°μ˜ 쀑앙값 계산 예제
    SELECT MEDIAN(hire_date) FROM employees;
    
             median         
    ------------------------
     2019-11-17 21:45:00+09

    value

    smallint | int | bigint | real | double precision | numeric | text | timestamp | timestamptz λ³€ν™˜ν•  λŒ€μƒ κ°’μž…λ‹ˆλ‹€. 숫자, λ‚ μ§œ, νƒ€μž„μŠ€νƒ¬ν”„ λ˜λŠ” λ¬Έμžμ—΄ 값을 μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. text νƒ€μž…μ˜ 경우, fmt 인자λ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ©°, 인자둜 μž…λ ₯받은 λ¬Έμžμ—΄μ„ κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    fmt

    text νƒ€μž…μž…λ‹ˆλ‹€;좜λ ₯ ν˜•μ‹μ„ μ§€μ •ν•˜λŠ” 포맷 λͺ¨λΈ.μˆ«μžν˜•μ€ 예λ₯Ό λ“€μ–΄ 'FM9999', λ‚ μ§œ/μ‹œκ°„μ€ 'YYYY-MM-DD HH24:MI:SS' λ“±μœΌλ‘œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ§€μ›ν•˜λŠ” 포멧 λͺ¨λΈμ€ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    * *


    TO_CHAR
    (
      value IN { smallint | int | bigint | real | double precision | numeric | text | timestamp | timestamptz }
      [, fmt IN text]
    )
    RETURNS text

    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    -- μˆ«μžν˜• κ°’ λ³€ν™˜ (포맷 없이)
    SELECT TO_CHAR(12345);
    
     to_char 
    ---------
     12345
    (1 row)
    
    -- μˆ«μžν˜• κ°’ λ³€ν™˜ (포맷 적용)
    SELECT TO_CHAR(12345, 'FM0000000');
    
     to_char 
    ---------
     0012345
    (1 row)
    
    -- λ‚ μ§œν˜• κ°’ λ³€ν™˜ (κΈ°λ³Έ ν˜•μ‹)
    SELECT TO_CHAR(SYSDATE());
    
           to_char       
    ---------------------
     2025-03-07 00:57:44
    (1 row)
    
    
    -- λ‚ μ§œν˜• κ°’ λ³€ν™˜ (포맷 적용)
    SELECT TO_CHAR(SYSDATE(), 'DD-MM-YYYY SS:MI:HH24');
    
           to_char       
    ---------------------
     07-03-2025 46:58:00
    (1 row)
    
    -- νƒ€μž„μŠ€νƒ¬ν”„ λ³€ν™˜ (timestamptz)
    SELECT TO_CHAR(SYSTIMESTAMP(), 'YYYY-MM-DD"T"HH24:MI:SS');
    
           to_char       
    ---------------------
     2025-03-06T15:59:30
    (1 row)

    예제

    이 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄μ„œ, 큰 ν•„λ“œ 값은 μ••μΆ•λ˜μ–΄ μ €μž₯λ˜κ±°λ‚˜ μ—¬λŸ¬ 개의 물리적 ROWS둜 λΆ„ν• λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.
  • 이 기법을 TOAST (The Oversized-Attribute Storage Technique)라고 ν•˜λ©° PostgreSQLμ—μ„œ 큰 데이터 값을 λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œ 효율적으둜 μ²˜λ¦¬ν•˜λŠ” 데에 μ‚¬μš©λ©λ‹ˆλ‹€.


    • 4TB μ΄ν•˜

    • νŠΉμ§•

      • νŒŒμΌμ— λŒ€ν•œ ν‘œμ€€ μž‘μ—…κ³Ό μœ μ‚¬ν•œ 읽기/μ“°κΈ° APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 생성, μˆ˜μ • 및 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

      • λŒ€ν˜• 개체의 일뢀λ₯Ό 읽고 μ—…λ°μ΄νŠΈν•˜λŠ” μž‘μ—…μ„ 효율적으둜 μˆ˜ν–‰ν•  수 μžˆλŠ” 반면 TOAST 둜 처리된 ν•„λ“œμ˜ λŒ€λΆ€λΆ„ μž‘μ—…μ€ 전체 값을 λ‹¨μœ„λ‘œ μ½κ±°λ‚˜ μ”λ‹ˆλ‹€.

      • Chunk둜 μͺΌκ°œκ³  DB에 row둜 μ €μž₯. B-tree둜 chunk index 탐색 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

    • μ°Έκ³ 


    였라클의 LOB은 4GBκΉŒμ§€ μ§€μ›ν•˜λŠ” 반면, O2의 LOB은 TEXT, BYTEA νƒ€μž…μ— κΈ°λ°˜ν•˜κΈ° λ•Œλ¬Έμ— 1GBκΉŒμ§€ μ§€μ›ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 1GB λ„˜λŠ” 데이터 이관 μ‹œμ—λŠ” PostgreSQL의 Large Objectλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • Large Object 이관에 ν•„μš”ν•œ API μ°Έκ³  λ¬Έμ„œ https://www.postgresql.org/docs/16/largeobjects.html

    BLOB/CLOB <- TEXT, BYTEA

    Large Object

    Migration κ°€μ΄λ“œ

    SYS_CONTEXT

    Syntax

    SYS_CONTEXT(namespace TEXT, parameter TEXT, length NUMERIC DEFAULT NULL)

    κ°œμš”

    SYS_CONTEXT ν•¨μˆ˜λŠ” ν˜„μž¬ μ„Έμ…˜μ˜ μ»¨ν…μŠ€νŠΈ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ μ—°κ²°λœ νŒŒλΌλ―Έν„°μ˜ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    namespace

    μž„μ˜μ˜ 이름이 μ§€μ •λœ μ»¨ν…μŠ€νŠΈμž…λ‹ˆλ‹€. ν˜„μž¬λŠ” USERENV만 μ§€μ›ν•©λ‹ˆλ‹€.

    parameter

    userenv λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같은 νŒŒλΌλ―Έν„°λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    Common Issues

    O2 Extension을 μ‚¬μš©ν•˜λ©΄μ„œ λ¬Έμ œκ°€ λ°œμƒν•  경우 μˆ˜ν–‰ν•  수 μžˆλŠ” 쑰치 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.

    μ˜ˆμ™Έ λ°œμƒ

    μ•„λž˜ λ°©λ²•μœΌλ‘œ ν•΄κ²°λ˜μ§€ μ•ŠλŠ” 경우 맀뉴얼에 기재된 κΈ°μˆ μ„œλΉ„μŠ€μ„Όν„°μ˜ OpenSQL Support νŒ€μ— λ¬Έμ˜ν•©λ‹ˆλ‹€.

    μ—λŸ¬ μ½”λ“œκ°€ β€˜O2β€™λ‘œ μ‹œμž‘ν•  경우

    O2 Extensionμ—μ„œ μƒμ„±ν•œ μ»€μŠ€ν…€ μ—λŸ¬λŠ” λͺ¨λ‘ β€˜O2β€™λ‘œ μ‹œμž‘ν•˜λŠ” μ—λŸ¬ μ½”λ“œκ°€ λΆ€μ—¬λ©λ‹ˆλ‹€. λ§Œμ•½ O2 Extension μ‚¬μš© μ‹œ β€˜O2β€™λ‘œ μ‹œμž‘ν•˜λŠ” μ—λŸ¬ μ½”λ“œκ°€ λ°œμƒν•œ 경우 μ•„λž˜μ™€ 같이 쑰치λ₯Ό μ·¨ν•©λ‹ˆλ‹€.

    1. TroubleShooting - μ—λŸ¬ μ½”λ“œ νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘°ν•˜μ—¬ 상황에 λ§žλŠ” μ—λŸ¬μΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.

    2. 상황에 λ§žλŠ” μ—λŸ¬μΈ 경우 TroubleShooting - μ—λŸ¬ μ½”λ“œ 쑰치 κ°€μ΄λ“œμ— 맞게 μ‘°μΉ˜ν•©λ‹ˆλ‹€.

    μ—λŸ¬ μ½”λ“œκ°€ β€˜O2β€™λ‘œ μ‹œμž‘ν•˜μ§€ μ•Šμ„ 경우

    λ§Œμ•½ O2 Extension μ‚¬μš© μ‹œ β€˜O2β€™λ‘œ μ‹œμž‘ν•˜μ§€ μ•ŠλŠ” μ—λŸ¬ μ½”λ“œκ°€ λ°œμƒν•˜λ”λΌλ„ O2 Extensionμ—μ„œ λ°œμƒμ‹œν‚¨ μ˜ˆμ™ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μƒν™©μ—μ„œλŠ” μ•„λž˜μ™€ 같이 쑰치λ₯Ό μ·¨ν•©λ‹ˆλ‹€.

    1. λ₯Ό μ°Έμ‘°ν•˜μ—¬ λ°œμƒν•œ μ—λŸ¬ μ½”λ“œκ°€ 상황에 λ§žλŠ” μ—λŸ¬μΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.

    2. 상황에 λ§žλŠ” μ—λŸ¬μΈ 경우 쑰치 κ°€μ΄λ“œμ— 맞게 μ‘°μΉ˜ν•©λ‹ˆλ‹€.

    λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ„±λŠ₯ μ €ν•˜λŠ” 볡합적인 원인을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. O2 Extension μ‚¬μš© μ‹œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•˜λ”λΌλ„ PostgreSQL μ½”μ–΄λ‚˜ λ‹€λ₯Έ μš”μ†Œλ‘œλΆ€ν„° κΈ°μΈν•œ 문제일 수 μžˆμŠ΅λ‹ˆλ‹€.

    O2 ExtensionμœΌλ‘œλΆ€ν„° κΈ°μΈν•œ μ„±λŠ₯ μ €ν•˜ λ¬Έμ œμΈμ§€ ν™•μΈν•˜λŠ” λͺ‡ κ°€μ§€ 방법을 μ œμ‹œν•©λ‹ˆλ‹€.

    1. O2Functions의 빌트인 ν•¨μˆ˜λ₯Ό λŒ€μ²΄ν•  수 μžˆλŠ” PostgreSQL 빌트인 ν•¨μˆ˜λ‘œ λ³€κ²½ν•˜μ—¬ ν…ŒμŠ€νŠΈ ν•©λ‹ˆλ‹€.

      1. λ§Œμ•½ PostgreSQL 빌트인 ν•¨μˆ˜λ‘œ λŒ€μ²΄ ν›„ μ„±λŠ₯ μ €ν•˜κ°€ ν•΄κ²°λœλ‹€λ©΄ O2Functionsλ‘œλΆ€ν„° κΈ°μΈν•œ λ¬Έμ œμ΄λ―€λ‘œ OpenSQL Support νŒ€μ— λ¬Έμ˜ν•©λ‹ˆλ‹€.

      2. λ§Œμ•½ μ„±λŠ₯ μ €ν•˜κ°€ ν•΄κ²°λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ PostgreSQL μ½”μ–΄λ‚˜ λ‹€λ₯Έ μš”μ†Œλ‘œλΆ€ν„° κΈ°μΈν•œ 문제일 수 μžˆμœΌλ―€λ‘œ 병λͺ©ν˜„μƒμ˜ 원인을 λ‹€λ₯Έ μš”μ†Œμ—μ„œ μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€.

    PostgreSQL은 ν•œ μ„Έμ…˜μ΄ ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ μœ ν•©λ‹ˆλ‹€. λ§Œμ•½ 질의 처리 쀑 μ„Έμ…˜μ΄ κ°•μ œ μ’…λ£Œλ  경우 μ„Έμ…˜μ΄ μ μœ ν•˜κ³  있던 ν”„λ‘œμ„ΈμŠ€λ„ 같이 κ°•μ œ μ’…λ£Œλ©λ‹ˆλ‹€. λ‹€λ₯Έ μ„Έμ…˜μ€ 영ν–₯을 λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    λ§Œμ•½ O2 Extensionμ—μ„œμ˜ λ²„κ·Έλ‘œ 인해 Segmentation Fault와 같은 μ‹œκ·Έλ„μ„ μœ λ°œν•˜λŠ” μ—λŸ¬κ°€ λ°œμƒν•  경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ O2 Extension은 μ»€μŠ€ν…€ μ‹œκ·Έλ„ 핸듀링 λ‘œμ§μ„ PostgreSQL에 μ£Όμž…ν–ˆμŠ΅λ‹ˆλ‹€. μ»€μŠ€ν…€ μ‹œκ·Έλ„ 핸듀링 λ‘œμ§μ€ μ‹œκ·Έλ„λ‘œ 인해 μ„Έμ…˜μ΄ κ°•μ œ μ’…λ£Œλ  경우 PostgreSQL λ‘œκ·Έμ— λ¬Έμ œκ°€ λ°œμƒν•œ μœ„μΉ˜μ˜ Backtrace 둜그λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

    ν•΄λ‹Ή μ‹œλ‚˜λ¦¬μ˜€κ°€ λ°œμƒν•  경우 PostgreSQL λ‘œκ·Έμ—μ„œ Backtrace 둜그λ₯Ό μ°Ύμ•„ μ €μž₯ν•˜κ³  OpenSQL μ§€μ›νŒ€μ— λ¬Έμ˜ν•©λ‹ˆλ‹€.

    PostgreSQL의 μ—λŸ¬ 레벨 쀑 β€˜PANIC’ λ ˆλ²¨μ€ λͺ¨λ“  μ„Έμ…˜μ„ κ°•μ œ μ’…λ£Œν•©λ‹ˆλ‹€.

    O2 Extension μ‚¬μš© μ‹œ 곡유 λ©”λͺ¨λ¦¬μ— λŒ€ν•œ 잘λͺ»λœ μ œμ–΄ 및 접근을 λ™λ°˜ν•œ λ²„κ·Έλ‘œ 인해 β€˜PANIC’ 레벨의 μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. DBMS_PIPE와 DBMS_ALERTλŠ” 곡유 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” Extension으둜 λͺ¨μ’…μ˜ 이유둜 인해 곡유 λ©”λͺ¨λ¦¬ μ œμ–΄ μ‹œ μ—λŸ¬κ°€ λ°œμƒν•  경우 상기 상황이 λ°œμƒν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

    ν•΄λ‹Ή 상황이 λ°œμƒν•œ 경우 곡유 λ©”λͺ¨λ¦¬κ°€ μ†μƒλ˜μ—ˆμ„ κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ μΈμŠ€ν„΄μŠ€ μž¬κΈ°λ™μ΄ ν•„μš”ν•©λ‹ˆλ‹€. PostgreSQL λ‘œκ·Έμ—μ„œ Backtrace 둜그λ₯Ό μ°Ύμ•„ μ €μž₯ν•˜κ³  OpenSQL μ§€μ›νŒ€μ— λ¬Έμ˜ν•©λ‹ˆλ‹€.

    이 κ²°κ³ΌλŠ” Postgresql의 μŠ€νŽ™μ— λ”°λ₯Έ ν•œκ³„λ‘œ λ³΄μž…λ‹ˆλ‹€.

    μž…λ ₯ν•˜λŠ” λ°μ΄ν„°μ˜ 크기λ₯Ό μ μ ˆν•œ 수치둜 쀄여보고 ν•΄λ‹Ή λ°©λ²•μœΌλ‘œλ„ 해결이 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄, PostgreSQL λ‘œκ·Έμ—μ„œ Backtrace 둜그λ₯Ό μ°Ύμ•„ μ €μž₯ν•˜κ³  OpenSQL μ§€μ›νŒ€μ— λ¬Έμ˜ν•©λ‹ˆλ‹€.

    TO_MULTI_BYTE


    단일 λ°”μ΄νŠΈ(ASCII) 문자λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ 인코딩에 λ”°λ₯Έ ν•΄λ‹Ή 닀쀑 λ°”μ΄νŠΈ 문자둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, ASCII λ²”μœ„(0x20 ~ 0x7E)에 ν•΄λ‹Ήν•˜λŠ” λ¬ΈμžλŠ” 미리 μ •μ˜λœ 닀쀑 λ°”μ΄νŠΈ λ§€ν•‘ ν…Œμ΄λΈ”(UTF8, EUC_JP, EUC_CN λ“±)에 따라 λ³€ν™˜λ©λ‹ˆλ‹€.

    λ°μ΄ν„°λ² μ΄μŠ€ 인코딩이 ν•΄λ‹Ή λ§€ν•‘ ν…Œμ΄λΈ” 쀑 ν•˜λ‚˜μ— ν•΄λ‹Ήν•˜λ©΄, μž…λ ₯ λ¬Έμžμ—΄μ˜ 각 문자λ₯Ό λŒ€μ‘ν•˜λŠ” 닀쀑 λ°”μ΄νŠΈ λ¬Έμžμ—΄λ‘œ μΉ˜ν™˜ν•˜κ³ , κ·Έ μ™Έμ˜ λ¬ΈμžλŠ” κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    DBTIMEZONE


    dbtimezone ν•¨μˆ˜λŠ” μ„œλ²„μ˜ κΈ°λ³Έ μ‹œκ°„λŒ€λ₯Ό ν…μŠ€νŠΈ ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    λ‚΄λΆ€μ μœΌλ‘œλŠ” ν˜„μž¬ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 섀정을 ν™•μΈν•˜κΈ° μœ„ν•΄ pg_db_role_setting ν…Œμ΄λΈ”μ„ μ‘°νšŒν•˜λ©°,

    λ§Œμ•½ ν•΄λ‹Ή 섀정이 μ—†μœΌλ©΄ pg_settingsμ—μ„œ κΈ°λ³Έ TimeZone 값을 κ°€μ Έμ˜΅λ‹ˆλ‹€.

    즉, μ„œλ²„μ— μ„€μ •λœ κΈ°λ³Έ μ‹œκ°„λŒ€λ₯Ό μ‘°νšŒν•΄μ„œ λ¬Έμžμ—΄λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.


    https://www.postgresql.org/docs/current/largeobjects.html
    빌트인 νŒ¨ν‚€μ§€ μ‚¬μš© μ‹œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•œ 경우 νƒ€μž„μ•„μ›ƒμ— 걸리지 μ•Šμ•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
    1. DBMS_PIPE, DBMS_ALERT와 같은 νŒ¨ν‚€μ§€λŠ” μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•ŒκΉŒμ§€ 기닀릴 νƒ€μž„μ•„μ›ƒμ΄ μ£Όμ–΄μ§‘λ‹ˆλ‹€. 이 λ•Œ νƒ€μž„μ•„μ›ƒμ΄ λ„ˆλ¬΄ 크게 μ£Όμ–΄μ§„ 경우 μ„±λŠ₯ μ €ν•˜λ‘œ 보일 수 μžˆμœΌλ―€λ‘œ μ μ ˆν•œ νƒ€μž„μ•„μ›ƒμ΄ 주어지도둝 μ‘°μΉ˜ν•©λ‹ˆλ‹€.

  • Callgrind와 같은 ν”„λ‘œνŒŒμΌλ§ νˆ΄μ„ μ‚¬μš©ν•˜μ—¬ 병λͺ©ν˜„μƒμ˜ μœ„μΉ˜κ°€ O2 Extension인지 ν™•μΈν•©λ‹ˆλ‹€.

  • μ„±λŠ₯ μ €ν•˜ λ°œμƒ

    μ‹±κΈ€ μ„Έμ…˜ κ°•μ œμ’…λ£Œ λ°œμƒ

    λͺ¨λ“  μ„Έμ…˜ κ°•μ œμ’…λ£Œ λ°œμƒ

    TEXT νƒ€μž…μ— λ§Žμ€ μ–‘μ˜ 데이터 μž…λ ₯μ‹œ Out of memory λ°œμƒ

    PostgreSQL Error Codes
    PostgreSQL Error Codes
    PG 곡식 λ¬Έμ„œ
    λ‚ μ§œ/μ‹œκ°„ 포멧 λͺ¨λΈ
    숫자 포멧 λͺ¨λΈ

    session_user

    μ‹€μ œ λ°μ΄ν„°λ² μ΄μŠ€ μ ‘μ†ν•œ μ‚¬μš©μžμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

    server_host

    μΈμŠ€ν„΄μŠ€κ°€ μ‹€ν–‰ 쀑인 λ¨Έμ‹ μ˜ 호슀트 μ΄λ¦„μž…λ‹ˆλ‹€.

    ip_address

    ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λœ λ¨Έμ‹ μ˜ IP μ£Όμ†Œμž…λ‹ˆλ‹€.

    λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ†μ„±μž…λ‹ˆλ‹€. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€λŠ” μ•Šμ§€λ§Œ μ΅œλŒ€ 30μžκΉŒμ§€λ§Œ μž…λ ₯을 ν—ˆμš©ν•©λ‹ˆλ‹€.

    length

    좜λ ₯의 κΈΈμ΄μž…λ‹ˆλ‹€. κΈ°λ³Έ 값은 256λ°”μ΄νŠΈμž…λ‹ˆλ‹€. 1λΆ€ν„° 4000κΉŒμ§€λ§Œ ν—ˆμš©λ©λ‹ˆλ‹€.

    host

    ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λœ 호슀트 λ¨Έμ‹ μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

    current_schema

    ν˜„μž¬ ν™œμ„± μƒνƒœμΈ κΈ°λ³Έ μŠ€ν‚€λ§ˆμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

    current_user

    ν˜„μž¬ ν™œμ„±ν™”λœ κΆŒν•œμ„ κ°€μ§„ λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

    예제

    Syntax

    κ°œμš”

    예제

    text νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  λŒ€μƒ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. ASCII λ¬Έμžλ“€μ΄ 닀쀑 λ°”μ΄νŠΈ 문자둜 μΉ˜ν™˜λ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    νŒŒλΌλ―Έν„°

    str

    예제

    select sys_context('userenv', 'current_schema');
     sys_context 
    -------------
     public
    
    select sys_context('userenv', 'host');
     sys_context 
    -------------
     [local]
    
    select sys_context('userenv', 'current_user');
     sys_context 
    -------------
     opensql
     
     select sys_context('userenv', 'session_user');
     sys_context 
    -------------
     opensql
    
    select sys_context('userenv', 'server_host');
     sys_context 
    -------------
     tmaxtibero
    
    select sys_context('userenv', 'ip_address');
     sys_context 
    -------------
     
     
     
    select oracle.sys_context('userenv', 'hostname');
    ERROR:  Not supported parameter: hostname
    DBTIMEZONE()
    RETURNS text;
    select dbtimezone();
    
     dbtimezone 
    ------------
     Asia/Seoul
    (1 row)
    TO_MULTI_BYTE
    (
      str  IN text
    )
    RETURNS text;
    SELECT TO_MULTI_BYTE('Hello, World!');
    
           to_multi_byte        
    ----------------------------
     οΌ¨ο½…ο½Œο½Œο½οΌŒγ€€οΌ·ο½ο½’ο½Œο½„οΌ
    (1 row)

    FAQ

    Q. PostgreSQL μ„œλ²„μ— O2 Extension을 μ–΄λ–»κ²Œ μ„€μΉ˜ν•©λ‹ˆκΉŒ?

    A. PostgreSQL은 Extension μ„€μΉ˜λ₯Ό κ°„νŽΈν•˜κ²Œ ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. O2 Extension도 λ§ˆμ°¬κ°€μ§€λ‘œ μ†μ‰½κ²Œ μ„€μΉ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ„€μΉ˜ μ•ˆλ‚΄μ„œλ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    Q. μ„€μΉ˜ν•œ O2 Extension을 μ–΄λ–»κ²Œ ν™œμ„±ν™”ν•©λ‹ˆκΉŒ?

    A. PostgreSQL은 동적 링크λ₯Ό ν™œμš©ν•˜μ—¬ Extension을 κ°„λ‹¨ν•œ SQL ꡬ문으둜 ν™œμ„±ν™”ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. O2 Extension도 λ§ˆμ°¬κ°€μ§€λ‘œ κ°„λ‹¨ν•œ SQL ꡬ문을 μ‚¬μš©ν•˜μ—¬ ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ„€μΉ˜ μ•ˆλ‚΄μ„œλ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    Q. O2 Extension이 νŠΉμ • PostgreSQL 버전과 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆκΉŒ?

    A. O2 Extension의 κΈ°λŠ₯은 λŒ€λΆ€λΆ„ PostgreSQL 14 이상 버전을 μ§€μ›ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 일뢀 κΈ°λŠ₯은 PostgreSQL 15 이상을, 또 λ‹€λ₯Έ 일뢀 κΈ°λŠ₯은 PostgreSQL 16 μ΄μƒμ˜ 버전을 μš”κ΅¬ν•©λ‹ˆλ‹€.

    μ‚¬μš© 쀑인 PostgreSQL 버전이 νŠΉμ • κΈ°λŠ₯의 μ΅œμ†Œ μš”κ΅¬ 사항을 μΆ©μ‘±ν•˜μ§€ λͺ»ν•  경우, μ„€μΉ˜ μ‹œ ν•΄λ‹Ή κΈ°λŠ₯은 μžλ™μœΌλ‘œ μ œμ™Έλ©λ‹ˆλ‹€. κΈ°λŠ₯별 μ΅œμ†Œ 지원 버전은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

    Extension
    Feature
    Object Type
    PostgreSQL μ΅œμ†Œ 버전

    A. λ°μ΄ν„°λ² μ΄μŠ€ μ„±λŠ₯ μ €ν•˜λŠ” λ‹€μ–‘ν•œ 이유둜 인해 λ°œμƒν•  수 있으며 문제 해결을 μœ„ν•΄μ„œλŠ” μ •ν™•ν•œ 원인을 μ°ΎλŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ„±λŠ₯ μ €ν•˜ 해결에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

    A. O2 Extensionμ—μ„œλŠ” PostgreSQL의 빌트인 μ—λŸ¬ μ½”λ“œμ™€ O2 Extension의 μ»€μŠ€ν…€ μ—λŸ¬ μ½”λ“œλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. PostgreSQL의 빌트인 μ—λŸ¬ μ½”λ“œλŠ” 맀뉴얼을 μ°Έμ‘°ν•©λ‹ˆλ‹€. O2 Extension의 μ»€μŠ€ν…€ μ—λŸ¬ μ½”λ“œλŠ” 을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

    A. PostgreSQL은 Extension을 κ°„λ‹¨ν•œ SQL ꡬ문으둜 μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. O2 Extension도 λ§ˆμ°¬κ°€μ§€λ‘œ κ°„λ‹¨ν•œ SQL ꡬ문을 μ‚¬μš©ν•˜μ—¬ μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    A. PostgreSQL은 Extension을 λ°μ΄ν„°λ² μ΄μŠ€ κ°μ²΄λ‘œμ„œ κ΄€λ¦¬ν•˜λ©° κ°„λ‹¨ν•œ SQL ꡬ문으둜 μ œκ±°ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. O2 Extension도 λ§ˆμ°¬κ°€μ§€λ‘œ κ°„λ‹¨ν•œ SQL ꡬ문을 μ‚¬μš©ν•˜μ—¬ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    A. O2 Extension κ΄€λ ¨ λ‘œκ·ΈλŠ” PostgreSQL의 둜그 νŒŒμΌμ— ν•¨κ»˜ μž‘μ„±λ©λ‹ˆλ‹€.

    15

    REGEXP_SUBSTR

    Function

    15

    REGEXP_REPLACE

    Function

    15

    O2Views

    O2_SHARED_MEMORY_INFO

    View

    15

    DBMS_ALERT

    REMOVEALL

    Procedure

    15

    WAITANY

    Procedure

    15

    DBMS_RLS

    전체 κΈ°λŠ₯

    Procedure

    16

    O2Functions

    REGEXP_LIKE

    Function

    15

    REGEXP_COUNT

    Function

    15

    REGEXP_INSTR

    Q. O2 Extension을 μ‚¬μš©ν•œ ν›„ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

    Q. O2 Extension μ‚¬μš© 쀑 λ°œμƒν•˜λŠ” 일반적인 μ—λŸ¬ μ½”λ“œμ™€ κ·Έ ν•΄κ²° 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

    Q. O2 Extension을 μ΅œμ‹ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

    Q. 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ O2 Extension을 μ–΄λ–»κ²Œ μ œκ±°ν•©λ‹ˆκΉŒ?

    Q. O2 Extension κ΄€λ ¨ 둜그λ₯Ό μ–΄λ””μ„œ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

    TroubleShooting의 Common Issues ν•­λͺ©
    PostgreSQL Error Codes
    TroubleShooting의 μ—λŸ¬ μ½”λ“œ ν•­λͺ©
    μ„€μΉ˜ μ•ˆλ‚΄μ„œ
    μ„€μΉ˜ μ•ˆλ‚΄μ„œ

    Function

    O2 Extension μ„€μΉ˜

    κ°œμš”

    O2λŠ” PostgreSQL ν™˜κ²½μ—μ„œ 였라클이 μ§€μ›ν•˜λŠ” ν•¨μˆ˜/νŒ¨ν‚€μ§€/νƒ€μž…λ“€κ³Ό ν˜Έν™˜λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜μ—¬ μ‚¬μš©μžλ“€μ˜ 편의λ₯Ό ν–₯μƒμ‹œν‚€λŠ” PostgreSQL Extension μž…λ‹ˆλ‹€.

    μ‹œμŠ€ν…œ μš”κ΅¬ 사항

    OpenSQLμ—μ„œ μ§€μ›ν•˜λŠ” 운영체제/ν•˜λ“œμ›¨μ–΄ 사양과 λ™μΌν•©λ‹ˆλ‹€.

    O2 Extensionμ—μ„œλŠ” μ œν’ˆ μ„€μΉ˜λ₯Ό μœ„ν•œ 방법을 λ‹€μŒμ˜ 2κ°€μ§€ μ„€μΉ˜ ν˜•νƒœλ‘œ μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    • make λ°©μ‹μœΌλ‘œ μ„€μΉ˜

    • shell λ°©μ‹μœΌλ‘œ μ„€μΉ˜

    O2 μ„€μΉ˜νŒŒμΌ 디렉토리 ꡬ쑰

    OpenSQL μ„€μΉ˜ νŒ¨ν‚€μ§€ 내뢀에 동봉될 O2 μ„€μΉ˜νŒŒμΌ λͺ¨μŒ λ””λ ‰ν† λ¦¬λŠ” μ•„λž˜μ™€ 같은 ν˜•μ‹μœΌλ‘œ μ œκ³΅λ©λ‹ˆλ‹€. λ‚΄λΆ€μ—λŠ” 2κ°€μ§€ μ„€μΉ˜λ°©λ²•μ„ μœ„ν•œ 파일(Makefile, install.sh)듀이 μ œκ³΅λ©λ‹ˆλ‹€.

    PostgreSQLκ°€ μ„€μΉ˜λœ Linux ν”Œλž«νΌμ—μ„œ O2 Extension을 make μ»€λ§¨λ“œλ₯Ό 톡해 μžλ™μœΌλ‘œ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€

    O2 Extension이 ν¬ν•¨ν•˜λŠ” λͺ¨λ“  Extension을 λ™μ‹œ μ„€μΉ˜ν•˜λŠ” 전체 μ„€μΉ˜, κ°œλ³„ Extension을 μ„€μΉ˜ν•˜λŠ” κ°œλ³„ μ„€μΉ˜λ‘œ κ΅¬λΆ„ν•©λ‹ˆλ‹€.

    PostgreSQL이 μ„€μΉ˜κ°€ λ˜μ–΄μžˆκ³ , 터미널 λͺ…λ Ήμ€„μ—μ„œ make, pg_config μ»€λ§¨λ“œκ°€ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœμ—¬μ•Ό ν•©λ‹ˆλ‹€.

    O2 Extension μ„€μΉ˜ ꡬ성 μš”μ†Œκ°€ λͺ¨μ—¬ μžˆλŠ” 디렉토리(Makefile 이 μžˆλŠ” 디렉토리) λ‚΄λΆ€λ‘œ μ΄λ™ν•˜μ—¬ μ•„λž˜μ˜ make μ»€λ§¨λ“œλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    κ°œλ³„ μ„€μΉ˜λŠ” make μ»€λ§¨λ“œμ— μ„€μΉ˜ν•˜λ €λŠ” extension 이름을 인자둜 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • DBMS_ALERT

    • DBMS_ASSERT

    • DBMS_OUTPUT

    • DBMS_PIPE


    make μ»€λ§¨λ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” ν™˜κ²½μ—μ„œ shell scriptλ₯Ό μ΄μš©ν•˜μ—¬ 수기둜 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    PostgreSQLκ°€ μ„€μΉ˜λœ Linux ν”Œλž«νΌμ—μ„œ O2 Extension을 μˆ˜λ™μœΌλ‘œ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. O2 Extension이 ν¬ν•¨ν•˜λŠ” λͺ¨λ“  Extension을 λ™μ‹œ μ„€μΉ˜ν•˜λŠ” 전체 μ„€μΉ˜, κ°œλ³„ Extension을 μ„€μΉ˜ν•˜λŠ” κ°œλ³„ μ„€μΉ˜λ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.

    PostgreSQL이 μ„€μΉ˜κ°€ λ˜μ–΄μžˆκ³ , 터미널 λͺ…λ Ήμ€„μ—μ„œ pg_config λ°”μ΄λ„ˆλ¦¬κ°€ μ‚¬μš©κ°€λŠ₯ν•œ μƒνƒœμ—¬μ•Ό ν•©λ‹ˆλ‹€.

    OpenSQL λ°”μ΄λ„ˆλ¦¬ μ„€μΉ˜ μŠ€ν¬λ¦½νŠΈκ°€ λͺ¨μ—¬μžˆλŠ” 디렉터리(scripts)둜 μ΄λ™ν•œ ν›„ install.sh 슀크립트λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

    O2 Extension μ„€μΉ˜ ꡬ성 μš”μ†Œκ°€ λͺ¨μ—¬ μžˆλŠ” 디렉토리(Makefile 이 μžˆλŠ” 디렉토리) λ‚΄λΆ€λ‘œ μ΄λ™ν•˜μ—¬ install.sh 을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ„€μΉ˜ μ»€λ§¨λ“œμ— μ„€μΉ˜ν•˜λ €λŠ” extension 이름을 인자둜 λ„£μ–΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

    • DBMS_ALERT

    • DBMS_ASSERT

    • DBMS_OUTPUT

    • DBMS_PIPE


    make/shell μ„€μΉ˜ 방법 λͺ¨λ‘ pg_config κ°€ μ‚¬μš© κ°€λŠ₯ν•œ κ³„μ •μœΌλ‘œ μ„€μΉ˜λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    $PATH λ³€μˆ˜ 값에 /usr/pgsql-{PG버전}/bin 이 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€.

    $PATHκ°€ μ„€μ •λ˜μ–΄μžˆλŠ” μœ μ €μ˜ κΆŒν•œμœΌλ‘œ μš°νšŒν•˜μ—¬ μ„€μΉ˜λ₯Ό μ§„ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    sudo κΆŒν•œμ„ 톡해 μ•„λž˜μ™€ 같은 λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    O2 extension 은 OpenSQL λΌμ΄μ„ΌμŠ€λ₯Ό ν™•μΈν•˜λ―€λ‘œ, μ•„λž˜μ™€ 같이 λΌμ΄μ„ΌμŠ€ 파일 경둜λ₯Ό μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.


    O2 Extension듀은 μ•„λž˜μ™€ 같이 크게 4μ’…λ₯˜ 그룹으둜 λΆ„λ₯˜λ©λ‹ˆλ‹€.

    각 κ·Έλ£Ήλ“€μ˜ ν•˜μœ„ λͺ©λ‘μ€ μ‹€μ œ μ œκ³΅λ˜λŠ” κ°œλ³„ Extension의 이름을 λ‚˜μ—΄ν•œ κ²ƒμž…λ‹ˆλ‹€.

    • Types Extension

      • O2Types

    • Views Extension

    각 extension듀은 μ•„λž˜μ™€ 같은 νŒŒμΌλ“€λ‘œ κ΅¬μ„±λ˜μ–΄ 있고 각 extensionλ³„λ‘œ κ°œλ³„ 생성 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    μ˜ˆμ‹œ) O2Functions Extension의 ꡬ성 νŒŒμΌμ€ λ‹€μŒκ³Όκ°™μŠ΅λ‹ˆλ‹€.

    • Shared object file (eg. o2functions.so)

    • Control file (eg. o2functions.control)

    • Script file (eg. o2functionsβ€”1.0.sql, o2functionsβ€”1.0β€”1.1.sql, …)

    그리고 extensionλ“€μ˜ 버전 정보λ₯Ό ν•œ 곳으둜 묢은 VERSION.json 파일이 μ‘΄μž¬ν•©λ‹ˆλ‹€.


    O2 Extension을 μ„€μΉ˜ν•œ ν›„ ν™œμ„±ν™”λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 SQL μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • O2 Extension듀은 내뢀에 μ •μ˜ν•œ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μŠ€ν‚€λ§ˆ oracle λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    • Package Extension(DBMS_ALERT, DBMS_PIPE λ“±)은 각자 extension 이름을 μŠ€ν‚€λ§ˆλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    • O2 Extensionμ—μ„œ μ‚¬μš©λ  μŠ€ν‚€λ§ˆ 이름을 λ³€κ²½ν•˜κΈ° μœ„ν•΄μ„œλŠ” 각 extension의 control 파일 λ‚΄λΆ€ schema ν•­λͺ©μ˜ 값을 μˆ˜μ •ν•΄μ•Όν•©λ‹ˆλ‹€. (단, 각 Package extension듀은 μŠ€ν‚€λ§ˆ 이름이 κ³ μ •κ°’μœΌλ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.)


    O2 Extension을 μƒμœ„ λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 SQL μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.


    HA ꡬ성 μ‹œ 각 λ…Έλ“œμ— 직접 λΆ™μ–΄ μˆ˜λ™μœΌλ‘œ O2 Extension μ„€μΉ˜ 및 μ—…λ°μ΄νŠΈλ₯Ό μ§„ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    λ˜ν•œ 각 λ…Έλ“œμ— μ„€μΉ˜λœ O2 Extension version은 μΌμΉ˜ν•˜κ²Œ μ„€μΉ˜λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

    λ…Έλ“œ κ°„ 버전 차이가 λ°œμƒν•˜λ©΄ 버전 κ°„ λ™μž‘ 차이둜 인해 쿼리 μˆ˜ν–‰ μ‹œ μ–΄λŠ λ…Έλ“œλ‘œ 보내 μ‘ŒλŠ”μ§€μ— 따라 λ‹€λ₯Έ 결과값이 λ‚˜μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

    DBMS_OUTPUT

    κ°œμš”

    DBMS_OUTPUT은 λ©”μ‹œμ§€λ₯Ό 버퍼에 μ €μž₯ν•˜κ³  λ²„νΌλ‘œλΆ€ν„° λ©”μ‹œμ§€λ₯Ό μ½μ–΄μ˜€κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€.

    ν•¨μˆ˜ / ν”„λ‘œμ‹œμ €
    λ°˜ν™˜ νƒ€μž…
    μ„€λͺ…

    DISABLE

    n/a

    ν• λ‹Ήλœ λ©”μ‹œμ§€ 버퍼λ₯Ό μ œκ±°ν•˜κ³ , DBMS_OUTPUT νŒ¨ν‚€μ§€ λ‚΄μ˜ λ‹€λ₯Έ ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•  수 μ—†κ²Œ ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.


    μ„€μΉ˜λŠ” super user에 이루어져야 ν•˜κ³  public으둜 κ³΅κ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.


    λ³Έ μ ˆμ—μ„œλŠ” DBMS_OUTPUT νŒ¨ν‚€μ§€μ—μ„œ μ œκ³΅ν•˜λŠ” ν”„λ‘œμ‹œμ €μ™€ ν•¨μˆ˜λ₯Ό μ•ŒνŒŒλ²³ 순으둜 μ„€λͺ…ν•©λ‹ˆλ‹€.

    ν• λ‹Ήλœ λ©”μ‹œμ§€ 버퍼λ₯Ό μ œκ±°ν•˜κ³ , DBMS_OUTPUT νŒ¨ν‚€μ§€ λ‚΄μ˜ λ‹€λ₯Έ ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•  수 μ—†κ²Œ ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. 이 ν”„λ‘œμ„œμ§€λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ©”μ‹œμ§€ 버퍼에 λ‚¨μ•„μžˆλŠ” λͺ¨λ“  λ©”μ‹œμ§€κ°€ ν•¨κ»˜ μ œκ±°λ©λ‹ˆλ‹€.

    μ§€μ •λœ 크기의 λ©”μ‹œμ§€ 버퍼λ₯Ό ν• λ‹Ήν•˜κ³  DBMS_OUTPUT νŒ¨ν‚€μ§€ λ‚΄μ˜ λ‹€λ₯Έ ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•  수 있게 ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. 이 ν”„λ‘œμ‹œμ €λ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜λ©΄ κ°€μž₯ 크게 μ§€μ •ν•œ 크기둜 λ©”μ‹œμ§€ 버퍼λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    λ©”μ‹œμ§€ λ²„νΌλ‘œλΆ€ν„° 라인 λ‹¨μœ„λ‘œ λ©”μ‹œμ§€λ₯Ό μ½μ–΄μ˜€λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. 이 ν”„λ‘œμ‹œμ €λŠ” 라인 λ‹¨μœ„λ‘œ λ©”μ‹œμ§€λ₯Ό 읽으며, ν•˜λ‚˜μ˜ 라인을 ν˜•μ„±ν•˜μ§€ μ•Šμ€ λ©”μ‹œμ§€λŠ” 읽지 μ•ŠμŠ΅λ‹ˆλ‹€.

    GET_LINE λ˜λŠ” GET_LINES ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•œ 후에 PUT λ˜λŠ” PUT_LINE ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•˜λ©΄, ν˜„μž¬κΉŒμ§€ λ©”μ‹œμ§€ 버퍼에 남아 있던 λ©”μ‹œμ§€λŠ” λͺ¨λ‘ μ œκ±°λ©λ‹ˆλ‹€.

    ν•œ 라인의 λ©”μ‹œμ§€λŠ” μ΅œλŒ€ 255bytes의 크기λ₯Ό κ°€μ§€λ―€λ‘œ, 좜λ ₯ νŒŒλΌλ―Έν„°μ˜ 크기λ₯Ό μΆ©λΆ„ν•˜κ²Œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    • GET_LINE GET_LINE ν”„λ‘œμ‹œμ €λŠ” ν•œ 번 호좜될 λ•Œλ§ˆλ‹€ ν•˜λ‚˜μ˜ λΌμΈλ§Œμ„ μ½μ–΄μ˜΅λ‹ˆλ‹€.

    • GET_LINES GET_LINES ν”„λ‘œμ‹œμ €λŠ” μ§€μ •λœ 수만큼, ν•œ λ²ˆμ— μ—¬λŸ¬ 라인의 λ©”μ‹œμ§€λ₯Ό μ½μ–΄μ˜΅λ‹ˆλ‹€. μ΄λ•Œ λ©”μ‹œμ§€ λ²„νΌλ‘œλΆ€ν„° μ‹€μ œλ‘œ μ½μ–΄μ˜¨ λ©”μ‹œμ§€ 라인의 수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ§Œμ•½ λ©”μ‹œμ§€ 버퍼 내에 μΆ©λΆ„ν•œ 수의 λ©”μ‹œμ§€ 라인이 μ—†μ–΄μ„œ μ§€μ •λœ 수 만큼의 λ©”μ‹œμ§€ 라인을 κ°€μ Έμ˜€μ§€ λͺ»ν•˜λ©΄, κ°€μ Έμ˜¨ λ©”μ‹œμ§€ 라인의 수 만큼만 μ €μž₯λ©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…
    • GET_LINE

    • GET_LINES

    λ©”μ‹œμ§€ 버퍼에 EOL 문자λ₯Ό μ €μž₯ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    PUT ν”„λ‘œμ‹œμ €λ‘œ λ©”μ‹œμ§€λ₯Ό μ €μž₯ν•œ 경우 EOL λ¬Έμžκ°€ μ—†μœΌλ―€λ‘œ 라인 λ‹¨μœ„λ‘œ λ©”μ‹œμ§€λ₯Ό μ½λŠ” GET_LINE, GET_LINES ν”„λ‘œμ‹œμ €λ‘œ λ¬Έμžμ—΄μ„ 읽어 올 수 μ—†μŠ΅λ‹ˆλ‹€. 단, NEW_LINE ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•˜λ©΄ GET_LINE, GET_LINES ν”„λ‘œμ‹œμ €λ‘œ λ¬Έμžμ—΄μ„ 읽어 올 수 μžˆμŠ΅λ‹ˆλ‹€.

    λ©”μ‹œμ§€ 버퍼에 λ©”μ‹œμ§€λ₯Ό μ €μž₯ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    • PUT PUT ν”„λ‘œμ‹œμ €λŠ” ν•˜λ‚˜μ˜ 라인을 μ—¬λŸ¬ λ²ˆμ— 걸쳐 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 버퍼에 μ €μž₯λ˜λŠ” λ©”μ‹œμ§€μ˜ λ§ˆμ§€λ§‰ 라인 끝에 EOL λ¬Έμžκ°€ μ²¨λΆ€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • PUT_LINE PUT_LINE ν”„λ‘œμ‹œμ €λŠ” PUT ν”„λ‘œμ‹œμ €μ™€λŠ” λ°˜λŒ€λ‘œ 버퍼에 μ €μž₯λ˜λŠ” λ©”μ‹œμ§€μ˜ λ§ˆμ§€λ§‰ 라인 끝에 EOL 문자λ₯Ό μ²¨λΆ€ν•©λ‹ˆλ‹€. λ§Œμ•½ EOL λ¬Έμžλ§Œμ„ μ €μž₯ν•˜λ €λ©΄ NEW_LINE ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    TO_NUMBER

    Syntax

    TO_NUMBER
    (
      value  IN { text | smallint | int | bigint | double precision | numeric }
    )
    RETURNS numeric;
    
    TO_NUMBER
    (
      value  IN numeric,
      fmt    IN numeric
    )
    RETURNS numeric;

    κ°œμš”

    μž…λ ₯된 λ¬Έμžμ—΄ λ˜λŠ” μˆ«μžν˜• 값을 Oracle μŠ€νƒ€μΌμ˜ 숫자(numeric)둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    ν…μŠ€νŠΈλ‘œ μž…λ ₯된 경우, λ‘œμΌ€μΌ 섀정에 따라 μ†Œμˆ˜μ  및 천 λ‹¨μœ„ ꡬ뢄 문자λ₯Ό μ‘°μ •ν•œ ν›„ 숫자 ν˜•μ‹ λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    λ˜ν•œ, smallint, int, bigint, double precision νƒ€μž… 값은 각 νƒ€μž… μ „μš© λ‚΄λΆ€ λ‘œμ§μ„ 톡해 numeric νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

    numeric νƒ€μž…μ˜ μž…λ ₯은 κ·ΈλŒ€λ‘œ λ°˜ν™˜ 되며, 포맷 λͺ¨λΈ(fmt)이 제곡되면 PG κΈ°λ³Έ λ‚΄μž₯ ν•¨μˆ˜(pg_catalog.to_number) ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μΆ”κ°€ λ³€ν™˜ ν˜•μ‹μ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    ADD_MONTHS


    ADD_MONTHS ν•¨μˆ˜λŠ” μ£Όμ–΄μ§„ λ‚ μ§œλ‚˜ νƒ€μž„μŠ€νƒ¬ν”„μ— μ§€μ •ν•œ κ°œμ›” 수λ₯Ό λ”ν•œ μƒˆλ‘œμš΄ λ‚ μ§œλ‚˜ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    λ‚΄λΆ€μ μœΌλ‘œ μž…λ ₯ λ‚ μ§œλ₯Ό μ—°, μ›”, 일둜 λΆ„ν•΄ν•œ ν›„, 전체 κ°œμ›” 수λ₯Ό 더해 μƒˆ 연도와 월을 κ³„μ‚°ν•©λ‹ˆλ‹€.

    특히, μž…λ ₯ λ‚ μ§œκ°€ ν•΄λ‹Ή μ›”μ˜ λ§ˆμ§€λ§‰ 날인 경우 μƒˆ λ‹¬μ˜ λ§ˆμ§€λ§‰ λ‚ λ‘œ μ‘°μ •λ©λ‹ˆλ‹€.

    첫 번째 μΈμžκ°€ timestamptz 인 경우, λ‚ μ§œ 계산 ν›„ 기쑴의 μ‹œκ°„ 정보λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    DBMS_RANDOM

  • DBMS_SCHEDULER

  • DBMS_SQL

  • DBMS_JOB

  • DBMS_RLS

  • UTL_FILE

  • O2Functions

  • O2Types

  • O2Views

  • DBMS_RANDOM

  • DBMS_SCHEDULER

  • DBMS_SQL

  • DBMS_JOB

  • DBMS_RLS

  • UTL_FILE

  • O2Functions

  • O2Types

  • O2Views

  • O2Views
  • Functions Extension

    • O2Functions

  • Package Extensions

    • DBMS_ALERT

    • DBMS_ASSERT

    • DBMS_OUTPUT

    • DBMS_PIPE

    • DBMS_RANDOM

    • DBMS_SCHEDULER

    • DBMS_SQL

    • DBMS_JOB

    • DBMS_RLS

    • UTL_FILE

  • make μ„€μΉ˜λ°©λ²•

    μ„€μΉ˜ μ „ μš”κ΅¬μ‚¬ν•­

    전체 μ„€μΉ˜

    κ°œλ³„ μ„€μΉ˜

    κ°œλ³„ μ„€μΉ˜ extension 이름 λͺ©λ‘

    shell μ„€μΉ˜λ°©λ²•

    μ„€μΉ˜ μ „ μš”κ΅¬μ‚¬ν•­

    전체 μ„€μΉ˜

    κ°œλ³„ μ„€μΉ˜

    κ°œλ³„ μ„€μΉ˜ extension 이름 λͺ©λ‘

    μ„€μΉ˜ 유의 사항

    pg_config와 $PATH μ„€μ •

    $PATH 값에 PGκ²½λ‘œκ°€ μ„€μ • λ˜μ–΄μžˆμ§€ μ•Šμ€ μœ μ € κ³„μ •μ—μ„œμ˜ μ„€μΉ˜ 방법

    λΌμ΄μ„ μŠ€ κ΄€λ ¨ μ„€μ •

    μ„€μΉ˜ ꡬ성 μš”μ†Œ

    Extension μ’…λ₯˜

    Extension ꡬ성 μš”μ†Œ

    O2 Extension ν™œμ„±ν™”

    O2 Extension μ—…λ°μ΄νŠΈ

    HA ꡬ성 μ‹œ 주의 사항

    ENABLE(buffer_size)

    n/a

    μ§€μ •λœ 크기의 λ©”μ‹œμ§€ 버퍼λ₯Ό ν• λ‹Ήν•˜κ³  DBMS_OUTPUT νŒ¨ν‚€μ§€ λ‚΄μ˜ λ‹€λ₯Έ ν”„λ‘œμ‹œμ €λ₯Ό μ‚¬μš©ν•  수 있게 ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    GET_LINE(line OUT, status OUT)

    n/a

    λ©”μ‹œμ§€ λ²„νΌλ‘œλΆ€ν„° ν•˜λ‚˜μ˜ 라인 λ©”μ‹œμ§€λ₯Ό μ½μ–΄μ˜€λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    GET_LINES(lines OUT, numlines IN OUT)

    n/a

    λ©”μ‹œμ§€ λ²„νΌλ‘œλΆ€ν„° μ§€μ •λœ 수만큼, ν•œ λ²ˆμ— μ—¬λŸ¬ 라인의 λ©”μ‹œμ§€λ₯Ό μ½μ–΄μ˜€λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    NEW_LINE

    n/a

    λ©”μ‹œμ§€ 버퍼에 EOL 문자λ₯Ό μ €μž₯ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€.

    PUT(item)

    n/a

    λ©”μ‹œμ§€ 버퍼에 λ©”μ‹œμ§€λ₯Ό μ €μž₯ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ 라인을 μ—¬λŸ¬ λ²ˆμ— 걸쳐 μ €μž₯ν•©λ‹ˆλ‹€.

    PUT_LINE(item)

    n/a

    λ©”μ‹œμ§€ 버퍼에 λ©”μ‹œμ§€λ₯Ό μ €μž₯ν•˜λŠ” ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. 버퍼에 μ €μž₯λ˜λŠ” λ©”μ‹œμ§€μ˜ λ§ˆμ§€λ§‰ 라인 끝에 EOL 문자λ₯Ό μ²¨λΆ€ν•©λ‹ˆλ‹€.

    buffer_size

    ν• λ‹Ήν•  λ©”μ‹œμ§€ λ²„νΌμ˜ ν¬κΈ°μž…λ‹ˆλ‹€. (λ‹¨μœ„: Byte)

    line, lines

    λ©”μ‹œμ§€ λ²„νΌλ‘œλΆ€ν„° 읽어 온 ν•œ 라인 λ˜λŠ” μ—¬λŸ¬ 라인의 λ©”μ‹œμ§€μž…λ‹ˆλ‹€.

    status

    λ©”μ‹œμ§€λ₯Ό μ„±κ³΅μ μœΌλ‘œ 읽어 온 κ²½μš°μ—λŠ” 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.λ©”μ‹œμ§€λ₯Ό μ„±κ³΅μ μœΌλ‘œ 읽어 μ˜€μ§€ λͺ»ν•œ κ²½μš°μ—λŠ” 1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    numlines

    읽어 올 λ©”μ‹œμ§€ 라인의 수λ₯Ό μž…λ ₯ν•˜κ³ , μ‹€μ œλ‘œ 읽어 온 λ©”μ‹œμ§€ 라인의 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

    data

    λ©”μ‹œμ§€ 버퍼에 μ €μž₯ν•  λ©”μ‹œμ§€ λ°μ΄ν„°μž…λ‹ˆλ‹€.

    κΆŒν•œ

    ꡬ성

    DISABLE

    ν”„λ‘œν† νƒ€μž…

    예제

    ENABLE

    ν”„λ‘œν† νƒ€μž…

    νŒŒλΌλ―Έν„°

    예제

    GET_LINE, GET_LINES

    ν”„λ‘œν† νƒ€μž…

    νŒŒλΌλ―Έν„°

    예제

    NEW_LINE

    ν”„λ‘œν† νƒ€μž…

    예제

    PUT, PUT_LINE

    ν”„λ‘œν† νƒ€μž…

    νŒŒλΌλ―Έν„°

    예제

    value

    text, smallint, int, bigint, double precision, numeric νƒ€μž…μž…λ‹ˆλ‹€; λ³€ν™˜ν•  λŒ€μƒ κ°’μž…λ‹ˆλ‹€.

    fmt

    numeric νƒ€μž…μž…λ‹ˆλ‹€; ν…μŠ€νŠΈ μž…λ ₯에 λŒ€ν•΄ μ μš©ν•  숫자 ν˜•μ‹μ„ μ§€μ •ν•˜λŠ” 포맷 λͺ¨λΈμž…λ‹ˆλ‹€. (예: '99999.99').

    μ§€μ›ν•˜λŠ” 포멧 λͺ¨λΈμ€ PG 곡식 λ¬Έμ„œ λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

    * 숫자 포멧 λͺ¨λΈ

    νŒŒλΌλ―Έν„°

    예제

    date

    date νƒ€μž…μž…λ‹ˆλ‹€; 기쀀이 λ˜λŠ” λ‚ μ§œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

    timestamp with timezone

    timestamptz νƒ€μž…μž…λ‹ˆλ‹€; 기쀀이 λ˜λŠ” λ‚ μ§œ+μ‹œκ°„+timezone을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

    number

    integer, double precision, numeric νƒ€μž…μž…λ‹ˆλ‹€; 더할 κ°œμ›” 수λ₯Ό λ‚˜νƒ€λ‚΄λ©°, λ‚΄λΆ€μ μœΌλ‘œ μ •μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μ‚¬μš©λ©λ‹ˆλ‹€.


    Syntax

    κ°œμš”

    예제

    ls -rlta
    
    total 60
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 utl_file
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 o2views
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 o2types
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 o2functions
    -rw-r--r--  1 root root 3266 Mar 13 05:09 install.sh        # sh μ„€μΉ˜μš© 슀크립트
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 dbms_sql
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 dbms_random
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 dbms_pipe
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 dbms_output
    drwxr-xr-x  2 root root 4096 Mar 13 05:09 dbms_alert
    -rw-r--r--  1 root root 1465 Mar 13 05:09 VERSION.json      # o2 extensions 버전 정보
    -rw-r--r--  1 root root  672 Mar 13 05:09 Makefile          # make λ°©μ‹μ„€μΉ˜μš© 파일
    drwxr-xr-x 12 root root 4096 Mar 13 05:09 .
    drwxr-xr-x  6 root root 4096 Mar 13 05:09 ..
    cd o2
    make all # o2 extensions 전체 μ„€μΉ˜
    
    # μ•„λž˜λŠ” 전체 μ„€μΉ˜ κ³Όμ •μ—μ„œ 좜λ ₯λ˜λŠ” μ˜ˆμ‹œ 둜그
    make[1]: Entering directory '/home/opensql/o2/build/o2-dist-1.0.1/o2functions'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/lib'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/share/extension'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/share/extension'
    /usr/bin/install -c -m 755  o2functions.so '/home/opensql/postgres/build/16/lib/o2functions.so'
    /usr/bin/install -c -m 644 .//o2functions.control '/home/opensql/postgres/build/16/share/extension/'
    /usr/bin/install -c -m 644 .//VERSION.json .//o2functions--1.0.sql  '/home/opensql/postgres/build/16/share/extension/'
    make[1]: Leaving directory '/home/opensql/o2/build/o2-dist-1.0.1/o2functions'
    ...
    cd o2
    # make [ extension1 extension2 ... ]
    make o2functions o2types dbms_output
    
    # μ•„λž˜λŠ” make μˆ˜ν–‰ μ‹œ λ‚˜μ˜€λŠ” μ˜ˆμ‹œ 둜그
    make -C o2functions install
    make[1]: Entering directory '/home/opensql/o2/build/o2-dist-1.0.1/o2functions'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/lib'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/share/extension'
    /usr/bin/mkdir -p '/home/opensql/postgres/build/16/share/extension'
    /usr/bin/install -c -m 755  o2functions.so '/home/opensql/postgres/build/16/lib/o2functions.so'
    /usr/bin/install -c -m 644 .//o2functions.control '/home/opensql/postgres/build/16/share/extension/'
    /usr/bin/install -c -m 644 .//VERSION.json .//o2functions--1.0.sql  '/home/opensql/postgres/build/16/share/extension/'
    make[1]: Leaving directory '/home/opensql/o2/build/o2-dist-1.0.1/o2functions'
    ...
    cd scripts
    sh ./install.sh o2
    # sh install.sh [ extension1 extension2 ... ]
    sh install.sh o2functions o2types dbms_output
    
    # μ•„λž˜λŠ” κ°œλ³„ μ„€μΉ˜ κ³Όμ •μ—μ„œ 좜λ ₯λ˜λŠ” μ˜ˆμ‹œλ‘œκ·Έ
    Installing extensions to:
      Library directory: /home/opensql/postgres/build/16/lib
      Shared extension directory: /home/opensql/postgres/build/16/share/extension
    Extensions to install: o2functions o2types dbms_output
    Installing extension: o2functions
      Copied control file: ./o2functions.control
      Copied SQL file: ./o2functions--1.0.sql
      Copied shared library: ./extensions/functions/o2functions.so
    Installing extension: o2types
      Copied control file: ./o2types.control
      Copied SQL file: ./o2types--1.0.sql
      Copied shared library: ./extensions/types/o2types.so
    Installing extension: dbms_output
      Copied control file: ./dbms_output.control
      Copied SQL file: ./dbms_output--1.0.sql
      Copied shared library: ./extensions/dbms_output/dbms_output.so
    Copied METADATA: VERSION.json
    Installation completed.
    [root@20fec5585ddd /]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/pgsql-16/bin/
    
    # ν˜„μž¬ μ ‘μ†ν•œ κ³„μ •μ˜ $PATH에 κ²½λ‘œκ°’μ΄ μ—†λ‹€λ©΄ PG 버전에 μ•Œλ§žμ€ 경둜λ₯Ό $PATH κ²½λ‘œμ— μΆ”κ°€
    [root@20fec5585ddd /]# echo "export PATH=$PATH:/usr/pgsql-16/bin/" >> ~/.bashrc
    [root@20fec5585ddd /]# source ~/.bashrc
    sudo -u {PGκ²½λ‘œκ°€ $PATH에 μ„€μ •λœ λ‹€λ₯Έ USER} bash -l -c "{make λ˜λŠ” shell μ„€μΉ˜ λͺ…λ Ή}"
    
    # μ˜ˆμ‹œ)
    # postgres μœ μ €μ˜ $PATH에 /usr/pgsql-16/bin/ κ²½λ‘œκ°€ λ“±λ‘λ˜μ–΄ 있고,
    # opensqlμ΄λΌλŠ” μœ μ €λ‘œ μ ‘μ†ν•˜μ—¬ make λ°©μ‹μœΌλ‘œ o2 μ„€μΉ˜ν•˜λ €λŠ” 경우
    [opensql@20fec5585ddd /]# sudo -u postgres bash -l -c "make all"
    # postgresql.conf의 shared_preload_libraries의 첫 번째둜 opensql_license μΆ”κ°€
    shared_preload_libraries = 'opensql_license'
    
    # λΌμ΄μ„ μŠ€ 파일 경둜 ν™˜κ²½λ³€μˆ˜ μ„€μ •
    export OPENSQL_LICENSE_PATH="/path/to/license.xml"
    CREATE EXTENSION {extension name};
    ALTER EXTENSION {extension name} UPDATE TO {new version};
    DBMS_OUTPUT.DISABLE();
    CALL DBMS_OUTPUT.DISABLE();
    DBMS_OUTPUT.ENABLE 
    (
        buffer_size IN INTEGER DEFAULT 20000
    );
    CALL DBMS_OUTPUT.ENABLE(32768);
    DBMS_OUTPUT.GET_LINE 
    (
        line   OUT TEXT, 
        status OUT INTEGER
    );
    DBMS_OUTPUT.GET_LINES 
    (
        lines    OUT    TEXT[], 
        numlines IN OUT INTEGER
    );
    DO $$
    DECLARE
        buff	TEXT;
        stts	INTEGER;
    BEGIN
        CALL DBMS_OUTPUT.PUT_LINE ('ORAFCE TEST 1');
        CALL DBMS_OUTPUT.GET_LINE(buff, stts);
    END;
    $$;
    DO $$
    DECLARE
        buff_arr    TEXT[];
        stts	    INTEGER := 10;
    BEGIN
        CALL DBMS_OUTPUT.PUT_LINE ('ORAFCE TEST 1');
        CALL DBMS_OUTPUT.PUT_LINE ('ORAFCE TEST 2');
        CALL DBMS_OUTPUT.PUT_LINE ('ORAFCE TEST 3');
        CALL DBMS_OUTPUT.GET_LINES(buff_arr, stts);
        END;
    $$;
    DBMS_OUTPUT.NEW_LINE();
    CALL DBMS_OUTPUT.NEW_LINE();
    DBMS_OUTPUT.PUT
    (
        data IN NUMERIC
    );
    DBMS_OUTPUT.PUT
    (
       data IN TEXT
    );
    DBMS_OUTPUT.PUT_LINE
    (
       data IN NUMERIC
    );
    DBMS_OUTPUT.PUT_LINE
    (
       data IN TEXT
    );
    CALL DBMS_OUTPUT.PUT('PUT_EXAMPLE');
    CALL DBMS_OUTPUT.PUT_LINE('TIBERO');
    -- ν…μŠ€νŠΈλ₯Ό numeric둜 λ³€ν™˜ (κΈ°λ³Έ λ³€ν™˜)
    SELECT TO_NUMBER('12345.67');
    
     to_number 
    -----------
      12345.67
    (1 row)
    
    -- numeric κ°’κ³Ό numeric κ°’ 포맷 λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ numeric λ³€ν™˜
    SELECT TO_NUMBER(12345.12467, 99999.9);
    
     to_number 
    -----------
       12345.1
    (1 row)
    
    -- μ •μˆ˜ν˜• 값을 numeric둜 λ³€ν™˜
    SELECT TO_NUMBER(12345::int);
    
     to_number 
    -----------
         12345
    (1 row)
    
    
    -- double precision 값을 numeric둜 λ³€ν™˜
    SELECT TO_NUMBER(12345.67::double precision);
    
     to_number 
    -----------
      12345.67
    (1 row)
    ADD_MONTHS
    (
      date    IN,
      number  IN 
    )
    RETURNS date;
    
    ADD_MONTHS
    (
      TIMESTAMP WITH TIME ZONE  IN,
      number                    IN
    )
    RETURNS TIMESTAMP WITH TIME ZONE;
    
    ADD_MONTHS
    (
      TIMESTAMP WITHOUT TIME ZONE  IN,
      number                    IN
    )
    RETURNS TIMESTAMP WITHOUT TIME ZONE;
    # ν…ŒμŠ€νŠΈ 1
    select add_months('2023-01-31'::date, 3);
    
     add_months 
    ------------
     2023-04-30
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 2
    select add_months('2023-01-31'::date, 3.9999);
    
     add_months 
    ------------
     2023-04-30
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 3
    SELECT ADD_MONTHS('2023-01-31 15:30:00+09'::timestamptz, 1);
    
         add_months      
    ---------------------
     2023-02-28 15:30:00
    (1 row)
    
    # ν…ŒμŠ€νŠΈ 4
    SELECT ADD_MONTHS('2023-01-31 15:30:00+09'::timestamptz, 1.3);
    
         add_months      
    ---------------------
     2023-02-28 15:30:00
    (1 row)

    DBMS_RLS

    κ°œμš”

    DBMS_RLS νŒ¨ν‚€μ§€λŠ” 가상 개인 λ°μ΄ν„°λ² μ΄μŠ€ κΈ°λŠ₯을 κ΅¬μ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” ν”„λ‘œμ‹œμ €λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

    가상 개인 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” ν…Œμ΄λΈ”μ— λŒ€ν•΄ λ™μ μœΌλ‘œ 쑰건문을 μƒμ„±ν•˜μ—¬ ν•΄λ‹Ή μŠ€ν‚€λ§ˆ κ°μ²΄μ—μ„œ λ°˜ν™˜ν•˜λŠ” λ‘œμš°μ— λŒ€ν•œ 접근을 μ„ νƒμ μœΌλ‘œ μ œν•œν•©λ‹ˆλ‹€.

    μ°Έκ³ 

    PostgreSQL Version 16 이상뢀터 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

    ν•¨μˆ˜ / ν”„λ‘œμ‹œμ €
    λ°˜ν™˜ νƒ€μž…
    μ„€λͺ…

    ADD_POLICY

    n/a


    DBMS_RLSλŠ” λ‹€λ₯Έ o2 extension처럼 μ„€μΉ˜ ν›„, ν™œμ„±ν™” ν•˜κΈ° 전에 μΆ”κ°€μ μœΌλ‘œ postgresql.conf νŒŒμΌμ„ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    λ˜ν•œ, ν•΄λ‹Ή μž‘μ—… ν›„μ—λŠ” λ°˜λ“œμ‹œ postgresql μ„œλ²„λ₯Ό μž¬κΈ°λ™ν•˜μ—¬ μˆ˜μ •ν•œ 값을 μ μš©μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.

    postgresql.conf 파일 λ‚΄μš© 쀑 shared_preload_libraries ν•­λͺ©μ˜ κ°’μœΌλ‘œμ¨ dbms_rls λ₯Ό μΆ”κ°€ν•˜μ—¬, postgresql κΈ°λ™λ λ•Œ DBMS_RLS κ΅¬μ„±νŒŒμΌμ΄ 같이 λ‘œλ“œλ  수 μžˆλ„λ‘ μ„€μ •ν•΄μ€λ‹ˆλ‹€.

    μ•„λž˜μ™€ 같이 postgresql.conf νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

    shared_preload_librariesλŠ” μ‚¬μš©μž ν™˜κ²½μ— 따라 λ‹€λ₯Έ extension듀이 이미 μΆ”κ°€λ˜μ–΄ μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

    κ·ΈλŸ¬ν•œ κ²½μš°μ—λŠ” , λ₯Ό ν™œμš©ν•˜μ—¬ dbms_rlsλ₯Ό λ§λΆ™μ—¬μ€λ‹ˆλ‹€.


    λ³Έ μ ˆμ—μ„œλŠ” DBMS_RLS νŒ¨ν‚€μ§€μ—μ„œ μ œκ³΅ν•˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μ•ŒνŒŒλ²³ 순으둜 μ„€λͺ…ν•©λ‹ˆλ‹€.

    ν•΄λ‹Ή ν…Œμ΄λΈ”μ— λŒ€ν•΄ 가상 개인 λ°μ΄ν„°λ² μ΄μŠ€ λ³΄μ•ˆ 정책을 μΆ”κ°€ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    ν•΄λ‹Ή ν…Œμ΄λΈ”μ— λŒ€ν•΄ κ±Έλ € μžˆλŠ” 가상 개인 λ°μ΄ν„°λ² μ΄μŠ€ λ³΄μ•ˆ 정책을 μ œκ±°λ©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    ν•΄λ‹Ή ν…Œμ΄λΈ”μ— λŒ€ν•΄ κ±Έλ € μžˆλŠ” 가상 개인 λ°μ΄ν„°λ² μ΄μŠ€ λ³΄μ•ˆ 정책을 ν™œμ„±ν™” ν˜Ήμ€ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

    νŒŒλΌλ―Έν„°
    μ„€λͺ…

    DBMS_PIPE

    DBMS_PIPE은 λ™μΌν•œ μΈμŠ€ν„΄μŠ€ 내에 속해 μžˆλŠ” μ„Έμ…˜λ“€ 간에 톡신할 수 μžˆλŠ” κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€.

    ν•¨μˆ˜ / ν”„λ‘œμ‹œμ €
    λ°˜ν™˜ νƒ€μž…
    μ„€λͺ…

    DBMS_ALERT

    DBMS_ALERT은 μ•Œλ¦Όμ„ λ“±λ‘ν•˜κ³ , 보내고, 받을 수 μžˆλŠ” κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€.

    ν•¨μˆ˜ / ν”„λ‘œμ‹œμ €
    λ°˜ν™˜ νƒ€μž…
    μ„€λͺ