Oracle Typ rekordów PL/SQL z przykładami

⚡ Inteligentne podsumowanie

Typ rekordu PL/SQL to złożony typ danych, który grupuje kilka kolumn, z których każda ma własną nazwę i typ danych, w jeden nowy typ. Rekord można zdefiniować na poziomie bazy danych jako obiekt składowany lub wewnątrz podprogramu, a do jego pól można uzyskać dostęp za pomocą operatora kropki.

  • 🧱 Definicja: Typ rekordu grupuje jedną lub więcej kolumn w jeden nowy typ danych.
  • 🔑 słowo kluczowe: Słowo kluczowe TYPE informuje kompilator, że tworzony jest nowy typ danych.
  • 🏛️. Dwa poziomy: Rekord na poziomie bazy danych jest obiektem przechowywanym; rekord na poziomie podprogramu jest widoczny tylko wewnątrz tego podprogramu.
  • 🔗 Dostęp terenowy: Dostęp do pól record_variable.column_name uzyskuje się za pomocą operatora kropki.
  • 📥 Poziom kolumny: Wartości mogą być przypisywane tylko do jednego pola na raz.
  • 📦 Poziom wiersza: Instrukcja SELECT INTO umożliwia wypełnienie całego rekordu wierszem tabeli.
  • 🧩 Rodzaje rekordów: %ROWTYPE oparte na tabeli, %ROWTYPE oparte na kursorze i rekordy zdefiniowane przez programistę.

Oracle Typ rekordu PL/SQL

Co to jest typ rekordu?

Typ rekordu to złożony typ danych, który pozwala programiście na utworzenie nowego typu danych o pożądanej strukturze kolumn. Jego główne cechy to:

  • Grupuje jedną lub więcej kolumn, tworząc nowy typ danych.
  • Każda z tych kolumn ma swoją własną nazwę i typ danych.
  • Typ rekordu może akceptować dane jako pojedynczy rekord składający się z wielu kolumn lub może akceptować wartość dla jednej konkretnej kolumny rekordu.
  • Typ rekordu to po prostu nowy typ danych. Po utworzeniu jest on zapisywany jako nowy typ danych i może być używany do deklarowania zmiennej w programach.
  • Używa słowa kluczowego 'TYP' aby poinformować kompilator, że tworzony jest nowy typ danych.
  • Można go utworzyć w poziom bazy danych, przechowywane jako obiekt bazy danych i używane w całej bazie danych lub w poziom podprogramu, widoczne tylko wewnątrz podprogramu.
  • Typ rekordu na poziomie bazy danych można również zadeklarować dla kolumn tabeli, dzięki czemu pojedyncza kolumna będzie mogła przechowywać złożone dane.
  • Dostęp do danych uzyskuje się poprzez odwołanie się do nazwy zmiennej, następnie operatora okresu (.), a następnie nazwy kolumny, jako ' . '.

Składnia deklaracji typu rekordu

Składnia deklaracji na poziomie bazy danych:

Deklaracja typu rekordu na poziomie bazy danych

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

W pierwszej składni słowo kluczowe „CREATE TYPE” instruuje kompilator, aby utworzył typ rekordu o nazwie „type_name_db” z określonymi kolumnami jako obiekt bazy danych. Jest to podawane jako pojedyncza instrukcja, a nie w bloku.

Składnia deklaracji na poziomie podprogramu:

Deklaracja typu rekordu na poziomie podprogramu

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

W tej składni tworzymy typ rekordu o nazwie „type_name” tylko wewnątrz podprogramu. W obu metodach sposób definiowania kolumny i typu danych jest podobny.

Przykład 1: Typ rekordu jako obiekt bazy danych

W tym programie pokażemy, jak utworzyć typ rekordu jako obiekt bazy danych. Tworzymy typ rekordu „emp_det” z czterema kolumnami. Kolumny i ich typy danych to:

  • EMP_NO (NUMBER)
  • EMP_NAME (VARCHAR2 (150))
  • MENEDŻER (NUMER)
  • WYNAGRODZENIE (LICZBA)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Wyjście:

Type created

Code Wyjaśnienie

  • Powyższy kod tworzy typ emp_det jako obiekt bazy danych.
  • Zawiera 4 kolumny: emp_no, emp_name, manager i salary, zgodnie z definicją.
  • Teraz „emp_det” jest podobny do każdego innego typ danych (jak NUMBER lub VARCHAR2) i jest widoczny w całej bazie danych. Można go zatem użyć w dowolnym miejscu bazy danych do zadeklarowania zmiennej tego typu.

Przykład 2: Poziom podprogramu, dostęp na poziomie kolumny

W tym przykładzie pokażemy, jak utworzyć typ rekordu na poziomie podprogramu oraz jak wypełniać go i pobierać z niego wartości według kolumn. Tworzymy typ rekordu „emp_det” na poziomie podprogramu i używamy go do wypełniania i wyświetlania danych.

Przykład dostępu na poziomie kolumny do typu rekordu

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;
/

Wyjście:

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

