[Error] Execution (1: 1): ORA-29275: 부분 다중 바이트 문자



[원인]

오라클 서버의 CHARACTERSET과 클라이언트의 CHARACTERSET이 서로 다르고 호환도 되지 않는 경우 발생하는 오류.


[해결법]


1. 서버의 characterset 확인.

select parameter, value
from nls_database_parameters
where parameter like '%CHARACTERSET%';


2. 클라이언트 characterset 확인.


실행 ( 윈도키+R ) > regedit 레지스터 편집기 실행 > LNS_LANG 검색 후 언어설정 확인.



경로는 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE ...






일반 개발자에게 서버에 CHARSET을 변경할 권한은 당연히 없을것이고 DBA라고 하더라도 너무 무모한 짓이다.  로컬 PC의 레지스트리의 NLS_LANG 값을 서버 charset과 동일하게 KOREAN_KOREA.AL32UTF8 (KOREAN_KOREA.AL16UTF17) 로 바꾸는 방법이 한 방법이다.






Tools -> Preferences -> PL/SQL Beautifier  항목에서

Rules fils에서 파일위치 지정

PLSQL_Beautifier.br



Error : executeQueryForObject returned too many results.


queryForObject 사용시


결과값이 하나 이상이 넘어갈때 발생

queryForList로 사용한다, 아니면 단일값이 나오는 결과에 맞게 재구성한다.




단건 조회면 selectByPk를 호출하시면 되는데.. 아마도 해당 query가 하나의 데이터(ResultSet)이 아닌 여러 건이 리턴된 경우입니다.

iBatis는 query xml 작성 시 단건 select와 다건 select를 구분하지 않고 API 호출 할 때에 단건이나 다건이냐를 구분합니다.

selectByPk는 queryForObject를 통해 단건으로 처리하고, list는 queryForList로 다건을 처리합니다.

결론... boardPageDAO.selectBoardPage_S id로 지정된 query의 결과가 하나 이상 나오기 때문에 query에 where 조건을 추가하는 등의 수정이 필요합니다.

참고 


http://open.egovframe.kr/cop/bbs/selectBoardArticle.do?bbsId=BBSMSTR_000000000013&nttId=14188



쿼리가 다건 리턴하므로 dao에 select메소드로 되어 있는거 list메소드로 수정함


이렇게

select("CommuteDao.selectCommuteTimeInfo", param); 

=> list("CommuteDao.selectCommuteTimeInfo", param);


  • Javascript 사용 선언하기

   - Javascript 는 HTML 문서 내 <script></script> 태그로 사용을 선언하고 태그 안에 코드를 작성합니다.

<script type="text/javascript">
/* Javascript 코드 작성 */
</script>

  - <script></script> 태그 선언 위치

  • 전통적인 방법으로는 <head></head> 안에 선언합니다.
  • 페이지의 렌더링 지연을 막기 위해 <body></body> 안에서 가장 하단에 선언 하기도 합니다.
  • <body> 안의 요소들을 조작하는 경우 <head> 선언 또는 조작하고자 하는 요소보다 먼저 선언 하는 경우 원하는 동작을 하지 않을 수도 있습니다.

  - 태그 선언 위치에 따른 동작 예시

<html>
<head>
  <script type="text/javascript">
      document.getElementById("txt1").value = "Did value change?";
  </script>
</head>
<body>
   <input type="text" id="txt1" value=""/>
</body>
</html>
<html>
<head>
</head>
<body>
   <input type="text" id="txt1" value=""/>
   <script type="text/javascript">
      document.getElementById("txt1").value = "Did value change?";
   </script>   
</body>
</html>


  • JS 파일 작성 및 로드 하기

  - JS 파일 작성하기

  • 확장자는 : .js
  • JS 파일에는 <script></script> 선언을 하지 않습니다.

  - JS 파일 로드하기

  • JS 파일을 사용하고자 하는 페이지에서 <script></script> 태그의 src 속성을 활용합니다.
  • JS 파일을 로드 한 <script></script> 태그의 내부 javascript는 무시됩니다.
/* test.js */
alert("test.js alert!");
<!-- test.html -->
<html>
<head>
   <script type="text/javascript" src="./test.js">
      alert("test.js alert!"); // 이 스크립트는 실행되지 않습니다.
   </script>   
</head>
<body>
</body>
</html>

 

  • JavaScript 키워드

  키워드는 변수 또는 함수의 이름으로 사용할 수 없습니다.

  - 알아두면 유용한 키워드

  • in : 객체에 속성이 존재하는지 확인 하는 키워드
  • instanceof : 특정 클래스의 인스턴스인지 확인하는 키워드
  • typeof : 자료형을 확인하는 키워드

  - 사용에 주의를 주어야 하는 키워드

  • with : 사용하지 않는 것을 권장


  • Javascript 변수와 자료형

  - 변수

  • var 키워드 사용하여 선언합니다.
  • 변수 선언 시 명시적인 자료형이 없습니다.
  • = 연산자로 변수에 값을 할당 합니다.

