데이터 조작 사용

오라클은 데이터베이스에서 데이터 작업을 수행하기 위해 데이터 조작 언어 명령을 제공합니다. 데이터 작업은 데이터베이스 테이블을 애플리케이션 또는 비즈니스 데이터로 채우고, 필요할 때마다 데이터를 수정하고 데이터베이스에서 데이터를 제거 할 수 있습니다. 데이터 작업 외에도 이러한 작업을 제어하는 ​​데 사용되는 일련의 명령이 있으며 이러한 명령은 트랜잭션 제어 언어로 그룹화됩니다.

논리적 SQL 트랜잭션에는 삽입, 업데이트, 삭제 및 병합이라는 세 가지 유형의 DML 문이 있습니다. 트랜잭션은 데이터베이스 세션 내에서 DML 작업의 논리적 모음입니다.

INSERT 문

INSERT 명령은 테이블에 데이터를 저장하는 데 사용됩니다. INSERT 명령은 종종 Visual Basic.NET 또는 C ++와 같은 고급 프로그래밍 언어에서 임베디드 SQL 명령으로 사용됩니다. 그러나이 명령은 명령 모드의 SQL * PLUS 프롬프트에서도 실행할 수 있습니다. INSERT 명령에는 두 가지 형식이 있습니다. 첫 번째 양식은 새 행에 행의 각 열에 삽입 된 값이있는 경우 사용됩니다. INSERT 명령의 두 번째 형식은 일부 열 데이터를 알 수 없거나 다른 비즈니스 논리에서 기본값이 지정된 행을 삽입하는 데 사용됩니다.이 형식의 INSERT 명령에서는 데이터가 저장되는 열 이름을 지정해야합니다.

통사론:

테이블의 모든 열에 대한 값이 명확하고 알려진 경우 아래 구문을 따를 수 있습니다.

INSERT INTO table
VALUES (column1 value, column2 value, 
...);

아래 구문은 테이블의 일부 열만 값으로 채워야하는 경우에 사용할 수 있습니다. 나머지 열은 NULL 또는 다른 비즈니스 논리에서 값을 추론 할 수 있습니다.

INSERT INTO table (column1 name, column2 name, . . .)
VALUES (column1 value, column2 value, . . .);

아래의 INSERT 문은 EMPLOYEES 테이블에 새 직원 레코드를 만듭니다. 기본 열 EMPLOYEE_ID, FIRST_NAME, SALARY 및 DEPARTMENT_ID에 대한 값을 삽입합니다.

INSERT INTO employees (EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID)
VALUES (130, 'KEMP', 3800, 10);

그렇지 않으면 아래 INSERT 문을 사용하여 열 목록을 지정하지 않고 EMPLOYEES 테이블에 완전한 직원 데이터를 삽입 할 수 있습니다. 값이 미리 알려져 있고 테이블에서 열의 데이터 유형 및 위치를 준수해야합니다.

INSERT INTO employees
VALUES (130, 'KEMP','GARNER', '[email protected]', '48309290',TO_DATE ('01-JAN-2012'), 'SALES', 3800, 0, 110, 10);

삽입 할 값은 열의 데이터 유형과 호환되어야합니다. 리터럴, 고정 값 및 함수, SYSDATE, CURRENT_DATE, SEQ.CURRVAL (NEXTVAL) 또는 USER와 같은 특수 값을 열 값으로 사용할 수 있습니다. 지정된 값은 일반 규칙을 따라야합니다. 문자열 리터럴과 날짜 값은 따옴표로 묶어야합니다. 날짜 값은 DD-MON-RR 또는 D-MON-YYYY 형식으로 제공 될 수 있지만 YYYY는 세기를 명확하게 지정하고 내부 RR 세기 계산 논리에 의존하지 않기 때문에 선호됩니다.

INSERT-AS-SELECT (IAS) 문

INSERT..AS..SELECT (IAS) 조작을 사용하여 소스 테이블에서 대상 테이블로 데이터를 채울 수 있습니다. 직접 경로 읽기 작업으로, 한 테이블에서 다른 테이블로 데이터 복사본을 만들거나 원본 테이블 작업이 온라인 상태 인 테이블의 백업 복사본을 만드는 간단한 방법입니다.

예를 들어 EMPLOYEES 테이블에서 EMP_HISTORY 테이블로 데이터를 복사 할 수 있습니다.

INSERT INTO EMP_HISTORY
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, SALARY, DEPARTMENT_ID
FROM employees;

UPDATE 문

