Oracle PL/SQL 레코드 유형(예 포함)
⚡ 스마트 요약
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 레코드가 가장 안전한 선택입니다. 커서컬럼 변경 사항은 다음 컴파일 시 자동으로 반영되기 때문입니다.




