Deklarowanie zmiennych, typy skalarne

Skalarne typy danych dostępne w PL/SQL

Najważniejsze typy numeryczne

NUMBER(P,S)

Typ ten może przechowywać wartości całkowite i rzeczywiste. P (precyzja) oznacza ilość wszystkich cyfr w liczbie, natomiast S (skala) oznacza ilość cyfr po przecinku. P <= 38, -84 <= S <= 127.

BINARY_INTEGER

Przechowuje tylko liczby całkowite z zakresu –2147483647 do 2147483647.

Typy znakowe

CHAR(L)

Przechowuje stałą zadeklarowaną (L) ilość znaków. Jeżeli ilość przypisanych znaków jest mniejsza niż L, wtedy zmienna jest uzupełniana do odpowiedniej długości spacjami. L musi być mniejsze od 32768 i domyślnie jest przyjmowane jako 1.

VARCHAR2(L)

Przechowuje znaki. Zajmuje tylko tyle miejsca, ile znaków zostanie przypisanych do zmiennej. L służy do wyznaczenia maksymalnego, dopuszczalnego rozmiaru łańcucha danych, jaki można przypisać do zmiennej tego typu. L musi być mniejsze od 32768 i nie jest przyjmowane domyślnie (musi zostać wyspecyfikowane).

LONG

Typ bardzo podobny do VARCHAR2, jego maksymalna długość wynosi tylko 32760 bajtów (w przeciwieństwie do kolumn bazodanowych typu LONG).

Pozostałe typy

RAW(L)

Typ podobny do CHAR(L), z tym, że służy do przechowywania ciągów binarnych a nie tekstu.

LONG RAW

Typ podobny do typu LONG, ale służy do przechowywania ciągów binarnych a nie tekstu.

DATE

Typ ten przechowuje informacje o wieku, roku, miesiącu, dniu, godzinie, minucie i sekundzie. Jest zakodowany na siedmiu bajach, po jednym na każdy komponent.

BOOLEAN

Typ, który może przyjmować tylko trzy wartości: TRUE, FALSE, NULL.

ROWID

Typ ten służy wyłącznie do przechowywania bazodanowej pseudokolumny ROWID.


Przykład

Deklaracja Przypisywana wartość Przechowywana wartość
NUMBER 1234.5678 1234.5678
NUMBER(3) 123 123
NUMBER(3) 1234 --Błąd podczas operacji--
NUMBER(7,4) 123.4567 123.4567
NUMBER(7,4) 123.45678 123.4568
NUMBER(3,-2) 123 100
NUMBER(3,-1) 123 120
CHAR(10) 'Ala' 'Ala '
VARCHAR2(10) 'Ala' 'Ala'
VARCHAR2(10) 'Ala ma kota' --Błąd podczas operacji--

Number visa binary_integer

Oba te typy służą do przechowywania wartości całkowitych, nie jest jednak obojętne dla wydajności, który z tych typów wybierzemy, ponieważ zmienne obu typów są przechowywane przez Oracle w innym formacie. Zmienne typu number są przechowywane w takim formacie, w jakim Oracle zapisuje liczby w bazie danych, dlatego należy używać tego typu w przypadku, gdy w deklarowanej zmiennej będziemy przechowywać wartości wybierane bądź wkładane do bazy danych.

Zmienne typu binary_integer są przechowywane w pamięci za pomocą kodu uzupełnieniowego do dwu, a zatem w formie optymalnej do wykonywania operacji arytmetycznych.

Możliwe jest wykonywanie operacji arytmetycznych na zmiennych typu number i używanie zmiennych typu binary_integer do operacji na wartościach z tabel bez jawnej konwersji, jednak wiąże się to z dodatkowym nakładem pracy wykonywanej przez serwer Oracle.

Char visa varchar2

Zmienne typu char zajmują zawsze tyle samo miejsca, niezależnie od tego, jakie wartości zostały tym zmiennym przypisane. Zmienne typu varchar2 zajmują miejsca w zależności od wielkości przypisanej wartości.

Oracle stosuje dwa różne algorytmy porównywania wartości znakowych, tzw. „blank padded” i „non blank padded”. Różnice pomiędzy tymi algorytmami objawiają się w przypadku, gdy porównywane są ze sobą dwa ciągi znaków o różnej długości, a porównanie początków ciągów nie przyniosło rezultatów. W przypadku algorytmu „non blank padded” ciąg krótszy uznawany jest za mniejszy, natomiast w przypadku algorytmu „blank padded” ciąg krótszy jest uzupełniany o spacje i porównywanie jest kontynuowane.

Przykład

Wartość zmiennej v_1 Wartość zmiennej v_2 Blank padded Non blank padded
'ABCD' 'ABCD' v_1 = v_2 v_1 = v_2
'ABC' 'ABCD' v_1 < v_2 v_1 < v_2
'ABC' 'ABC ' v_1 = v_2 v_1 < v_2

Jeżeli przynajmniej jeden argument porównania jest zmienną typu o zmiennej długości (varchar2), to Oracle stosuje algorytm „non blank padded”. Algorytm „blank padded” jest stosowany tylko, jeżeli oba argumenty porównania są zmiennymi typu o stałej długości lub literałami.

Definiowanie własnych podtypów

Użytkownik może zdefiniować w sekcji deklaracyjnej własne podtypy na podstawie istniejących typów skalarnych.


SUBTYPE nowy_typ IS istniejący_typ;
                        

istniejący_typ może zawierać skalę i precyzji dla typów numerycznych oraz długości dla typów znakowych. Podczas deklaracji zmiennych nowego podtypu dane te mogą zostać nadpisane.

Przykład

Stworzyć wyzwalacz, który będzie odnotowywał w specjalnej tabeli ddl_log informacje o wszystkich tworzonych obiektach na schemacie, na którym będzie stworzony wyzwalacz.

DECLARE
  SUBTYPE t_nazwisko IS varchar2(30);
  v_nazw1 t_nazwisko; 			-- zmienna typu varchar2(30)
  v_nazw2 t_nazwisko; 			-- zmienna typu varchar2(30)
  v_dl_nazw t_nazwisko(70); 	-- zmienna typu varchar2(70)
BEGIN
  ...