var id = 10; // number 타입의 변수 값 10 선언
alert(id); // 10 출력
id = "ten"; //string 타입의 값 ten 으로 변수 값 변경
alert(id); // ten 출력


  - 자료형

  • undefined : 변수 선언만 하고 아무런 값을 할당 하지 않은 경우

  • null : 변수에 값이 없음을 명시적으로 할당한 경우

  • boolean

  • number :NaN 객체도 Number 타입

  • string

  • object   

var variable1; // undefined
variable1 = null;
variable1 = false; // boolean
variable1 = 1; // number
variable1 = "one"; // string
variable1 = function(){}; // object


  • Javascript 연산자

  - 기본적으로 다른 언어 (C, Java 등)와 동일한 연산자를 사용하므로 따로 기능을 설명하지 않겠습니다.

  - ==, != 의 특수한 경우

null == undefined // true
"NaN" == NaN // false
10 == NaN // false
NaN == NaN // false
NaN !=NaN // true
false == 0 // true
true == 1 // true
true == "1" // true
true == 2 // false
undefined == 0 // false
null == 0 // false
"1" == 1 // true

  - ==, != 비교와 ===, !== 비교의 차이 

  • ==, != : 두값의 값만을 비교하여 true 또는 false 를 반환합니다.

  • ===, !== : 두 값과 데이터 타입을 모두 비교하여 true 또는 false 를 반환합니다.

null === undefined // false
true === 1 // false
"1" === 1 //false

  - ! 연산자를 활용한 undefined, null, empty 체크

  • if 문의 조건으로 변수를 지정할 경우 null, undefined, NaN, "", 0, false 의 경우 false 나머지 값에 대해 true를 반환합니다.

var id = "";
if( !id ) {
   alert("id is empty.")
}


select 검색할때 파라미터를 리스트로 보내서 리스트에 있는 값을 하나하나씩 매핑시켜서 결과를 받을 때 유용한 쿼리죠. 

예를 들면 어떠한 리스트에 있는 값을 통해 쿼리문을 생성한다던지 하는 경우 iBatis에서는 iterate 태그로 for문과 같은 역할을 하여 동적 쿼리를 생성 할 수 있습니다.

<select id="getData" parameterclass="java.util.List" resultclass="int">
    SELECT  count(0)
    FROM    data_tb
    <iterate prepend="WHERE id IN" open="(" close=")" conjunction=",">
            #[]#
     </iterate>
</select>

위와 같이 parameterClass를 java의 List 형태로 전달해 주면 동적쿼리를 생성할수 있습니다. 만약 list에 1,2,3,4 의 데이터가 들어가 있으면 결과적으로 다음과 같은 쿼리가 실행되는 것과 같습니다.


<select id="getData" parameterclass="java.util.List" resultclass="int">
    SELECT  count(0)
    FROM    data_tb
    WHERE  id IN (1,2,3,4)
</select>

이렇게 iterate 를 사용하여 동적 쿼리문을 생성할 수 있습니다. 또한 parameterClass가 list형태가 아닌 Map이 List를 가지고 있는 형태도 iterate의 property 속성을 통해 접근할 수 있습니다.

만약 HashMap에 paramList라는 이름으로 list형이 들어가 있다고 가정하면

예)

 HashMap<String, Object> paramMap = new HashMap<String, Object>();

 List<Integer> paramList = new ArrayList<Integer>();

 paramMap.put("paramList", paramList);


<select id="getData" parameterclass="HashMap" resultclass="result">
    SELECT  *
    FROM    data_tb
    <iterate property="paramList" prepend="WHERE id IN" open="(" close=")" conjunction=",">
            #paramList[]#
    </iterate>
</select>

위와 같이 HashMap에 들어있는 list는 iterate의 property 속성을 통해 List를 가져 옵니다. ##사이는 HashMap에 put했던 list이름을 넣어주셔야 작동합니다.





- setInterval 함수 : 일정한 시간 간격으로 작업을 수행하기 위해서 사용합니다.clearInterval 함수를 사용하여 중지할 수 있습니다. 주의할 점은 일정한 시간 간격으로 실행되는 작업이 그 시간 간격보다 오래걸릴 경우 문제가 발생할 수 있습니다.


- setTimeout 함수 : 일정한 시간 후에 작업을 한번 실행합니다. 보통 재귀적 호출을 사용하여 작업을 반복합니다. 기본적으로 setInterval 과는 달리 지정된 시간을 기다린후 작업을 수행하고, 다시 일정한 시간을 기다린후 작업을 수행하는 방식입니다. 지정된 시간 사이에 작업 시간이 추가 되는 것입니다. clearTimeout() 을 사용해서 작업을 중지합니다.


