기본 콘텐츠로 건너뛰기

181220 ORA-01481

ORA-01481: 숫자 형식 모델이 부적합합니다 1. 원인: CHAR 형식이 있어야 할 곳에 NUMBER 형식이 있어서 2. 해결: TO_CHAR함수를 이용하여 CHAR 형식으로 변경 3. TO_CHAR 1) 문제 인식 SELECT  TO_CHAR( '19851013' ,  'yyyy-MM-dd' )  FROM  DUAL; cs  - 오류 발생함  - ORA-01481: 숫자형식의 모델이 부적합합니다  - ''(COMMA)로 묶기는 했지만 NUMBER 타입으로 인식  - 'YYYY-MM-DD'는 DATE 타입에서 사용하는 것이므로 오류발생  - '19851013'은 사람이 봤을 때는 날짜지만 컴퓨터(ORACLE)는 모름  - DATE 타입으로 conversion을 하면 해결 가능 2) 해결 SELECT  TO_CHAR(TO_DATE( '19851013' ,  'yyyymmddhh24ml' ),  'yyyy-MM-dd' )  FROM  DUAL; cs  -  DATE 타입으로 일단 변환한 후에  - 다시 CHAR 타입으로 변환

181218 java.lang.ClassCastException

java.lang.ClassCastException 1. java.math.BigDecimal cannot be cast to java.lang.String 1) 원인  - NUMBER 타입의 데이터를 String으로 형변환할 때 발생하는 오류 2) 해결  - String.valueOf(Object)를 이용하여 해결 예시)  - slipLineNo 값이 NUMBER 타입 sendData.clear(); sendData.put( "cmpnCd"     , param.get(i).get( "cmpnCd" )); sendData.put( "projCd"     , param.get(i).get( "projCd" )); sendData.put( "slipNo"     , param.get(i).get( "slipNo" )); sendData.put( "slipLineNo" ,  String . valueOf (param.get(i).get( "slipLineNo" ))); sendData.put( "sendDvsnCd" , param.get(i).get( "sendDvsnCd" )); sendData.put( "emlSedr"    , param.get(i).get( "emlSedr" )); sendData.put( "emlSendDt"  , param.get(i).get( "emlSendDt" )); sendData.put( "emlRvcr"    , param.get(i).get( "emlRvcr" )); sendData.put( "regDtm"     , param.get(i)....

181218 SimpleDateFormat

SimpleDateFormat 0. Date Class  - 자바에는 2개의 Date 클래스가 존재  - java.sql.Date: 오라클의 날짜 타입과 연동 가능  - java.util.Date: 오라클의 날짜 타입과 연동 불가능 ※ 참고  - java.sql.Date의 valueOf(String string)는 입력받은 문자열 값을 가지고    날짜 값으로 변경해줌  - 이때, 날짜 형식은 yyyy-mm-dd  - valueOf("20181218") 이렇게 입력하면 exception 발생 1. 개요  - Date 타입의 객체에서 특정 형식의 문자열을 가져오기 위해 사용 2. parse()  - 문자열 형식의 날짜를 가져와서  - Date 객체를 생성할 수 있음 예) public   void  sendDocMail(List < Map < String ,  String > >  param)  throws  Exception {      // TODO Auto-generated method stub        this .logger.info( "공문 이메일서비스: " + param);           //클래스 변수 세팅      String  banSlipNoDate  =   null ;      int  cYear;      int ...

181211 nexacro:: 키 입력했을 때 중복 여부 확인(findRow(), getEditValue(), getCellPos())

nexacro:: findRow(), getEditValue(), getCellPos() 0. 상황 1) 중복 체크 2) 키가 입력되었을 때 바로 확인   ※ ajax와 같이 비동기식으로 확인 1. 사용할 메서드 및 함수 1) onkeyup: key입력했을 때 event 발생 2) obj.getCellPos(): 선택된 cell의 index값을 반환 3) Dataset.findRow( strColID, strVal [ ,nStartIdx [ ,nEndIdx ] ] )  - 특정 column값과 전달된 값과 일치하는 데이터를 갖는 첫번째 row의 index를 반환  - strColID: Dataset에서 대상이 되는 column id  - strVal: strColID에 해당되는 column에서 검색할 값을 설정  - nStartIdx: Dataset에서 검색을 시작할 row의 index를 설정  - nEndIdx: Dataset에서 검색을 종료할 row의 index에서 1을 더한 값 설정                   음수값이나 -1 설정시 마지막 row까지 검색  - 일치하는 데이터가 없는 경우 -1을 반환 4) Grid.getEditValue()  - cell이 편집모드일 때 표시되는 컨트롤의 value 속성값을 반환  - grid의 edittype값이 button, checkbox, tree 면 undefined 반환  - grid의 edittype값이 combo, date 면 undefined 반환 예) this.grdList_onkeyup  =   function (obj:nexacro.Grid,e:nexacro.KeyEventInfo) {    ...

181207 ORACLE:: table lock

ORACLE:: table lock 1. 증상 1) 정상적으로 서버단 개발 (controller, service, dao, sql) 2) 정상적으로 화면단 개발 (nexacro) 3) 기능 작동시 deadlock or memory leak 문제 뱉어냄 2. 원인 1) 쿼리 작업 중 update문 실행 후 commit을 하지 않은 경우 2) table에 lock이 걸린 경우 3. 해결 1) table에 lock이 걸려 있는지 확인  - lock 걸린 테이블 확인하는 SQL문 SELECT  DO.OBJECT_NAME      , DO.OWNER      , DO.OBJECT_TYPE      , DO.OWNER, VO.XIDUSN      , VO.SESSION_ID      , VO.LOCKED_MODE   FROM  V$LOCKED_OBJECT VO     , DBA_OBJECTS DO   WHERE  VO.OBJECT_ID  =  DO.OBJECT_ID cs - 해당 테이블이 lock에 걸렸는지 확인하는 SQL문 SELECT  A.SID      , A.SERIAL#      , B.TYPE      , C.OBJECT_NAME   FROM  V$SESSION...

