728x90

 

사용 프로그램 & 버젼 등 환경

Oracle 11g
프로그래머스

 

메세지

ORA-30076: invalid extract field for extract source

 

상황

프로그래머스 입양 시각 구하기(1) 풀이 중 EXTRACT로 HOUR를 추출할려고 써보는데 해당 에러 발생

SELECT EXTRACT(HOUR FROM DATETIME)
FROM ANIMAL_OUTS

 

원인

데이터타입이 안맞아서 나는 오류

EXTRACT 함수를 사용할때, 2가지 데이터타입을 받을 수 있는데 하나는 DATE 다른 하나는 TIMESTAMP
1)DATE(DATETIME) : YEAR, MONTH, DAY
2)TIMESTAMP : HOUR, MINUTE, SECOND 등등

※DATETIME 데이터타입
DATE + TIMESTAMP = DATETIME
DATETIME 자체가 DATE 타입과 TIMESTAMP을 합쳐 놓은 데이터타입

SELECT SYSDATE,
       SYSTIMESTAMP,
       EXTRACT (YEAR FROM SYSDATE),
       EXTRACT (MONTH FROM SYSDATE),
       EXTRACT (DAY FROM SYSDATE),
       EXTRACT (HOUR FROM SYSTIMESTAMP),
       EXTRACT (MINUTE FROM SYSTIMESTAMP),
       EXTRACT (SECOND FROM SYSTIMESTAMP)
  FROM DUAL

 

해결

CAST()로 TIMESTAMP형으로 파싱해주면 된다

SELECT EXTRACT(HOUR FROM CAST(DATETIME AS TIMESTAMP)) HOUR
FROM ANIMAL_OUTS
728x90
반응형
728x90

 

 

사용 프로그램 & 버젼 등 환경

Oracle 11g
프로그래머스

 

 

메세지

ORA-00937 : not a single-group group function

 

 

상황

GROUP BY + 서브쿼리로 이용하여, 여러 날짜(DAY)의 HOUR를 그루핑해서 조회할려다가 에러 발생

SELECT HOUR, DATETIME, COUNT(DATETIME) AS COUNT -- FM 공백제거, HH24 시간만 24시제로 표시
 FROM (
     SELECT TO_CHAR(DATETIME,'FMHH24') AS HOUR, DATETIME
     FROM ANIMAL_OUTS
     **GROUP BY DATETIME** -- ORA-00937: not a single-group group function
     )
 ORDER BY DATETIME

 

 

원인

GROUP BY 형식을 잘몰라서 생기는 오류
GROUP BY에 지정한 컬럼과 SELECT의 지정한 컬럼이 같아야한다. 한쪽에 컬럼 세팅이 빠져서 생기는 오류
집계함수를 제외하면 컬럼명을 양 쪽에 모두 공유해야한다

 

 

해결

위에서는 별칭인 HOUR로는 연계가 안되기 때문에 컬럼을 직접적으로 선언하던가
또는 DATETIME으로 별칭을 짜면 해결 가능

SELECT HOUR, DATETIME -- COUNT(DATETIME) AS COUNT를 지우면 ORA-00937 해결
 FROM (
     SELECT TO_CHAR(DATETIME,'FMHH24') AS HOUR, DATETIME
     FROM ANIMAL_OUTS
     GROUP BY DATETIME
     ) 
 ORDER BY DATETIME
728x90
반응형
728x90

사용 프로그램

Oracle 11g + SQL Developer

 

메세지

ORA-01722: 수치가 부적합합니다

00000 - "invalid number"

*Cause: The specified number was invalid.

*Action: Specify a valid number.

 

상황

자체조인(SELF JOIN) 해볼려고 하던 중 JOIN ON절의 조건을 EMP_NO(사번)과 FAM_NM(가족명) 두가지를 넣었더니 에러 발생

 

원인

EMP_NO(사번)과 FAM_NM(가족명) 둘의 데이터 타입의 다른데 ON절에서 서로를 매칭 시킬려고 해서 에러 발생

※ “ORA-01722: 수치가 부적합 합니다”

 

위 메세지의 에러 원인

1.데이터 타입이 일치 하지 않는경우

2.데이터타입이 다른데 연산을 하는 경우

 

해결

데이터 타입이 다른 두 컬럼을 매핑할려 했던거라 데이터타입이 일치하는 컬럼끼리 매핑 시켜야함

SELECT F1.EMP_NO, F2.FAM_NM
FROM FAM_C F1
    JOIN FAM_C F2 ON(F1.EMP_NO = F2.EMP_NO) 
;

 

728x90
반응형
728x90

사용 프로그램

Oracle 11g & SQL Developer

 

메세지

ORA-00979: GROUP BY 표현식이 아닙니다. 00979. 00000 - "not a GROUP BY expression"

 

상황

아래 쿼리를 조회하려다 발생

SELECT E.EMP_NO, E.EMP_NM, COUNT(E.EMP_NO)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)    
WHERE REL_TYPE_CD = 'A27'
GROUP BY E.EMP_NO; -- 인출행 수 1239

 

