오라클은 다중 테이블을 조인하여 데이터를 갱신하는 기능을 지원합니다. T1 테이블 A1, A2, A3 컬럼, T2 테이블 B1, B2, B3 컬럼에서 A2 와 B2 의 데이터가 같고 A1 의 데이터가 1 인경우 A3 을 B3 으로 업데이트 한다고 합니다.CREATE TABLE A ( A1 INT, A2 INT, A3 INT ); CREATE TABLE B ( B1 INT, B2 INT, B3 INT ); INSERT INTO A VALUES (1, 3, 3); INSERT INTO B VALUES (1, 3, 5); COMMIT;UPDATE 문은 다음과 같이 작성할 수 있습니다.UPDATE A SET A3 = ( SELECT B3 FROM B WHERE A.A2 = B.B2 AND A.A1 = 1 );이..
Database
SQL 의 성능은 시스템 운영에 매우 중요합니다.예를들어 사용자가 평소 1초내로 응답받던 결과가, 갑자기 느려지면 사용자는 그 서비스를 더이상 사용하지 않을수도 있습니다. 이번 포스팅은 SPM(SQL Plan Management 실행계획 관리) 을 통해 SQL 성능이 갑자기 느려졌을 때, 대처하는 방법입니다. SPM 을 관리함으로써 아래와 같은 효과를 얻을 수 있습니다. - 성능 안정화 - 성능 개선 먼저 SPM 아키텍처에 대해 알아봅니다.SPM 은 SQL 성능이 저하될 경우를 대비해 미리 실행계획을 저장합니다.이렇게 저장된 실행계획은 'SQL 계획 베이스라인' 이라고 불립니다.실행계획은 SQL 단위로 다수개가 저장될 수 있습니다. SPM 은 SQL 관리 베이스라는 딕셔너리 뷰에서 관리되며, SYSAUX..
ORACLE 은 대량의 레코드 적재를 FORALL 키워드 를 이용하여, 벌크로 적재하는 기능을 제공합니다.또한 이런 기능을 BULK INSERT 라고 칭합니다. 벌크 INSERT 는 레코드를 배열의 값에 저장하고 한번에 INSERT 하는 작업을 수행합니다. 예를들어서 테이블이 아래와 같은 경우,CREATE TABLE MOZI ( C1 NUMBER, C2 NUMBER ); 레코드를 3건 넣기 위해서는 INSERT 구문을 3번 수행해야 합니다.SQL> INSERT INTO MOZI VALUES (1, 1); SQL> INSERT INTO MOZI VALUES (2, 2); SQL> INSERT INTO MOZI VALUES (3, 3); SQL> COMMIT; 반면, FORALL 을 사용하여 데이터를 배열에..
ORACLE 은 SQL 을 병렬 힌트를 부여하여 실행하는 기능을 제공합니다.이 기능을 사용하면 어플리케이션 쪽에서 소스를 수정하지 않아도 되므로, 많은 이점이 있습니다. 병렬 힌트란, 데이터를 가져오는 작업을 단일이 아닌 멀티로 진행하여 빠른 응답을 제공받습니다. 병렬 쿼리 사용 방법먼저, 병렬처리가 가능하도록 세션에 권한을 부여합니다.SQL> ALTER SESSION ENABLE PARALLEL DML; Session altered.병렬 쿼리는 PARALLEL 힌트를 사용하여 활성화 합니다. 괄호안의 수는 멀티 작업 스레드를 의미합니다.SQL> SELECT /*+ PARALLEL (4) */ 2 C1, C2 3 FROM 4 MOZI; C1 C2 ---------- ---------- 1 1 2 2 병렬..
GOLDILOCKS 는 프로시저를 수행중 일어나는 예외상황에 대해 처리할 수 있는 Exception 을 지원합니다. Exception 은 사용자가 지정할 수 있거나 혹은 미리 정의된 예외처리를 사용할 수 있습니다. 미리 정의된 예외처리는 다음과 같습니다. 이름 설명 CASE_NOT_FOUND CASE WHEN 조건에 모두 맞지 않으며 ELSE 절이 없는 경우 DUP_VAL_ON_INDEX INDEX 중복 오류가 발생한 경우 INVALID_CURSOR 커서의 상태가 올바르지 않은 경우 INVALID_NUMBER 숫자로 변환할 수 없는 경우 NO_DATA_FOUND SELECT 에 의해 0 건이 리턴되는 경우 ROWTYPE_MISMATCH 2개의 로우타입 변수의 필드 타입이 서로 다른 경우 TOO_MANY_..
GOLDILOCKS 는 디버깅 및 예외처리 용도로 다음 함수를 지원합니다. 함수 기능 DBMS_OUTPUT.ENABLE( 양의 정수 ) 주어진 버퍼 크기로 메시지 로깅 기능을 활성화 기본값은 20,000 바이트 DBMS_OUTPUT.DISABLE 메시지 로깅 기능을 비활성화 DBMS_OUTPUT.SET_LOG( 'PATH' ) 메시지 로깅시에 파일로 기록하는 경로를 지정 DBMS_OUPUT.PUT_LINE( 'LOGGING' ) 최대 4000 자로 메세지를 버퍼에 저장 DBMS_OUTPUT.GET_LINE( CONTENT, STATUS ) 버퍼에 저장된 메세지중 아직 읽지 않은 가장 오래된 메세지를 반환 메시지가 존재하면 status 는 0, 존재하지 않으면 1 DBMS_STANDARD.RAISE_APP..
GOLDILOCKs 는 프로시져의 효율적인 기능을 위해 아래와 같은 함수를 지원합니다. 함수 설명 IF 주어진 조건들 중 참인 것에 해당하는 구문을 수행 CASE Simple CASE - CASE 키워드 다음에 기술된 변수를 가지고 WHEN 절 이후에 기술된 표현 중 맞는 부분을 실행 Searched CASE - WHEN 절 이후에 변수와 표현을 계산하여 맞는 부분을 실행 BASIC LOOP LOOP 와 END LOOP 키워드로 반복 수행할 일련의 구문을 수행 FOR LOOP 주어진 범위의 정수 개수 만큼 일련의 구문을 수행 WHILE LOOP 주어진 조건이 참인 동안 계속 구문을 수행 IFgSQL> DECLARE 2 V1 INTEGER := 1; 3 BEGIN 4 IF V1 > 0 THEN 5 DBMS..
원인ODBC 에서 SQLHSTMT 의 변수로 SELECT 를 사용한 뒤, 바로 다른 쿼리를 수행하려고 하는 경우 발생합니다. 해결방안SELECT 시 암묵적으로 Cursor 가 생성되며 다른 쿼리를 사용 전, Cursor 를 닫아주어야 합니다. SELECT 사용 뒤 사용된 Statement 변수의 커서를 닫아줍니다.while( 1 ) { sRet = SQLFetch( sStmt ); if( sRet == SQL_NO_DATA ) { break; } printf("T1 :: %d, %d, %ld, %f, %f\n", sC1, sC2, sC3, sC4, sC5); } SQLCloseCursor( sStmt ); /* DROP */ sRet = SQLExecDirect( sStmt, (SQLCHAR*)"DROP..
GOLDILOCKS 는 SQL/PSM 에서 커서의 상태를 확인하기 위해 암시적/명시적 커서 속성을 지원합니다. 암시적(Implicit) 커서 속성직전에 수행한 SQL 문의 처리 상태를 알기 위한 용도로 사용됩니다. 속성 명 리턴 타입 설명 ISOPEN BOOLEAN 내부적으로 CLOSE 됨 항상 FALSE FOUND BOOLEAN SQL 에 의해 데이터가 반환되었으면 TRUE NOTFOUND BOOLEAN FOUND 와 반대 ROWCOUNT INTEGER SQL 에 의해 영향받은 로우 수 테스트를 위해 테이블을 생성합니다.CREATE TABLE MOZI ( C1 INTEGER, C2 VARCHAR(20) ); INSERT INTO MOZI (C1, C2) VALUES ( 1, 'Mozi' ); INSER..
GOLDILOCKS 는 SQL/PSM 에서 일반 데이터 타입으로 선언된 변수를 지원합니다.또한, 사용자의 편리성을 위해 변수를 선언하는 많은 방법을 지원합니다. 데이터 타입 구문 참조 대상 Attribute Data Types %TYPE 다른 변수 혹은 테이블 컬럼과 같은 타입을 명시 %ROWTYPE 특정 테이블 구조 혹은 특정 커서의 반환 타입과 같은 타입을 명시 User Defined Record Types TYPE .. IS RECORD .. 사용자가 특정 용도에 맞는 데이터 구조를 선언하여 생성 User Defined Collection Types TYPE .. IS TABLE OF .. INDEX BY Associative Array 를 지원하며, Key/Value 형태로 1개 이상의 값을 저장..