목록오라클 (59)
정미나닷컴
B*Tree Index (B: Balanced)- 인덱스 Root에서 Leaf Block까지 어떤 값으로 탐색하더라도 읽는 Block 수가 동일 (Root로 부터 모든 Leaf Block 까지의 높이가 동일) 위 그림을 보면서 처음에 Root Block과 Branch Block에 있는 KEY 값 때문에 헷갈렸는데 저기에 나타난 KI나 BER, FO, JONES 등등의 값은 테이블 레코드 값이라기 보다는 범위를 의미한다. 다시 말해 KI는 > KI 를 의미하고 BER는 > BER 를 의미한다. Root Block & Branch Block - 저장 엔트리: {KEY:DBA(하위 노드의 Data Block Address)} * 여기에 저장된 KEY 값은 테이블 레코드의 KEY 값이 아닌 하위 노드의 범위를 ..
ORA-06502: PL/SQL: 수치 또는 값 오류: 문자열 버퍼가 너무 작습니다 : 오라클 Function이나 Procedure 내에 선언된 변수의 크기보다 더 큰 값을 담으려고 할 때 발생하는 에러 하지만 내가 문자열을 담으려던 변수는 Function 내에 VARCHAR2(32767)로 선언되어 있었고 아무리 DB를 뒤져봐도 32767 byte를 넘어가는 데이터는 없어서 멘붕이 오던 찰나, 오라클 VARCHAR2는 4000 byte까지만 지원된다는 구글님의 조언을 얼핏 듣고 그렇다면 저 변수는 왜 32767 byte로 선언되어 있는가 의문이 들어 다시 한번 폭풍 검색- 결론은 PL/SQL내에서는 VARCHAR2가 32K까지 지원이 되지만 어차피 그 변수값을 테이블이나 뷰에 담을거라면 4000 byt..
- SYNONYM 조회 SELECT * FROM USER_SYNONYMS WHERE TABLE_OWNER='소유계정'; - SYNONYM 생성 CREATE SYNONYM 소유계정.테이블명(or 프로시저명) FOR 부여계정.테이블명(or 프로시저명); - SYNONYM 삭제 DROP SYNONYM 시노님명; * 프로시저 실행 권한 부여 GRANT EXECUTE ON 소유계정.프로시저명 TO 부여계정;
오라클 DB에서 지정된 URI를 호출하는 방식이 프로시저를 DB Job에 등록하면 배치 형식으로 사용할 수도 있음(*지정된 URI 페이지 내의 자바스크립트는 실행 불가) CREATE OR REPLACE PROCEDURE SP_CALLIS REQ UTL_HTTP.REQ; RESP UTL_HTTP.RESP; BEGIN UTL_HTTP.SET_TRANSFER_TIMEOUT(5); REQ := UTL_HTTP.BEGIN_REQUEST('URL'); -- 호출 페이지 UTL_HTTP.SET_HEADER(REQ, 'Content-Type', 'text/xml'); RESP := UTL_HTTP.GET_RESPONSE(REQ); BEGIN LOOP UTL_HTTP.READ_LINE(RESP,replyline,TRUE..
init.ora 의 global_names가 true로 설정되어 있는 경우 DBLink 생성시 반드시 상대방의 global_name과 같은 이름으로 DBLink명을 지정해야 한다. (true가 아닐 경우에는 임의의 이름으로 생성 가능) 그렇지 않았을 경우 SELECT, INSERT, DELETE 등은 가능하지만 function 사용은 불가함 * DB의 global_name 확인 select * from global_name; 설정값을 바꾸기 위해서는 initSID.ora 파일을 수정하는 것이 맞지만 DB를 내렸다 올릴 수 없는 경우 임시방편으로 쿼리문 날리기 전에 ALTER SESSION SET GLOBAL_NAMES = TRUE 위 쿼리를 날려주는 방법이 있음
INNER JOIN- 가장 일반적인 JOIN 형태- 두 개 이상의 테이블의 공통 컬럼을 JOIN 조건으로 만들어 데이터 조회- JOIN에 참여하는 두 컬럼은 동일한 데이터 타입(필수사항은 아님)- WHERE 절에는 일반 조건과 JOIN 조건을 병행 사용 가능- SELF JOIN > 자기 자신과 JOIN- ANTI JOIN > NOT IN 연산자를 사용한 JOIN- SEMI JOIN > EXISTS 연산자를 사용한 JOINSELECT A.EVENT_NO, B.CUST_NO FROM TEVENT A, TCUSTOMER B WHERE A.CUST_ID = B.CUST_ID;▶ 이벤트에 참여한 고객의 데이터 출력 Outer JOIN- 두 테이블에서 어느 한 테이블의 데이터가 없을 경우, 전체 row수를 보존하면..
* SET 연산자로 묶이는 SELECT 문장의 열의 개수가 반드시 같아야 함 * SET 연산자로 연결되는 SELECT 문장에서 컬럼들의 순서와 데이터 타입이 일치해야 함 UNION - A와 B란 데이터 셋이 있을 경우, A∪B로 표현되는 집합 - 두 테이블의 중복되지 않은 값들을 반환 SELECT cust_id FROM tb_event WHERE event_no=1 UNION SELECT cust_id FROM tb_event WHERE event_no=2 => 1번 이벤트와 2번 이벤트에 참여한 고객들의 리스트 UNION ALL - UNION과 같으나 두 테이블의 중복되는 값까지 반환 + UNION 연산자는 연결된 쿼리에서 동일한 row는 제거하고 한 row만 반환하게 된다. 따라서 추가적으로 필터링하..
HAVING절 - GROUP BY 절과 같이 사용되어 SELECT 문장에서 집계 함수를 사용한 조건을 명시하는 절, 집계 함수용 WHERE 절, 항상 GROUP BY 절과 같이 사용되어야 한다. SELECT department_id, COUNT(*) FROM EMPLOYEES WHERE department_id IS NOT NULL GROUP BY department_id HAVING COUNT(*) GROUP BY -> HAVING + SELECT 문장 실행 순서 SELECT -- ⑤ FROM -- ① WHERE -- ② GROUP BY -- ③ HAVING -- ④ ORDER BY -- ⑥ => SELECT 절에서 정의한 alias는 ORDER BY 절에서만 사용 가능 (일반조건을 HAVING절에 명..