UPDATE 명령은 열에 저장된 데이터를 수정하며 WHERE 절에 지정된 조건으로 필터링 된 결과 집합에 따라 한 번에 하나 또는 여러 행을 업데이트 할 수 있습니다. 열 업데이트는 열 변경과 다릅니다. 이 장의 앞부분에서 ALTER 명령을 살펴 보았습니다. ALTER 명령은 테이블 구조를 변경하지만 테이블 데이터에는 영향을주지 않습니다. UPDATE 명령은 테이블 구조가 아닌 테이블의 데이터를 변경합니다.

통사론:

UPDATE table
SET column = value [, column = value ...]
[WHERE condition]

구문에서

SET column = expression은 지정된 열 이름의 데이터를 업데이트 할 문자, 수식 또는 함수의 모든 조합이 될 수 있습니다. WHERE 절은 선택 사항이지만 포함 된 경우 업데이트 할 행을 지정합니다. UPDATE 명령으로 한 번에 업데이트됩니다.

아래의 UPDATE 문은 직원 JOHN의 급여를 5000으로 업데이트합니다.

UPDATE employees
SET salary = 5000
WHERE UPPER (first_name) = 'JOHN';

WHERE 술어는 선택 사항이지만 테이블의 필수 행만 수정하려면 논리적으로 추가해야합니다. 아래의 UPDATE 문은 테이블에있는 모든 직원의 급여를 업데이트합니다.

UPDATE employees
SET salary = 5000;

쉼표로 구분 된 SET 절에 여러 열을 지정하여 여러 열을 업데이트 할 수도 있습니다. 예를 들어, JOHN에 대해 급여 및 직무 역할을 각각 5000 및 SALES로 변경해야하는 경우 UPDATE 문은 다음과 같습니다.

UPDATE employees
SET	SALARY = 5000,
	JOB_ID = 'SALES'
WHERE UPPER (first_name) = 'JOHN';

1 row updated.

동일한 행의 여러 열을 업데이트하는 또 다른 방법은 하위 쿼리 사용을 보여줍니다.

UPDATE employees
SET (SALARY, JOB_ID) = (SELECT 5000, 'SALES' FROM DUAL)
WHERE UPPER (ENAME) = 'JOHN'

DELETE 문

DELETE 명령은 가장 간단한 SQL 문 중 하나입니다. 테이블에서 하나 이상의 행을 제거합니다. SQL에서는 여러 테이블 삭제 작업이 허용되지 않으며 DELETE 명령 구문은 다음과 같습니다.

DELETE FROM table_name
    [WHERE condition];

DELETE 명령은 선택적 WHERE 절의 조건을 충족하는 테이블의 모든 행을 삭제합니다. WHERE 절은 선택 사항이므로 WHERE 절은 DELETE 작업의 범위를 제한하므로 WHERE 절을 생략하여 테이블에서 모든 행을 쉽게 삭제할 수 있습니다.

아래 DELETE 문은 EMP 테이블에서 EDWIN의 세부 정보를 제거합니다.

DELETE employees
WHERE UPPER (ENAME) = 'EDWIN'

1 row deleted.

참고 : DELETE [TABLE NAME] 및 DELETE FROM [TABLE NAME]은 동일한 의미를가집니다.

조건부 삭제 문의 WHERE 조건은 아래와 같이 하위 쿼리를 사용할 수 있습니다.

DELETE FROM employees
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
				    FROM LOCATIONS
				    WHERE LOCATION_CODE = 'SFO')

자르기

Truncate는 테이블에서 모든 레코드를 플러시하지만 테이블 구조를 유지하는 데 사용되는 DDL 명령입니다. 선택한 레코드를 제거하는 WHERE 조건을 지원하지 않습니다.

통사론:

TRUNCATE [table name]

자동 커밋입니다. 즉, 세션에서 현재 활성 트랜잭션을 커밋합니다. 테이블을 잘라도 종속 인덱스, 트리거 또는 테이블 제약 조건은 삭제되지 않습니다. 테이블 A가 데이터베이스에있는 테이블 B의 참조 제약 조건의 상위 인 경우 테이블 A를자를 수 없습니다.

트랜잭션

트랜잭션은 데이터베이스에서 수행되는 논리적 작업 단위입니다. 다음을 포함 할 수 있습니다.

  • TCL 명령 (예 : COMMIT 또는 ROLLBACK)으로 끝나는 여러 DML 명령

  • 하나의 DDL 명령

  • 하나의 DCL 명령