181203 DB SYNONYM

DB SYNONYM 0. 개요 데이터베이스 객체에 대한 소유권은 해당 객체를 생성한 사용자가 갖는다  = 다른 사용자가 그 객체에 접근하려면 접근권한을 부여받아야 한다  = 다른 사용자가 해당 객체를 조회하려면 소유자의 ID를 지정해야함  ↔ 객체를 조회할 때마다 ID를 지정하는 것은 귀찮은 일 ∴ 하나의 객체에 다른 이름을 지정할 때 사용    SYNONYM은 데이터베이스 전체에서 사용할 수 있는 객체 1. 정의 오라클 객체인 테이블, 뷰, 시퀀스, 프로시저에 대한 별칭 객체에 대한 직접적인 참조를 의미함 2. 사용하는 이유 DB 투명성 제공 다른 사용자의 객체를 참조하기 위해 코딩의 단순화 3. 종류 1) private synonym: 특정 사용자만 사용 가능 2) public synonym: 공용 사용자 그룹, 모든 사용자가 사용 가능 4. 사용법 0) scott계정 사용자에게 synonym 권한 부여  - 처음부터 scott 계정이 권한을 갖고 있지 않음  - system 계정이 권한을 부여해줘야 scott 계정도 synonym 사용가능  - 권한 부여: grant create synonym to scott  ※ other 계정은 생성때부터 synonym권한이 있음 (  1) 참조  )   1) scott계정으로 접속해서 other계정에게 MA_MI_DEPT테이블의 조작 권한을 부여  - grant all on MA_MI_DEPT to other   : scott 계정의 MA_MI_DEPT 테이블의 모든 권한을 other 계정에게 부여 2) other 계정으로 접속해서 synonym 생성  - create synonym MA_MI_DEPT for SCOTT.MA_MI_DEPT   : other계정이 scott계정의 MA_MI_DE...

181129 Statement, PreparedStatement

