에러 코드: ORA-12514 에러 메시지: "TNS:listener does not currently know of service requested in connect descriptor" (TNS: 리스너가 연결 설명자에서 요청된 서비스를 현재 인식하지 못함) 발생 원인 ORA-12514 에러는 클라이언트가 데이터베이스에 연결을 시도할 때 Oracle Net 리스너(listener)가 요청된 서비스 이름(service name)을 인식하지 못할 때 발생합니다. 이는 주로 서비스 이름이 리스너 구성에 올바르게 등록되지 않았거나, 리스너가 아직 데이터베이스 인스턴스의 등록을 인지하지 못했을 때 발생합니다. 예제 다음은 클라이언트가 데이터베이스에 연결을 시도하는 상황에서 ORA-12514 에러가 발생할 수..
에러 코드: ORA-02292 에러 메시지: "integrity constraint violation - child record found" (무결성 제약 조건 위반 - 자식 레코드 발견됨) 발생 원인 ORA-02292 에러는 무결성 제약 조건(integrity constraint)을 위반했을 때 발생합니다. 이 에러는 부모 테이블(parent table)에서 레코드(record)를 삭제하거나 수정하려고 시도할 때 해당 레코드에 의존하는 자식 테이블(child table)에 여전히 레코드가 남아 있을 경우에 발생합니다. 이는 주로 외래 키(foreign key) 제약 조건에 의해 발생합니다. 예제 다음 예제에서는 EMP 테이블이 DEPT 테이블에 외래 키로 연결되어 있습니다: -- 부모 테이블 'DEPT..
에러 코드: ORA-00942 에러 메시지: table or view does not exist (테이블 또는 뷰가 존재하지 않음) 발생 원인 ORA-00942 에러는 데이터베이스에서 쿼리를 실행하려 할 때, 참조된 테이블(table)이나 뷰(view)가 존재하지 않을 경우 발생합니다. 이 에러는 대개 SQL 쿼리를 실행하는 동안 잘못된 이름을 사용했거나, 데이터베이스에 접근할 권한(permission)이 없을 때 발생합니다. 예제 다음은 ORA-00942 에러가 발생하는 상황의 예입니다. SELECT * FROM emp; 1. 사용자 접속 계정 : USER01 2. EMP 소유 계정 : SCOTT USER01로 접속하여 위와 같이 SELECT * FROM EMP; 질의시 에러 발생! 위 쿼리를 실행했을..
에러 코드: ORA-01555 에러 메시지: "snapshot too old" (스냅샷이 너무 오래됨) 발생 원인 이 에러는 오라클 데이터베이스에서 긴 실행 시간을 갖는 쿼리가 실행되는 동안 필요한 이전 데이터 버전(스냅샷)을 유지하기 위해 사용되는 UNDO 데이터가 오버라이트되어 발생합니다. 이는 큰 트랜잭션이 진행 중일 때 다른 트랜잭션이 동일한 데이터를 수정하면서 발생할 수 있습니다. 예제 회사의 재무 부서에서 연말 결산 작업을 진행하는 동안 다음과 같은 상황에서 ORA-01555 에러가 발생할 수 있습니다: 재무 부서는 transactions 테이블에서 올해의 모든 거래를 검토하고 요약하는 복잡한 쿼리를 실행합니다. 이 쿼리는 데이터가 많아 처리 시간이 길어집니다. EGIN FOR rec IN (..
에러 코드: ORA-04031 에러 메시지 : unable to allocate bytes of shared memory ("area","object","subpool","allocation name") 발생 원인 ORA-04031 에러는 오라클 데이터베이스가 필요로 하는 메모리 공간을 할당받지 못할 때 발생합니다. 이는 SGA(시스템 글로벌 영역) 또는 PGA(프로세스 글로벌 영역)에서 메모리 할당을 시도할 때, 충분한 공간이 없을때 발생할 수 있습니다. 주로 대형 쿼리를 실행하거나 많은 사용자가 동시에 데이터베이스에 접근할 때 발생하기 쉽습니다. 예제 다음은 이 에러가 발생할 수 있는 상황을 설명하는 SQL 쿼리 예제입니다. -- 대용량 데이터 처리 쿼리 ( 수십억 건 테이블 ) SELECT * FR..
에러 코드: ORA-00904 에러 메시지: invalid identifier 발생 원인 ORA-00904 에러는 테이블, 뷰, 시퀀스, 컬럼 등의 이름을 잘못 사용했을 때 발생합니다. 이는 존재하지 않는 이름을 참조하거나, 식별자를 잘못 입력했을 때, 또는 대소문자 구분 등의 문제로 발생할 수 있습니다. 예제 다음 예제에서는 employees 테이블에서 emp_id 컬럼을 선택하려고 시도합니다. 하지만 실제 컬럼 이름은 empno 입니다. SELECT emp_id FROM employees; 위 SQL 명령은 ORA-00904: invalid identifier 에러를 발생시킬 것입니다. 왜냐하면 emp_id라는 이름의 컬럼이 emp 테이블에 존재하지 않기 때문입니다. 해결 방법 이 에러를 해결하기 위..
에러 코드: ORA-06502 에러 메시지: PL/SQL: numeric or value error 발생 원인 이 에러는 PL/SQL 블록에서 데이터 타입 불일치 또는 값 범위 초과 때문에 발생합니다. 예를 들어, 변수에 할당된 값이 변수 타입의 범위를 초과하거나, 잘못된 타입의 데이터를 변수에 할당하려고 할 때 이 에러가 발생할 수 있습니다. 예제 다음은 ORA-06502 에러가 발생하는 예제입니다. DECLARE v_num NUMBER(5); BEGIN v_num := 100000; -- 이 값은 num_var의 선언 범위를 초과합니다. EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); END; 위 예제에서 v_num은 최대..
에러 코드: ORA-12154 에러 메시지: TNS:could not resolve the connect identifier specified 발생 원인 ORA-12154 에러는 Oracle Net Services의 설정이 올바르지 않을 때 주로 발생합니다. 특히, 데이터베이스 연결 문자열에서 지정한 'connect identifier'를 찾을 수 없을 때 이 에러가 나타납니다. 이는 주로 tnsnames.ora 파일에서 데이터베이스의 주소나 이름이 잘못 입력되었을 때 발생합니다. 예제 예를 들어, 아래와 같이 tnsnames.ora 파일에 데이터베이스 연결 정보를 설정했다고 가정해 봅시다. ORCL1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = local..
에러 코드: ORA-00001 에러 메시지: unique constraint (constraint_name) violated 발생 원인 이 에러는 테이블에 유니크 제약 조건이 설정되어 있고, 이 제약 조건을 위배하는 데이터가 입력되려 할 때 발생합니다. 예를 들어, 사용자 아이디가 유니크해야 하는 테이블에 이미 존재하는 아이디를 다시 입력하려고 하면 이 에러가 발생하게 됩니다. 예제 고객 정보를 저장하는 테이블에서 고객의 이메일 주소에 유니크 제약 조건이 설정되어 있다고 가정해 봅시다. CREATE TABLE customers ( id NUMBER PRIMARY KEY, email VARCHAR(100) UNIQUE ); -- 이미 'scott@naver.com' 이메일을 가진 고객이 존재하는 상태 IN..
성능 개선을 위해 PK 컬럼 NO를 선두로하는 인덱스를 만들어야 한다. 고민이 많아진다. PK 컬럼을 선두컬럼으로 하는 인덱스를 만드는게 맞는건가? PK 인덱스는 빠른거 아닌가? PK 뒤에 넣는것도 찝찝하고. 컬럼 중복 인거 같기도하고... 당황스럽다. 경험을 쌓다보니, 성능 개선을 위해 반드시 필요하면 신규 생성하는 것은 옳은 방법임을 알게 되었다. 단, 명확한 사유가 있어야야 한다. 당연히 성능 개선을 위한 것이지만, 오성고 저자분의 의견은 아래와 같이 명확하다. 1) TB_TEST_PK : 중복 방지용 ( PK ) 2) TB_TEST_IDX01 : 조회용 ( PK를 포함하는 인덱스 ) 아래 TEST로 어떻게 구성하는지 확인! [ PK 컬럼을 포함하는 인덱스 생성 ] [1] 테이블 생성 DROP TA..
시퀀스 "1" 초기화 방법은 18C 이전에는 매우 번롭고, 깔끔하지 못했다. 왜냐하면, 재생성을 하지 않고는, 조정 후 시퀀스를 사용하게 되면 면 2로 시작되기 때문이었다. 18C 부터는 간단한 명령문으로 시퀀스를 초기화 하고, 1 부터 사용 할 수 있게 되었다. 아래 문법 및 테스트를 참고하세요. [ 문법 ] ALTER SEQUENCE TB_SSQ_TEST_SQ1 RESTART START WITH "원하는 시작 번호"; [ 18C 부터 시퀀스 초기화 ] 1. 신규 생성 CREATE SEQUENCE TB_SSQ_TEST_SQ1 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE; 2. 시퀀스 현재값 10으로 변경 위해 10번 사용 SELECT TB_SSQ_TEST_SQ1..
수행한 SQL Cursor를 Flush 해아만 하는 상황이 종종 발생한다. 명령문은 아래와 같으며 살제 사용하는 방법은 아래 글을 참고 하시기 바랍니다. [ 명령문 ] EXEC SYS.DBMS_SHARED_POOL.PURGE ( SQL의 ADDRESS, SQL의 HASH_VALUE ,'C'); [1] 아키텍처 확인 SQL을 수행하면 내부적으로 SQL Cursor(LCO = Library Cache Object) 로써, SGA -> Shared Pool -> Shared SQL Area에 저장됩니다. [2] SQL을 10개 실행하여 Cursor 10개 생성 주석에 다른 숫자를 넣어 SQL FULL TEXT 서로 다르게 함. SELECT /* KTH 1 */ * FROM EMP; SELECT /*..
Unique 컬럼은 집합에서 모든 ROW 사이에 서로 다름을 보장해주는 컬럼 or 컬럼들이다. 물리적으로는 Unique Index가 그 역할을 하고 있다. Partitioned Table에서 Unique를 생각해 보았다. 아래 3가지 Unique 경우의 수가 있다. 1) Unique Non-Partititioned Index - "전체" 대상 집합으로 Unique 하게 해준다. 2) Unique Local-Partitioned Index - Local 이라서 파티션 당 Unique함을 표현하는 것 같다. 하지만 "전체" 기준에서 Unique 하면, 파티션에서도 당연히 Unique 해진다. 그러므로 Unique Index 안에는 필수로 "파티션 키"가 포함되어야 한다. ( 파티션 키가 포함 되지 않으면 D..
년월일(YYYYMMDD) 컬럼을 이용하여 년 파티션 테이블로 구성 하였다. 여기서 년 별로 [NO] 컬럼이 UNIQUE한 데이터가 구성되도록 하려고 합니다. INDEX 생성 스크립는 어떻게 해야 할까? == 문제 예제 테이블 스크립트 ==; CREATE TABLE TEST ( NO VARCHAR2(10), YYYYMMDD VARCHAR2(8), C1 VARCHAR2(10), C2 VARCHAR2(10), C3 VARCHAR2(10) ) PARTITION BY RANGE ( YYYYMMDD ) ( PARTITION P_2023 VALUES LESS THAN ( '2024' ), PARTITION P_2024 VALUES LESS THAN ( '2025' ), PARTITION P_2025 VALUES LE..
ERROR CODE / 설명 : 접속하려는 DB Version 보다 낮은 버전의 Client or Server Version으로 접속을 시도하는 경우 볼 수 있는 에러코드 ORA-28040 : NO matching authentication protocol 발생 원인 11G CLIENT로 원격 DB 19c 에 접속하려고 함. 에러 발생 ( ORA-28040 : NO matching authentication protocol ) 해결 방법 1. sqlnet.ora 파일 수정 : "SQLNET.ALLOWED_LOGON_VERSION=10" 기입하기 ( 서버보다 낮은 클라이언트 버전도 접속을 허용하겠다는 의미 ) 2. 비밀번호 변경 SQLNET.ORA 파일 변경 전에 이미 생성된 계정이 위 작업에 영향을 받..