2012. 10. 12. 20:41 COMPUTER
[ORACLE/PLSQLDEV] PL/SQL Developer 한 화면에서 쿼리를 선택하지 않고 실행 설정, AutoSelect Statement

PL/SQL Developer는 정말 좋은 툴이에요.

하지만 뷰티파이어에 단축키도 없고,

한 쿼리화면에서 일부만 실행시키려고하면,

실행 할 쿼리만 선택한 채로 F8을 눌러야 합니다.

 

하지만 아래처럼 설정하면,

쿼리당 세미콜론을 붙여주고 원하는 쿼리에 커서가 위치한 상태에서 (선택을 안해도됨) F8키만 누르면 쿼리하나씩만 실행이 됩니다. 

 

 

메뉴 > Tools > Preferences 선택

Preferences > SQL Window > AutoSelect statement 체크 (아마도 위에서 4번째쯤)

 

AutoSelect statement에 체크한 모습

 

2012. 9. 18. 18:01 PROGRAMMING
[ORACLE] 에러 ORA-01843: 지정한 월이 부적합합니다 , not a valid month ... SqlException

ORA-01843: 지정한 월이 부적합합니다.

ORA-01843: not a valid month ...


대부분 오타일 경우가 많습니다.

변환할수 없는 날짜나 시간으로 TO_DATE함수를 사용하면 발생합니다.


대체 '월'이 뭔뜻인지...



슬래시와 대시가 틀리고, 년월일 순서가 잘못됨

 
UPDATE TABLE_NAME SET
INPUT_DATE=TO_DATE('09/18/2012 00:00','YYYY-MM-DD HH24:MI:SS')
WHERE SEQ=1
 



수정 후

 
UPDATE TABLE_NAME SET
INPUT_DATE=TO_DATE('09/18/2012 00:00','MM/DD/YYYY HH24:MI:SS')
WHERE SEQ=1
 


2011. 6. 24. 14:33 COMPUTER
[ORACLE/SQL] 셀렉트 후 업데이트, 수정 가능한 조인 뷰, SELECT-UPDATE, Modifiable Join View

멋도모르고 SELECT-UPDATE문을 찾아서 사용하고있었는데,

엄청난 사실 - IN절에 사용한 컬럼명이 키가 아닐경우 UPDATE가 정상적으로 이뤄지지 않는다
는거였습니다. (엉뚱한 데이타가 업데이트되고 돼야할 레코드는 업데이트 안되고,,,)
물론 해당 테이블의 키가 컬럼 한개가 아니라면 갯수도 맞아야 하죠.

그래서 이걸 루프를 돌려야하나 말아야하나 하다가 알아낸게 '수정 가능한 조인 뷰' 입니다.

UPDATE의 테이블 대신에 수정할만큼의 데이타만 들고와서 SET을 하는 쿼리입니다.


기존 쿼리 (SELECT-UPDATE)

UPDATE TRNSAPLC T1
SET
T1.RESULT_CODE='2',
T1.REASON='넌 불합격이야'
WHERE T1.SEQ_NO IN (
SELECT T.SEQ_NO
FROM
TRNSAPLC T,
ADMTBASE T2,
REG TS
WHERE 1=1
AND T.SENO=T2.SENO
AND T.STU_NO=TS.STU_NO(+)
AND T.APPLY_DATE IS NOT NULL
AND T.YEAR='2010'
AND T.APLCDGE='1'
)
;


새로운 쿼리 (Modifiable Join View)

UPDATE (
SELECT T.RESULT_CODE , T.REASON
FROM
TRNSAPLC T,
ADMTBASE T2,
REG TS
WHERE 1=1
AND T.SENO=T2.SENO
AND T.STU_NO=TS.STU_NO(+)
AND T.APPLY_DATE IS NOT NULL
AND T.YEAR='2010'
AND T.APLCDGE='1'
) T1
SET
T1.RESULT_CODE='2',
T1.REASON='넌 불합격이야'
;
2011. 1. 24. 11:07 COMPUTER
[ORACLE] ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴, single-row subquery returns more than one row

ORA-01427: single-row subquery returns more than one row 또는
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

영어로된 에러메세지를 본사람은 'ㅅㅂ한줄이상 나와야된다는 메세지가 아니였어?!' 할수도,,
나도 그랬거덩!! ^.,^;;



서브쿼리의 출력은 한줄씩만 나와야만 셀렉트절에 표시될 수 있습니다.
해당서브쿼리의 WHERE절을 좀더 자세하게 수정하거나,
DISTINCT, GROUP BY로 해결 할 수 있습니다.


아래 코드는 이런 에러가 나는 상황을 연출한 예제입니다.

CREATE TABLE TEST1(
CODE  VARCHAR2(32),
CODE2 VARCHAR2(32),
NAME  VARCHAR2(32)
);

CREATE TABLE TEST2(
TITLE VARCHAR2(32),
CODE  VARCHAR2(32)
);

INSERT INTO TEST1 (CODE, CODE2, NAME) VALUES ('CD1', 'CDA', '안두리');
INSERT INTO TEST1 (CODE, CODE2, NAME) VALUES ('CD1', 'CDB', '안두봉');
INSERT INTO TEST1 (CODE, CODE2, NAME) VALUES ('CD2', 'CDA', '안둘');
INSERT INTO TEST1 (CODE, CODE2, NAME) VALUES ('CD2', 'CDB', '탄야');
COMMIT;

INSERT INTO TEST2 (TITLE, CODE) VALUES ('이것은 리스트입니다.', 'CD1');
INSERT INTO TEST2 (TITLE, CODE) VALUES ('나는 사람이다', 'CD2');
INSERT INTO TEST2 (TITLE, CODE) VALUES ('오늘은 뭘먹지', 'CD2');
COMMIT;


오류나는 쿼리
SELECT
TITLE,
(SELECT NAME FROM TEST1 WHERE CODE=TD2.CODE) CODE_NAME
FROM TEST2 TD2;

정상 쿼리
SELECT
TITLE,
(SELECT NAME FROM TEST1 WHERE CODE2='CDA' AND CODE=TD2.CODE) CODE_NAME
FROM TEST2 TD2;
2011. 1. 13. 17:31 COMPUTER
[ORACLE] 오라클 날짜변환 입출력 함수 SELECT, INSERT, TO_DATE, TO_CHAR
오라클에서 사용하는 날짜변환 함수
TO_DATETO_CHAR예제입니다.
쓸때마다 까먹어 ㅎㅎ;;


문자열을 데이트타입으로 입력
INSERT INTO 테이블 (날짜컬럼)
VALUES ( SYSDATE )

INSERT INTO 테이블 (날짜컬럼)
VALUES ( TO_DATE('2011-03-03','YYYY-MM-DD') )

INSERT INTO 테이블 (날짜컬럼)
VALUES ( TO_DATE('12-JAN-1982', 'DD-MON-YYYY') )

INSERT INTO 테이블 (날짜컬럼)
VALUES ( TO_DATE('10-04-2010 20:37:50','MM-DD-YYYY HH24:MI:SS') )


데이트타입을 문자열로 출력
SELECT TO_CHAR(날짜컬럼,'YYYY-MM-DD') FROM 테이블

SELECT TO_CHAR(날짜컬럼,'DD-MON-YYYY') FROM 테이블

SELECT TO_CHAR(날짜컬럼,'YYYY-MM-DD HH24:MI:SS') FROM 테이블
2010. 10. 28. 18:01 PROGRAMMING
[IBATIS] 아이바티스 쿼리 작성시 유의사항, com.ibatis.common.xml.NodeletException, Error parsing XML

논리연산자를 아무렇게나 사용하면 에러가 납니다.
왜냐면 XML파일이기 때문이죠.
GREATER나 LESS를 쓰면 태그로 인식하는것입니다.

<![CDATA[ STRING ]]> 으로 쿼리 전체를 감싸도 됩니다.

이것때문에 파일이 깨지면 컴파일이 안되서 길쭉한 에러를 보게됩니다.

Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.
Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.
Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.
Cause: org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.