원인

조회할려는 컬럼이 그룹바이로 지정이 안됐기에 에러 발생

GROUP BY문에 들어가 있는 컬럼명들 중에 SELECT문에 안들어가도 있어도 에러발생X

반대로, GROUP BY문에 없는데 SELECT문에서 들어가있는 컬럼명이 있다면 에러발생O

 

해결

GROUP BY E.EMP_NO에 추가로 E.EMP_NM 컬럼 추가

E.EMP_NM이 조회할려던 컬럼

즉, 조회할려는 컬럼이 그룹바이로 지정이 안됐기에 에러 발생

SELECT E.EMP_NO, E.EMP_NM, COUNT(E.EMP_NO)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)    
WHERE REL_TYPE_CD = 'A27'
GROUP BY E.EMP_NO, E.EMP_NM; -- 인출행 수 1239

 

728x90
반응형
728x90

 

 

사용 프로그램

Oracle 11g

 

메세지

ORA-25154: column part of USING clause cannot have qualifier 25154. 00000 - "column part of USING clause cannot have qualifier"

*Cause: Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier.

*Action: Remove the qualifier.

 

상황

ANSI 표준구문으로 사번, 사원 명, 직급코드, 직급명 조회할려던 중 발생

 

원인

ANSI 표준구문에서 USING 자체가 다른 테이블에 같은 컬럼명을 JOIN한다는 전제가 깔려있기에 SELECT절에 JOIN되는 각 컬럼 앞에 테이블 경로 지정해줄 필요가 없다

 

해결

식별자(quilifier) 삭제

 

-- 에러 해결 전
EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J USING(JOB_CODE);
    
 -- 에러 해결 후
 EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE);
728x90
반응형
728x90

메세지

ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session

원인

아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러.

해결

NEXTVAL에서 CURRVAL로 최초값을 받아오자.

 

--SEQ_EMPID에 대한 '현재 값' 조회
SELECT SEQ_EMPID.CURRVAL FROM DUAL;
-- ERROR : ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session
-- 원인 : 아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러. NEXTVAL에서 CURRVAL로 최초값을 받아오자.
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 300 // 305 // 310 누를 때마다 5씩 값 증가되서 출력됨. 최대치설정이310이라 멈춤
728x90
반응형
728x90

메세지

ORA-00998: must name this expression with a column alias

 

원인

컬럼에 별칭 짓겠다고 하고 안만들어서 난 에러

※별칭 생성해야만 할 때 : 서브쿼리 SELECT절 안에 함수가 포함되면 반드시 별칭 지정

 

728x90
반응형
728x90

메세지

ORA-12983: cannot drop all columns in a table 12983. 00000 - "cannot drop all columns in a table"

*Cause: An attempt was made to drop all columns in a table. *Action: Ensure that at least one column remains in the table after the drop column operation.

원인

테이블에 컬럼을 전부 지우려다 발생

테이블에 컬럼이 하나라도 남아있어야한다

 

ALTER TABLE DEPT_COPY2
DROP COLUMN DEPT_TITLE;
728x90
반응형
728x90

메세지

ORA-01441: cannot decrease column length because some value is too big

 

원인

넣을려는 곳의 정해진 자료형의 값보다 큰 값을 넣을려고 해서 발생

크기 수정할 때는 안에 데이터의 크기가 어떤지를 보고 수정해야함

ALTER TABLE DEPT_COPY
MODIFY DEPT_TITLE VARCHAR2(10);
-- ORA-01441: cannot decrease column length because some value is too big
-- 크기 수정할 때는 안에 데이터의 크기가 어떤지를 보고 수정해야함

 

728x90
반응형
728x90

메세지

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

 

원인

컬럼명의 순서를 바꿔서 들어갈 수 없는 데이터 형식이 넣어졌기에 에러발생

 

상황

테이블의 모든 컬럼에 값을 넣을 때는 컬럼명 명시를 생략 가능하여 해보던 중

해결 컬럼명을 명시하는 경우에는 명시한 순서를 따라 데이터를 넣으면 되고, 생략 시에는 테이블에 있는 컬럼명 순서을 따라야 한다

 

-- 테이블의 모든 컬럼에 값을 넣을 때는 컬럼명 명시를 생략 가능            
-- INSERT 시, 컬럼명을 생략하려면 테이블에 있는 컬럼 순서를 정확히 지켜서 넣어야 함
INSERT INTO EMPLOYEE -- 컬럼명 명시부분 삭제
VALUES(900,'강건강','990311-1451201','kang_kk@kh.or.kr','01011112222',
        'D1','J7','S3',4300000,0.2,200,SYSDATE,'N',NULL);            
-- ORA-01841: (full) year must be between -4713 and +9999, and not be 0
-- 원인 : ENT_YN,ENT_DATE의 순서를 바꿔서 에러발생
-- 컬럼명을 명시하는 경우에는 명시한 순서를 따라 데이터를 넣으면 되고, 
-- 생략 시에는 테이블에 있는 컬럼명 순서을 따라야 한다
728x90
반응형

+ Recent posts