Oracle PL/SQL 삽입, 업데이트, 삭제 및 선택 [예]
⚡ 스마트 요약
SQL 문 내부 Oracle PL/SQL은 모든 데이터 조작 작업을 처리하여 블록에서 직접 행을 삽입, 업데이트, 삭제 및 선택할 수 있도록 합니다. INSERT, UPDATE, DELETE 및 SELECT INTO 명령은 데이터베이스 내에서 데이터를 이동하고 검색합니다.

PL/SQL의 DML 트랜잭션
DML은 데이터 조작 언어(Data Manipulation Language)의 약자로, 여러 언어들이 모여 이루어진 언어 그룹입니다. SQL 테이블에 저장된 데이터를 변경하는 명령입니다. PL/SQL 블록이러한 명령어는 조작 작업을 수행하고, PL/SQL은 주변 논리를 제공합니다. DML은 아래와 같은 작업을 처리합니다.
- 데이터 삽입
- 데이터 업데이트
- 데이터 삭제
- 데이터 선택
PL/SQL에서는 데이터 조작이 오직 SQL 명령어를 통해서만 수행됩니다.
데이터 삽입
PL/SQL에서 테이블에 행을 추가하는 SQL 명령은 INSERT INTO입니다. 이 명령은 테이블 이름, 대상 열, 그리고 열 값을 입력으로 받아 기본 테이블에 값을 삽입합니다.
INSERT 명령은 각 열의 값을 지정하는 대신 SELECT 문을 사용하여 다른 테이블에서 값을 직접 가져올 수도 있습니다. SELECT 문을 사용하면 원본 테이블에 있는 행 수만큼 한 번에 삽입할 수 있습니다.
구문 :
BEGIN INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>) VALUES(<value1>,<value2>,...,<value_n>); END;
위 구문은 INSERT INTO 명령을 보여줍니다. 테이블 이름과 값은 필수 필드이지만, INSERT 문에서 테이블의 모든 열에 값을 제공하는 경우 열 이름은 선택 사항입니다. 위와 같이 값을 개별적으로 지정할 때는 키워드 VALUES가 필수입니다.
구문 :
BEGIN INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>) SELECT <column1>,<column2>,...,<column_n> FROM <table_name2>; END;
이 두 번째 형태의 INSERT INTO는 값을 직접 가져옵니다. SELECT 명령을 사용합니다. 값은 별도로 제공되지 않으므로 VALUES 키워드는 여기에 있으면 안 됩니다.
데이터 업데이트
데이터 업데이트란 기존 행의 특정 열 값을 변경하는 것을 의미합니다. 이는 UPDATE 문을 사용하여 수행되며, 이 문은 테이블 이름, 열 이름, 그리고 새로운 값을 입력으로 받아 데이터를 업데이트합니다.
구문 :
BEGIN UPDATE <table_name> SET <column1>=<value1>,<column2>=<value2>,<column_n>=<value_n> WHERE <condition that uniquely identifies the record that needs to be updated>; END;
위 구문은 UPDATE 문을 보여줍니다. SET 키워드는 PL/SQL 엔진에게 지정된 값으로 해당 열을 업데이트하도록 지시합니다. WHERE 절은 선택 사항이며, 지정하지 않으면 해당 열의 값이 테이블 전체에서 업데이트됩니다.
데이터 삭제
데이터 삭제란 데이터베이스 테이블에서 하나의 레코드를 완전히 제거하는 것을 의미합니다. 이를 위해 DELETE 명령어가 사용됩니다.
구문 :
BEGIN DELETE FROM <table_name> WHERE <condition that uniquely identifies the record that needs to be deleted>; END;
위 구문은 DELETE 명령을 보여줍니다. FROM 키워드는 선택 사항이며, FROM 절이 있든 없든 명령은 동일하게 작동합니다. WHERE 절 또한 선택 사항이며, 지정하지 않으면 테이블의 모든 항목이 삭제됩니다.
데이터 선택
데이터 프로젝션 또는 페칭은 데이터베이스 테이블에서 필요한 데이터를 가져오는 것을 의미합니다. 이는 SELECT 명령과 INTO 절을 함께 사용하여 수행됩니다. SELECT 명령은 데이터베이스에서 값을 가져오고, INTO 절은 가져온 값을 PL/SQL 블록의 로컬 변수에 할당합니다.
SELECT 문과 INTO 절을 함께 사용할 때 다음 사항들을 고려해야 합니다.
- SELECT 문은 INTO 절을 사용할 때 하나의 변수에 하나의 값만 저장할 수 있으므로 하나의 레코드만 반환해야 합니다. SELECT 문이 두 개 이상의 행을 반환하는 경우, TOO_MANY_ROWS 예외 제기됩니다.
- SELECT 문은 INTO 절에서 변수에 값을 할당하므로, 값을 채우려면 최소한 하나의 레코드가 필요합니다. 레코드를 찾지 못하면 NO_DATA_FOUND 예외가 발생합니다.
- SELECT 절의 열 개수와 데이터 형식은 INTO 절의 변수 개수와 데이터 형식과 일치해야 합니다.
- 명령문에 언급된 것과 동일한 순서로 값을 가져와서 채웁니다.
- WHERE 절은 선택 사항이며, 가져오는 레코드에 더 많은 제약을 설정할 수 있도록 해줍니다.
- SELECT 문은 다른 DML 문의 WHERE 조건에 사용하여 조건 값을 정의할 수 있습니다.
- INSERT, UPDATE 또는 DELETE 문 내에서 사용되는 SELECT 문에는 INTO 절이 포함되어서는 안 됩니다. 왜냐하면 해당 경우에는 변수에 값을 채우지 않기 때문입니다.
구문 :
BEGIN SELECT <column1>,...,<column_n> INTO <variable1>,...,<variable_n> FROM <table_name> WHERE <condition to fetch the required records>; END;
위 구문은 SELECT-INTO 명령어를 보여줍니다. FROM 키워드는 필수이며, 데이터를 가져올 테이블을 지정합니다. WHERE 절은 선택 사항이며, 생략하면 해당 테이블의 모든 데이터가 가져와집니다.
예 1 : 이 예제에서는 PL/SQL에서 DML 작업을 수행하는 방법을 살펴보겠습니다. 아래 네 개의 레코드를 emp 테이블에 삽입해 보겠습니다.
| EMP_NAME | EMP_NO | 봉급 | MANAGER |
|---|---|---|---|
| BBB | 1000 | 25000 | AAA |
| 트리플 엑스 | 1001 | 10000 | BBB |
| YYY | 1002 | 10000 | BBB |
| Zzz | 1003 | 7500 | BBB |
다음으로 'XXX'의 급여를 15000으로 업데이트하고, 직원 기록 'ZZZ'를 삭제한 후, 마지막으로 직원 'XXX'의 상세 정보를 표시합니다.
아래 스크린샷은 이 예제에 사용된 전체 PL/SQL 블록을 보여줍니다.
DECLARE l_emp_name VARCHAR2(250); l_emp_no NUMBER; l_salary NUMBER; l_manager VARCHAR2(250); BEGIN INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('BBB',1000,25000,'AAA'); INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('XXX',1001,10000,'BBB'); INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('YYY',1002,10000,'BBB'); INSERT INTO emp(emp_name,emp_no,salary,manager) VALUES('ZZZ',1003,7500,'BBB'); COMMIT; Dbms_output.put_line('Values Inserted'); UPDATE EMP SET salary=15000 WHERE emp_name='XXX'; COMMIT; Dbms_output.put_line('Values Updated'); DELETE emp WHERE emp_name='ZZZ'; COMMIT; Dbms_output.put_line('Values Deleted'); SELECT emp_name,emp_no,salary,manager INTO l_emp_name,l_emp_no,l_salary,l_manager FROM emp WHERE emp_name='XXX'; Dbms_output.put_line('Employee Detail'); Dbms_output.put_line('Employee Name:'||l_emp_name); Dbms_output.put_line('Employee Number:'||l_emp_no); Dbms_output.put_line('Employee Salary:'||l_salary); Dbms_output.put_line('Employee Manager Name:'||l_manager); END; /
출력:
Values Inserted Values Updated Values Deleted Employee Detail Employee Name:XXX Employee Number:1001 Employee Salary:15000 Employee Manager Name:BBB
Code 설명 :
- Code 2-5행: 변수를 선언합니다.
- Code 7-14행: 직원 테이블에 레코드를 삽입합니다.
- Code 15행: 삽입 트랜잭션을 커밋합니다.
- Code 17-19행: 직원 'XXX'의 급여를 15000으로 업데이트합니다.
- Code 20행: 업데이트 트랜잭션을 커밋합니다.
- Code 22행: 'ZZZ' 기록을 삭제합니다.
- Code 23행: 삭제 트랜잭션을 커밋합니다.
- Code 25행: 'XXX' 레코드를 선택하고 l_emp_name, l_emp_no, l_salary, l_manager 변수에 값을 할당합니다.
- Code 26-30행: 가져온 레코드 값을 표시합니다.