Code Wyjaśnienie

  • Code wiersz 2-8: Typ rekordu „emp_det” jest zadeklarowany z kolumnami emp_no, emp_name, manager i salary o typie danych NUMBER, VARCHAR2, NUMBER i NUMBER.
  • Code linia 9: Zmienna guru99_emp_rec jest zadeklarowana jako typ danych „emp_det”. zmienna może przechowywać wartość zawierającą wszystkie cztery pola.
  • Code linia 11: Wypełnianie pola „emp_no” w „guru99_emp_rec” wartością 1001.
  • Code linia 12: Wypełnianie pola „emp_name” wartością XXX.
  • Code linia 13: Wypełnianie pola „menedżer” wartością 1000.
  • Code linia 14: Wypełnianie pola „wynagrodzenie” wartością 10000.
  • Code wiersz 15-19: Wyświetlanie wartości 'guru99_emp_rec' na wyjściu.

Przykład 3: Poziom podprogramu, dostęp na poziomie wiersza

W tym przykładzie pokazujemy, jak utworzyć typ rekordu na poziomie podprogramu i wypełnić go na poziomie wiersza. Tworzymy typ rekordu „emp_det” na poziomie podprogramu i używamy go do wypełniania i wyświetlania danych.

Przykład dostępu na poziomie wiersza do typu rekordu

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 Wyjaśnienie

  • Code wiersz 2-8: Typ rekordu „emp_det” jest zadeklarowany z kolumnami emp_no, emp_name, manager i salary o typie danych NUMBER, VARCHAR2, NUMBER i NUMBER.
  • Code linia 9: Zmienna guru99_emp_rec jest zadeklarowana jako typ danych „emp_det” i może zawierać wszystkie cztery pola.
  • Code linia 11: Wypełnianie tabeli emp wartościami 1002 jako emp_no, YYY jako emp_name, 15000 jako salary i 1000 jako numer menedżera.
  • Code linia 12: Zatwierdzanie transakcji wstawiania.
  • Code linia 13: Wypełnianie zmiennej „guru99_emp_rec” na poziomie wiersza z zapytania SELECT dla pracownika nr 1002.
  • Code wiersz 15-19: Wyświetlanie wartości 'guru99_emp_rec' na wyjściu.

Wyjście:

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

Uwaga: Dostęp do typu rekordu jest możliwy tylko na poziomie kolumny podczas przekierowywania jego wartości do dowolnego trybu wyjściowego. Należy zauważyć, że w tym przykładzie kolejność na liście SELECT nie odpowiada kolejności pól rekordu, dlatego wartości wynagrodzenia i menedżera są zamienione w wynikach.

Typy rekordów PL/SQL

Poza zdefiniowanym przez programistę rekordem pokazanym powyżej, Oracle Oferuje dwa rodzaje zakotwiczonych rekordów, które automatycznie kopiują swoją strukturę. Użycie ich pozwala uniknąć ponownego deklarowania kolumn i utrzymuje rekord w zgodzie z tabelą lub kursorem, na którym się opiera.

Rodzaj rekordu Zadeklarowano z Struktura pochodzi z
Rekord oparty na tabeli nazwa_tabeli%ROWTYPE Wszystkie kolumny tabeli
Rekord oparty na kursorze nazwa_kursora%ROWTYPE Lista wyboru kursora
Rekord zdefiniowany przez programistę TYP … JEST REKORDEM Kolumny, które wymieniasz ręcznie

Rekord %ROWTYPE jest najbezpieczniejszym wyborem, gdy kształt powinien następować po tabeli lub kursor, ponieważ zmiana kolumny jest automatycznie wykrywana podczas kolejnej kompilacji.

FAQ

Rekord grupuje różne kolumny o potencjalnie różnych typach w jedną strukturę przypominającą wiersz. Kolekcja zawiera wiele elementów tego samego typu indeksowanych indeksem dolnym. Często są one łączone, tworząc zbiór rekordów.

%ROWTYPE deklaruje rekord, którego pola automatycznie pasują do tabeli lub kursora. Użyj go, gdy rekord powinien odzwierciedlać to źródło, aby zmiana kolumny była widoczna bez edytowania deklaracji.

Tak, jeśli oba rekordy są tego samego typu. Polecenie SELECT INTO może również wypełnić cały rekord z wiersza tabeli, pod warunkiem, że kolejność na liście wyboru jest zgodna z kolejnością pól w rekordzie.

Tak. Sztuczna inteligencja może odczytać definicję tabeli i wygenerować pasujący blok TYPE … IS RECORD lub zarekomendować %ROWTYPE, jeśli preferowany jest aktywny link do tabeli. Przed użyciem należy zweryfikować typy danych.

Rekord na poziomie bazy danych jest tworzony za pomocą polecenia CREATE TYPE i przechowywany jako obiekt widoczny w całej bazie danych. Rekord na poziomie podprogramu jest deklarowany wewnątrz bloku i istnieje tylko w obrębie tego podprogramu.

Podsumuj ten post następująco: