νμλ μ€νλ§λΆνΈλ₯Ό μ΄μ©νμ¬ νμΊλ¦°λλ₯Ό μ μ©νκ³ μμμ΅λλ€. κ·Έλ¬λ μ€, μ€λΌν΄ λ°μ΄ν°λ² μ΄μ€ λ΄ 'Schedule'ν μ΄λΈμ μ μ₯λ μΌμ λͺ©λ‘ λ°μ΄ν°λ₯Ό μ‘°νν΄μ κ°μ Έμ€λ μ€μ 500 μλ¬κ° λ°μνμμ΅λλ€. μλ¬ λ©μμ§λ 'ORA-17059' μλ¬μμ΅λλ€. μ ννκ²λ 'ORA-17059: λ΄λΆ νμμΌλ‘μ λ³νμ μ€ν¨νμ΅λλ€.' λΌλ λ©μμ§μμ΅λλ€. λ°μ΄ν°λ₯Ό λ°μμ€λ κ³Όμ μμ μλ¬κ° λ°μνκΈ° λλ¬Έμ, κ°μ₯ νμ€νκ² μμ¬ κ°λ λΆλΆμ 'ν μ΄λΈ λ΄ μ‘°νλ λ°μ΄ν°λ₯Ό λ°μΈλ©νλλ° μλ¬κ° λ°μνꡬλ.'μκ³ , μμλ μΏΌλ¦¬κ° μμ±λ mapper.xmlμ 'resultType' μμ±μ λͺ μλ ν΄λμ€ νμ μΌλ‘ μ‘°νλ λ°μ΄ν°λ₯Ό λ°μΈλ©νλ κ³Όμ μμ λ°μν μλ¬μμ΅λλ€. ꡬ체μ μΌλ‘ μ€λͺ νμλ©΄ μ‘°νλ λ°μ΄ν°λ ν μ΄λΈμ μ»¬λΌ νμ μ΄ 'VARCHAR'μΈλ° VOμ ν΄λμ€ νλ νμ μ΄ intλ‘ κ΅¬μ±λμ΄ μμ΄μ λ°μ΄ν°κ° λ°μΈλ©λλ κ³Όμ μμ λ°μνμ΅λλ€.
μλ¬κ° λ°μν νμμ μν©
μμμ μν© μ€λͺ νλ―μ΄ μ‘°νλ₯Ό ν΄μ κ°μ Έμ€λ €κ³ μμ±νλ 쿼리λ μλμ κ°μ΅λλ€. μΌλ°μ μΈ ν μ΄λΈμ μ΄μ©ν΄ μ‘°ννκ³ μ νλ 컬λΌμ SELECT ꡬ문μ μμ± ν μ‘°ννμμ΅λλ€.
μ‘°ννλ €λ ν μ΄λΈμ κ° μ»¬λΌλ³ μ 보λ μλ μ΄λ―Έμ§μ κ°μ΅λλ€. 'SCH_NO'λΆν° 'SCH_ALLDAY' 컬λΌκΉμ§ κ° μ»¬λΌλ§λ€μ νμ μ΄ ν¬κΈ°μ ν¨κ» λ€λ₯΄κ² μ€μ λμ΄ μμ΅λλ€. μ΄ μ€, 'SCH_NO'λ₯Ό μ μΈνκ³ λ λͺ¨λ 'VARCHAR2' νμ μΌλ‘ λ¬Έμμ΄μ λ΄μ μ μλ νμ μ΄ μ€μ λμ΄ μμ΅λλ€.
ν μ΄λΈμ μ 보λ 'SCH_NO'λ₯Ό μ μΈνκ³ λλ¨Έμ§ μ»¬λΌμ νμ μ΄ 'VARCHAR'μΈλ° λ°μ΄ν°λ₯Ό λ°μ VO ν΄λμ€ λ΄ idμ νλκ° λ¬Έμμ΄μ λ°κΈ° μν νμ μΈ Stringμ΄ μλλΌ intλ‘ μ€μ λμ΄ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ λ°μ΄ν°λ₯Ό λ°κΈ° μν νμ μ΄ μΌμΉνμ§ μμμ 'ORA-17059' μλ¬κ° λ°μνμμ΅λλ€.
μ΄λ λ―, 'ORA-17059'μ κ΄λ ¨λ μλ¬λ νμκ° μ§νμ€μ λ°μνλ μλ¬ μ΄μΈμ νμμμλ λ°μν μ μμ΅λλ€. ν΄λΉ μλ¬κ° λ°μνλ μ¬λ¬ μμΈκ³Ό ν΄κ²°λ°©λ²μ λν΄μ μμλ³΄κ² μ΅λλ€.
'ORA-17059' μ£Όμ λ°μ μν© λ° ν΄κ²° λ°©λ²
1. λ°μ΄ν° νμ λΆμΌμΉ
λ°μ μν©
κ°μ₯ νν μμΈ μ€ νλλ‘ λ°μ΄ν°λ² μ΄μ€ 컬λΌμ λ°μ΄ν° νμ κ³Ό μ ν리μΌμ΄μ μμ ν΄λΉ λ°μ΄ν°λ₯Ό λ°μΌλ €κ³ νλ Java νμ μ΄ νΈνλμ§ μλ κ²½μ° λ°μν©λλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€μ NUMBER νμ μ»¬λΌ κ°μ μ ν리μΌμ΄μ μμ StringμΌλ‘ λ°μΌλ €κ³ νκ±°λ, DATE νμ μ»¬λΌ κ°μ INTEGERλ‘ λ°μΌλ €κ³ ν λ λ°μν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
- λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ νμΈ
λ¨Όμ ν΄λΉ 컬λΌμ νμ μ μ νν νμΈν΄μΌ ν©λλ€. SQL Developerλ DBeaver κ°μ ν΄μ μ¬μ©νκ±°λ, 'DESCRIBE ν μ΄λΈλͺ ;'κ³Ό κ°μ SQL ꡬ문μ μ€νν΄μ μ»¬λΌ μ 보λ₯Ό νμΈν©λλ€. - Java μ½λ μμ
λ°μ΄ν°λ² μ΄μ€ μ»¬λΌ νμ μ λ§μΆ° Java λ³μμ νμ μ λ³κ²½ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, NUMBER νμ μ int, long, BigDecimal λ±μΌλ‘, VARCHAR2 νμ μ StringμΌλ‘, DATE λλ TIMESTAMP νμ μ Date, TimeStamp λ±μΌλ‘ λ§€νν΄μΌ ν©λλ€. - ResultSetμ getXXX() λ©μλ νμΈ
ResultSetμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ λ μ¬μ©νλ getInt(), getString(), getDate() λ±μ λ©μλκ° μ»¬λΌ νμ κ³Ό μΌμΉνλμ§ νμΈν©λλ€. μλ₯Ό λ€μ΄, NUMBER νμ 컬λΌμ κ°μ κ°μ Έμ¬ λλ getInt()λ getLong()μ μ¬μ©ν΄μΌ ν©λλ€. - λͺ
μμ μΈ νμ
λ³ν
νμν κ²½μ°, Java μ½λ λ΄μμ λͺ μμ μΈ νμ λ³νμ μνν μ μμ΅λλ€. μλ₯Ό λ€μ΄, BigDecimal κ°μ StringμΌλ‘ λ°νν΄μΌ νλ€λ©΄ bigDecimalValue.toString() λ©μλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
2. λ°μ΄ν° νμ λΆμΌμΉ
λ°μ μν©
λ°μ΄ν°λ² μ΄μ€ 컬λΌμ λ°μ΄ν° νμ μ λ§μ§λ§, μ μ₯λ λ°μ΄ν°μ νμμ΄ μ ν리μΌμ΄μ μμ κΈ°λνλ νμκ³Ό λ€λ₯Ό λ λ°μν μ μμ΅λλ€. νΉν λ μ§(DATE, TIMESTAMP) νμ μ κ²½μ°, λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ νμκ³Ό JDBC λλΌμ΄λ²μ κΈ°λ³Έ νμ λλ μ ν리μΌμ΄μ μμ μ§μ ν νμμ΄ λ€λ₯΄λ©΄ λ³νμ μ€ν¨ν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
- λ μ§ νμ νμΈ
λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ λ μ§ νμμ νμΈν©λλ€. TO_CHAR ν¨μλ₯Ό μ¬μ©νμ¬ νΉμ νμμΌλ‘ μ‘°νν΄ λ³΄λ©΄ μ μ μμ΅λλ€. (SELECT TO_CHAR(date_column, 'YYYY-MM-DD HH24:MI:SS') FROM TABLENAME; SQL ꡬ문μΌλ‘ μ‘°ν) - JDBC URL νλΌλ―Έν° μ€μ
JDBC μ°κ²° URLμ λ μ§ νμ κ΄λ ¨ νλΌλ―Έν°λ₯Ό μΆκ°νμ¬ JDBC λλΌμ΄λ²κ° νΉμ νμμΌλ‘ λ μ§ λ°μ΄ν°λ₯Ό μ²λ¦¬νλλ‘ μ§μ ν μ μμ΅λλ€.
(jdbc:oracle:thin:@localhost:1521:XE?oracle.jdbc.formatMapping=true&oracle.jdbc.timestampTZinGmt=false μ κ°μ νλΌλ―Έν°λ₯Ό μ€μ ν΄ λ³Ό μ μμ΅λλ€.) - SimpleDateFormat μ¬μ©
Java μ½λμμ SimpleDateFormat ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μμ κ°μ Έμ¨ λ μ§ λ°μ΄ν°λ₯Ό μνλ νμμΌλ‘ νμ±νκ±°λ, μ ν리μΌμ΄μ μ λ μ§ λ°μ΄ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν νμμΌλ‘ ν¬λ§·ν ν μ μμ΅λλ€.
3. NLS μ€μ λ¬Έμ
λ°μ μν©
μ€λΌν΄ λ°μ΄ν°λ² μ΄μ€μ NLS(National Language Support) μ€μ μ΄ μ ν리μΌμ΄μ μ λ‘μΌμΌ μ€μ κ³Ό μΆ©λνλ κ²½μ°μλ λ°μ΄ν° λ³ν μ€λ₯κ° λ°μν μ μμ΅λλ€. νΉν μ«μλ λ μ νμμ μν₯μ λ―ΈμΉ μ μμ΅λλ€. λ§μΉ νκ΅μ λ μ νκΈ° λ°©μκ³Ό λ―Έκ΅μ λ μ§ νκΈ° λ°©μμ νΌμ©ν΄μ μ¬μ©νλ κ²κ³Ό κ°μ νΌλμ΄ λ°μν μ μμ΅λλ€.
** NLSλ?
'National Language Support'μ μ½μλ‘, μ€λΌν΄ λ°μ΄ν°λ² μ΄μ€μμ λ€κ΅μ΄ νκ²½μ μ§μνλ κΈ°λ₯μ μλ―Έν©λλ€. NLS νλΌλ―Έν°λ λ°μ΄ν°λ² μ΄μ€, μΈμ€ν΄μ€, μΈμ
λ 벨μμ μ€μ νμ¬ μΈμ΄, μ§μ, λ¬Έμ μ§ν©κ³Ό κ΄λ ¨λ λμ λ°©μμ μ μ΄ν©λλ€.
ν΄κ²° λ°©λ²
- λ°μ΄ν°λ² μ΄μ€ NLS μ€μ νμΈ
λ°μ΄ν°λ² μ΄μ€μ NLS μ€μ μ νμΈν©λλ€. 'SELECT * FROM NLS_DATABASE_PARAMETERS;' SQL ꡬ문μ μ€ννμ¬ νμΈν μ μμ΅λλ€. νΉν NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_NUMERIC_CHARACTERS λ±μ νλΌλ―Έν°λ₯Ό νμΈν©λλ€. - μΈμ
NLS μ€μ λ³κ²½
νμν κ²½μ°, νΉμ μΈμ μ λν΄μλ§ NLS μ€μ μ λ³κ²½ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ 'ALTER' SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS;'μ κ°μ΄ SQL ꡬ문μ μ€νν μ μμ΅λλ€. - JDBC URL νλΌλ―Έν° μ€μ
JDBC μ°κ²° URLμ NLS κ΄λ ¨ νλΌλ―Έν°λ₯Ό μΆκ°νμ¬ JDBC λλΌμ΄λ²μ λμ λ°©μμ μ μ΄ ν μ μμ΅λλ€.
4. BLOB / CLOB λ°μ΄ν° μ²λ¦¬ μ€λ₯
λ°μ μν©
BLOB (Binary Large Object) λλ CLOB (Character Large Object) νμ μ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ³Όμ μμ μΈμ½λ© μΏ€μ λ λ°μ΄ν° κΈΈμ΄ λ¬Έμ λ±μΌλ‘ λ³νμ μ€ν¨ν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
- μΈμ½λ© νμΈ
CLOB λ°μ΄ν°λ₯Ό μ²λ¦¬ν λλ λ°μ΄ν°λ² μ΄μ€μ μ ν리μΌμ΄μ μ λ¬Έμ μΈμ½λ©μ΄ μΌμΉνλμ§ νμΈν΄μΌ ν©λλ€. μΌλ°μ μΌλ‘ UTF-8 μΈμ½λ©μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. - μ€νΈλ¦¬λ° λ°©μ μ²λ¦¬
BLOB λλ λ§€μ° ν° CLOB λ°μ΄ν°λ ν λ²μ λ©λͺ¨λ¦¬μ λ‘λνμ§ μκ³ μ€νΈλ¦¬λ° λ°©μμΌλ‘ μ²λ¦¬νλ κ²μ΄ μ’μ΅λλ€. JDBCμμ μ 곡νλ BLOB λ° CLOB μΈν°νμ΄μ€μ λ©μλλ₯Ό νμ©ν©λλ€. - λ°μ΄ν° κΈΈμ΄ νμΈ
μ½μ νκ±°λ μ‘°ννλ €λ λ°μ΄ν°μ κΈΈμ΄κ° 컬λΌμ μ΅λ κΈΈμ΄λ₯Ό μ΄κ³Όνμ§ μλμ§ νμΈν©λλ€.
5. JDBC λλΌμ΄λ² λ²μ λ¬Έμ
λ°μ μν©
μ¬μ©νκ³ μλ JDBC λλΌμ΄λ² λ²μ μ΄ μ€λΌν΄ λ°μ΄ν°λ² μ΄μ€ μλ² λ²μ κ³Ό νΈνλμ§ μκ±°λ, νΉμ λ²μ μμ μλ €μ§ λ²κ·Έλ‘ μΈν΄ λ°μ΄ν° λ³ν μ€λ₯κ° λ°μν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
- JDBC λλΌμ΄λ² λ²μ νμΈ
μ¬μ©νκ³ μλ JDBC λλΌμ΄λ²μ λ²μ μ νμΈν©λλ€. Maven λλ Gradleκ³Ό κ°μ λΉλ λꡬλ₯Ό μ¬μ©νλ κ²½μ°, ν΄λΉ μμ‘΄μ± μ 보λ₯Ό νμΈν©λλ€. - λλΌμ΄λ² λ²μ μ
κ·Έλ μ΄λ λλ λ€μ΄κ·Έλ μ΄λ
μ€λΌν΄ λ°μ΄ν°λ² μ΄μ€ μλ² λ²μ μ λ§λ μ΅μ JDBC λλΌμ΄λ²λ‘ μ κ·Έλ μ΄λνκ±°λ, μμ μ μΈ μ΄μ λ²μ μΌλ‘ λ€μ΄κ·Έλ μ΄λλ₯Ό ν΄λ΄ λλ€. μ€λΌν΄ 곡μ λ¬Έμλ₯Ό μ°Έκ³ νμ¬ νΈνλλ λλΌμ΄λ² λ²μ μ νμΈνλ κ²μ΄ μ€μν©λλ€.
ORA-17059 μλ¬λ λ€μν μμΈμΌλ‘ λ°μν μ μμ§λ§, λλΆλΆ λ°μ΄ν° νμ μ΄λ νμ λΆμΌμΉμ κ΄λ ¨λ λ¬Έμ μ λλ€. μμ μ μλ ν΄κ²° λ°©λ²λ€μ μ°¨κ·Όμ°¨κ·Ό νμΈν΄ 보면 λ¬Έμ ν΄κ²°μ λμμ΄ λ κ²μ λλ€.
@Junesker