PL / SQL - Szybki przewodnik
Język programowania PL / SQL został opracowany przez Oracle Corporation pod koniec lat 80. XX wieku jako rozszerzenie proceduralne języka SQL i relacyjnej bazy danych Oracle. Oto kilka ważnych faktów na temat PL / SQL -
PL / SQL to całkowicie przenośny, wydajny język przetwarzania transakcji.
PL / SQL zapewnia wbudowane, interpretowane i niezależne od systemu operacyjnego środowisko programistyczne.
PL / SQL można również wywołać bezpośrednio z wiersza poleceń SQL*Plus interface.
Bezpośrednie wywołanie można również wykonać z zewnętrznego języka programowania do bazy danych.
Ogólna składnia PL / SQL jest oparta na języku programowania ADA i Pascal.
Oprócz Oracle, PL / SQL jest dostępny w TimesTen in-memory database i IBM DB2.
Funkcje PL / SQL
PL / SQL ma następujące funkcje -
- PL / SQL jest ściśle zintegrowany z SQL.
- Oferuje obszerne sprawdzanie błędów.
- Oferuje wiele typów danych.
- Oferuje różnorodne struktury programistyczne.
- Obsługuje programowanie strukturalne za pomocą funkcji i procedur.
- Obsługuje programowanie obiektowe.
- Obsługuje tworzenie aplikacji internetowych i stron serwerowych.
Zalety PL / SQL
PL / SQL ma następujące zalety -
SQL jest standardowym językiem baz danych, a PL / SQL jest silnie zintegrowany z SQL. PL / SQL obsługuje zarówno statyczny, jak i dynamiczny SQL. Statyczny SQL obsługuje operacje DML i kontrolę transakcji z bloku PL / SQL. W dynamicznym SQL, SQL umożliwia osadzanie instrukcji DDL w blokach PL / SQL.
PL / SQL umożliwia wysyłanie do bazy danych całego bloku instrukcji jednocześnie. Zmniejsza to ruch w sieci i zapewnia wysoką wydajność aplikacji.
PL / SQL zapewnia wysoką produktywność programistom, ponieważ może wyszukiwać, przekształcać i aktualizować dane w bazie danych.
PL / SQL oszczędza czas na projektowaniu i debugowaniu dzięki mocnym funkcjom, takim jak obsługa wyjątków, hermetyzacja, ukrywanie danych i obiektowe typy danych.
Aplikacje napisane w PL / SQL są w pełni przenośne.
PL / SQL zapewnia wysoki poziom bezpieczeństwa.
PL / SQL zapewnia dostęp do predefiniowanych pakietów SQL.
PL / SQL zapewnia obsługę programowania obiektowego.
PL / SQL zapewnia obsługę tworzenia aplikacji internetowych i stron serwera.
W tym rozdziale omówimy konfigurację środowiska PL / SQL. PL / SQL nie jest samodzielnym językiem programowania; jest to narzędzie w środowisku programistycznym Oracle.SQL* Plusto interaktywne narzędzie, które umożliwia wpisywanie instrukcji SQL i PL / SQL w wierszu poleceń. Te polecenia są następnie wysyłane do bazy danych w celu przetworzenia. Po przetworzeniu wyciągów wyniki są odsyłane i wyświetlane na ekranie.
Aby uruchamiać programy PL / SQL, na komputerze powinien być zainstalowany serwer Oracle RDBMS. To zajmie się wykonywaniem poleceń SQL. Najnowsza wersja Oracle RDBMS to 11g. Możesz pobrać wersję próbną Oracle 11g z następującego łącza -
Pobierz Oracle 11g Express Edition
Będziesz musiał pobrać 32-bitową lub 64-bitową wersję instalacji zgodnie z systemem operacyjnym. Zwykle są to dwa pliki. Pobraliśmy wersję 64-bitową. Wykonasz również podobne kroki w swoim systemie operacyjnym, nie ma znaczenia, czy jest to Linux czy Solaris.
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip
Po pobraniu powyższych dwóch plików będziesz musiał rozpakować je w jednym katalogu database a pod nim znajdziesz następujące podkatalogi -
Krok 1
Uruchommy teraz Instalatora bazy danych Oracle przy użyciu pliku instalacyjnego. Poniżej znajduje się pierwszy ekran. Możesz podać swój identyfikator e-mail i zaznaczyć pole wyboru, jak pokazano na poniższym zrzucie ekranu. KliknijNext przycisk.
Krok 2
Zostaniesz przekierowany do następującego ekranu; usuń zaznaczenie pola wyboru i kliknijContinue aby kontynuować.
Krok 3
Po prostu wybierz pierwszą opcję Create and Configure Database używając przycisku opcji i kliknij Next aby kontynuować.
Krok 4
Zakładamy, że instalujesz Oracle w podstawowym celu nauki i że instalujesz go na swoim komputerze PC lub laptopie. Dlatego wybierz plikDesktop Class opcję i kliknij Next aby kontynuować.
Krok 5
Podaj lokalizację, w której zostanie zainstalowany serwer Oracle. Po prostu zmodyfikujOracle Basea inne lokalizacje zostaną ustawione automatycznie. Będziesz musiał również podać hasło; będzie to używane przez administratora systemu. Po podaniu wymaganych informacji kliknij plikNext aby kontynuować.
Krok 6
Ponownie kliknij Next aby kontynuować.
Krok 7
Kliknij Finishprzycisk, aby kontynuować; spowoduje to rozpoczęcie właściwej instalacji serwera.
Krok 8
Może to zająć kilka chwil, zanim Oracle rozpocznie wykonywanie wymaganej konfiguracji.
Krok 9
Tutaj instalacja Oracle skopiuje wymagane pliki konfiguracyjne. To powinno chwilę zająć -
Krok 10
Po skopiowaniu plików bazy danych pojawi się następujące okno dialogowe. Po prostu kliknijOK przycisk i wyjdź.
Krok 11
Po instalacji pojawi się następujące końcowe okno.
Ostatni krok
Nadszedł czas, aby zweryfikować instalację. W wierszu polecenia użyj następującego polecenia, jeśli używasz systemu Windows -
sqlplus "/ as sysdba"
Powinieneś mieć znak zachęty SQL, w którym napiszesz swoje polecenia i skrypty PL / SQL -
Edytor tekstu
Uruchamianie dużych programów z wiersza poleceń może spowodować nieumyślną utratę części pracy. Zawsze zaleca się używanie plików poleceń. Aby użyć plików poleceń -
Wpisz swój kod w edytorze tekstu, na przykład Notepad, Notepad+, lub EditPlusitp.
Zapisz plik z rozszerzeniem .sql rozszerzenie w katalogu domowym.
Uruchom SQL*Plus command prompt z katalogu, w którym utworzyłeś plik PL / SQL.
Rodzaj @file_name w wierszu polecenia SQL * Plus, aby uruchomić program.
Jeśli nie używasz pliku do wykonywania skryptów PL / SQL, po prostu skopiuj kod PL / SQL i kliknij prawym przyciskiem myszy czarne okno, w którym zostanie wyświetlony monit SQL; Użyjpastemożliwość wklejenia całego kodu w wierszu polecenia. Na koniec po prostu naciśnijEnter do wykonania kodu, jeśli nie został jeszcze wykonany.
W tym rozdziale omówimy podstawową składnię języka PL / SQL, która jest plikiem block-structuredjęzyk; Oznacza to, że programy PL / SQL są podzielone i napisane w logicznych blokach kodu. Każdy blok składa się z trzech części podrzędnych -
S.Nr | Sekcje i opis |
---|---|
1 | Declarations Ta sekcja zaczyna się od słowa kluczowego DECLARE. Jest to sekcja opcjonalna i definiuje wszystkie zmienne, kursory, podprogramy i inne elementy, które mają być używane w programie. |
2 | Executable Commands Ta sekcja jest umieszczona między słowami kluczowymi BEGIN i ENDi jest to sekcja obowiązkowa. Składa się z wykonywalnych instrukcji PL / SQL programu. Powinien zawierać co najmniej jedną wykonywalną linię kodu, która może być po prostu plikiemNULL command aby wskazać, że nic nie powinno być wykonywane. |
3 | Exception Handling Ta sekcja zaczyna się od słowa kluczowego EXCEPTION. Ta opcjonalna sekcja zawieraexception(s) które obsługują błędy w programie. |
Każda instrukcja PL / SQL kończy się średnikiem (;). Bloki PL / SQL można zagnieżdżać w innych blokach PL / SQL za pomocąBEGIN i END. Poniżej przedstawiono podstawową strukturę bloku PL / SQL -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling>
END;
Przykład „Hello World”
DECLARE
message varchar2(20):= 'Hello, World!';
BEGIN
dbms_output.put_line(message);
END;
/
Plik end;linia sygnalizuje koniec bloku PL / SQL. Aby uruchomić kod z wiersza poleceń SQL, może być konieczne wpisanie / na początku pierwszej pustej linii po ostatniej linii kodu. Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Hello World
PL/SQL procedure successfully completed.
Identyfikatory PL / SQL
Identyfikatory PL / SQL to stałe, zmienne, wyjątki, procedury, kursory i słowa zastrzeżone. Identyfikatory składają się z litery, opcjonalnie po której następuje więcej liter, cyfr, znaków dolara, znaków podkreślenia i cyfr i nie powinny przekraczać 30 znaków.
Domyślnie, identifiers are not case-sensitive. Więc możesz użyćinteger lub INTEGERdo reprezentowania wartości liczbowej. Nie możesz użyć zastrzeżonego słowa kluczowego jako identyfikatora.
Ograniczniki PL / SQL
Separator to symbol o specjalnym znaczeniu. Poniżej znajduje się lista ograniczników w PL / SQL -
Separator | Opis |
---|---|
+, -, *, / | Dodawanie, odejmowanie / negacja, mnożenie, dzielenie |
% | Wskaźnik atrybutu |
' | Ogranicznik ciągu znaków |
. | Selektor komponentów |
(,) | Ogranicznik wyrażenia lub listy |
: | Wskaźnik zmiennej żywicielskiej |
, | Separator pozycji |
" | Cytowany ogranicznik identyfikatora |
= | Operator relacyjny |
@ | Wskaźnik zdalnego dostępu |
; | Terminator instrukcji |
:= | Operator przypisania |
=> | Operator stowarzyszenia |
|| | Operator łączenia |
** | Operator potęgowania |
<<, >> | Separator etykiety (początek i koniec) |
/*, */ | Wieloliniowy separator komentarzy (początek i koniec) |
-- | Jednowierszowy wskaźnik komentarza |
.. | Operator zakresu |
<, >, <=, >= | Operatorzy relacyjni |
<>, '=, ~=, ^= | Różne wersje NOT EQUAL |
Komentarze PL / SQL
Komentarze do programu to wyjaśnienia, które mogą być zawarte w kodzie PL / SQL, który piszesz i które pomagają każdemu czytać jego kod źródłowy. Wszystkie języki programowania pozwalają na jakąś formę komentarzy.
PL / SQL obsługuje komentarze jednowierszowe i wieloliniowe. Wszystkie znaki dostępne w komentarzu są ignorowane przez kompilator PL / SQL. Jednowierszowe komentarze PL / SQL zaczynają się od separatora - (podwójny łącznik), a komentarze wieloliniowe są otoczone znakami / * i * /.
DECLARE
-- variable declaration
message varchar2(20):= 'Hello, World!';
BEGIN
/*
* PL/SQL executable statement(s)
*/
dbms_output.put_line(message);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Hello World
PL/SQL procedure successfully completed.
Jednostki programu PL / SQL
Jednostka PL / SQL to dowolna z następujących -
- Blok PL / SQL
- Function
- Package
- Treść pakietu
- Procedure
- Trigger
- Type
- Wpisz treść
Każda z tych jednostek zostanie omówiona w kolejnych rozdziałach.
W tym rozdziale omówimy typy danych w PL / SQL. Zmienne, stałe i parametry PL / SQL muszą mieć prawidłowy typ danych, który określa format przechowywania, ograniczenia i prawidłowy zakres wartości. Skoncentrujemy się naSCALAR i LOBtypy danych w tym rozdziale. Pozostałe dwa typy danych zostaną omówione w innych rozdziałach.
S.Nr | Opis kategorii |
---|---|
1 | Scalar Pojedyncze wartości bez komponentów wewnętrznych, takie jak plik NUMBER, DATE, lub BOOLEAN. |
2 | Large Object (LOB) Wskaźniki do dużych obiektów, które są przechowywane oddzielnie od innych elementów danych, takich jak tekst, obrazy graficzne, klipy wideo i przebiegi dźwiękowe. |
3 | Composite Elementy danych, które mają komponenty wewnętrzne, do których można uzyskać dostęp indywidualnie. Na przykład kolekcje i rekordy. |
4 | Reference Wskaźniki do innych elementów danych. |
Typy i podtypy danych skalarnych PL / SQL
Typy i podtypy danych skalarnych PL / SQL należą do następujących kategorii -
S.Nr | Typ i opis daty |
---|---|
1 | Numeric Wartości liczbowe, na których wykonywane są operacje arytmetyczne. |
2 | Character Wartości alfanumeryczne, które reprezentują pojedyncze znaki lub ciągi znaków. |
3 | Boolean Wartości logiczne, na których wykonywane są operacje logiczne. |
4 | Datetime Daty i godziny. |
PL / SQL udostępnia podtypy typów danych. Na przykład typ danych NUMBER ma podtyp o nazwie INTEGER. Możesz użyć podtypów w swoim programie PL / SQL, aby zapewnić zgodność typów danych z typami danych w innych programach, jednocześnie osadzając kod PL / SQL w innym programie, takim jak program Java.
Numeryczne typy danych i podtypy PL / SQL
Poniższa tabela zawiera wstępnie zdefiniowane numeryczne typy danych PL / SQL i ich podtypy -
S.Nr | Typ i opis danych |
---|---|
1 | PLS_INTEGER Liczba całkowita ze znakiem z zakresu od -2 147 483 648 do 2 147 483 647, reprezentowana w 32 bitach |
2 | BINARY_INTEGER Liczba całkowita ze znakiem z zakresu od -2 147 483 648 do 2 147 483 647, reprezentowana w 32 bitach |
3 | BINARY_FLOAT Liczba zmiennoprzecinkowa w formacie IEEE 754 o pojedynczej precyzji |
4 | BINARY_DOUBLE Liczba zmiennoprzecinkowa w formacie IEEE 754 o podwójnej precyzji |
5 | NUMBER(prec, scale) Liczba stałoprzecinkowa lub zmiennoprzecinkowa o wartości bezwzględnej w zakresie od 1E-130 do (ale nie włącznie) 1.0E126. Zmienna NUMBER może również reprezentować 0 |
6 | DEC(prec, scale) Specyficzny dla ANSI typ stałoprzecinkowy z maksymalną precyzją 38 cyfr dziesiętnych |
7 | DECIMAL(prec, scale) Specyficzny dla IBM typ stałoprzecinkowy o maksymalnej precyzji 38 cyfr dziesiętnych |
8 | NUMERIC(pre, secale) Typ zmienny z maksymalną precyzją 38 cyfr dziesiętnych |
9 | DOUBLE PRECISION Typ zmiennoprzecinkowy specyficzny dla ANSI z maksymalną precyzją 126 cyfr binarnych (około 38 cyfr dziesiętnych) |
10 | FLOAT Typ zmiennoprzecinkowy specyficzny dla ANSI i IBM z maksymalną dokładnością 126 cyfr binarnych (około 38 cyfr dziesiętnych) |
11 | INT Typ liczb całkowitych specyficzny dla ANSI z maksymalną dokładnością 38 cyfr dziesiętnych |
12 | INTEGER Typ liczb całkowitych specyficznych dla ANSI i IBM z maksymalną dokładnością 38 cyfr dziesiętnych |
13 | SMALLINT Typ liczb całkowitych specyficznych dla ANSI i IBM z maksymalną dokładnością 38 cyfr dziesiętnych |
14 | REAL Typ zmiennoprzecinkowy z maksymalną precyzją 63 cyfr binarnych (około 18 cyfr dziesiętnych) |
Poniżej znajduje się ważna deklaracja -
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
PL/SQL procedure successfully completed
Typy i podtypy znaków PL / SQL
Poniżej przedstawiono szczegóły wstępnie zdefiniowanych typów danych znakowych PL / SQL i ich podtypów -
S.Nr | Typ i opis danych |
---|---|
1 | CHAR Ciąg znaków o stałej długości i maksymalnym rozmiarze 32767 bajtów |
2 | VARCHAR2 Ciąg znaków o zmiennej długości i maksymalnym rozmiarze 32767 bajtów |
3 | RAW Ciąg binarny lub bajtowy o zmiennej długości o maksymalnym rozmiarze 32767 bajtów, nieinterpretowany przez PL / SQL |
4 | NCHAR Ciąg znaków narodowych o stałej długości i maksymalnym rozmiarze 32767 bajtów |
5 | NVARCHAR2 Ciąg znaków narodowych o zmiennej długości i maksymalnym rozmiarze 32767 bajtów |
6 | LONG Ciąg znaków o zmiennej długości i maksymalnym rozmiarze 32760 bajtów |
7 | LONG RAW Ciąg binarny lub bajtowy o zmiennej długości o maksymalnym rozmiarze 32760 bajtów, nieinterpretowany przez PL / SQL |
8 | ROWID Fizyczny identyfikator wiersza, adres wiersza w zwykłej tabeli |
9 | UROWID Uniwersalny identyfikator wiersza (fizyczny, logiczny lub obcy identyfikator wiersza) |
PL / SQL Boolean Typy danych
Plik BOOLEANtyp danych przechowuje wartości logiczne, które są używane w operacjach logicznych. Wartości logiczne to wartości logiczneTRUE i FALSE i wartość NULL.
Jednak SQL nie ma równoważnego typu danych z BOOLEAN. Dlatego wartości logiczne nie mogą być używane w -
- Instrukcje SQL
- Wbudowane funkcje SQL (takie jak TO_CHAR)
- Funkcje PL / SQL wywoływane z instrukcji SQL
PL / SQL Datetime i Interval Types
Plik DATEdatatype służy do przechowywania danych o stałej długości, które obejmują godzinę w sekundach od północy. Ważne daty obejmują okres od 1 stycznia 4712 rpne do 31 grudnia 9999 r.
Domyślny format daty jest ustawiany przez parametr inicjalizacji Oracle NLS_DATE_FORMAT. Na przykład domyślną wartością może być „DD-MON-RR”, która zawiera dwucyfrową liczbę oznaczającą dzień miesiąca, skrót nazwy miesiąca i dwie ostatnie cyfry roku. Na przykład 01-OCT-12.
Każda DATA zawiera wiek, rok, miesiąc, dzień, godzinę, minutę i sekundę. W poniższej tabeli przedstawiono prawidłowe wartości dla każdego pola -
Nazwa pola | Prawidłowe wartości daty i godziny | Prawidłowe wartości przedziałów |
---|---|---|
ROK | -4712 do 9999 (z wyłączeniem roku 0) | Dowolna niezerowa liczba całkowita |
MIESIĄC | 01 do 12 | Od 0 do 11 |
DZIEŃ | 01 do 31 (ograniczone wartościami MIESIĄCA i ROKU, zgodnie z regułami kalendarza dla regionu) | Dowolna niezerowa liczba całkowita |
GODZINA | 00 do 23 | Od 0 do 23 |
MINUTA | 00 do 59 | Od 0 do 59 |
DRUGA | 00 do 59,9 (n), gdzie 9 (n) jest dokładnością ułamków czasu w sekundach | 0 do 59,9 (n), gdzie 9 (n) jest dokładnością ułamków sekund interwału |
TIMEZONE_HOUR | -12 do 14 (zakres obejmuje zmiany czasu letniego) | Nie dotyczy |
TIMEZONE_MINUTE | 00 do 59 | Nie dotyczy |
TIMEZONE_REGION | Znaleziono w dynamicznym widoku wydajności V $ TIMEZONE_NAMES | Nie dotyczy |
TIMEZONE_ABBR | Znaleziono w dynamicznym widoku wydajności V $ TIMEZONE_NAMES | Nie dotyczy |
Typy danych PL / SQL Large Object (LOB)
Typy danych Large Object (LOB) odnoszą się do dużych elementów danych, takich jak tekst, obrazy graficzne, klipy wideo i przebiegi dźwiękowe. Typy danych LOB umożliwiają wydajny, losowy i fragmentaryczny dostęp do tych danych. Poniżej przedstawiono predefiniowane typy danych PL / SQL LOB -
Typ danych | Opis | Rozmiar |
---|---|---|
BFILE | Służy do przechowywania dużych obiektów binarnych w plikach systemu operacyjnego poza bazą danych. | Zależne od systemu. Nie może przekraczać 4 gigabajtów (GB). |
KROPELKA | Służy do przechowywania dużych obiektów binarnych w bazie danych. | 8 do 128 terabajtów (TB) |
CLOB | Służy do przechowywania dużych bloków danych znakowych w bazie danych. | Od 8 do 128 TB |
NCLOB | Służy do przechowywania dużych bloków danych NCHAR w bazie danych. | Od 8 do 128 TB |
Podtypy PL / SQL zdefiniowane przez użytkownika
Podtyp jest podzbiorem innego typu danych, nazywanego jego typem podstawowym. Podtyp ma te same prawidłowe operacje, co jego typ podstawowy, ale tylko podzbiór jego prawidłowych wartości.
PL / SQL wstępnie definiuje kilka podtypów w pakiecie STANDARD. Na przykład PL / SQL wstępnie definiuje podtypyCHARACTER i INTEGER w następujący sposób -
SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);
Możesz zdefiniować i używać własnych podtypów. Poniższy program ilustruje definiowanie i używanie podtypu zdefiniowanego przez użytkownika -
DECLARE
SUBTYPE name IS char(20);
SUBTYPE message IS varchar2(100);
salutation name;
greetings message;
BEGIN
salutation := 'Reader ';
greetings := 'Welcome to the World of PL/SQL';
dbms_output.put_line('Hello ' || salutation || greetings);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Hello Reader Welcome to the World of PL/SQL
PL/SQL procedure successfully completed.
NULL w PL / SQL
Reprezentują wartości NULL PL / SQL missing lub unknown datai nie są one liczbą całkowitą, znakiem ani żadnym innym określonym typem danych. Zwróć na to uwagęNULL nie jest tym samym, co pusty ciąg danych lub wartość znaku null '\0'. Można przypisać wartość null, ale nie można jej utożsamiać z niczym, łącznie z samym sobą.
W tym rozdziale omówimy zmienne w Pl / SQL. Zmienna to nic innego jak nazwa nadana obszarowi pamięci, którym nasze programy mogą manipulować. Każda zmienna w PL / SQL ma określony typ danych, który określa rozmiar i układ pamięci zmiennej; zakres wartości, które mogą być przechowywane w tej pamięci, oraz zestaw operacji, które można zastosować do zmiennej.
Nazwa zmiennej PL / SQL składa się z litery, po której opcjonalnie może następować więcej liter, cyfr, znaków dolara, podkreśleń i znaków liczbowych i nie powinna przekraczać 30 znaków. Domyślnie w nazwach zmiennych wielkość liter nie jest rozróżniana. Nie można użyć zastrzeżonego słowa kluczowego PL / SQL jako nazwy zmiennej.
Język programowania PL / SQL pozwala na definiowanie różnych typów zmiennych, takich jak typy danych daty i godziny, rekordy, zbiory itp., Które omówimy w kolejnych rozdziałach. W tym rozdziale przyjrzyjmy się tylko podstawowym typom zmiennych.
Deklaracja zmiennej w PL / SQL
Zmienne PL / SQL muszą być zadeklarowane w sekcji deklaracji lub w pakiecie jako zmienna globalna. Kiedy deklarujesz zmienną, PL / SQL alokuje pamięć dla wartości zmiennej, a miejsce przechowywania jest identyfikowane przez nazwę zmiennej.
Składnia deklarowania zmiennej to -
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]
Gdzie nazwa_zmiennej jest poprawnym identyfikatorem w PL / SQL, typ danych musi być prawidłowym typem danych PL / SQL lub dowolnym typem danych zdefiniowanym przez użytkownika, który omówiliśmy już w poprzednim rozdziale. Poniżej przedstawiono niektóre prawidłowe deklaracje zmiennych wraz z ich definicją -
sales number(10, 2);
pi CONSTANT double precision := 3.1415;
name varchar2(25);
address varchar2(100);
Kiedy podajesz rozmiar, skalę lub limit precyzji z typem danych, jest to nazywane constrained declaration. Deklaracje ograniczone wymagają mniej pamięci niż deklaracje nieograniczone. Na przykład -
sales number(10, 2);
name varchar2(25);
address varchar2(100);
Inicjalizacja zmiennych w PL / SQL
Za każdym razem, gdy deklarujesz zmienną, PL / SQL przypisuje jej domyślną wartość NULL. Jeśli chcesz zainicjować zmienną o wartości innej niż wartość NULL, możesz to zrobić podczas deklaracji, używając jednego z następujących -
Plik DEFAULT słowo kluczowe
Plik assignment operator
Na przykład -
counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';
Możesz również określić, że zmienna nie powinna mieć rozszerzenia NULL wartość za pomocą NOT NULLprzymus. Jeśli używasz ograniczenia NOT NULL, musisz jawnie przypisać wartość początkową dla tej zmiennej.
Dobrą praktyką programistyczną jest prawidłowe inicjowanie zmiennych, w przeciwnym razie czasami programy mogą dawać nieoczekiwane rezultaty. Wypróbuj następujący przykład, który wykorzystuje różne typy zmiennych -
DECLARE
a integer := 10;
b integer := 20;
c integer;
f real;
BEGIN
c := a + b;
dbms_output.put_line('Value of c: ' || c);
f := 70.0/3.0;
dbms_output.put_line('Value of f: ' || f);
END;
/
Wykonanie powyższego kodu daje następujący wynik -
Value of c: 30
Value of f: 23.333333333333333333
PL/SQL procedure successfully completed.
Zmienny zakres w PL / SQL
PL / SQL umożliwia zagnieżdżanie bloków, tj. Każdy blok programu może zawierać inny blok wewnętrzny. Jeśli zmienna jest zadeklarowana w bloku wewnętrznym, nie jest dostępna dla bloku zewnętrznego. Jeśli jednak zmienna jest zadeklarowana i dostępna dla bloku zewnętrznego, jest również dostępna dla wszystkich zagnieżdżonych bloków wewnętrznych. Istnieją dwa rodzaje zakresu zmiennych -
Local variables - Zmienne zadeklarowane w bloku wewnętrznym i niedostępne dla bloków zewnętrznych.
Global variables - Zmienne zadeklarowane w najbardziej zewnętrznym bloku lub pakiecie.
Poniższy przykład pokazuje użycie Local i Global zmienne w swojej prostej formie -
DECLARE
-- Global variables
num1 number := 95;
num2 number := 85;
BEGIN
dbms_output.put_line('Outer Variable num1: ' || num1);
dbms_output.put_line('Outer Variable num2: ' || num2);
DECLARE
-- Local variables
num1 number := 195;
num2 number := 185;
BEGIN
dbms_output.put_line('Inner Variable num1: ' || num1);
dbms_output.put_line('Inner Variable num2: ' || num2);
END;
END;
/
Wykonanie powyższego kodu daje następujący wynik -
Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185
PL/SQL procedure successfully completed.
Przypisywanie wyników zapytania SQL do zmiennych PL / SQL
Możesz użyć SELECT INTOinstrukcja SQL w celu przypisania wartości do zmiennych PL / SQL. Dla każdego elementu wSELECT list, w pliku musi znajdować się odpowiednia zmienna zgodna z typem INTO list. Poniższy przykład ilustruje tę koncepcję. Utwórzmy tabelę o nazwie CUSTOMERS -
(For SQL statements, please refer to the SQL tutorial)
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Table Created
Wstawmy teraz kilka wartości do tabeli -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
Poniższy program przypisuje wartości z powyższej tabeli do zmiennych PL / SQL za pomocą SELECT INTO clause SQL -
DECLARE
c_id customers.id%type := 1;
c_name customers.name%type;
c_addr customers.address%type;
c_sal customers.salary%type;
BEGIN
SELECT name, address, salary INTO c_name, c_addr, c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line
('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/
Wykonanie powyższego kodu daje następujący wynik -
Customer Ramesh from Ahmedabad earns 2000
PL/SQL procedure completed successfully
W tym rozdziale omówimy constants i literalsw PL / SQL. Stała posiada wartość, która raz zadeklarowana nie zmienia się w programie. Stała deklaracja określa jej nazwę, typ danych i wartość oraz przydziela dla niej miejsce na dane. Deklaracja może również narzucićNOT NULL constraint.
Deklarowanie stałej
Stała jest deklarowana przy użyciu CONSTANTsłowo kluczowe. Wymaga wartości początkowej i nie pozwala na zmianę tej wartości. Na przykład -
PI CONSTANT NUMBER := 3.141592654;
DECLARE
-- constant declaration
pi constant number := 3.141592654;
-- other declarations
radius number(5,2);
dia number(5,2);
circumference number(7, 2);
area number (10, 2);
BEGIN
-- processing
radius := 9.5;
dia := radius * 2;
circumference := 2.0 * pi * radius;
area := pi * radius * radius;
-- output
dbms_output.put_line('Radius: ' || radius);
dbms_output.put_line('Diameter: ' || dia);
dbms_output.put_line('Circumference: ' || circumference);
dbms_output.put_line('Area: ' || area);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Radius: 9.5
Diameter: 19
Circumference: 59.69
Area: 283.53
Pl/SQL procedure successfully completed.
Literały PL / SQL
Literał to jawna liczba, znak, ciąg znaków lub wartość logiczna, która nie jest reprezentowana przez identyfikator. Na przykład TRUE, 786, NULL, „tutorialspoint” to wszystkie literały typu Boolean, number lub string. PL / SQL, w literałach jest rozróżniana wielkość liter. PL / SQL obsługuje następujące rodzaje literałów -
- Literały numeryczne
- Literały postaci
- Literały strunowe
- Literały BOOLEAN
- Literały daty i czasu
Poniższa tabela zawiera przykłady ze wszystkich kategorii wartości literałów.
S.Nr | Typ i przykład literału |
---|---|
1 | Numeric Literals 050 78-14 0 +32767 6,6667 0,0 -12,0 3,14159 +7800,00 6E5 1,0E-8 3,14159e0 -1E38 -9,5e-3 |
2 | Character Literals 'A' '%' '9' '' 'z' '(' |
3 | String Literals 'Witaj świecie!' „Punkt samouczków” „19-listopada-12” |
4 | BOOLEAN Literals TRUE, FALSE i NULL. |
5 | Date and Time Literals DATA „1978-12-25”; TIMESTAMP '2012-10-29 12:01:01'; |
Aby osadzić pojedyncze cudzysłowy w literale ciągu, umieść dwa pojedyncze cudzysłowy obok siebie, jak pokazano w poniższym programie -
DECLARE
message varchar2(30):= 'That''s tutorialspoint.com!';
BEGIN
dbms_output.put_line(message);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
That's tutorialspoint.com!
PL/SQL procedure successfully completed.
W tym rozdziale omówimy operatory w PL / SQL. Operator to symbol, który mówi kompilatorowi, aby wykonał określone operacje matematyczne lub logiczne. Język PL / SQL jest bogaty we wbudowane operatory i zapewnia następujące typy operatorów -
- Operatory arytmetyczne
- Operatorzy relacyjni
- Operatory porównania
- Operatory logiczne
- Operatory łańcuchowe
Tutaj zrozumiemy kolejno operatory arytmetyczne, relacyjne, porównawcze i logiczne. Operatory łańcuchowe zostaną omówione w kolejnym rozdziale -PL/SQL - Strings.
Operatory arytmetyczne
Poniższa tabela przedstawia wszystkie operatory arytmetyczne obsługiwane przez PL / SQL. Załóżmyvariable A mieści 10 i variable B mieści 5, a następnie -
Pokaż przykłady
Operator | Opis | Przykład |
---|---|---|
+ | Dodaje dwa operandy | A + B da 15 |
- | Odejmuje drugi operand od pierwszego | A - B da 5 |
* | Mnoży oba operandy | A * B da 50 |
/ | Dzieli licznik przez de-licznik | A / B da 2 |
** | Operator potęgowania podnosi jeden operand do potęgi drugiego | A ** B da 100000 |
Operatorzy relacyjni
Operatory relacyjne porównują dwa wyrażenia lub wartości i zwracają wynik logiczny. Poniższa tabela przedstawia wszystkie operatory relacyjne obsługiwane przez PL / SQL. Załóżmyvariable A mieści 10 i variable B mieści 20, a następnie -
Pokaż przykłady
Operator | Opis | Przykład |
---|---|---|
= | Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli tak, warunek staje się prawdziwy. | (A = B) nie jest prawdą. |
! = <> ~ = |
Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli wartości nie są równe, warunek staje się prawdziwy. | (A! = B) jest prawdą. |
> | Sprawdza, czy wartość lewego operandu jest większa niż wartość prawego operandu, jeśli tak, warunek staje się prawdziwy. | (A> B) nie jest prawdą. |
< | Sprawdza, czy wartość lewego operandu jest mniejsza niż wartość prawego operandu. Jeśli tak, warunek staje się prawdziwy. | (A <B) jest prawdą. |
> = | Sprawdza, czy wartość lewego operandu jest większa lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. | (A> = B) nie jest prawdą. |
<= | Sprawdza, czy wartość lewego operandu jest mniejsza lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. | (A <= B) jest prawdą |
Operatory porównania
Operatory porównania służą do porównywania jednego wyrażenia z innym. Wynik jest zawsze alboTRUE, FALSE lub NULL.
Pokaż przykłady
Operator | Opis | Przykład |
---|---|---|
LUBIĆ | Operator LIKE porównuje znak, ciąg lub wartość CLOB ze wzorcem i zwraca wartość TRUE, jeśli wartość jest zgodna ze wzorcem, lub FALSE, jeśli nie. | Jeśli „Zara Ali”, jak „Z% A_i”, zwraca wartość logiczną true, podczas gdy „Nuha Ali”, podobnie jak „Z% A_i”, zwraca wartość logiczną fałsz. |
POMIĘDZY | Operator BETWEEN sprawdza, czy wartość mieści się w określonym zakresie. x BETWEEN a AND b oznacza, że x> = a i x <= b. | Jeśli x = 10, wtedy x między 5 a 20 zwraca prawdę, x między 5 a 10 zwraca prawdę, ale x między 11 a 20 zwraca fałsz. |
W | Operator IN testuje członkostwo w zestawie. x IN (zbiór) oznacza, że x jest równe dowolnemu elementowi zbioru. | Jeśli x = 'm', wtedy x in ('a', 'b', 'c') zwraca wartość logiczną fałsz, ale x in ('m', 'n', 'o') zwraca wartość logiczną prawda. |
JEST NULL | Operator IS NULL zwraca wartość typu BOOLEAN TRUE, jeśli jego operand ma wartość NULL lub FALSE, jeśli nie ma wartości NULL. Porównania obejmujące wartości NULL zawsze dają NULL. | Jeśli x = „m”, to „x jest null” zwraca wartość logiczną fałsz. |
Operatory logiczne
Poniższa tabela przedstawia operatory logiczne obsługiwane przez PL / SQL. Wszystkie te operatory działają na operandach boolowskich i dają wyniki boolowskie. Załóżmyvariable A jest prawdą i variable B ma fałsz, więc -
Pokaż przykłady
Operator | Opis | Przykłady |
---|---|---|
i | Nazywa się operatorem logicznym AND. Jeśli oba operandy są prawdziwe, warunek staje się prawdziwy. | (A i B) jest fałszem. |
lub | Nazywa się operatorem logicznym OR. Jeśli którykolwiek z dwóch operandów jest prawdziwy, warunek staje się prawdziwy. | (A lub B) jest prawdą. |
nie | Nazywany operatorem logicznym NOT. Służy do odwracania stanu logicznego argumentu. Jeśli warunek jest prawdziwy, operator logiczny NOT sprawi, że będzie fałszywy. | nie (A i B) jest prawdą. |
Pierwszeństwo operatorów PL / SQL
Pierwszeństwo operatorów określa grupowanie terminów w wyrażeniu. Ma to wpływ na sposób oceny wyrażenia. Niektórzy operatorzy mają wyższy priorytet niż inni; na przykład operator mnożenia ma wyższy priorytet niż operator dodawania.
Na przykład, x = 7 + 3 * 2; tutaj,x jest przypisany 13, a nie 20, ponieważ operator * ma wyższy priorytet niż +, więc najpierw jest mnożony przez 3*2 a następnie dodaje do 7.
Tutaj operatory o najwyższym priorytecie pojawiają się na górze tabeli, a operatory o najniższym priorytecie - na dole. W wyrażeniu najpierw zostaną ocenione operatory o wyższym priorytecie.
Pierwszeństwo operatorów jest następujące: =, <,>, <=,> =, <>,! =, ~ =, ^ =, IS NULL, LIKE, BETWEEN, IN.
Pokaż przykłady
Operator | Operacja |
---|---|
** | potęgowanie |
+, - | tożsamość, negacja |
*, / | mnożenie, dzielenie |
+, -, || | dodawanie, odejmowanie, łączenie |
porównanie | |
NIE | logiczna negacja |
I | spójnik |
LUB | włączenie |
W tym rozdziale omówimy warunki w PL / SQL. Struktury decyzyjne wymagają, aby programista określił jeden lub więcej warunków, które mają być ocenione lub przetestowane przez program, wraz z instrukcją lub instrukcjami do wykonania, jeśli warunek zostanie określony jako prawdziwy, i opcjonalnie inne instrukcje do wykonania, warunek jest określany jako fałszywy.
Poniżej przedstawiono ogólną postać typowej warunkowej (tj. Decyzyjnej) struktury występującej w większości języków programowania -
Język programowania PL / SQL udostępnia następujące typy instrukcji decyzyjnych. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.
S.Nr | Oświadczenie i opis |
---|---|
1 | JEŚLI - TO instrukcja Plik IF statement wiąże warunek z sekwencją instrukcji zawartych w słowach kluczowych THEN i END IF. Jeśli warunek jest prawdziwy, instrukcje są wykonywane, a jeśli warunek jest fałszywy lub NULL, instrukcja IF nic nie robi. |
2 | Instrukcja IF-THEN-INSE IF statement dodaje słowo kluczowe ELSEpo którym następuje alternatywna sekwencja instrukcji. Jeśli warunek ma wartość false lub NULL, zostanie wykonana tylko alternatywna sekwencja instrukcji. Zapewnia wykonanie dowolnej sekwencji instrukcji. |
3 | Instrukcja IF-THEN-ELSIF Umożliwia wybór między kilkoma alternatywami. |
4 | Oświadczenie Case Podobnie jak instrukcja IF, plik CASE statement wybiera jedną sekwencję instrukcji do wykonania. Jednak aby wybrać sekwencję, instrukcja CASE używa selektora, a nie wielu wyrażeń logicznych. Selektor to wyrażenie, którego wartość służy do wyboru jednej z kilku alternatyw. |
5 | Szukana instrukcja CASE Szukana instrukcja CASE has no selector, a klauzule to WHEN zawierają warunki wyszukiwania, które dają wartości logiczne. |
6 | zagnieżdżone IF-THEN-INNE Możesz użyć jednego IF-THEN lub IF-THEN-ELSIF oświadczenie wewnątrz innego IF-THEN lub IF-THEN-ELSIF sprawozdania). |
W tym rozdziale omówimy pętle w PL / SQL. Może zaistnieć sytuacja, w której trzeba będzie kilkakrotnie wykonać blok kodu. Ogólnie instrukcje są wykonywane sekwencyjnie: pierwsza instrukcja funkcji jest wykonywana jako pierwsza, po niej następuje druga i tak dalej.
Języki programowania zapewniają różne struktury kontrolne, które pozwalają na bardziej skomplikowane ścieżki wykonywania.
Instrukcja pętli pozwala nam wielokrotnie wykonać instrukcję lub grupę instrukcji, a następująca po niej jest ogólną postacią instrukcji pętli w większości języków programowania -
PL / SQL udostępnia następujące typy pętli do obsługi wymagań dotyczących pętli. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.
S.Nr | Typ i opis pętli |
---|---|
1 | PL / SQL Basic LOOP W tej strukturze pętli sekwencja instrukcji jest zawarta między instrukcjami LOOP i END LOOP. W każdej iteracji wykonywana jest sekwencja instrukcji, a następnie sterowanie wznawia się na początku pętli. |
2 | PL / SQL WHILE LOOP Powtarza instrukcję lub grupę instrukcji, gdy dany warunek jest prawdziwy. Testuje warunek przed wykonaniem treści pętli. |
3 | PL / SQL FOR LOOP Wykonuje sekwencję instrukcji wiele razy i skraca kod zarządzający zmienną pętli. |
4 | Zagnieżdżone pętle w PL / SQL Możesz użyć jednej lub więcej pętli wewnątrz dowolnej innej podstawowej pętli, pętli while lub for. |
Etykietowanie pętli PL / SQL
Pętle PL / SQL można oznaczyć. Etykieta powinna być ujęta w podwójne nawiasy ostre (<< i >>) i pojawić się na początku instrukcji LOOP. Nazwa etykiety może również pojawić się na końcu instrukcji LOOP. Możesz użyć etykiety w instrukcji EXIT, aby wyjść z pętli.
Poniższy program ilustruje koncepcję -
DECLARE
i number(1);
j number(1);
BEGIN
<< outer_loop >>
FOR i IN 1..3 LOOP
<< inner_loop >>
FOR j IN 1..3 LOOP
dbms_output.put_line('i is: '|| i || ' and j is: ' || j);
END loop inner_loop;
END loop outer_loop;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
i is: 1 and j is: 1
i is: 1 and j is: 2
i is: 1 and j is: 3
i is: 2 and j is: 1
i is: 2 and j is: 2
i is: 2 and j is: 3
i is: 3 and j is: 1
i is: 3 and j is: 2
i is: 3 and j is: 3
PL/SQL procedure successfully completed.
Instrukcje sterujące pętlą
Instrukcje sterujące pętlą zmieniają wykonanie z jego normalnej sekwencji. Gdy wykonanie opuszcza zakres, wszystkie automatyczne obiekty utworzone w tym zakresie są niszczone.
PL / SQL obsługuje następujące instrukcje sterujące. Etykietowanie pętli pomaga również w przenoszeniu sterowania poza pętlę. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.
S.Nr | Oświadczenie i opis kontroli |
---|---|
1 | Instrukcja EXIT Instrukcja Exit kończy pętlę i sterowanie przechodzi do instrukcji bezpośrednio po zakończeniu pętli END LOOP. |
2 | Instrukcja CONTINUE Powoduje, że pętla pomija pozostałą część swojego ciała i natychmiast ponownie testuje swój stan przed ponownym powtórzeniem. |
3 | Instrukcja GOTO Przekazuje kontrolę do oznaczonej instrukcji. Chociaż nie jest zalecane używanie w programie instrukcji GOTO. |
Łańcuch w PL / SQL jest w rzeczywistości sekwencją znaków z opcjonalną specyfikacją rozmiaru. Znaki mogą być numeryczne, litery, spacje, znaki specjalne lub kombinacja wszystkich. PL / SQL oferuje trzy rodzaje ciągów -
Fixed-length strings- W takich łańcuchach programiści określają długość podczas deklarowania łańcucha. Ciąg jest dopełniony spacjami do tak określonej długości.
Variable-length strings - W takich łańcuchach określona jest maksymalna długość do 32767 dla ciągu znaków i nie ma miejsca dopełnianie.
Character large objects (CLOBs) - Są to ciągi o zmiennej długości, które mogą mieć do 128 terabajtów.
Łańcuchy PL / SQL mogą być zmiennymi lub literałami. Literał ciągu jest ujęty w cudzysłów. Na przykład,
'This is a string literal.' Or 'hello world'
Aby zawrzeć pojedynczy cudzysłów wewnątrz literału ciągu, musisz wpisać dwa pojedyncze cudzysłowy obok siebie. Na przykład,
'this isn''t what it looks like'
Deklarowanie zmiennych łańcuchowych
Baza danych Oracle udostępnia wiele typów danych typu string, takich jak CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB i NCLOB. Typy danych poprzedzone przedrostkiem'N' są 'national character set' typy danych, które przechowują dane znaków Unicode.
Jeśli chcesz zadeklarować ciąg o zmiennej długości, musisz podać maksymalną długość tego ciągu. Na przykład typ danych VARCHAR2. Poniższy przykład ilustruje deklarowanie i używanie niektórych zmiennych łańcuchowych -
DECLARE
name varchar2(20);
company varchar2(30);
introduction clob;
choice char(1);
BEGIN
name := 'John Smith';
company := 'Infotech';
introduction := ' Hello! I''m John Smith from Infotech.';
choice := 'y';
IF choice = 'y' THEN
dbms_output.put_line(name);
dbms_output.put_line(company);
dbms_output.put_line(introduction);
END IF;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
John Smith
Infotech
Hello! I'm John Smith from Infotech.
PL/SQL procedure successfully completed
Aby zadeklarować ciąg o stałej długości, użyj typu danych CHAR. Tutaj nie musisz określać maksymalnej długości dla zmiennej o stałej długości. Jeśli pominiesz ograniczenie długości, baza danych Oracle automatycznie zastosuje maksymalną wymaganą długość. Następujące dwie deklaracje są identyczne -
red_flag CHAR(1) := 'Y';
red_flag CHAR := 'Y';
Funkcje i operatory łańcuchów PL / SQL
PL / SQL oferuje operator konkatenacji (||)do łączenia dwóch strun. Poniższa tabela zawiera funkcje tekstowe zapewniane przez PL / SQL -
S.Nr | Funkcja i cel |
---|---|
1 | ASCII(x); Zwraca wartość ASCII znaku x. |
2 | CHR(x); Zwraca znak o wartości x w ASCII. |
3 | CONCAT(x, y); Łączy ciągi x i y i zwraca dołączony ciąg. |
4 | INITCAP(x); Konwertuje początkową literę każdego słowa x na wielkie litery i zwraca ten ciąg. |
5 | INSTR(x, find_string [, start] [, occurrence]); Wyszukuje find_string inx i zwraca pozycję, w której występuje. |
6 | INSTRB(x); Zwraca lokalizację ciągu w innym ciągu, ale zwraca wartość w bajtach. |
7 | LENGTH(x); Zwraca liczbę znaków w x. |
8 | LENGTHB(x); Zwraca długość ciągu znaków w bajtach dla zestawu znaków jednobajtowych. |
9 | LOWER(x); Konwertuje litery x na małe i zwraca ten ciąg. |
10 | LPAD(x, width [, pad_string]) ; Naramienniki x ze spacjami po lewej stronie, aby zwiększyć całkowitą długość ciągu do znaków szerokości. |
11 | LTRIM(x [, trim_string]); Przycina znaki z lewej strony x. |
12 | NANVL(x, value); Zwraca wartość, jeśli x pasuje do wartości specjalnej NaN (nie liczby), w przeciwnym razie x jest zwracany. |
13 | NLS_INITCAP(x); Taka sama, jak funkcja INITCAP, z tą różnicą, że może używać innej metody sortowania określonej przez NLSSORT. |
14 | NLS_LOWER(x) ; Taka sama jak funkcja LOWER, z tą różnicą, że może używać innej metody sortowania określonej przez NLSSORT. |
15 | NLS_UPPER(x); Taka sama jak funkcja UPPER, z tą różnicą, że może używać innej metody sortowania określonej przez NLSSORT. |
16 | NLSSORT(x); Zmienia metodę sortowania znaków. Musi być określona przed jakąkolwiek funkcją NLS; w przeciwnym razie zostanie użyte domyślne sortowanie. |
17 | NVL(x, value); Zwraca wartość, jeśli xjest null; w przeciwnym razie zwracane jest x. |
18 | NVL2(x, value1, value2); Zwraca wartość1, jeśli x nie jest null; jeśli x ma wartość null, zwracana jest wartość2. |
19 | REPLACE(x, search_string, replace_string); Wyszukiwania x dla search_string i zamienia go na replace_string. |
20 | RPAD(x, width [, pad_string]); Naramienniki x w prawo. |
21 | RTRIM(x [, trim_string]); Wykończenia x z prawej strony. |
22 | SOUNDEX(x) ; Returns a string containing the phonetic representation of x. |
23 | SUBSTR(x, start [, length]); Returns a substring of x that begins at the position specified by start. An optional length for the substring may be supplied. |
24 | SUBSTRB(x); Same as SUBSTR except that the parameters are expressed in bytes instead of characters for the single-byte character systems. |
25 | TRIM([trim_char FROM) x); Trims characters from the left and right of x. |
26 | UPPER(x); Converts the letters in x to uppercase and returns that string. |
Przeanalizujmy teraz kilka przykładów, aby zrozumieć koncepcję -
Przykład 1
DECLARE
greetings varchar2(11) := 'hello world';
BEGIN
dbms_output.put_line(UPPER(greetings));
dbms_output.put_line(LOWER(greetings));
dbms_output.put_line(INITCAP(greetings));
/* retrieve the first character in the string */
dbms_output.put_line ( SUBSTR (greetings, 1, 1));
/* retrieve the last character in the string */
dbms_output.put_line ( SUBSTR (greetings, -1, 1));
/* retrieve five characters,
starting from the seventh position. */
dbms_output.put_line ( SUBSTR (greetings, 7, 5));
/* retrieve the remainder of the string,
starting from the second position. */
dbms_output.put_line ( SUBSTR (greetings, 2));
/* find the location of the first "e" */
dbms_output.put_line ( INSTR (greetings, 'e'));
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
HELLO WORLD
hello world
Hello World
h
d
World
ello World
2
PL/SQL procedure successfully completed.
Przykład 2
DECLARE
greetings varchar2(30) := '......Hello World.....';
BEGIN
dbms_output.put_line(RTRIM(greetings,'.'));
dbms_output.put_line(LTRIM(greetings, '.'));
dbms_output.put_line(TRIM( '.' from greetings));
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
......Hello World
Hello World.....
Hello World
PL/SQL procedure successfully completed.
W tym rozdziale omówimy tablice w PL / SQL. Język programowania PL / SQL zapewnia strukturę danych zwanąVARRAY, który może przechowywać sekwencyjną kolekcję elementów tego samego typu o stałym rozmiarze. Zmienna służy do przechowywania uporządkowanego zbioru danych, jednak często lepiej jest myśleć o tablicy jako o zbiorze zmiennych tego samego typu.
Wszystkie warianty składają się z ciągłych miejsc pamięci. Najniższy adres odpowiada pierwszemu elementowi, a najwyższy adres ostatniemu elementowi.
Tablica jest częścią danych typu kolekcji i oznacza tablice o zmiennej wielkości. W następnym rozdziale przeanalizujemy inne typy kolekcji'PL/SQL Collections'.
Każdy element w varrayma przypisany indeks. Ma również maksymalny rozmiar, który można dynamicznie zmieniać.
Tworzenie typu Varray
Typ varray jest tworzony za pomocą CREATE TYPEkomunikat. Musisz określić maksymalny rozmiar i typ elementów przechowywanych w varray.
Podstawowa składnia tworzenia typu VARRAY na poziomie schematu to -
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
Gdzie,
- varray_type_name to poprawna nazwa atrybutu,
- n to liczba elementów (maksymalna) w varray,
- typ_elementu to typ danych elementów tablicy.
Maksymalny rozmiar varray można zmienić za pomocą ALTER TYPE komunikat.
Na przykład,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
Type created.
Podstawowa składnia tworzenia typu VARRAY w bloku PL / SQL to -
TYPE varray_type_name IS VARRAY(n) of <element_type>
Na przykład -
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
Przeanalizujmy teraz kilka przykładów, aby zrozumieć koncepcję -
Przykład 1
Poniższy program ilustruje użycie varrays -
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i in 1 .. total LOOP
dbms_output.put_line('Student: ' || names(i) || '
Marks: ' || marks(i));
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Total 5 Students
Student: Kavita Marks: 98
Student: Pritam Marks: 97
Student: Ayan Marks: 78
Student: Rishav Marks: 87
Student: Aziz Marks: 92
PL/SQL procedure successfully completed.
Please note -
W środowisku Oracle początkowy indeks varray wynosi zawsze 1.
Elementy varray można zainicjować przy użyciu metody konstruktora typu varray, który ma taką samą nazwę jak varray.
Warray to jednowymiarowe tablice.
Zmienna jest automatycznie NULL, gdy jest zadeklarowana i musi zostać zainicjowana, zanim będzie można przywołać jej elementy.
Przykład 2
Elementy varray mogą być również% ROWTYPE dowolnej tabeli bazy danych lub% TYPE dowolnego pola tabeli bazy danych. Poniższy przykład ilustruje tę koncepcję.
Będziemy używać tabeli CUSTOMERS przechowywanej w naszej bazie danych jako -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Poniższy przykład wykorzystuje cursor, które szczegółowo przestudiujesz w osobnym rozdziale.
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
type c_list is varray (6) of customers.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter + 1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
W tym rozdziale omówimy procedury w PL / SQL. ZAsubprogramto jednostka / moduł programu, który wykonuje określone zadanie. Te podprogramy są łączone w celu utworzenia większych programów. Zasadniczo nazywa się to „konstrukcją modułową”. Podprogram może być wywołany przez inny podprogram lub program, który nosi nazwęcalling program.
Można utworzyć podprogram -
- Na poziomie schematu
- W opakowaniu
- Wewnątrz bloku PL / SQL
Na poziomie schematu podprogram to plik standalone subprogram. Jest tworzony za pomocą instrukcji CREATE PROCEDURE lub CREATE FUNCTION. Jest przechowywany w bazie danych i można go usunąć za pomocą instrukcji DROP PROCEDURE lub DROP FUNCTION.
Podprogram utworzony w pakiecie to plik packaged subprogram. Jest przechowywany w bazie danych i można go usunąć tylko wtedy, gdy pakiet zostanie usunięty za pomocą instrukcji DROP PACKAGE. Pakiety omówimy w rozdziale'PL/SQL - Packages'.
Podprogramy PL / SQL nazywane są blokami PL / SQL, które mogą być wywoływane z zestawem parametrów. PL / SQL udostępnia dwa rodzaje podprogramów -
Functions- Te podprogramy zwracają pojedynczą wartość; używany głównie do obliczania i zwracania wartości.
Procedures- Te podprogramy nie zwracają wartości bezpośrednio; używany głównie do wykonywania akcji.
W tym rozdziale zostaną omówione ważne aspekty PL/SQL procedure. OmówimyPL/SQL function w następnym rozdziale.
Części podprogramu PL / SQL
Każdy podprogram PL / SQL ma nazwę i może mieć również listę parametrów. Podobnie jak anonimowe bloki PL / SQL, nazwane bloki będą również miały następujące trzy części -
S.Nr | Części i opis |
---|---|
1 | Declarative Part Jest to część opcjonalna. Jednak deklaratywna część podprogramu nie rozpoczyna się słowem kluczowym DECLARE. Zawiera deklaracje typów, kursorów, stałych, zmiennych, wyjątków i zagnieżdżonych podprogramów. Pozycje te są lokalne dla podprogramu i przestają istnieć, gdy podprogram kończy wykonywanie. |
2 | Executable Part Jest to część obowiązkowa i zawiera stwierdzenia, które wykonują określoną czynność. |
3 | Exception-handling To znowu część opcjonalna. Zawiera kod, który obsługuje błędy w czasie wykonywania. |
Tworzenie procedury
Procedura jest tworzona z CREATE OR REPLACE PROCEDUREkomunikat. Uproszczona składnia instrukcji CREATE OR REPLACE PROCEDURE jest następująca:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
Gdzie,
nazwa-procedury określa nazwę procedury.
Opcja [OR REPLACE] umożliwia modyfikację istniejącej procedury.
Opcjonalna lista parametrów zawiera nazwę, tryb i typy parametrów. IN reprezentuje wartość, która zostanie przekazana z zewnątrz, a OUT reprezentuje parametr, który zostanie użyty do zwrócenia wartości poza procedurą.
treść procedury zawiera część wykonywalną.
Słowo kluczowe AS jest używane zamiast słowa kluczowego IS do tworzenia samodzielnej procedury.
Przykład
Poniższy przykład tworzy prostą procedurę, która wyświetla ciąg „Hello World!” na ekranie po wykonaniu.
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
Gdy powyższy kod zostanie wykonany przy użyciu znaku zachęty SQL, wygeneruje następujący wynik -
Procedure created.
Wykonywanie samodzielnej procedury
Oddzielną procedurę można wywołać na dwa sposoby -
Używając EXECUTE słowo kluczowe
Wywołanie nazwy procedury z bloku PL / SQL
Powyższa procedura o nazwie 'greetings' można wywołać słowem kluczowym EXECUTE jako -
EXECUTE greetings;
Powyższe wywołanie wyświetli -
Hello World
PL/SQL procedure successfully completed.
Procedurę można również wywołać z innego bloku PL / SQL -
BEGIN
greetings;
END;
/
Powyższe wywołanie wyświetli -
Hello World
PL/SQL procedure successfully completed.
Usuwanie samodzielnej procedury
Samodzielna procedura jest usuwana z DROP PROCEDUREkomunikat. Składnia usuwania procedury to -
DROP PROCEDURE procedure-name;
Możesz porzucić procedurę powitania, używając następującej instrukcji -
DROP PROCEDURE greetings;
Tryby parametrów w podprogramach PL / SQL
Poniższa tabela przedstawia tryby parametrów w podprogramach PL / SQL -
S.Nr | Tryb parametrów i opis |
---|---|
1 | IN Parametr IN umożliwia przekazanie wartości do podprogramu. It is a read-only parameter. W podprogramie parametr IN działa jak stała. Nie można mu przypisać wartości. Jako parametr IN można przekazać stałą, literał, zainicjowaną zmienną lub wyrażenie. Możesz także zainicjować go do wartości domyślnej; jednakże w tym przypadku jest pomijany w wywołaniu podprogramu.It is the default mode of parameter passing. Parameters are passed by reference. |
2 | OUT Parametr OUT zwraca wartość do programu wywołującego. W podprogramie parametr OUT działa jak zmienna. Możesz zmienić jego wartość i odwołać się do wartości po jej przypisaniu.The actual parameter must be variable and it is passed by value. |
3 | IN OUT Na IN OUTparametr przekazuje wartość początkową do podprogramu i zwraca zaktualizowaną wartość do programu wywołującego. Można mu przypisać wartość, a wartość można odczytać. Rzeczywisty parametr odpowiadający parametrowi formalnemu IN OUT musi być zmienną, a nie stałą lub wyrażeniem. Parametrowi formalnemu należy przypisać wartość.Actual parameter is passed by value. |
Tryb IN & OUT Przykład 1
Ten program znajduje minimum dwie wartości. Tutaj procedura przyjmuje dwie liczby przy użyciu trybu IN i zwraca ich minimum przy użyciu parametrów OUT.
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
Tryb IN & OUT Przykład 2
Ta procedura oblicza kwadrat wartości przekazanej wartości. Ten przykład pokazuje, jak możemy użyć tego samego parametru do zaakceptowania wartości, a następnie zwrócenia innego wyniku.
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Square of (23): 529
PL/SQL procedure successfully completed.
Metody przekazywania parametrów
Rzeczywiste parametry można przekazać na trzy sposoby -
- Notacja pozycyjna
- Nazwana notacja
- Notacja mieszana
Notacja pozycyjna
W notacji pozycyjnej procedurę można wywołać jako -
findMin(a, b, c, d);
W notacji pozycyjnej pierwszy rzeczywisty parametr jest podstawiany za pierwszy parametr formalny; drugi rzeczywisty parametr zastępuje drugi parametr formalny i tak dalej. Więc,a jest zastąpiony x, b jest zastąpiony y, c jest zastąpiony z i d jest zastąpiony m.
Nazwana notacja
W notacji nazwanej rzeczywisty parametr jest skojarzony z parametrem formalnym przy użyciu arrow symbol ( => ). Wywołanie procedury będzie wyglądać następująco -
findMin(x => a, y => b, z => c, m => d);
Notacja mieszana
W notacji mieszanej można mieszać obie notacje w wywołaniu procedury; jednak notacja pozycyjna powinna poprzedzać notację nazwaną.
Następujące połączenie jest legalne -
findMin(a, b, c, m => d);
Jednak jest to niezgodne z prawem:
findMin(x => a, b, c, d);
W tym rozdziale omówimy funkcje w PL / SQL. Funkcja jest taka sama jak procedura, z tą różnicą, że zwraca wartość. Dlatego wszystkie dyskusje z poprzedniego rozdziału odnoszą się również do funkcji.
Tworzenie funkcji
Niezależna funkcja jest tworzona przy użyciu CREATE FUNCTIONkomunikat. Uproszczona składnia dlaCREATE OR REPLACE PROCEDURE oświadczenie jest następujące -
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype
{IS | AS}
BEGIN
< function_body >
END [function_name];
Gdzie,
nazwa-funkcji określa nazwę funkcji.
Opcja [OR REPLACE] umożliwia modyfikację istniejącej funkcji.
Opcjonalna lista parametrów zawiera nazwę, tryb i typy parametrów. IN reprezentuje wartość, która zostanie przekazana z zewnątrz, a OUT reprezentuje parametr, który zostanie użyty do zwrócenia wartości poza procedurą.
Funkcja musi zawierać return komunikat.
RETURN klauzula określa typ danych idziesz do powrotu z funkcji.
Treść funkcji zawiera część wykonywalną.
Słowo kluczowe AS jest używane zamiast słowa kluczowego IS do tworzenia samodzielnej funkcji.
Przykład
Poniższy przykład ilustruje sposób tworzenia i wywoływania funkcji autonomicznej. Ta funkcja zwraca całkowitą liczbę KLIENTÓW w tabeli klientów.
Skorzystamy z tabeli CUSTOMERS, którą stworzyliśmy w rozdziale Zmienne PL / SQL -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers
RETURN number IS
total number(2) := 0;
BEGIN
SELECT count(*) into total
FROM customers;
RETURN total;
END;
/
Gdy powyższy kod zostanie wykonany przy użyciu znaku zachęty SQL, wygeneruje następujący wynik -
Function created.
Wywołanie funkcji
Tworząc funkcję, podajesz definicję tego, co funkcja ma robić. Aby użyć funkcji, będziesz musiał wywołać tę funkcję, aby wykonać określone zadanie. Gdy program wywołuje funkcję, sterowanie programem jest przekazywane do wywoływanej funkcji.
Wywołana funkcja wykonuje zdefiniowane zadanie i kiedy wykonywana jest jej instrukcja return lub gdy last end statement zostanie osiągnięty, przywraca sterowanie programem z powrotem do programu głównego.
Aby wywołać funkcję, wystarczy przekazać wymagane parametry wraz z nazwą funkcji, a jeśli funkcja zwraca wartość, można ją zapisać. Poniższy program wywołuje funkcjętotalCustomers z anonimowego bloku -
DECLARE
c number(2);
BEGIN
c := totalCustomers();
dbms_output.put_line('Total no. of Customers: ' || c);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Total no. of Customers: 6
PL/SQL procedure successfully completed.
Przykład
Poniższy przykład ilustruje deklarowanie, definiowanie i wywoływanie prostej funkcji PL / SQL, która oblicza i zwraca maksymalnie dwie wartości.
DECLARE
a number;
b number;
c number;
FUNCTION findMax(x IN number, y IN number)
RETURN number
IS
z number;
BEGIN
IF x > y THEN
z:= x;
ELSE
Z:= y;
END IF;
RETURN z;
END;
BEGIN
a:= 23;
b:= 45;
c := findMax(a, b);
dbms_output.put_line(' Maximum of (23,45): ' || c);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Maximum of (23,45): 45
PL/SQL procedure successfully completed.
Funkcje rekurencyjne PL / SQL
Widzieliśmy, że program lub podprogram może wywołać inny podprogram. Gdy podprogram wywołuje sam siebie, nazywa się to wywołaniem rekurencyjnym, a proces jest znany jakorecursion.
Aby zilustrować to pojęcie, obliczmy silnię liczby. Silnia liczby n jest definiowana jako -
n! = n*(n-1)!
= n*(n-1)*(n-2)!
...
= n*(n-1)*(n-2)*(n-3)... 1
Poniższy program oblicza silnię podanej liczby, wywołując siebie rekurencyjnie -
DECLARE
num number;
factorial number;
FUNCTION fact(x number)
RETURN number
IS
f number;
BEGIN
IF x=0 THEN
f := 1;
ELSE
f := x * fact(x-1);
END IF;
RETURN f;
END;
BEGIN
num:= 6;
factorial := fact(num);
dbms_output.put_line(' Factorial '|| num || ' is ' || factorial);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Factorial 6 is 720
PL/SQL procedure successfully completed.
W tym rozdziale omówimy kursory w PL / SQL. Oracle tworzy obszar pamięci, zwany obszarem kontekstu, do przetwarzania instrukcji SQL, który zawiera wszystkie informacje potrzebne do przetwarzania instrukcji; na przykład liczba przetworzonych wierszy itp.
ZA cursorjest wskaźnikiem do tego obszaru kontekstu. PL / SQL kontroluje obszar kontekstu za pomocą kursora. Kursor przechowuje wiersze (jeden lub więcej) zwróconych przez instrukcję SQL. Zestaw wierszy, które utrzymuje kursor, jest nazywanyactive set.
Kursor można nazwać tak, aby mógł się do niego odwoływać w programie do pobierania i przetwarzania wierszy zwracanych przez instrukcję SQL, po jednym na raz. Istnieją dwa rodzaje kursorów -
- Ukryte kursory
- Jawne kursory
Niejawne kursory
Niejawne kursory są tworzone automatycznie przez Oracle za każdym razem, gdy wykonywana jest instrukcja SQL, gdy nie ma dla niej jawnego kursora. Programiści nie mogą kontrolować ukrytych kursorów i zawartych w nich informacji.
Za każdym razem, gdy jest wydawana instrukcja DML (INSERT, UPDATE i DELETE), z nią skojarzony jest niejawny kursor. W przypadku operacji INSERT kursor przechowuje dane, które należy wstawić. W przypadku operacji UPDATE i DELETE kursor identyfikuje wiersze, których to dotyczy.
W PL / SQL możesz odwołać się do najnowszego niejawnego kursora jako SQL cursor, który zawsze ma takie atrybuty jak %FOUND, %ISOPEN, %NOTFOUND, i %ROWCOUNT. Kursor SQL ma dodatkowe atrybuty,%BULK_ROWCOUNT i %BULK_EXCEPTIONS, przeznaczony do użytku z FORALLkomunikat. Poniższa tabela zawiera opis najczęściej używanych atrybutów -
S.Nr | Atrybut i opis |
---|---|
1 | %FOUND Zwraca wartość TRUE, jeśli instrukcja INSERT, UPDATE lub DELETE wpłynęła na jeden lub więcej wierszy lub instrukcja SELECT INTO zwróciła jeden lub więcej wierszy. W przeciwnym razie zwraca FALSE. |
2 | %NOTFOUND Logiczne przeciwieństwo% FOUND. Zwraca wartość TRUE, jeśli instrukcja INSERT, UPDATE lub DELETE nie wpłynęła na żadne wiersze lub instrukcja SELECT INTO nie zwróciła żadnych wierszy. W przeciwnym razie zwraca FALSE. |
3 | %ISOPEN Zawsze zwraca FALSE dla niejawnych kursorów, ponieważ Oracle automatycznie zamyka kursor SQL po wykonaniu powiązanej z nim instrukcji SQL. |
4 | %ROWCOUNT Zwraca liczbę wierszy, na które ma wpływ instrukcja INSERT, UPDATE lub DELETE, lub zwracanych przez instrukcję SELECT INTO. |
Każdy atrybut kursora SQL będzie dostępny jako sql%attribute_name jak pokazano poniżej w przykładzie.
Przykład
Będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach.
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Poniższy program zaktualizuje tabelę i zwiększy pensję każdego klienta o 500 i użyje SQL%ROWCOUNT atrybut określający liczbę wierszy, których to dotyczy -
DECLARE
total_rows number(2);
BEGIN
UPDATE customers
SET salary = salary + 500;
IF sql%notfound THEN
dbms_output.put_line('no customers selected');
ELSIF sql%found THEN
total_rows := sql%rowcount;
dbms_output.put_line( total_rows || ' customers selected ');
END IF;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
6 customers selected
PL/SQL procedure successfully completed.
Jeśli sprawdzisz rekordy w tabeli klientów, zobaczysz, że wiersze zostały zaktualizowane -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2500.00 |
| 2 | Khilan | 25 | Delhi | 2000.00 |
| 3 | kaushik | 23 | Kota | 2500.00 |
| 4 | Chaitali | 25 | Mumbai | 7000.00 |
| 5 | Hardik | 27 | Bhopal | 9000.00 |
| 6 | Komal | 22 | MP | 5000.00 |
+----+----------+-----+-----------+----------+
Jawne kursory
Jawne kursory to kursory zdefiniowane przez programistę w celu uzyskania większej kontroli nad context area. W sekcji deklaracji bloku PL / SQL należy zdefiniować wyraźny kursor. Jest tworzony w instrukcji SELECT, która zwraca więcej niż jeden wiersz.
Składnia tworzenia jawnego kursora to -
CURSOR cursor_name IS select_statement;
Praca z jawnym kursorem obejmuje następujące kroki -
- Deklaracja kursora do inicjalizacji pamięci
- Otwarcie kursora w celu przydzielenia pamięci
- Pobieranie kursora do pobierania danych
- Zamknięcie kursora w celu zwolnienia przydzielonej pamięci
Deklarowanie kursora
Zadeklarowanie kursora definiuje kursor z nazwą i powiązaną instrukcją SELECT. Na przykład -
CURSOR c_customers IS
SELECT id, name, address FROM customers;
Otwieranie kursora
Otwarcie kursora przydziela pamięć dla kursora i przygotowuje go do pobrania do niego wierszy zwróconych przez instrukcję SQL. Na przykład otworzymy wyżej zdefiniowany kursor w następujący sposób -
OPEN c_customers;
Pobieranie kursora
Pobieranie kursora obejmuje dostęp do jednego wiersza na raz. Na przykład pobierzemy wiersze z otwartego powyżej kursora w następujący sposób -
FETCH c_customers INTO c_id, c_name, c_addr;
Zamykanie kursora
Zamknięcie kursora oznacza zwolnienie przydzielonej pamięci. Na przykład zamkniemy powyższy kursor w następujący sposób -
CLOSE c_customers;
Przykład
Poniżej znajduje się kompletny przykład ilustrujący koncepcje kursorów jawnych & minua;
DECLARE
c_id customers.id%type;
c_name customer.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
END LOOP;
CLOSE c_customers;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
1 Ramesh Ahmedabad
2 Khilan Delhi
3 kaushik Kota
4 Chaitali Mumbai
5 Hardik Bhopal
6 Komal MP
PL/SQL procedure successfully completed.
W tym rozdziale omówimy Rekordy w PL / SQL. ZArecordto struktura danych, która może zawierać elementy danych różnego rodzaju. Rekordy składają się z różnych pól, podobnie jak wiersz tabeli bazy danych.
Na przykład chcesz śledzić swoje książki w bibliotece. Możesz chcieć śledzić następujące atrybuty dotyczące każdej książki, takie jak tytuł, autor, temat, identyfikator książki. Rekord zawierający pole dla każdego z tych elementów umożliwia traktowanie KSIĄŻKI jako jednostki logicznej i pozwala lepiej organizować i przedstawiać zawarte w niej informacje.
PL / SQL może obsługiwać następujące typy rekordów -
- Table-based
- Rekordy oparte na kursorach
- Rekordy zdefiniowane przez użytkownika
Rekordy oparte na tabelach
Atrybut% ROWTYPE umożliwia programiście tworzenie table-based i cursorbased dokumentacja.
Poniższy przykład ilustruje koncepcję table-baseddokumentacja. Będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach -
DECLARE
customer_rec customers%rowtype;
BEGIN
SELECT * into customer_rec
FROM customers
WHERE id = 5;
dbms_output.put_line('Customer ID: ' || customer_rec.id);
dbms_output.put_line('Customer Name: ' || customer_rec.name);
dbms_output.put_line('Customer Address: ' || customer_rec.address);
dbms_output.put_line('Customer Salary: ' || customer_rec.salary);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Customer ID: 5
Customer Name: Hardik
Customer Address: Bhopal
Customer Salary: 9000
PL/SQL procedure successfully completed.
Rekordy oparte na kursorach
Poniższy przykład ilustruje koncepcję cursor-baseddokumentacja. Będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach -
DECLARE
CURSOR customer_cur is
SELECT id, name, address
FROM customers;
customer_rec customer_cur%rowtype;
BEGIN
OPEN customer_cur;
LOOP
FETCH customer_cur into customer_rec;
EXIT WHEN customer_cur%notfound;
DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name);
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
1 Ramesh
2 Khilan
3 kaushik
4 Chaitali
5 Hardik
6 Komal
PL/SQL procedure successfully completed.
Rekordy zdefiniowane przez użytkownika
PL / SQL udostępnia typ rekordu zdefiniowany przez użytkownika, który umożliwia definiowanie różnych struktur rekordów. Te rekordy składają się z różnych pól. Załóżmy, że chcesz śledzić swoje książki w bibliotece. Możesz chcieć śledzić następujące atrybuty dotyczące każdej książki -
- Title
- Author
- Subject
- Identyfikator książki
Definiowanie rekordu
Typ rekordu jest zdefiniowany jako -
TYPE
type_name IS RECORD
( field_name1 datatype1 [NOT NULL] [:= DEFAULT EXPRESSION],
field_name2 datatype2 [NOT NULL] [:= DEFAULT EXPRESSION],
...
field_nameN datatypeN [NOT NULL] [:= DEFAULT EXPRESSION);
record-name type_name;
Rekord Księgi jest zadeklarowany w następujący sposób -
DECLARE
TYPE books IS RECORD
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
Dostęp do pól
Aby uzyskać dostęp do dowolnego pola rekordu, używamy kropki (.)operator. Operator dostępu do członka jest zakodowany jako kropka między nazwą zmiennej rekordu a polem, do którego chcemy uzyskać dostęp. Poniżej znajduje się przykład wyjaśniający użycie rekordu -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Print book 1 record
dbms_output.put_line('Book 1 title : '|| book1.title);
dbms_output.put_line('Book 1 author : '|| book1.author);
dbms_output.put_line('Book 1 subject : '|| book1.subject);
dbms_output.put_line('Book 1 book_id : ' || book1.book_id);
-- Print book 2 record
dbms_output.put_line('Book 2 title : '|| book2.title);
dbms_output.put_line('Book 2 author : '|| book2.author);
dbms_output.put_line('Book 2 subject : '|| book2.subject);
dbms_output.put_line('Book 2 book_id : '|| book2.book_id);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
PL/SQL procedure successfully completed.
Rekordy jako parametry podprogramu
Rekord można przekazać jako parametr podprogramu, tak samo jak każdą inną zmienną. Możesz również uzyskać dostęp do pól rekordów w taki sam sposób, jak w powyższym przykładzie -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
PROCEDURE printbook (book books) IS
BEGIN
dbms_output.put_line ('Book title : ' || book.title);
dbms_output.put_line('Book author : ' || book.author);
dbms_output.put_line( 'Book subject : ' || book.subject);
dbms_output.put_line( 'Book book_id : ' || book.book_id);
END;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Use procedure to print book info
printbook(book1);
printbook(book2);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
PL/SQL procedure successfully completed.
W tym rozdziale omówimy Wyjątki w PL / SQL. Wyjątkiem jest stan błędu podczas wykonywania programu. PL / SQL wspiera programistów w wyłapywaniu takich warunków przy użyciuEXCEPTIONbloku w programie i podejmowana jest odpowiednia akcja przeciwko warunkowi błędu. Istnieją dwa rodzaje wyjątków -
- Wyjątki zdefiniowane przez system
- Wyjątki zdefiniowane przez użytkownika
Składnia obsługi wyjątków
Ogólna składnia obsługi wyjątków jest następująca. Tutaj możesz wymienić tyle wyjątków, ile możesz obsłużyć. Domyślny wyjątek będzie obsługiwany za pomocąWHEN others THEN -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
Przykład
Napiszmy kod ilustrujący koncepcję. Będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach -
DECLARE
c_id customers.id%type := 8;
c_name customerS.Name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
No such customer!
PL/SQL procedure successfully completed.
Powyższy program wyświetla nazwę i adres klienta, któremu nadano identyfikator. Ponieważ w naszej bazie danych nie ma klienta o identyfikatorze 8, program zgłasza wyjątek czasu wykonywaniaNO_DATA_FOUND, który jest przechwytywany w EXCEPTION block.
Podnoszenie wyjątków
Wyjątki są zgłaszane przez serwer bazy danych automatycznie za każdym razem, gdy wystąpi jakikolwiek wewnętrzny błąd bazy danych, ale wyjątki mogą być jawnie zgłaszane przez programistę za pomocą polecenia RAISE. Poniżej znajduje się prosta składnia zgłaszania wyjątku -
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
Możesz użyć powyższej składni do podniesienia standardowego wyjątku Oracle lub dowolnego wyjątku zdefiniowanego przez użytkownika. W następnej sekcji podamy przykład zgłaszania wyjątku zdefiniowanego przez użytkownika. W podobny sposób można podnieść standardowe wyjątki Oracle.
Wyjątki zdefiniowane przez użytkownika
PL / SQL pozwala zdefiniować własne wyjątki zgodnie z potrzebami Twojego programu. Wyjątek zdefiniowany przez użytkownika musi zostać zadeklarowany, a następnie zgłoszony jawnie za pomocą instrukcji RAISE lub proceduryDBMS_STANDARD.RAISE_APPLICATION_ERROR.
Składnia deklarowania wyjątku to -
DECLARE
my-exception EXCEPTION;
Przykład
Poniższy przykład ilustruje tę koncepcję. Ten program pyta o identyfikator klienta, gdy użytkownik wprowadza nieprawidłowy identyfikator, wyjątekinvalid_id jest podniesiony.
DECLARE
c_id customers.id%type := &cc_id;
c_name customerS.Name%type;
c_addr customers.address%type;
-- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Enter value for cc_id: -6 (let's enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero!
PL/SQL procedure successfully completed.
Wstępnie zdefiniowane wyjątki
PL / SQL zapewnia wiele predefiniowanych wyjątków, które są wykonywane, gdy program narusza dowolną regułę bazy danych. Na przykład predefiniowany wyjątek NO_DATA_FOUND jest zgłaszany, gdy instrukcja SELECT INTO nie zwraca żadnych wierszy. W poniższej tabeli wymieniono kilka ważnych, wstępnie zdefiniowanych wyjątków -
Wyjątek | Błąd Oracle | SQLCODE | Opis |
---|---|---|---|
ACCESS_INTO_NULL | 06530 | -6530 | Jest podnoszony, gdy obiekt zerowy ma automatycznie przypisaną wartość. |
CASE_NOT_FOUND | 06592 | -6592 | Jest on zgłaszany, gdy nie wybrano żadnego z wyborów w klauzuli WHEN instrukcji CASE i nie ma klauzuli ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Jest wywoływany, gdy program próbuje zastosować metody kolekcji inne niż EXISTS do niezainicjowanej tabeli zagnieżdżonej lub zmiennej lub program próbuje przypisać wartości do elementów niezainicjowanej tabeli zagnieżdżonej lub zmiennej. |
DUP_VAL_ON_INDEX | 00001 | -1 | Jest podnoszony, gdy zduplikowane wartości mają być przechowywane w kolumnie z unikalnym indeksem. |
INVALID_CURSOR | 01001 | -1001 | Jest podnoszony, gdy podejmowane są próby wykonania operacji kursora, która jest niedozwolona, na przykład zamknięcie nieotwartego kursora. |
NIEPRAWIDŁOWY NUMER | 01722 | -1722 | Jest zgłaszany, gdy konwersja ciągu znaków na liczbę nie powiedzie się, ponieważ ciąg nie reprezentuje prawidłowej liczby. |
LOGIN_DENIED | 01017 | -1017 | Jest wywoływany, gdy program próbuje zalogować się do bazy danych przy użyciu nieprawidłowej nazwy użytkownika lub hasła. |
NIE ZNALEZIONO DANYCH | 01403 | +100 | Jest podnoszony, gdy instrukcja SELECT INTO nie zwraca żadnych wierszy. |
NOT_LOGGED_ON | 01012 | -1012 | Jest wywoływany, gdy wywołanie bazy danych jest wykonywane bez połączenia z bazą danych. |
PROGRAM_ERROR | 06501 | -6501 | Jest podnoszony, gdy PL / SQL ma wewnętrzny problem. |
ROWTYPE_MISMATCH | 06504 | -6504 | Jest podnoszony, gdy kursor pobiera wartość w zmiennej o niezgodnym typie danych. |
SELF_IS_NULL | 30625 | -30625 | Jest wywoływana, gdy wywoływana jest metoda składowa, ale wystąpienie typu obiektu nie zostało zainicjowane. |
STORAGE_ERROR | 06500 | -6500 | Jest wywoływany, gdy PL / SQL zabrakło pamięci lub pamięć została uszkodzona. |
TOO_MANY_ROWS | 01422 | -1422 | Jest zgłaszany, gdy instrukcja SELECT INTO zwraca więcej niż jeden wiersz. |
VALUE_ERROR | 06502 | -6502 | Jest zgłaszany, gdy wystąpi błąd arytmetyczny, konwersji, obcinania lub ograniczenia rozmiaru. |
ZERO_DIVIDE | 01476 | 1476 | Jest podnoszony, gdy podejmowana jest próba podzielenia liczby przez zero. |
W tym rozdziale omówimy wyzwalacze w PL / SQL. Wyzwalacze to zapisane programy, które są automatycznie wykonywane lub uruchamiane, gdy wystąpią jakieś zdarzenia. Wyzwalacze są w rzeczywistości napisane do wykonania w odpowiedzi na którekolwiek z następujących zdarzeń -
ZA database manipulation (DML) instrukcja (DELETE, INSERT lub UPDATE)
ZA database definition (DDL) instrukcja (CREATE, ALTER lub DROP).
ZA database operation (SERVERERROR, LOGON, LOGOFF, STARTUP lub SHUTDOWN).
Wyzwalacze można zdefiniować w tabeli, widoku, schemacie lub bazie danych, z którą skojarzone jest zdarzenie.
Korzyści z wyzwalaczy
Wyzwalacze można napisać w następujących celach -
- Automatyczne generowanie niektórych wartości kolumn pochodnych
- Wymuszanie więzów integralności
- Rejestrowanie zdarzeń i przechowywanie informacji o dostępie do tabeli
- Auditing
- Synchroniczna replikacja tabel
- Nakładanie uprawnień bezpieczeństwa
- Zapobieganie nieprawidłowym transakcjom
Tworzenie wyzwalaczy
Składnia tworzenia wyzwalacza to -
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
Gdzie,
CREATE [OR REPLACE] TRIGGER nazwa_trigera - tworzy lub zastępuje istniejący wyzwalacz nazwą wyzwalacza .
{PRZED | PO | INSTEAD OF} - określa, kiedy wyzwalacz zostanie wykonany. Klauzula INSTEAD OF służy do tworzenia wyzwalacza w widoku.
{WSTAWIĆ [LUB] | UPDATE [LUB] | DELETE} - określa operację DML.
[OF nazwa_kolumny] - określa nazwę kolumny, która będzie aktualizowana.
[ON nazwa_tabeli] - określa nazwę tabeli powiązanej z wyzwalaczem.
[REFERENCING STARE AS lub NEW AS n] - Umożliwia to odwoływanie się do nowych i starych wartości dla różnych instrukcji DML, takich jak INSERT, UPDATE i DELETE.
[FOR EACH ROW] - określa wyzwalacz na poziomie wiersza, tj. Wyzwalacz zostanie wykonany dla każdego wiersza, którego dotyczy. W przeciwnym razie wyzwalacz zostanie wykonany tylko raz, gdy zostanie wykonana instrukcja SQL, co jest nazywane wyzwalaczem na poziomie tabeli.
KIEDY (warunek) - zapewnia warunek dla wierszy, dla których zostanie uruchomiony wyzwalacz. Ta klauzula jest ważna tylko dla wyzwalaczy na poziomie wiersza.
Przykład
Na początek będziemy korzystać z tabeli CUSTOMERS, którą stworzyliśmy i używaliśmy w poprzednich rozdziałach -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Poniższy program tworzy plik row-levelwyzwalacz dla tabeli klientów, który byłby uruchamiany w przypadku operacji INSERT, UPDATE lub DELETE wykonywanych na tabeli CUSTOMERS. Ten wyzwalacz wyświetli różnicę wynagrodzeń między starymi a nowymi wartościami -
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Old salary: ' || :OLD.salary);
dbms_output.put_line('New salary: ' || :NEW.salary);
dbms_output.put_line('Salary difference: ' || sal_diff);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Trigger created.
Należy wziąć pod uwagę następujące kwestie:
Odwołania STARE i NOWE nie są dostępne dla wyzwalaczy na poziomie tabeli, ale można ich użyć do wyzwalaczy na poziomie rekordu.
Jeśli chcesz odpytać tabelę w tym samym wyzwalaczu, powinieneś użyć słowa kluczowego AFTER, ponieważ wyzwalacze mogą wysyłać zapytania do tabeli lub zmieniać ją ponownie dopiero po zastosowaniu początkowych zmian i przywróceniu spójnego stanu tabeli.
Powyższy wyzwalacz został napisany w taki sposób, że będzie uruchamiany przed jakąkolwiek operacją DELETE lub INSERT lub UPDATE na tabeli, ale możesz zapisać swój wyzwalacz na jednej lub wielu operacjach, na przykład BEFORE DELETE, która zostanie uruchomiona za każdym razem, gdy rekord zostaną usunięte za pomocą operacji DELETE w tabeli.
Wyzwalanie wyzwalacza
Wykonajmy kilka operacji DML na tabeli CUSTOMERS. Oto jedna instrukcja INSERT, która utworzy nowy rekord w tabeli -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );
Kiedy rekord jest tworzony w tabeli CUSTOMERS, powyższe tworzy wyzwalacz, display_salary_changes zostanie odpalony i wyświetli następujący wynik -
Old salary:
New salary: 7500
Salary difference:
Ponieważ jest to nowy rekord, stare wynagrodzenie nie jest dostępne, a powyższy wynik jest zerowy. Wykonajmy teraz jeszcze jedną operację DML na tabeli CUSTOMERS. Instrukcja UPDATE zaktualizuje istniejący rekord w tabeli -
UPDATE customers
SET salary = salary + 500
WHERE id = 2;
Kiedy rekord jest aktualizowany w tabeli CUSTOMERS, powyższe tworzy wyzwalacz, display_salary_changes zostanie odpalony i wyświetli następujący wynik -
Old salary: 1500
New salary: 2000
Salary difference: 500
W tym rozdziale omówimy pakiety w PL / SQL. Pakiety to obiekty schematów, które grupują logicznie powiązane typy PL / SQL, zmienne i podprogramy.
Pakiet będzie miał dwie obowiązkowe części -
- Specyfikacja pakietu
- Treść lub definicja pakietu
Specyfikacja pakietu
Specyfikacja to interfejs do pakietu. To tylkoDECLAREStypy, zmienne, stałe, wyjątki, kursory i podprogramy, do których można się odwoływać spoza pakietu. Innymi słowy, zawiera wszystkie informacje o zawartości pakietu, ale wyklucza kod dla podprogramów.
Wszystkie obiekty umieszczone w specyfikacji są wywoływane publicobiekty. Każdy podprogram, którego nie ma w specyfikacji pakietu, ale jest zakodowany w treści pakietu, nazywany jest plikiemprivate obiekt.
Poniższy fragment kodu przedstawia specyfikację pakietu mającą jedną procedurę. W pakiecie można zdefiniować wiele zmiennych globalnych i wiele procedur lub funkcji.
CREATE PACKAGE cust_sal AS
PROCEDURE find_sal(c_id customers.id%type);
END cust_sal;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Package created.
Treść pakietu
W treści pakietu znajdują się kody różnych metod zadeklarowanych w specyfikacji pakietu oraz inne deklaracje prywatne, które są ukryte przed kodem na zewnątrz pakietu.
Plik CREATE PACKAGE BODYInstrukcja służy do tworzenia treści pakietu. Poniższy fragment kodu przedstawia deklarację treści pakietu dlacust_salpakiet utworzony powyżej. Założyłem, że mamy już utworzoną tabelę CUSTOMERS w naszej bazie danych, jak wspomniano w rozdziale PL / SQL - Zmienne .
CREATE OR REPLACE PACKAGE BODY cust_sal AS
PROCEDURE find_sal(c_id customers.id%TYPE) IS
c_sal customers.salary%TYPE;
BEGIN
SELECT salary INTO c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line('Salary: '|| c_sal);
END find_sal;
END cust_sal;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Package body created.
Korzystanie z elementów pakietu
Dostęp do elementów pakietu (zmiennych, procedur lub funkcji) uzyskuje się za pomocą następującej składni -
package_name.element_name;
Weź pod uwagę, że utworzyliśmy już powyższy pakiet w naszym schemacie bazy danych, następujący program używa find_sal metoda cust_sal pakiet -
DECLARE
code customers.id%type := &cc_id;
BEGIN
cust_sal.find_sal(code);
END;
/
Gdy powyższy kod jest wykonywany po znaku zachęty SQL, prosi o wprowadzenie identyfikatora klienta, a po wprowadzeniu identyfikatora wyświetla odpowiednie wynagrodzenie w następujący sposób -
Enter value for cc_id: 1
Salary: 3000
PL/SQL procedure successfully completed.
Przykład
Poniższy program zawiera bardziej kompletny pakiet. Będziemy korzystać z tabeli KLIENCI przechowywanej w naszej bazie danych z następującymi rekordami -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 3000.00 |
| 2 | Khilan | 25 | Delhi | 3000.00 |
| 3 | kaushik | 23 | Kota | 3000.00 |
| 4 | Chaitali | 25 | Mumbai | 7500.00 |
| 5 | Hardik | 27 | Bhopal | 9500.00 |
| 6 | Komal | 22 | MP | 5500.00 |
+----+----------+-----+-----------+----------+
Specyfikacja pakietu
CREATE OR REPLACE PACKAGE c_package AS
-- Adds a customer
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type);
-- Removes a customer
PROCEDURE delCustomer(c_id customers.id%TYPE);
--Lists all customers
PROCEDURE listCustomer;
END c_package;
/
Gdy powyższy kod jest wykonywany po znaku zachęty SQL, tworzy powyższy pakiet i wyświetla następujący wynik -
Package created.
Tworzenie treści pakietu
CREATE OR REPLACE PACKAGE BODY c_package AS
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type)
IS
BEGIN
INSERT INTO customers (id,name,age,address,salary)
VALUES(c_id, c_name, c_age, c_addr, c_sal);
END addCustomer;
PROCEDURE delCustomer(c_id customers.id%type) IS
BEGIN
DELETE FROM customers
WHERE id = c_id;
END delCustomer;
PROCEDURE listCustomer IS
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list is TABLE OF customers.Name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
END LOOP;
END listCustomer;
END c_package;
/
Powyższy przykład wykorzystuje rozszerzenie nested table. W następnym rozdziale omówimy koncepcję tabeli zagnieżdżonej.
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Package body created.
Korzystanie z pakietu
Poniższy program używa metod zadeklarowanych i zdefiniowanych w pakiecie c_package .
DECLARE
code customers.id%type:= 8;
BEGIN
c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500);
c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500);
c_package.listcustomer;
c_package.delcustomer(code);
c_package.listcustomer;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
Customer(8): Subham
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
PL/SQL procedure successfully completed
W tym rozdziale omówimy kolekcje w PL / SQL. Kolekcja to uporządkowana grupa elementów o tym samym typie danych. Każdy element jest identyfikowany przez unikalny indeks dolny, który reprezentuje jego pozycję w kolekcji.
PL / SQL udostępnia trzy typy kolekcji -
- Tabele indeksowane lub tablice asocjacyjne
- Tabela zagnieżdżona
- Tablica o zmiennej wielkości lub Varray
Dokumentacja Oracle zawiera następujące cechy dla każdego typu kolekcji -
Typ kolekcji | Liczba elementów | Typ indeksu | Gęsty lub Rzadki | Gdzie utworzono | Może być atrybutem typu obiektu |
---|---|---|---|---|---|
Tablica asocjacyjna (lub tablica indeksu) | Bezgraniczny | Ciąg lub liczba całkowita | Zarówno | Tylko w bloku PL / SQL | Nie |
Tabela zagnieżdżona | Bezgraniczny | Liczba całkowita | Zaczyna się gęsty, może stać się rzadki | Albo w bloku PL / SQL, albo na poziomie schematu | tak |
Tablica Variablesize (Varray) | Zobowiązany | Liczba całkowita | Zawsze gęsty | Albo w bloku PL / SQL, albo na poziomie schematu | tak |
Omówiliśmy już varray w rozdziale 'PL/SQL arrays'. W tym rozdziale omówimy tabele PL / SQL.
Oba typy tabel PL / SQL, tj. Tabele indeksowane i tabele zagnieżdżone, mają taką samą strukturę, a dostęp do ich wierszy uzyskuje się za pomocą notacji z indeksem dolnym. Jednak te dwa typy tabel różnią się pod jednym względem; tabele zagnieżdżone mogą być przechowywane w kolumnie bazy danych, a tabele indeksowane nie mogą.
Indeks według tabeli
Na index-by table (nazywany również associative array) jest zbiorem key-valuepary. Każdy klucz jest unikalny i służy do lokalizowania odpowiedniej wartości. Klucz może być liczbą całkowitą lub łańcuchem.
Tabela indeksu według jest tworzona przy użyciu następującej składni. Tutaj tworzymy plikindex-by tabela o nazwie table_name, których klucze będą miały typ indeks_indeksowy, a powiązane wartości będą miały typ_elementu
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
table_name type_name;
Przykład
Poniższy przykład pokazuje, jak utworzyć tabelę do przechowywania wartości całkowitych wraz z nazwami, a później drukuje tę samą listę nazw.
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT null LOOP
dbms_output.put_line
('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Salary of James is 78000
Salary of Martin is 100000
Salary of Minakshi is 75000
Salary of Rajnish is 62000
PL/SQL procedure successfully completed.
Przykład
Elementami tabeli indeksowanej mogą być również pliki %ROWTYPE dowolnej tabeli bazy danych lub %TYPEdowolnego pola tabeli bazy danych. Poniższy przykład ilustruje tę koncepcję. Będziemy używaćCUSTOMERS tabela przechowywana w naszej bazie danych jako -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
select name from customers;
TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter));
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed
Tabele zagnieżdżone
ZA nested tablejest jak jednowymiarowa tablica z dowolną liczbą elementów. Jednak tabela zagnieżdżona różni się od tablicy w następujących aspektach -
Tablica ma zadeklarowaną liczbę elementów, ale tabela zagnieżdżona nie. Rozmiar tabeli zagnieżdżonej może się dynamicznie zwiększać.
Tablica jest zawsze gęsta, tj. Zawsze ma następujące po sobie indeksy. Zagnieżdżona tablica jest początkowo gęsta, ale może stać się rzadka po usunięciu z niej elementów.
Zagnieżdżona tabela jest tworzona przy użyciu następującej składni -
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
Ta deklaracja jest podobna do deklaracji index-by stół, ale nie ma INDEX BY klauzula.
Zagnieżdżona tabela może być przechowywana w kolumnie bazy danych. Można go ponadto wykorzystać do uproszczenia operacji SQL, w których łączysz tabelę jednokolumnową z większą tabelą. Tablica asocjacyjna nie może być przechowywana w bazie danych.
Przykład
Poniższe przykłady ilustrują użycie tabeli zagnieżdżonej -
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
end loop;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92
PL/SQL procedure successfully completed.
Przykład
Elementy a nested table może być również %ROWTYPEdowolnej tabeli bazy danych lub% TYPE dowolnego pola tabeli bazy danych. Poniższy przykład ilustruje tę koncepcję. Będziemy używać tabeli CUSTOMERS przechowywanej w naszej bazie danych jako -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list IS TABLE of customerS.No.ame%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
Metody zbierania
PL / SQL udostępnia wbudowane metody kolekcji, które ułatwiają korzystanie z kolekcji. W poniższej tabeli wymieniono metody i ich przeznaczenie -
S.Nr | Nazwa i cel metody |
---|---|
1 | EXISTS(n) Zwraca wartość TRUE, jeśli n-ty element kolekcji istnieje; w przeciwnym razie zwraca FALSE. |
2 | COUNT Zwraca liczbę elementów, które aktualnie zawiera kolekcja. |
3 | LIMIT Sprawdza maksymalny rozmiar kolekcji. |
4 | FIRST Zwraca pierwsze (najmniejsze) liczby indeksu w kolekcji, w której są używane indeksy całkowite. |
5 | LAST Zwraca ostatnie (największe) liczby indeksu w kolekcji używającej indeksów całkowitych. |
6 | PRIOR(n) Zwraca numer indeksu poprzedzający indeks n w kolekcji. |
7 | NEXT(n) Zwraca numer indeksu, który następuje po indeksie n. |
8 | EXTEND Dołącza jeden element o wartości null do kolekcji. |
9 | EXTEND(n) Dołącza null elementów do kolekcji. |
10 | EXTEND(n,i) Dołącza nkopie i- tego elementu do kolekcji. |
11 | TRIM Usuwa jeden element z końca kolekcji. |
12 | TRIM(n) Usuwa n elementy z końca kolekcji. |
13 | DELETE Usuwa wszystkie elementy z kolekcji, ustawiając COUNT na 0. |
14 | DELETE(n) Usuwa nthelement z tablicy asocjacyjnej z kluczem numerycznym lub zagnieżdżoną tabelą. Jeśli tablica asocjacyjna ma klucz łańcuchowy, element odpowiadający wartości klucza jest usuwany. Gdybyn jest zerowy, DELETE(n) nic nie robi. |
15 | DELETE(m,n) Usuwa wszystkie elementy z zakresu m..nz tablicy asocjacyjnej lub tabeli zagnieżdżonej. Gdybym jest większy niż n albo jeśli m lub n jest zerowy, DELETE(m,n) nic nie robi. |
Wyjątki dotyczące kolekcji
W poniższej tabeli przedstawiono wyjątki kolekcji i kiedy są one zgłaszane -
Wyjątek dotyczący kolekcji | Wychowany w sytuacjach |
---|---|
COLLECTION_IS_NULL | Próbujesz operować na kolekcji atomowo zerowej. |
NIE ZNALEZIONO DANYCH | Indeks dolny oznacza usunięty element lub nieistniejący element tablicy asocjacyjnej. |
SUBSCRIPT_BEYOND_COUNT | Indeks dolny przekracza liczbę elementów w kolekcji. |
SUBSCRIPT_OUTSIDE_LIMIT | Indeks dolny jest poza dozwolonym zakresem. |
VALUE_ERROR | Indeks dolny jest pusty lub nie można go zamienić na typ klucza. Ten wyjątek może wystąpić, jeśli klucz jest zdefiniowany jako plikPLS_INTEGER zakres, a indeks dolny jest poza tym zakresem. |
W tym rozdziale omówimy transakcje w PL / SQL. Baza danychtransactionto niepodzielna jednostka pracy, która może składać się z jednej lub więcej powiązanych instrukcji SQL. Nazywa się to niepodzielną, ponieważ modyfikacje bazy danych wywołane przez instrukcje SQL, które stanowią transakcję, mogą być zbiorczo zatwierdzone, tj. Trwale w bazie danych lub wycofane (cofnięte) z bazy danych.
Pomyślnie wykonana instrukcja SQL i zatwierdzona transakcja to nie to samo. Nawet jeśli instrukcja SQL zostanie wykonana pomyślnie, chyba że transakcja zawierająca instrukcję zostanie zatwierdzona, można ją wycofać, a wszystkie zmiany wprowadzone przez instrukcję (y) można cofnąć.
Rozpoczęcie i zakończenie transakcji
Transakcja ma rozszerzenie beginning i end. Transakcja rozpoczyna się, gdy ma miejsce jedno z następujących zdarzeń -
Pierwsza instrukcja SQL jest wykonywana po połączeniu się z bazą danych.
Przy każdej nowej instrukcji SQL wydanej po zakończeniu transakcji.
Transakcja kończy się, gdy ma miejsce jedno z następujących zdarzeń -
ZA COMMIT lub a ROLLBACK wydano oświadczenie.
ZA DDL oświadczenie, takie jak CREATE TABLEwydano oświadczenie; ponieważ w tym przypadku polecenie COMMIT jest wykonywane automatycznie.
ZA DCL oświadczenie, takie jak GRANTwydano oświadczenie; ponieważ w tym przypadku polecenie COMMIT jest wykonywane automatycznie.
Użytkownik rozłącza się z bazą danych.
Użytkownik wychodzi z SQL*PLUS wydając EXIT polecenie, polecenie COMMIT jest wykonywane automatycznie.
SQL * Plus kończy działanie nieprawidłowo, a ROLLBACK jest wykonywana automatycznie.
ZA DMLinstrukcja kończy się niepowodzeniem; w takim przypadku ROLLBACK jest wykonywana automatycznie w celu cofnięcia tej instrukcji DML.
Zatwierdzenie transakcji
Transakcja jest trwała przez wydanie polecenia SQL COMMIT. Ogólna składnia polecenia COMMIT to -
COMMIT;
Na przykład,
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;
Wycofywanie transakcji
Zmiany wprowadzone w bazie danych bez polecenia COMMIT można cofnąć za pomocą polecenia ROLLBACK.
Ogólna składnia polecenia ROLLBACK to -
ROLLBACK [TO SAVEPOINT < savepoint_name>];
Kiedy transakcja zostaje przerwana z powodu jakiejś bezprecedensowej sytuacji, takiej jak awaria systemu, cała transakcja od momentu zatwierdzenia jest automatycznie wycofywana. Jeśli nie używaszsavepoint, a następnie użyj poniższej instrukcji, aby cofnąć wszystkie zmiany -
ROLLBACK;
Savepoints
Savepoints to rodzaj znaczników, które pomagają w podzieleniu długiej transakcji na mniejsze jednostki poprzez ustawienie niektórych punktów kontrolnych. Ustawiając punkty zapisu w ramach długiej transakcji, możesz w razie potrzeby cofnąć się do punktu kontrolnego. Odbywa się to poprzez wydanieSAVEPOINT Komenda.
Ogólna składnia polecenia SAVEPOINT to -
SAVEPOINT < savepoint_name >;
Na przykład
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 );
SAVEPOINT sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000;
ROLLBACK TO sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 7;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 8;
COMMIT;
ROLLBACK TO sav1 - Ta instrukcja cofa wszystkie zmiany do momentu, w którym zaznaczyłeś punkt zapisu sav1.
Następnie rozpoczną się nowe zmiany, które wprowadzisz.
Automatyczna kontrola transakcji
Aby wykonać COMMIT automatycznie, gdy plik INSERT, UPDATE lub DELETE jest wykonywane, możesz ustawić AUTOCOMMIT zmienna środowiskowa jako -
SET AUTOCOMMIT ON;
Możesz wyłączyć tryb automatycznego zatwierdzania za pomocą następującego polecenia -
SET AUTOCOMMIT OFF;
W tym rozdziale omówimy datę i godzinę w PL / SQL. Istnieją dwie klasy typów danych związanych z datą i godziną w PL / SQL -
- Typy danych typu data i godzina
- Typy danych interwałowych
Typy danych Datetime to -
- DATE
- TIMESTAMP
- TIMESTAMP ZE STREFĄ CZASOWĄ
- ZNAK CZASOWY Z LOKALNĄ STREFĄ CZASOWĄ
Typy danych Interval to -
- ODSTĘP OD ROKU DO MIESIĄCA
- ODSTĘP DZIEŃ DO DRUGI
Wartości pól dla typów danych typu Datetime i Interval
Obie datetime i interval typy danych składają się z fields. Wartości tych pól określają wartość typu danych. W poniższej tabeli wymieniono pola i ich możliwe wartości dla dat i interwałów.
Nazwa pola | Prawidłowe wartości daty i godziny | Prawidłowe wartości przedziałów |
---|---|---|
ROK | -4712 do 9999 (z wyłączeniem roku 0) | Dowolna niezerowa liczba całkowita |
MIESIĄC | 01 do 12 | Od 0 do 11 |
DZIEŃ | 01 do 31 (ograniczone wartościami MIESIĄCA i ROKU, zgodnie z regułami kalendarza dla regionu) | Dowolna niezerowa liczba całkowita |
GODZINA | 00 do 23 | Od 0 do 23 |
MINUTA | 00 do 59 | Od 0 do 59 |
DRUGA | 00 do 59,9 (n), gdzie 9 (n) jest dokładnością ułamków czasu w sekundach Część 9 (n) nie dotyczy DATE. |
0 do 59,9 (n), gdzie 9 (n) jest dokładnością ułamków sekund interwału |
TIMEZONE_HOUR | -12 do 14 (zakres obejmuje zmiany czasu letniego) Nie dotyczy DATE ani TIMESTAMP. |
Nie dotyczy |
TIMEZONE_MINUTE | 00 do 59 Nie dotyczy DATE ani TIMESTAMP. |
Nie dotyczy |
TIMEZONE_REGION | Nie dotyczy DATE ani TIMESTAMP. | Nie dotyczy |
TIMEZONE_ABBR | Nie dotyczy DATE ani TIMESTAMP. | Nie dotyczy |
Typy danych i funkcje daty i godziny
Poniżej przedstawiono typy danych typu data i godzina -
DATA
Przechowuje informacje o dacie i godzinie zarówno w postaci znaków, jak i liczb. Zawiera informacje dotyczące wieku, roku, miesiąca, daty, godziny, minuty i sekundy. Jest określony jako -
ZNAK CZASU
Jest to rozszerzenie typu danych DATE. Przechowuje rok, miesiąc i dzień typu danych DATE, wraz z wartościami godzin, minut i sekund. Jest to przydatne do przechowywania dokładnych wartości czasu.
TIMESTAMP ZE STREFĄ CZASOWĄ
Jest to wariant TIMESTAMP, który zawiera w swojej wartości nazwę regionu strefy czasowej lub przesunięcie strefy czasowej. Przesunięcie strefy czasowej to różnica (w godzinach i minutach) między czasem lokalnym a czasem UTC. Ten typ danych jest przydatny do zbierania i oceny informacji o dacie w różnych regionach geograficznych.
ZNAK CZASOWY Z LOKALNĄ STREFĄ CZASOWĄ
Jest to kolejny wariant TIMESTAMP, który zawiera przesunięcie strefy czasowej w swojej wartości.
Poniższa tabela zawiera funkcje daty i godziny (gdzie x ma wartość datetime) -
S.Nr | Nazwa i opis funkcji |
---|---|
1 | ADD_MONTHS(x, y); Dodaje y miesięcy do x. |
2 | LAST_DAY(x); Zwraca ostatni dzień miesiąca. |
3 | MONTHS_BETWEEN(x, y); Zwraca liczbę miesięcy między x i y. |
4 | NEXT_DAY(x, day); Zwraca datę i godzinę następnego dnia pox. |
5 | NEW_TIME; Zwraca wartość godziny / dnia ze strefy czasowej określonej przez użytkownika. |
6 | ROUND(x [, unit]); Rundy x. |
7 | SYSDATE(); Zwraca bieżącą datę i godzinę. |
8 | TRUNC(x [, unit]); Obcina x. |
Funkcje datownika (gdzie x ma wartość datownika) -
S.Nr | Nazwa i opis funkcji |
---|---|
1 | CURRENT_TIMESTAMP(); Zwraca TIMESTAMP WITH TIME ZONE zawierającą aktualny czas sesji oraz strefę czasową sesji. |
2 | EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x) Wyodrębnia i zwraca rok, miesiąc, dzień, godzinę, minutę, sekundę lub strefę czasową z x. |
3 | FROM_TZ(x, time_zone); Konwertuje TIMESTAMP x i strefę czasową określoną przez time_zone na TIMESTAMP WITH TIMEZONE. |
4 | LOCALTIMESTAMP(); Zwraca TIMESTAMP zawierający czas lokalny w strefie czasowej sesji. |
5 | SYSTIMESTAMP(); Zwraca TIMESTAMP WITH TIME ZONE zawierającą bieżący czas bazy danych wraz ze strefą czasową bazy danych. |
6 | SYS_EXTRACT_UTC(x); Konwertuje TIMESTAMP WITH TIMEZONE x na TIMESTAMP zawierający datę i godzinę w UTC. |
7 | TO_TIMESTAMP(x, [format]); Konwertuje ciąg x na TIMESTAMP. |
8 | TO_TIMESTAMP_TZ(x, [format]); Konwertuje ciąg x na TIMESTAMP WITH TIMEZONE. |
Przykłady
Poniższe fragmenty kodu ilustrują użycie powyższych funkcji -
Example 1
SELECT SYSDATE FROM DUAL;
Output -
08/31/2012 5:25:34 PM
Example 2
SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL;
Output -
31-08-2012 05:26:14
Example 3
SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;
Output -
01/31/2013 5:26:31 PM
Example 4
SELECT LOCALTIMESTAMP FROM DUAL;
Output -
8/31/2012 5:26:55.347000 PM
Typy i funkcje danych przedziałów czasu
Poniżej przedstawiono typy danych Interval -
IINTERVAL YEAR TO MONTH - Przechowuje okres czasu przy użyciu pól YEAR i MONTH datetime.
INTERVAL DAY TO SECOND - Przechowuje okres czasu w postaci dni, godzin, minut i sekund.
Funkcje interwałowe
S.Nr | Nazwa i opis funkcji |
---|---|
1 | NUMTODSINTERVAL(x, interval_unit); Konwertuje liczbę x na INTERVAL DAY TO SECOND. |
2 | NUMTOYMINTERVAL(x, interval_unit); Konwertuje liczbę x na INTERVAL YEAR TO MONTH. |
3 | TO_DSINTERVAL(x); Konwertuje ciąg x na INTERVAL DAY TO SECOND. |
4 | TO_YMINTERVAL(x); Konwertuje ciąg x na INTERVAL YEAR TO MONTH. |
W tym rozdziale omówimy wyjście DBMS w PL / SQL. PlikDBMS_OUTPUTto wbudowany pakiet, który umożliwia wyświetlanie danych wyjściowych, debugowania informacji i wysyłanie komunikatów z bloków PL / SQL, podprogramów, pakietów i wyzwalaczy. Korzystaliśmy już z tego pakietu w całym naszym samouczku.
Spójrzmy na mały fragment kodu, który wyświetli wszystkie tabele użytkowników w bazie danych. Wypróbuj w swojej bazie danych, aby wyświetlić listę wszystkich nazw tabel -
BEGIN
dbms_output.put_line (user || ' Tables in the database:');
FOR t IN (SELECT table_name FROM user_tables)
LOOP
dbms_output.put_line(t.table_name);
END LOOP;
END;
/
DBMS_OUTPUT Podprogramy
Pakiet DBMS_OUTPUT ma następujące podprogramy -
S.Nr | Podprogram i cel | |
---|---|---|
1 | DBMS_OUTPUT.DISABLE; Wyłącza wysyłanie wiadomości. |
|
2 | DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000); Włącza wysyłanie wiadomości. NULL wartośćbuffer_size reprezentuje nieograniczony rozmiar bufora. |
|
3 | DBMS_OUTPUT.GET_LINE (line OUT VARCHAR2, status OUT INTEGER); Pobiera pojedynczą linię zbuforowanych informacji. |
|
4 | DBMS_OUTPUT.GET_LINES (lines OUT CHARARR, numlines IN OUT INTEGER); Pobiera tablicę wierszy z bufora. |
|
5 | DBMS_OUTPUT.NEW_LINE; Umieszcza znacznik końca linii. |
|
6 | DBMS_OUTPUT.PUT(item IN VARCHAR2); Umieszcza częściową linię w buforze. |
|
7 | DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2); Umieszcza linię w buforze. |
Przykład
DECLARE
lines dbms_output.chararr;
num_lines number;
BEGIN
-- enable the buffer with default size 20000
dbms_output.enable;
dbms_output.put_line('Hello Reader!');
dbms_output.put_line('Hope you have enjoyed the tutorials!');
dbms_output.put_line('Have a great time exploring pl/sql!');
num_lines := 3;
dbms_output.get_lines(lines, num_lines);
FOR i IN 1..num_lines LOOP
dbms_output.put_line(lines(i));
END LOOP;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Hello Reader!
Hope you have enjoyed the tutorials!
Have a great time exploring pl/sql!
PL/SQL procedure successfully completed.
W tym rozdziale omówimy język PL / SQL zorientowany obiektowo. PL / SQL umożliwia zdefiniowanie typu obiektu, co pomaga w projektowaniu obiektowej bazy danych w Oracle. Typ obiektu umożliwia tworzenie typów złożonych. Korzystanie z obiektów pozwala na implementację obiektów świata rzeczywistego o określonej strukturze danych i metodach ich obsługi. Obiekty mają atrybuty i metody. Atrybuty są właściwościami obiektu i służą do przechowywania stanu obiektu; i metody są używane do modelowania jego zachowania.
Obiekty są tworzone za pomocą instrukcji CREATE [OR REPLACE] TYPE. Poniżej znajduje się przykład tworzenia prostego plikuaddress obiekt składający się z kilku atrybutów -
CREATE OR REPLACE TYPE address AS OBJECT
(house_no varchar2(10),
street varchar2(30),
city varchar2(20),
state varchar2(10),
pincode varchar2(10)
);
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Stwórzmy jeszcze jeden obiekt customer gdzie będziemy zawijać attributes i methods razem, aby mieć poczucie zorientowania na obiekt -
CREATE OR REPLACE TYPE customer AS OBJECT
(code number(5),
name varchar2(30),
contact_no varchar2(12),
addr address,
member procedure display
);
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Tworzenie wystąpienia obiektu
Zdefiniowanie typu obiektu zapewnia plan dla obiektu. Aby użyć tego obiektu, musisz utworzyć instancje tego obiektu. Dostęp do atrybutów i metod obiektu można uzyskać za pomocą nazwy instancji ithe access operator (.) w następujący sposób -
DECLARE
residence address;
BEGIN
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
dbms_output.put_line('House No: '|| residence.house_no);
dbms_output.put_line('Street: '|| residence.street);
dbms_output.put_line('City: '|| residence.city);
dbms_output.put_line('State: '|| residence.state);
dbms_output.put_line('Pincode: '|| residence.pincode);
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
House No: 103A
Street: M.G.Road
City: Jaipur
State: Rajasthan
Pincode: 201301
PL/SQL procedure successfully completed.
Metody członkowskie
Member methods są używane do manipulowania plikiem attributesobiektu. Deklarację metody składowej podaje się podczas deklarowania typu obiektu. Treść obiektu definiuje kod metod składowych. Treść obiektu jest tworzona za pomocą instrukcji CREATE TYPE BODY.
Constructorsto funkcje, które zwracają nowy obiekt jako jego wartość. Każdy obiekt ma zdefiniowaną przez system metodę konstruktora. Nazwa konstruktora jest taka sama, jak typ obiektu. Na przykład -
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
Plik comparison methodssłużą do porównywania obiektów. Istnieją dwa sposoby porównywania obiektów -
Metoda mapy
Plik Map methodjest funkcją zaimplementowaną w taki sposób, że jej wartość zależy od wartości atrybutów. Na przykład dla obiektu klienta, jeśli kod klienta jest taki sam dla dwóch klientów, obaj klienci mogą być tacy sami. Zatem związek między tymi dwoma obiektami zależałby od wartości kodu.
Sposób zamawiania
Plik Order methodimplementuje pewną wewnętrzną logikę do porównywania dwóch obiektów. Na przykład dla obiektu prostokątnego prostokąt jest większy niż inny prostokąt, jeśli oba jego boki są większe.
Korzystanie z metody Map
Spróbujmy zrozumieć powyższe pojęcia, używając następującego obiektu prostokąta -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
member procedure display,
map member function measure return number
);
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Tworzenie treści typu -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
MAP MEMBER FUNCTION measure return number IS
BEGIN
return (sqrt(length*length + width*width));
END measure;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type body created.
Teraz używając obiektu rectangle i jego funkcji składowych -
DECLARE
r1 rectangle;
r2 rectangle;
r3 rectangle;
inc_factor number := 5;
BEGIN
r1 := rectangle(3, 4);
r2 := rectangle(5, 7);
r3 := r1.enlarge(inc_factor);
r3.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Length: 8
Width: 9
Length: 5
Width: 7
PL/SQL procedure successfully completed.
Korzystanie z metody zamawiania
Teraz same effect could be achieved using an order method. Odtwórzmy prostokątny obiekt za pomocą metody zamówienia -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member procedure display,
order member function measure(r rectangle) return number
);
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Tworzenie treści typu -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
ORDER MEMBER FUNCTION measure(r rectangle) return number IS
BEGIN
IF(sqrt(self.length*self.length + self.width*self.width)>
sqrt(r.length*r.length + r.width*r.width)) then
return(1);
ELSE
return(-1);
END IF;
END measure;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type body created.
Korzystanie z obiektu prostokątnego i jego funkcji składowych -
DECLARE
r1 rectangle;
r2 rectangle;
BEGIN
r1 := rectangle(23, 44);
r2 := rectangle(15, 17);
r1.display;
r2.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Length: 23
Width: 44
Length: 15
Width: 17
Length: 23
Width: 44
PL/SQL procedure successfully completed.
Dziedziczenie dla obiektów PL / SQL
PL / SQL umożliwia tworzenie obiektów z istniejących obiektów bazowych. Aby zaimplementować dziedziczenie, obiekty bazowe powinny być zadeklarowane jakoNOT FINAL. Wartość domyślna toFINAL.
Poniższe programy ilustrują dziedziczenie w obiektach PL / SQL. Stwórzmy kolejny obiekt o nazwieTableTop, jest to dziedziczone z obiektu Rectangle. W tym celu musimy utworzyć podstawowy obiekt prostokątny -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
NOT FINAL member procedure display) NOT FINAL
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Tworzenie treści typu podstawowego -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type body created.
Tworzenie blatu obiektu potomnego -
CREATE OR REPLACE TYPE tabletop UNDER rectangle
(
material varchar2(20),
OVERRIDING member procedure display
)
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.
Tworzenie treści typu dla blatu obiektu podrzędnego
CREATE OR REPLACE TYPE BODY tabletop AS
OVERRIDING MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
dbms_output.put_line('Material: '|| material);
END display;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type body created.
Korzystanie z obiektu blatu i jego funkcji składowych -
DECLARE
t1 tabletop;
t2 tabletop;
BEGIN
t1:= tabletop(20, 10, 'Wood');
t2 := tabletop(50, 30, 'Steel');
t1.display;
t2.display;
END;
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Length: 20
Width: 10
Material: Wood
Length: 50
Width: 30
Material: Steel
PL/SQL procedure successfully completed.
Obiekty abstrakcyjne w PL / SQL
Plik NOT INSTANTIABLEklauzula umożliwia zadeklarowanie abstrakcyjnego obiektu. Nie możesz używać abstrakcyjnego obiektu takim, jakim jest; będziesz musiał stworzyć podtyp lub typ podrzędny takich obiektów, aby móc korzystać z ich funkcjonalności.
Na przykład,
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)
NOT INSTANTIABLE NOT FINAL
/
Gdy powyższy kod jest wykonywany w wierszu polecenia SQL, daje następujący wynik -
Type created.