적용방법
<= : <![CDATA[ <= ]]>
=> : <![CDATA[ => ]]>
< : <![CDATA[ < ]]>
> : <![CDATA[ > ]]>

샘플
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="QueryManager">
 <select id="sampleQuery1" resultClass="java.util.HashMap">
  SELECT * FROM (
   SELECT ROWNUM AS RNUM, COL1, COL2, COL3, COL4 FROM BOARD
   ORDER BY COL1 ASC, COL2 DESC
  ) WHERE RNUM <![CDATA[ <= ]]> #START# ORDER BY COL1 DESC, COL2 ASC

 </select>

 <select id="sampleQuery2" resultClass="java.util.HashMap" parameterClass="java.util.HashMap">
  SELECT COUNT(*) AS TOTAL FROM BOARD
 </select>

2010. 10. 21. 16:55 PROGRAMMING
[ORACLE] 오라클 페이징 3가지 쿼리, PAGING, RNUM, ROWNUM
오라클에서 페이징 구현할때 쓰는 쿼리입니다.

SELECT * FROM (
 SELECT ROWNUM AS RNUM, A.* FROM (
  SELECT 컬럼 FROM 테이블
 ) A WHERE ROWNUM <= 시작점 + 출력양 ORDER BY ROWNUM DESC
) WHERE ROWNUM <= 출력양 ORDER BY RNUM ASC


SELECT * FROM (
 SELECT ROWNUM AS RNUM, A.* FROM (
  SELECT 컬럼 FROM 테이블
 ) A WHERE ROWNUM < 출력양
) WHERE RNUM > 시작점 ORDER BY 컬럼 DESC


SELECT * FROM (
 SELECT ROWNUM AS RNUM, 컬럼 FROM 테이블
) WHERE RNUM BETWEEN 시작점 AND 출력양
ORDER BY 컬럼 DESC

2010. 10. 11. 18:23 COMPUTER
[ORACLE/MYSQL] 인서트 자동증가, AUTO_INCREMENT, CREATE SEQUENCE

MySql에는 테이블생성시 AUTO_INCREMENT만 추가해주면 자동증가가 설정되서 편합니다.
오라클은 MySql처럼 편리하진 않지만,
시퀀스를 생성해주고 그값을 조회해서 자동증가를 이용할 수 있습니다.
어쩌면 유지보수면에선 오라클같은 형식이 낳을지도...

ORACLE
CREATE TABLE TESTTABLE (
 IDX NUMBER(10),
 INDEX2 NUMBER(10) NOT NULL,
 CONSTRAINT PK_TESTTABLE PRIMARY KEY(IDX)
);
CREATE SEQUENCE SEQ_TESTTABLE START WITH 1 INCREMENT BY 1 MAXVALUE 99999 CYCLE NOCACHE;


INSERT INTO TESTTABLE ( IDX, INDEX2 ) VALUES ( SEQ_TESTTABLE.NEXTVAL , 100 );

MYSQL
CREATE TABLE TESTTABLE (
 IDX INT(11) AUTO_INCREMENT,
 INDEX2 INT(11) NOT NULL,
 PRIMARY KEY (IDX)
);


INSERT INTO TESTTABLE ( INDEX2 ) VALUES ( 100 );

 

2010. 10. 5. 09:37 COMPUTER
[ORACLE] 오라클에 DATE타입으로 INSERT / SELECT, ORA-01861: 리터럴이 형식 문자열과 일치하지 않음
오라클 날짜형식으로 된 컬럼의 입/출력 쿼리


- 입력 (INSERT)

INSERT INTO TABLE1 (REG_DATE) VALUES ( TO_DATE('10-04-2010 20:37:50','MM-DD-YYYY HH24:MI:SS') )
INSERT INTO TABLE2 (REG_DATE) VALUES ( SYSDATE )


- 출력 (SELECT)
SELECT TO_CHAR(REG_DATE,'YYYY-MM-DD HH24:MI:SS') FROM TABLE1



TO_DATE에서 형식을 똑바로 맞추지 못하면 나는 에러입니다.

최근에 올라온 글

최근에 달린 댓글