Oracle PL/SQL 레코드 유형(예 포함)

⚡ 스마트 요약

PL/SQL 레코드 타입은 여러 열을 하나의 새로운 타입으로 묶는 복합 데이터 타입입니다. 레코드는 데이터베이스 수준에서 저장된 객체로 정의하거나 서브프로그램 내에서 정의할 수 있으며, 필드는 점 연산자(.)를 사용하여 접근할 수 있습니다.

  • 🧱 정의: 레코드 유형은 하나 이상의 열을 하나의 새로운 데이터 유형으로 그룹화합니다.
  • 🔑 예어: TYPE 키워드는 컴파일러에게 새로운 데이터 형식이 생성되고 있음을 알려줍니다.
  • 🏛️ 두 가지 수준: 데이터베이스 수준 레코드는 저장된 객체이고, 서브프로그램 수준 레코드는 해당 서브프로그램 내부에서만 볼 수 있습니다.
  • 🔗 현장 접근 권한: 필드는 점 연산자를 사용하여 record_variable.column_name 형식으로 접근할 수 있습니다.
  • 📥 컬럼 레벨: 한 번에 하나의 필드에만 값을 할당할 수 있습니다.
  • 📦 행 수준: SELECT INTO 문을 사용하면 테이블의 한 행에서 전체 레코드를 가져올 수 있습니다.
  • 🧩 기록 종류: 테이블 기반 %ROWTYPE, 커서 기반 %ROWTYPE 및 프로그래머 정의 레코드.

Oracle PL/SQL 레코드 유형

레코드 유형이란 무엇인가요?

레코드 타입은 프로그래머가 원하는 열 구조를 가진 새로운 데이터 타입을 생성할 수 있도록 하는 복합 데이터 타입입니다. 주요 특징은 다음과 같습니다.

  • 하나 이상의 열을 그룹화하여 새로운 데이터 형식을 만듭니다.
  • 각 열에는 고유한 이름과 데이터 형식이 있습니다.
  • 레코드 유형은 여러 열로 구성된 단일 레코드 형태의 데이터를 허용하거나, 레코드의 특정 열 하나에 대한 값만을 허용할 수 있습니다.
  • 레코드 타입은 간단히 말해 새로운 데이터 타입입니다. 생성되면 새로운 데이터 타입으로 저장되며 프로그램에서 변수를 선언하는 데 사용할 수 있습니다.
  • 키워드를 사용합니다. '유형' 컴파일러에게 새로운 데이터 형식이 생성되고 있음을 알리기 위해서입니다.
  • 그것은 다음에서 생성될 수 있습니다. 데이터베이스 수준데이터베이스 객체로 저장되어 데이터베이스 전체에서 사용되거나 특정 위치에서 사용됩니다. 하위 프로그램 수준서브 프로그램 내부에서만 볼 수 있습니다.
  • 테이블 열에 대해 데이터베이스 수준의 레코드 유형을 선언할 수도 있으므로 단일 열에 복잡한 데이터를 저장할 수 있습니다.
  • 데이터에 접근하려면 변수 이름 다음에 마침표 연산자(.)를 붙이고, 마지막으로 열 이름을 입력하는 방식으로 '를 사용합니다. . '.

레코드 형식을 선언하는 구문

데이터베이스 수준 선언 구문:

데이터베이스 수준에서의 레코드 유형 선언

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

첫 번째 구문에서 'CREATE TYPE' 키워드는 컴파일러에게 지정된 열을 가진 "type_name_db"라는 레코드 유형을 데이터베이스 객체로 생성하도록 지시합니다. 이는 블록 내부에 있는 것이 아니라 독립적인 문장으로 제공됩니다.

서브프로그램 수준에서의 선언 구문:

서브프로그램 수준에서의 레코드 유형 선언

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

이 구문에서는 서브프로그램 내부에서만 "type_name"이라는 이름의 레코드 유형을 생성합니다. 두 방법 모두 열과 데이터 유형을 정의하는 방식은 유사합니다.

예시 1: 데이터베이스 객체로서의 레코드 유형

이 프로그램에서는 레코드 타입을 데이터베이스 객체로 생성하는 방법을 살펴봅니다. 'emp_det'라는 레코드 타입을 네 개의 열로 생성합니다. 각 열과 해당 데이터 타입은 다음과 같습니다.

  • EMP_NO(NUMBER)
  • EMP_NAME(VARCHAR2 (150))
  • 관리자(번호)
  • 급여 (숫자)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

출력:

Type created

Code 설명

  • 위 코드는 emp_det 타입의 데이터베이스 객체를 생성합니다.
  • 정의된 대로 emp_no, emp_name, manager, salary의 4개 열로 구성됩니다.
  • 이제 'emp_det'는 다른 것들과 비슷합니다. 데이터 형식 (NUMBER 또는 VARCHAR2와 같은) 특정 유형의 변수는 데이터베이스 전체에서 사용 가능합니다. 따라서 데이터베이스 어디에서든 이 유형의 변수를 선언하는 데 사용할 수 있습니다.

예제 2: 서브프로그램 수준, 열 수준 접근