- clearInterval(), clearTimeout()이 실행중인 작업을 중지시키는 것은 아닙니다. 지정된 작업은 모두 실행되고 다음 작업 스케쥴이 중지 되는 것입니다.




setInterval() 함수 사용법.

w3schools.com 사이트의 예제사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<body>
 
<p>Click the button to wait 3 seconds, then alert "Hello".</p>
<p>After clicking away the alert box, an new alert box will appear in 3 seconds.
 This goes on forever...</p>
<button onclick="myFunction()">Try it</button>
 
<script>
function myFunction() {
    setInterval(function(){ alert("Hello"); }, 3000);
}
</script>
 
</body>
</html>
 
cs

▶ 예제설명 : "Hello!" 라는 메시지를 3초 마다 알림창을 띄우는 예제입니다.


1. Tryit 버튼을 클릭시 myFunction() 함수가 호출됩니다.

2. myFunction() 메소드가 호출되고 setInterval({함수},{설정할시간}) 호출됩니다.

3. 시간을 3000으로 설정하였기때문에 3초마다 function(){ alert("Hello"); } 가 호출됩니다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<body>
 
<p>Click the button to wait 3 seconds, then alert "Hello".</p>
 
<button onclick="myFunction()">Try it</button>
 
<script>
var myVar;
 
function myFunction() {
    myVar = setTimeout(alertFunc, 3000);
}
 
function alertFunc() {
  alert("Hello!");
}
</script>
 
</body>
</html>
 
cs
▶ 예제설명 : 마찬가지입니다. 위에 설명과 소스를 이해하셨다면 충분히 이해하실겁니다.^^


'웹개발 > javascript' 카테고리의 다른 글

[javascript] 1일차 - 자바스크립트 문법  (0) 2018.03.20
select M_NAME,M_TIME from RESEARCH where M_TIME between to_date('2003-11-12', 'YYYY-MM-DD') and to_date('2003-11-14', 'YYYY-MM-DD');

위에서 2003년 11월12일 부터 2003년 11월14일사이의 데이터만 디비에서 셀렉트해오고 싶다고 가정할때 쿼리의 결과는
12일부터 13일사이의 데이터만가지고 오는데 문제는 14일데이터를 못가져오는것입니다.
12일부터 15일사이를 검색하면 되겠지만 사용자입장에서 좋은방법 같지가 않습니다.

방법 :
select M_NAME,M_TIME from RESEARCH where M_TIME between to_date('2003-11-12', 'YYYY-MM-DD') and to_date('2003-11-14' || ' 23:59:59', 'YYYYMMDD HH24:MI:SS');

 오늘은 오라클 ROWNUM, BETWEEN AND, TO_CHAR, LAG OVER, LEAD OVER, NVL, MAX 쿼리에 대해서 알아보겠습니다.


1
2
3
4
5
6
7
8
    SELECT *
    FROM (SELECT result1.*,ROWNUM rnum 
          FROM (SELECT num,writer,title,content,regdate
                FROM board_guest
                ORDER BY num DESC
                ) result1
         )
    WHERE rnum BETWEEN #{startRowNum} AND #{endRowNum}
cs


ROWNUM  : 보통 오라클에서 페이징을 하거나 top n 을 뽑을때 사용합니다.

 

BETWEEN  : 범위를 지정하여 조건을 걸 때 사용합니다.



1
2
3
4
5
6
7
8
9
        SELECT result1.*
        FROM 
            (SELECT num,writer,title,content,
            TO_CHAR(regdate, 'YYYY.MM.DD AM HH:MI') regdate,
            LAG(num, 10) OVER(ORDER BY num DESC) prevNum,
            LEAD(num, 10) OVER(ORDER BY num DESC) nextNum
            FROM board_guest
            ORDER BY num DESC) result1
        WHERE num=#{num}
cs


TO_CHAR(숫자 혹은 날자, format)  : 숫자나 날짜를 문자로 변환해 주는 함수입니다.


LAG : 이전(위) Row 값을 가져올때 사용합니다.


LEAD : 이후(아래) Row 값을 가져올때 사용합니다.


OVER : ORDER BY, GROUP BY 서브쿼리를 개선하기 위해 나온 함수라고 할 수 있습니다.

   참고 : http://blog.naver.com/whitefre/140148769754



1
2
        SELECT NVL(MAX(ROWNUM), 0)
        FROM board_guest
cs


MAX : 최고값에 해당하는 값을 가져올때 사용합니다.


NVL : 테이블에 not null 처리가 안되어 있는 컬럼에 대해서 자주 사용합니다.

어떤 컬럼이 Null이면 특정값으로 치환해야하는 경우에 사용합니다.

+ Recent posts