Tabele Oracle PLSQL
- Tabele PLSQL są złożonymi typami danych.
- Zachowują się one w taki sam sposób jak tablice, z wyjątkiem tego, że nie mają górnych granic, co pozwala na ich ciągłe rozszerzanie.
- Nazywa się je również indeksem według tabeli
- Tabela PLSQL zawiera dwa elementy
(1) Klucz podstawowy typów danych BINARY_INTEGER, które indeksują tabelę, które nie muszą być kolejnymi. Kolekcja jest rozszerzona o przypisanie wartości do elementu za pomocą wartości indeksu, która aktualnie nie istnieje.
możemy również indeksować za pomocą wartości ciągu
(2) Kolumna skalarnego lub rekordowego typu danych, która przechowuje indeks według elementów tabeli
Jak zdefiniować i zadeklarować typ tabeli
Aby utworzyć tabele PL/SQL, wykonaj dwa kroki. Najpierw definiujesz typ TABLE, a następnie deklarujesz tabele PL/SQL tego typu. Możesz zdefiniować typy TABLE w deklaratywnej części dowolnego bloku, podprogramu lub pakietu za pomocą składni
Syntax TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;
Jeśli typem elementu jest typ rekordu, każde pole w rekordzie musi mieć skalarny typ danych, taki jak CHAR, DATE lub NUMBER.
Aby określić typ elementu, możesz użyć %TYPE, aby podać typ danych zmiennej lub kolumny bazy danych
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;
Możesz dodać ograniczenie NOT NULL do definicji typu TABLE, aby zapobiec przechowywaniu wartości null w tabelach PL/SQL tego typu:
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;
Możesz także użyć %ROWTYPE, aby określić typ elementu.
DECLARE TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
do określenia typu elementu używasz typu ZAPIS zdefiniowanego przez użytkownika:
DECLARE TYPE emp_phonetyp IS RECORD ( Stdcode PLS_INTEGER, phn_number PLS_INTEGER, extension PLS_INTEGER ); TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;
Po zdefiniowaniu typu TABLE możesz zadeklarować tabele PL/SQL tego typu
DECLARE TYPE SalTabTyp IS TABLE OF emp.sal%TYPE INDEX BY BINARY_INTEGER; TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; sal_tab SalTabTyp; -- declare PL/SQL table emp_tab EmpTabTyp; -- declare another PL/SQL table
Atrybuty lub metoda tabeli PLSQL
Tabela PL/SQL ma atrybuty EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT i DELETE.
Sprawiają, że tabele PL/SQL są łatwiejsze w użyciu, a Twoje aplikacje łatwiejsze w utrzymaniu.
plsql_table_name.attribute_name |
Atrybuty istnieją, PRIOR, NEXT i DELETE przyjmują parametry. Każdy parametr musi być wyrażeniem, które daje wartość BINARY_INTEGER lub wartość domyślnie konwertowaną na ten typ danych.
DELETE działa jak procedura, która jest wywoływana jako instrukcja. Jednak inne atrybuty tabeli PL/SQL działają jak funkcja, która jest wywoływana jako część wyrażenia.
Istnieje(n) | Zwróć prawdę, jeśli istnieje n-ty element w tabeli |
liczba | Zwróć liczbę elementów w tabeli |
Pierwszy i ostatni | FIRST i LAST zwracają pierwszą i ostatnią (najmniejszą i największą) liczbę indeksów w tabeli PL/SQL |
PRIOR(n ) | zwraca numer indeksu poprzedzający indeks n w tabeli PL/SQL |
NASTĘPNY(n ) | zwraca numer indeksu, który następuje po indeksie n |
Usuń | DELETE usuwa wszystkie elementy z tabeli PL/SQL. USUŃ(n ) usuwa n element. Jeśli n ma wartość null, DELETE(n ) nic nie robi. USUŃ(m , n ) usuwa wszystkie elementy z zakresu m .. n . Jeśli m jest większy niż n lub jeśli m lub n ma wartość null, DELETE(m , n ) nic nie robi |
Tabele PL/SQL do przenoszenia danych zbiorczych do i z tabel bazy danych lub między aplikacjami po stronie klienta a zapisanymi podprogramami.
Jak wypełnić dane w tabeli PLSQL
Tabele z prostymi typami danych można wypełniać jako:
<variable>(<integer>) := <value>;
Tabele ze złożonymi typami danych będą wymagały kolumn wypełnionych indywidualnie jako:
<variable>(<integer>).<column_name> := <value>;
Lub z kursora:
fetch <cursor_name> into <variable>(<integer>);
Type emptabletype is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;
Możesz pobrać dane Oracle do tabeli PL/SQL na trzy inne sposoby
a) Instrukcja SELECT INTO pozwala wybrać pojedynczy wiersz danych
Używając instrukcji SELECT INTO, możesz wybrać wpis kolumny do elementu skalarnego. Możesz też wybrać cały wiersz do elementu rekordu. W poniższym przykładzie wybierasz wiersz z tabeli bazy danych dept do rekordu przechowywanego przez pierwszy element tabeli PL/SQL dept_tab:
DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;
b) Oświadczenie FETCH
Za pomocą instrukcji FETCH możesz pobrać całą kolumnę danych Oracle do tabeli skalarów PL/SQL.
Możesz też pobrać całą tabelę danych Oracle do tabeli rekordów PL/SQL.
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;
c) pętla kursora FOR umożliwia pobranie wielu wierszy.
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;
Musisz przeczytać te inne posty o PLSQL
Struktura i typy bloków Oracle PLSQL
Rekordy Oracle PLSQL
Pytania dotyczące Oracle PLSQL w rozmowie kwalifikacyjnej
Szybkie samouczki dotyczące Oracle SQL i plsql