이 예제에서는 서브프로그램 수준에서 레코드 유형을 생성하고 열을 기준으로 값을 채우고 가져오는 방법을 보여줍니다. 서브프로그램 수준에서 'emp_det' 레코드 유형을 생성하고 이를 사용하여 데이터를 채우고 표시합니다.

레코드 유형 열 수준 액세스 예시

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

출력:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code 설명

  • Code 2-8행: 'emp_det' 레코드 유형은 emp_no, emp_name, manager, salary 열로 선언되었으며, 각 열의 데이터 유형은 NUMBER, VARCHAR2, NUMBER, NUMBER입니다.
  • Code 9행: guru99_emp_rec 변수는 'emp_det' 데이터 타입으로 선언되었습니다. 변수 네 가지 필드를 모두 포함하는 값을 저장할 수 있습니다.
  • Code 11행: 'guru99_emp_rec'의 'emp_no' 필드를 값 1001로 채웁니다.
  • Code 12행: 'emp_name' 필드에 XXX 값을 입력합니다.
  • Code 13행: '관리자' 필드에 1000이라는 값을 입력합니다.
  • Code 14행: '급여' 필드에 10000이라는 값을 입력합니다.
  • Code 15-19행: 'guru99_emp_rec' 값을 출력에 표시합니다.

예제 3: 서브프로그램 수준, 행 수준 접근

이 예제에서는 서브프로그램 수준에서 레코드 유형을 생성하고 행 수준에서 데이터를 채우는 방법을 보여줍니다. 서브프로그램 수준에서 'emp_det' 레코드 유형을 생성하고 이를 사용하여 데이터를 채우고 표시합니다.

레코드 유형 행 수준 액세스 예시

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code 설명

  • Code 2-8행: 'emp_det' 레코드 유형은 emp_no, emp_name, manager, salary 열로 선언되었으며, 각 열의 데이터 유형은 NUMBER, VARCHAR2, NUMBER, NUMBER입니다.
  • Code 9행: guru99_emp_rec 변수는 'emp_det' 데이터 형식으로 선언되었으며 네 가지 필드를 모두 저장할 수 있습니다.
  • Code 11행: emp 테이블에 emp_no를 1002, emp_name을 YYY 형식으로, salary를 15000, manager number를 1000으로 채웁니다.
  • Code 12행: 삽입 트랜잭션을 커밋합니다.
  • Code 13행: 직원 번호 1002에 대한 선택 쿼리 결과를 행 단위로 'guru99_emp_rec' 변수에 채웁니다.
  • Code 15-19행: 'guru99_emp_rec' 값을 출력에 표시합니다.

출력:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

참고 : 레코드 유형은 값을 출력 모드로 리디렉션할 때 열 수준에서만 접근할 수 있습니다. 이 예에서 SELECT 목록 순서가 레코드 필드 순서와 일치하지 않기 때문에 출력에서 ​​급여와 관리자 값이 서로 바뀌어 나타납니다.

PL/SQL 레코드 유형

위에 표시된 프로그래머가 정의한 기록 외에도, Oracle 구조를 자동으로 복사하는 두 가지 앵커 레코드 유형을 제공합니다. 이를 사용하면 열을 다시 선언할 필요가 없으며 레코드가 기반이 되는 테이블 또는 커서와 항상 일치하는 상태를 유지합니다.

레코드 종류 선언됨 구조는 다음에서 비롯됩니다.
테이블 기반 레코드 테이블 이름%ROWTYPE 테이블의 모든 열
커서 기반 레코드 커서 이름%ROWTYPE 커서의 선택 목록
프로그래머가 정의한 레코드 유형 …은 기록입니다 수동으로 나열하는 열

형태가 테이블이나 특정 형식을 따라야 할 경우 %ROWTYPE 레코드가 가장 안전한 선택입니다. 커서컬럼 변경 사항은 다음 컴파일 시 자동으로 반영되기 때문입니다.

자주 묻는 질문

레코드는 서로 다른 데이터 유형을 가진 여러 열을 하나의 행과 같은 구조로 그룹화합니다. 컬렉션은 동일한 데이터 유형의 여러 요소를 첨자로 인덱싱하여 저장합니다. 레코드와 컬렉션은 종종 결합되어 레코드 모음이 됩니다.

%ROWTYPE은 테이블 또는 커서의 필드와 자동으로 일치하는 레코드를 선언합니다. 레코드가 해당 소스를 그대로 반영해야 할 때 사용하며, 이렇게 하면 선언을 수정하지 않고도 열 변경 사항이 반영됩니다.

네, 두 레코드의 데이터 유형이 동일하다면 가능합니다. SELECT INTO 문을 사용하면 선택 목록의 순서가 레코드의 필드 순서와 일치하는 경우 테이블 행에서 전체 레코드를 채울 수도 있습니다.

예. AI는 테이블 정의를 읽어 일치하는 TYPE … IS RECORD 블록을 생성하거나, 테이블에 대한 실시간 링크가 더 적합한 경우 %ROWTYPE을 추천할 수 있습니다. 사용 전에 데이터 유형을 확인하십시오.

데이터베이스 수준 레코드는 `CREATE TYPE` 문을 사용하여 생성되며 데이터베이스 전체에서 접근 가능한 객체로 저장됩니다. 서브프로그램 수준 레코드는 블록 내부에 선언되며 해당 서브프로그램 내에서만 존재합니다.

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