Oracle PL/SQL – jak załadować zawartość tabeli do kolekcji PL/SQL

W tym poście przedstawię jak pobrać zawartość tabeli bazodanowej do kolekcji PL/SQL.

Pokażemy kilka z dostępnych możliwości wraz z kodem opartym o użytkownika HR.

Zaczniemy od zwięzłego przeglądu kolekcji, jakie mamy dostępne w Oracle:

Indeksowane przez BINARY_INTEGER – dostępne są wszystkie elementy w kolekcji z zakresu typu binary_integer. W momencie przypisywania do danego elementu kolekcji alokowana jest dla niego pamięć. Nie musi to być typ BINARY_INTEGER – jaki inny typ może zostać użyty opiszę w jednym z kolejnych postów.

TYPE nazwa IS TABLE OF typ INDEX BY binary_integer;

Zagnieżdżone: przed przypisaniem wartości do elementu kolekcji musi zostać zainicjalizowany – w innym wypadku będzie błąd. Elementy indeksowane są kolejnymi liczbami od 1.

TYPE nazwa IS TABLE OF typ;

VARRAY – o określonej maksymalnej długości. Podobnie jak zagnieżdżone wymagają
zainicjalizowania elementu przed jego przypisaniem. Elementy indeksowane są kolejnymi liczbami od 1 do rozmiaru maksymalnego.

TYPE nazwa IS VARRAY(n) OF typ;

Zatem do dzieła!

Do załadowania zawartości tabeli użyjemy kolekcji indeksowanych przez BINARY_INTEGER oraz kolekcji zagnieżdżonych.

1. Ładowanie przy użyciu kursorów

DECLARE
TYPE t_typ IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER;
kolekcja t_typ;
i NUMBER:=0;
BEGIN
FOR rekord IN (SELECT * FROM employees) LOOP
  i:=i+1;
  kolekcja(i):=rekord;
END LOOP;
END;
DECLARE
TYPE t_typ IS TABLE OF employees%ROWTYPE;
kolekcja t_typ:=t_typ();
i NUMBER:=0;
BEGIN
FOR rekord IN (SELECT * FROM employees) LOOP
  i:=i+1;
  kolekcja.EXTEND;
  kolekcja(i):=rekord;
END LOOP;
END;

Jak widać w powyższym przykładzie – konieczna jest inicjalizacja oraz “poszerzanie” kolekcji przy użyciu extend.

2. Ładowanie przez przetwarzanie masowe – BULK COLLECT

DECLARE
  TYPE t_tablica IS TABLE OF employees%ROWTYPE;
  tablica t_tablica;
BEGIN
    SELECT *
    BULK COLLECT INTO tablica
    FROM employees;
END;

Jak widać nie ma konieczności inicjalizowania kolekcji

DECLARE
  TYPE t_tablica IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER;
  tablica t_tablica;
BEGIN
    SELECT *
    BULK COLLECT INTO tablica
    FROM employees;
END;

Więcej o kolekcjach i przetwarzaniu masowym w kolejnych postach.

 

About Rafal Stryjek

My LinkedIn profile. Passionate about data. Data Warehousing Expert. Snowflake Data SuperHero & Oracle ACE Associate. International conferences Speaker: Snowflake Build Summit-BUILD.local 2021, Oracle Open World, DOAG, UKOUG, APEX World,.. Visit dataconsulting.pl website!
This entry was posted in Oracle, PL/SQL, PL/SQL Podstawy and tagged , , , , . Bookmark the permalink.

Leave a Reply