Oracle PL/SQL 삽입, 업데이트, 삭제 및 선택 [예]

⚡ 스마트 요약

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

  • ⚙️ DML 명령어: INSERT, UPDATE, DELETE 및 SELECT INTO는 PL/SQL 블록 내에서 모든 데이터 조작 작업을 수행합니다.
  • 데이터 삽입: INSERT INTO는 명시적인 값을 사용하여 행을 추가하거나 SELECT를 사용하여 다른 테이블에서 직접 행을 추가합니다.
  • 🔄 데이터 업데이트: UPDATE 절에 SET 절을 추가하면 열 값이 변경되고, 선택적으로 WHERE 절을 사용하면 변경 대상 행을 제한할 수 있습니다.
  • 🗑️ 데이터 삭제: DELETE 문은 일치하는 레코드를 제거하고, WHERE 절을 생략하면 테이블 전체가 비워집니다.
  • 🎯 다음으로 선택하세요: SELECT INTO는 정확히 한 행을 반환해야 합니다. Oracle NO_DATA_FOUND 또는 TOO_MANY_ROWS 오류가 발생합니다.
  • 🤖 AI 지원: GitHub Copilot과 같은 AI 도우미는 DML 블록을 작성하고 WHERE 절이나 COMMIT 절이 누락되었음을 표시합니다.

Oracle PL/SQL 삽입 업데이트 삭제 선택

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 블록을 보여줍니다.

Oracle emp 테이블에 대한 삽입, 업데이트, 삭제 및 선택 작업을 수행하는 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행: 가져온 레코드 값을 표시합니다.

자주 묻는 질문

아니요. 정적 PL/SQL은 DDL을 직접 실행할 수 없습니다. 문장을 문자열로 구성한 다음 실행하세요. 즉시 실행이는 실행 시점에 생성, 변경 및 삭제 작업을 처리합니다.

SELECT INTO 문은 정확히 한 행만 반환해야 합니다. 여러 행을 읽으려면 명시적인 SELECT INTO 문을 사용하십시오. 커서 FETCH 루프를 사용하거나 BULK COLLECT를 사용하여 컬렉션에 저장합니다.

DELETE는 DML(문서 기반 실행)입니다. WHERE 절을 사용하여 선택한 행을 삭제하며 롤백이 가능합니다. TRUNCATE는 DDL(문서 기반 실행)입니다. 모든 행을 즉시 삭제하고 자동 커밋되며 되돌릴 수 없습니다.

예. 삽입, 업데이트 및 삭제 작업 내용은 사용자가 직접 수정할 때까지 세션에 유지됩니다. COMMITPL/SQL은 자동 커밋을 지원하지 않습니다. 저장하려면 COMMIT을 사용하고, 취소하려면 ROLLBACK을 사용하십시오.

MERGE 문은 별도의 UPDATE 및 INSERT 문을 사용하는 대신, 조인 조건과 일치하는 행을 업데이트하고 일치하지 않는 행을 삽입하는 업서트 작업을 단일 문으로 수행합니다.

`RETURNING INTO`는 `INSERT`, `UPDATE`, `DELETE` 작업이 방금 수행한 행의 열 값을 가져와 변수에 저장하므로 변경된 데이터를 읽기 위한 추가 `SELECT` 작업을 방지합니다.

예. GitHub 부조종사 간단한 설명에서 INSERT, UPDATE, DELETE 및 SELECT INTO 블록 초안을 작성하고, 바인드 변수를 제안하며, 열 목록을 완성합니다. 단, 먼저 논리를 검토해야 합니다.

AI 어시스턴트는 DML 코드에서 누락된 WHERE 절, COMMIT 문, 안전하지 않은 문자열 연결 등을 검사하고 수정 사항을 제안하며 오류를 설명합니다. 이러한 머신러닝 기반 검토를 통해 위험한 변경 사항이 프로덕션 환경에 배포되기 전에 이를 감지할 수 있습니다.

이 게시물을 요약하면 다음과 같습니다.