Statement, PreparedStatement 0. 개요  - SQL 질의문을 전달하는 인터페이스  - 예외처리(try ~ catch문) 필수 1. connection connection API - statement 1) Statement 객체는 Statement 인터페이스를 구현한 객체를    Connection 클래스의 createStatement( ) 메서드로 호출하여 얻을 수 있음 2) Statement 객체가 생성되면 executeQuery( ) 메서드로 SQL문을 실행 3) 메서드의 인수로 SQL문을 담은 String객체를 DB에 전달 4) Statement는 값이 미리 입력되어 있는 정적인 쿼리문을 처리할 수 있음 connection API - preparedStatement 1) PreparedStatement 객체는 Connection 객체의     preparedStatement( ) 메서드를 사용해서 생성 2) preparedStatement( )  메서드는 인수로 SQL문을 담은 String객체가 필요함 3) SQL문장이 미리 컴파일되고 실행하는 동안 인수값을 위한 공간을 확보할 수 있음 4) 실행될 때 매번 서버에서 분석해야 하는Statement와 달리     PreparedStatement 객체는 한 번 분석되면 재사용이 용이 5) 각각의 인수는 위치홀더(placeholder)인 ?를 이용하여 SQL문장을 정의할 수 있음 6) 동일한 SQL문을 특정 값만 바꾸어서 여러 번 실행해야 할 때 6-1) 인수가 많아서 SQL문을 정리해야 될 필요가 있을 때 사용하면 유용 예) public   class  DBConnection  {      public   static  Connection...

181127 nexacro:: getColumn, setColumn

nexacro:: getColumn, setColumn 1.setColumn 2.getColumn 1.setColumn: 특정 row의 column값을 변경하는 메서드 1) syntax   Dataset.setColumn(nRow, nColIdx, varVal);  → 숫자로 된 row값, 숫자로 된 컬럼 인덱스, 변경하고자 하는 값   Dataset.setColumn(nRow, strColID, varVal);  → 숫자로된 row값, 문자로된 컬럼 아이디, 변경하고자 하는 값 ※ n~: 숫자    str~: 문자 ※ nRow에서 첫번째 row 인덱스값은 0, 찾고자하는 row값에 따라 변화 가능 사용 예)     this.dsSearch.setColumn( 0 ,  "rqstDtFr" , rqstDtFr);      this.dsSearch.setColumn( 0 ,  "rqstDtTo" , rqstDtTo);      this.dsSearch.setColumn( 0 ,  "sendDt" , this.divSearch.form.calSendDt.value);     this.dsSearch.setColumn( 0 ,  "cmpnCd"  , gvTmCmpnCd);      this.dsSearch.setColumn( 0 ,  "incmCd"  , this.divSearch.form.edtIncmCd.value );       this.dsSearch.setColumn( 0 ,...

181119 CROSS JOIN

CROSS JOIN  - "모든 경우를 고려한다"를 의미  - 테이블 상호간에 연결될 수 있는 모든 경우의 수를 산출하여 나타내는 조인  - Cartesian Product값을 얻을 때 사용 예) SELECT           T1.AMT_ODR         , T2.AMT_ODR         , (DSTB_AMT_SUM  /  NMPR_CNT) AS ID_RATE        FROM          (            SELECT   1  AS AMT_ODR, DSTB_AMT_SUM               FROM  MA_RT_PCST              WHERE  FACC_YYMM     =   '201809'                AND MNGM_ACNT_CD  =   'T60000000'...

181119 SELECT 1 FROM

SELECT 1 FROM select 문에서 1을 사용하여 테이블 개수만큼 1로된 행을 출력 테이블내 행의 개수가 N개라면 N개만큼 행이 반환됨 1은 true를 의미함 WHERE 조건문에서 해당 조건을 만족하면 1을 반환 예) SELECT   *      FROM  TABLE1 T1    WHERE   EXISTS  (       SELECT   1           FROM  TABLE2 T2         WHERE  T1.ID  =  T2.ID  ); cs 예) SELECT           T1.AMT_ODR         , T2.AMT_ODR         , (DSTB_AMT_SUM  /  NMPR_CNT) AS ID_RATE        FROM          (            SELECT   1  AS AMT_ODR, DSTB_AMT_SUM     ...

181115 Mybatis: #, $

Mybatis: #, $ 0. #, $ 비교 SELECT   * FROM  TEMP WHERE   1 = 1   AND TEMP_ID  =  #{tempId} cs 위와 같은 쿼리를 실행 1) DB에서는 SELECT   * FROM  TEMP WHERE   1 = 1   AND TEMP_ID  =  ? cs     이렇게 쿼리문에 대한 의미 파악 시작 2) 구문 분석 및 파싱 진행 = PreparedStatement  - 예를 들어, tempId에 1이라는 값이 들어가면 위의 파싱된 구문을 재활용  - 단, DB 옵티마이저의 수행계획은 동일  - 인덱스 스캔으로 인한 성능 저하 가능성 존재 -------------------------------------------------------------------------------------------------- SELECT   * FROM  TEMP WHERE   1 = 1   AND TEMP_ID  =  ${tempId} cs 위 쿼리의 경우, SELECT   * FROM  TEMP WHERE   1 = 1   AND TEMP_ID  =   1 cs 1) ${tempId}가 1인 경우 위 쿼리로 실행  - DB에서는 의미 파악, 파싱 시작= Statement  - 상수로 치환하여 수행 = 값이 변경될 때마다 파싱 진행 2) SQL injection에 취약 ※  PreparedStatement,...