트랜잭션 시작은 첫 번째 DML 명령으로 표시됩니다. TCL, DDL 또는 DCL 명령으로 끝납니다. TCL 명령, 즉 COMMIT 또는 ROLLBACK은 활성 트랜잭션을 종료하기 위해 명시 적으로 실행됩니다. 기본 동작으로 인해 DDL 또는 DCL 명령이 데이터베이스 세션에서 실행되는 경우 세션에서 진행중인 활성 트랜잭션을 커밋합니다. 데이터베이스 인스턴스가 비정상적으로 충돌하면 트랜잭션이 중지됩니다.

COMMIT, ROLLBACK 및 SAVEPOINT는 트랜잭션 제어 언어입니다. COMMIT는 데이터 변경 사항을 데이터베이스에 영구적으로 적용하고 ROLLBACK은 안티 커밋 작업을 수행합니다. SAVEPOINT는 서로 다른 트랜잭션 단계에서 마커를 설정하여 일련의 트랜잭션을 제어합니다. 사용자는 현재 트랜잭션을 이전에 설정 한 원하는 저장 지점으로 롤백 할 수 있습니다.

COMMIT-Commit은 데이터 변경 사항을 데이터베이스 테이블에 영구적으로 적용하여 현재 활성 트랜잭션을 종료합니다. COMMIT는 명시 적으로 트랜잭션을 종료하는 TCL 명령입니다. 그러나 DDL 및 DCL 명령은 암시 적으로 트랜잭션을 커밋합니다.

SAVEPOINT-세이브 포인트는 세션에서 현재 트랜잭션의 특정 지점을 표시하는 데 사용됩니다. 트랜잭션의 논리적 마커이므로 데이터 사전에서 세이브 포인트를 쿼리 할 수 ​​없습니다.

ROLLBACK-ROLLBACK 명령은 데이터 변경 사항을 삭제하여 전체 트랜잭션을 종료하는 데 사용됩니다. 트랜잭션에 표시된 저장 점이 포함 된 경우 ROLLBACK TO SAVEPOINT [name]을 사용하여 트랜잭션을 지정된 저장 점까지만 롤백 할 수 있습니다. 결과적으로 지정된 저장 점까지의 모든 데이터 변경 사항이 삭제됩니다.

데모

매년 1 분기에 새로 고용 된 직원 세부 정보로 채워지는 EMPLOYEES 테이블을 고려하십시오. 사무 직원은 데이터 공급 활동 중 언제든지 결함이있는 데이터를 롤백 할 수 있도록 각 직원 세부 정보에 저장 점을 추가합니다. 그는 직원 이름과 동일한 세이브 포인트 이름을 유지합니다.

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (105, 'Allen',TO_DATE ('15-JAN-2013','SALES',10000,10);

SAVEPOINT Allen;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',10000,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',12000,30);

SAVEPOINT McMan;

데이터 공급 운영자가 '케이트'와 '맥맨'의 급여를 잘못 입력했음을 알게되었다고 가정 해 보겠습니다. 그는 활성 트랜잭션을 저장 점 Kate로 롤백하고 Kate 및 McMan의 직원 세부 정보를 다시 입력합니다.

ROLLBACK TO SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',12500,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',13200,30);

SAVEPOINT McMan;

데이터 입력이 완료되면 현재 세션에서 COMMIT를 실행하여 전체 트랜잭션을 커밋 할 수 있습니다.

일관성 읽기

Oracle은 데이터 액세스 및 읽기 / 쓰기 작업 측면에서 각 세션의 사용자간에 일관성을 유지합니다.

테이블에서 DML이 발생하면 작업에 의해 변경된 원래 데이터 값이 데이터베이스 실행 취소 레코드에 기록됩니다. 트랜잭션이 데이터베이스에 커밋되지 않는 한 나중에 수정 된 데이터를 쿼리하는 다른 세션의 모든 사용자는 원래 데이터 값을 봅니다. Oracle은 시스템 전역 영역의 현재 정보와 실행 취소 레코드의 정보를 사용하여 쿼리에 대한 테이블 데이터의 읽기 일관성보기를 구성합니다. 트랜잭션이 커밋 된 경우에만 트랜잭션 변경 사항이 영구적으로 적용됩니다. 트랜잭션은 읽기 일관성을 제공하기위한 Oracle 전략의 핵심입니다.

읽기 일관된보기의 시작점이 독자를 대신하여 생성됩니다.

읽기 또는 업데이트를 위해 데이터베이스의 다른 트랜잭션에서 수정 된 데이터를 볼 수있는시기를 제어합니다.