PL/SQL - PL/SQL

PL / SQL ( proceduralne Język dla SQL) jest Oracle Corporation „s proceduralne rozszerzenie dla SQL i Oracle relacyjnej bazy danych . PL/SQL jest dostępny w Oracle Database (od wersji 6 - przechowywane procedury/funkcje/pakiety/wyzwalacze PL/SQL od wersji 7), w bazie danych Times Ten w pamięci (od wersji 11.2.1) i IBM DB 2 (od wersji 9.7). Oracle Corporation zwykle rozszerza funkcjonalność PL/SQL z każdym kolejnym wydaniem bazy danych Oracle.

PL/SQL zawiera elementy języka proceduralnego, takie jak warunki i pętle . Umożliwia deklarację stałych i zmiennych , procedur i funkcji, typów i zmiennych tych typów oraz wyzwalaczy. Może obsługiwać wyjątki (błędy wykonania). Obsługiwane są tablice z wykorzystaniem kolekcji PL/SQL. Implementacje począwszy od wersji 8 bazy danych Oracle zawierały funkcje związane z orientacją obiektową . Można tworzyć jednostki PL/SQL, takie jak procedury, funkcje, pakiety, typy i wyzwalacze, które są przechowywane w bazie danych do ponownego wykorzystania przez aplikacje korzystające z dowolnego interfejsu programistycznego Oracle Database.

Historycznie pierwsza publiczna wersja definicji PL/SQL miała miejsce w 1995 roku, a rok powstania Oracle około 1992 roku. Implementuje standard ISO SQL/PSM .

Jednostka programu PL/SQL

Główną cechą SQL (nieproceduralną) jest również wada SQL: nie można używać instrukcji sterujących (sterowanie decyzyjne lub iteracyjne ), jeśli ma być używany tylko SQL. PL/SQL to w zasadzie język proceduralny, który zapewnia funkcjonalność podejmowania decyzji, iteracji i wiele innych funkcji, takich jak inne proceduralne języki programowania. PL / SQL Jednostka programu jest jednym z poniższych: blok PL / SQL anonimowy, procedura , funkcja , pakiet specyfikacja, ciało pakietu, wyzwalacz, specyfikacja, typ ciała, biblioteka. Jednostki programu to kod źródłowy PL/SQL, który jest kompilowany, rozwijany i ostatecznie wykonywany w bazie danych.

Blok anonimowy PL/SQL

Podstawową jednostką programu źródłowego PL/SQL jest blok, który grupuje powiązane ze sobą deklaracje i instrukcje. Blok PL/SQL jest zdefiniowany przez słowa kluczowe DECLARE, BEGIN, EXCEPTION i END. Te słowa kluczowe dzielą blok na część deklaratywną, część wykonywalną i część dotyczącą obsługi wyjątków. Sekcja deklaracji jest opcjonalna i może być używana do definiowania i inicjowania stałych i zmiennych. Jeśli zmienna nie jest inicjowana, domyślnie przyjmuje wartość NULL . Opcjonalna część obsługi wyjątków służy do obsługi błędów czasu wykonywania. Wymagana jest tylko część wykonywalna. Blok może mieć etykietę.

Na przykład:

<<label>>   -- this is optional
DECLARE
-- this section is optional
  number1 NUMBER(2);
  number2 number1%TYPE := 17;             -- value default
  text1   VARCHAR2(12) := 'Hello world';
  text2   DATE         := SYSDATE;        -- current date and time
BEGIN
-- this section is mandatory, must contain at least one executable statement
  SELECT street_number
    INTO number1
    FROM address
    WHERE name = 'INU';
EXCEPTION
-- this section is optional
   WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE('Error Code is ' || TO_CHAR(sqlcode));
     DBMS_OUTPUT.PUT_LINE('Error Message is ' || sqlerrm);
END;

Symbol :=działa jako operator przypisania do przechowywania wartości w zmiennej.

Bloki mogą być zagnieżdżone – tzn. ponieważ blok jest instrukcją wykonywalną, może pojawić się w innym bloku, gdziekolwiek jest dozwolona instrukcja wykonywalna. Blok można przesłać do interaktywnego narzędzia (takiego jak SQL*Plus) lub osadzić w prekompilatorze Oracle lub programie OCI . Interaktywne narzędzie lub program uruchamia blok jeden raz. Blok nie jest przechowywany w bazie danych iz tego powodu nazywany jest blokiem anonimowym (nawet jeśli posiada etykietę).

Funkcjonować

Przeznaczenie funkcji PL/SQL jest zwykle używane do obliczania i zwracania pojedynczej wartości. Ta zwracana wartość może być pojedynczą wartością skalarną (taką jak liczba, data lub ciąg znaków) lub pojedynczą kolekcją (taką jak zagnieżdżona tabela lub tablica). Funkcje zdefiniowane przez użytkownika uzupełniają funkcje wbudowane dostarczane przez Oracle Corporation.

Funkcja PL/SQL ma postać:

CREATE OR REPLACE FUNCTION <function_name> [(input/output variable declarations)] RETURN return_type
[AUTHID <CURRENT_USER | DEFINER>] <IS|AS>   -- heading part
amount number;   -- declaration block
BEGIN   -- executable part
	<PL/SQL block with return statement>
        RETURN <return_value>;
[Exception
	none]
        RETURN <return_value>;
END;

Funkcje tabel potokowe zwracają kolekcje i przyjmują postać:

CREATE OR REPLACE FUNCTION <function_name> [(input/output variable declarations)] RETURN return_type
[AUTHID <CURRENT_USER | DEFINER>] [<AGGREGATE | PIPELINED>] <IS|USING>
	[declaration block]
BEGIN
	<PL/SQL block with return statement>
        PIPE ROW <return type>;
        RETURN;
[Exception
	exception block]
        PIPE ROW <return type>;
        RETURN;
END;

Funkcja powinna używać tylko domyślnego typu parametru IN. Jedyną wartością wychodzącą z funkcji powinna być wartość, którą zwraca.

Procedura

Procedury przypominają funkcje, ponieważ są nazwanymi jednostkami programu, które mogą być wywoływane wielokrotnie. Podstawowa różnica polega na tym, że funkcje mogą być używane w instrukcji SQL, podczas gdy procedury nie . Inną różnicą jest to, że procedura może zwrócić wiele wartości, podczas gdy funkcja powinna zwracać tylko jedną wartość.

Procedura zaczyna się od obowiązkowej części nagłówka, która przechowuje nazwę procedury i opcjonalnie listę parametrów procedury. Dalej są części deklaratywne, wykonywalne i obsługujące wyjątki, jak w bloku anonimowym PL/SQL. Prosta procedura może wyglądać tak:

CREATE PROCEDURE create_email_address ( -- Procedure heading part begins
    name1 VARCHAR2,
    name2 VARCHAR2,
    company VARCHAR2,
    email OUT VARCHAR2
) -- Procedure heading part ends
AS
-- Declarative part begins (optional)
error_message VARCHAR2(30) := 'Email address is too long.';
BEGIN -- Executable part begins (mandatory)
    email := name1 || '.' || name2 || '@' || company;
EXCEPTION -- Exception-handling part begins (optional)
WHEN VALUE_ERROR THEN
    DBMS_OUTPUT.PUT_LINE(error_message);
END create_email_address;

Powyższy przykład przedstawia samodzielną procedurę — ​​ten typ procedury jest tworzony i przechowywany w schemacie bazy danych za pomocą instrukcji CREATE PROCEDURE. Procedurę można również utworzyć w pakiecie PL/SQL - nazywa się to procedurą pakietową. Procedura utworzona w anonimowym bloku PL/SQL nazywana jest procedurą zagnieżdżoną. Procedury autonomiczne lub pakietowe przechowywane w bazie danych są określane jako „ procedury składowane ”.

Procedury mogą mieć trzy typy parametrów: IN, OUT i IN OUT.

  1. Parametr IN jest używany tylko jako wejście. Parametr IN jest przekazywany przez odwołanie, chociaż może być zmieniony przez nieaktywny program.
  2. Parametr OUT ma początkowo wartość NULL. Program przypisuje wartość parametru i ta wartość jest zwracana do programu wywołującego.
  3. Parametr IN OUT może, ale nie musi mieć wartości początkowej. Ta wartość początkowa może, ale nie musi być modyfikowana przez wywoływany program. Wszelkie zmiany wprowadzone w parametrze są domyślnie zwracane do programu wywołującego przez skopiowanie, ale - z podpowiedzią NO-COPY - mogą być przekazywane przez odwołanie .

PL/SQL obsługuje również procedury zewnętrzne za pośrednictwem standardowego ext-procprocesu bazy danych Oracle .

Pakiet

Pakiety to grupy koncepcyjnie powiązanych funkcji, procedur, zmiennych, instrukcji PL/SQL tabeli i rekordów TYPE, stałych, kursorów itp. Korzystanie z pakietów promuje ponowne wykorzystanie kodu. Pakiety składają się ze specyfikacji pakietu i opcjonalnej treści pakietu. Specyfikacja jest interfejsem do aplikacji; deklaruje dostępne typy, zmienne, stałe, wyjątki, kursory i podprogramy. Ciało w pełni definiuje kursory i podprogramy, a więc implementuje specyfikację. Dwie zalety pakietów to:

  1. Podejście modułowe, hermetyzacja/ukrywanie logiki biznesowej, bezpieczeństwo, poprawa wydajności, ponowne wykorzystanie. Obsługują funkcje programowania obiektowego, takie jak przeciążanie funkcji i enkapsulacja.
  2. Za pomocą zmiennych pakietu można deklarować zmienne na poziomie sesji (zakresowe), ponieważ zmienne zadeklarowane w specyfikacji pakietu mają zasięg sesyjny.

Cyngiel

Wyzwalacz jest jak procedury przechowywanej, że Oracle Database wywołuje automatycznie, gdy wystąpi określone zdarzenie. Jest to nazwana jednostka PL/SQL, która jest przechowywana w bazie danych i może być wywoływana wielokrotnie. W przeciwieństwie do procedury składowanej można włączać i wyłączać wyzwalacz, ale nie można go jawnie wywołać. Gdy wyzwalacz jest włączony, baza danych automatycznie go wywołuje — to znaczy wyzwalacz — za każdym razem, gdy wystąpi zdarzenie wyzwalające. Gdy wyzwalacz jest wyłączony, nie uruchamia się.

Wyzwalacz tworzy się za pomocą instrukcji CREATE TRIGGER. Zdarzenie wyzwalające określasz w kategoriach instrukcji wyzwalających oraz elementu, na którym działają. Mówi się, że wyzwalacz jest utworzony lub zdefiniowany na elemencie — którym jest tabela, widok , schemat lub baza danych. Należy również określić punkt czasowy, który określa, czy wyzwalacz jest uruchamiany przed, czy po uruchomieniu instrukcji wyzwalającej i czy jest uruchamiany dla każdego wiersza, na który ma wpływ instrukcja wyzwalająca.

Jeśli wyzwalacz jest tworzony w tabeli lub widoku, zdarzenie wyzwalające składa się z instrukcji DML, a wyzwalacz jest nazywany wyzwalaczem DML. Jeśli wyzwalacz jest tworzony w schemacie lub bazie danych, zdarzenie wyzwalające składa się z instrukcji DDL lub operacji na bazie danych, a wyzwalacz jest nazywany wyzwalaczem systemowym.

Wyzwalacz INSTEAD OF to: Wyzwalacz DML utworzony w widoku lub wyzwalacz systemowy zdefiniowany w instrukcji CREATE. Baza danych uruchamia wyzwalacz INSTEAD OF zamiast uruchamiania instrukcji wyzwalania.

Cel wyzwalaczy

Wyzwalacze można pisać w następujących celach:

  • Automatyczne generowanie niektórych wartości kolumn pochodnych
  • Egzekwowanie integralności referencyjnej
  • Rejestrowanie zdarzeń i przechowywanie informacji o dostępie do tabeli
  • Audyt
  • Synchroniczna replikacja tabel
  • Narzucanie autoryzacji bezpieczeństwa
  • Zapobieganie nieprawidłowym transakcjom

Typy danych

Główne typy danych w PL/SQL to NUMBER, CHAR, VARCHAR2, DATE i TIMESTAMP.

Zmienne numeryczne

variable_name number([P, S]) := 0;

Aby zdefiniować zmienną liczbową, programista dołącza do definicji nazwy zmienną typu NUMBER . Aby określić (opcjonalną) dokładność (P) i (opcjonalną) skalę (S), można je dodatkowo dołączyć w nawiasach okrągłych, oddzielonych przecinkiem. („Precyzja” w tym kontekście odnosi się do liczby cyfr, które zmienna może przechowywać, a „skala” odnosi się do liczby cyfr, które mogą występować po przecinku.)

Wybór innych typów danych dla zmiennych numerycznych obejmuje: binary_float, binary_double, dec, dziesiętny, podwójnej precyzji, float, integer, int, numeric, real, small-int, binary_integer.

Zmienne znakowe

variable_name varchar2(20) := 'Text';

-- e.g.: 
address varchar2(20) := 'lake view road';

Aby zdefiniować zmienną znakową, programista zwykle dołącza do definicji nazwy typ zmiennej VARCHAR2. W nawiasach znajduje się maksymalna liczba znaków, które zmienna może przechowywać.

Inne typy danych dla zmiennych znakowych to: varchar, char, long, raw, long raw, nchar, nchar2, clob, blob i bfile.

Zmienne daty

variable_name date := to_date('01-01-2005 14:20:23', 'DD-MM-YYYY hh24:mi:ss');

Zmienne daty mogą zawierać datę i czas. Czas można pominąć, ale nie ma możliwości zdefiniowania zmiennej, która zawiera tylko czas. Nie ma typu DATETIME. I jest typ CZAS. Ale nie ma typu TIMESTAMP, który może zawierać drobnoziarnisty znacznik czasu do milisekundy lub nanosekundy. Typy danych Oracle

TO_DATEFunkcja może być użyty do konwersji ciągów znaków na wartości dat. Funkcja konwertuje pierwszy ciąg w cudzysłowie na datę, używając jako definicji drugiego ciągu w cudzysłowie, na przykład:

 to_date('31-12-2004', 'dd-mm-yyyy')

lub

 to_date ('31-Dec-2004', 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE = American')

Do konwersji dat na ciągi znaków służy funkcja TO_CHAR (date_string, format_string).

PL/SQL obsługuje również użycie literałów daty i interwału ANSI. Poniższa klauzula podaje 18-miesięczny zakres:

WHERE dateField BETWEEN DATE '2004-12-30' - INTERVAL '1-6' YEAR TO MONTH
    AND DATE '2004-12-30'

Wyjątki

Wyjątki — błędy podczas wykonywania kodu — są dwojakiego rodzaju: zdefiniowane przez użytkownika i wstępnie zdefiniowane.

Wyjątki zdefiniowane przez użytkownika są zawsze wyraźnie zgłaszane przez programistów za pomocą poleceń RAISElub RAISE_APPLICATION_ERRORw każdej sytuacji, w której stwierdzą, że nie jest możliwe kontynuowanie normalnego wykonywania. RAISEKomenda ma składnię:

RAISE <exception name>;

Oracle Corporation predefiniowane kilka wyjątków, takich jak NO_DATA_FOUND, TOO_MANY_ROWS, itd. Każdy wyjątek posiada numer błędu SQL i SQL komunikat błędu związanego z nim. Programiści mogą uzyskać do nich dostęp za pomocą funkcji SQLCODEi SQLERRM.

Typy danych dla określonych kolumn

Variable_name Table_name.Column_name%type;

Ta składnia definiuje zmienną typu kolumny, do której istnieje odwołanie, w tabelach, do których się odwołuje.

Programiści określają typy danych zdefiniowane przez użytkownika za pomocą składni:

type data_type is record (field_1 type_1 := xyz, field_2 type_2 := xyz, ..., field_n type_n := xyz);

Na przykład:

declare
    type t_address is record (
        name address.name%type,
        street address.street%type,
        street_number address.street_number%type,
        postcode address.postcode%type);
    v_address t_address;
begin
    select name, street, street_number, postcode into v_address from address where rownum = 1;
end;

Ten przykładowy program definiuje swój własny typ danych o nazwie t_address , który zawiera pola name, street, street_number i postcode .

Czyli zgodnie z przykładem jesteśmy w stanie skopiować dane z bazy do pól w programie.

Używając tego typu danych programista zdefiniował zmienną o nazwie v_address i załadował ją danymi z tablicy ADDRESS.

Programiści mogą adresować poszczególne atrybuty w takiej strukturze za pomocą notacji kropkowej, a więc:

v_address.street := 'High Street';

Instrukcje warunkowe

Poniższy segment kodu przedstawia konstrukcję IF-THEN-ELSIF-ELSE. Części ELSIF i ELSE są opcjonalne, więc możliwe jest tworzenie prostszych konstrukcji IF-THEN lub IF-THEN-ELSE.

IF x = 1 THEN
   sequence_of_statements_1;
ELSIF x = 2 THEN
   sequence_of_statements_2;
ELSIF x = 3 THEN
   sequence_of_statements_3;
ELSIF x = 4 THEN
   sequence_of_statements_4;
ELSIF x = 5 THEN
   sequence_of_statements_5;
ELSE
   sequence_of_statements_N;
END IF;

Instrukcja CASE upraszcza niektóre duże struktury IF-THEN-ELSIF-ELSE.

CASE
   WHEN x = 1 THEN sequence_of_statements_1;
   WHEN x = 2 THEN sequence_of_statements_2;
   WHEN x = 3 THEN sequence_of_statements_3;
   WHEN x = 4 THEN sequence_of_statements_4;
   WHEN x = 5 THEN sequence_of_statements_5;
   ELSE sequence_of_statements_N;
END CASE;

Instrukcja CASE może być używana z predefiniowanym selektorem:

CASE x
   WHEN 1 THEN sequence_of_statements_1;
   WHEN 2 THEN sequence_of_statements_2;
   WHEN 3 THEN sequence_of_statements_3;
   WHEN 4 THEN sequence_of_statements_4;
   WHEN 5 THEN sequence_of_statements_5;
   ELSE sequence_of_statements_N;
END CASE;

Obsługa tablicy

PL/SQL odnosi się do tablic jako „kolekcje”. Język oferuje trzy rodzaje kolekcji:

  1. Tablice asocjacyjne (tabele indeksowania)
  2. Tabele zagnieżdżone
  3. Varrays (macierze o zmiennej wielkości)

Programiści muszą określić górny limit dla zmiennych, ale nie muszą dla tabel indeksowanych lub tabel zagnieżdżonych. Język zawiera kilka metod gromadzenia używanych do manipulowania elementami kolekcji: na przykład FIRST, LAST, NEXT, PRIOR, EXTEND, TRIM, DELETE itp. Tabele indeksowane mogą być używane do symulowania tablic asocjacyjnych, jak w tym przykładzie funkcji memo dla funkcji Ackermanna w PL/SQL .

Tablice asocjacyjne (tabele indeksowania)

W przypadku tabel indeksowanych według tabeli, tablica może być indeksowana za pomocą liczb lub łańcuchów. Jest to paralela mapy Java , która zawiera pary klucz-wartość. Jest tylko jeden wymiar i jest nieograniczony.

Tabele zagnieżdżone

W przypadku tabel zagnieżdżonych programista musi zrozumieć, co jest zagnieżdżone. Tutaj tworzony jest nowy typ, który może składać się z wielu komponentów. Tego typu można następnie użyć do utworzenia kolumny w tabeli, a zagnieżdżone w tej kolumnie są te składniki.

Varrays (macierze o zmiennej wielkości)

W przypadku Varrays musisz zrozumieć, że słowo „zmienna” w wyrażeniu „tablice o zmiennej wielkości” nie odnosi się do rozmiaru tablicy w sposób, w jaki mogłoby się to wydawać. Rozmiar, z jakim zadeklarowana jest tablica, jest w rzeczywistości ustalony. Liczba elementów w tablicy jest zmienna do zadeklarowanego rozmiaru. Zapewne zatem tablice o zmiennych rozmiarach nie są tak zmiennymi rozmiarami.

Kursory

Kursor jest mechanizmem, wskaźnik do obszaru prywatnego SQL, która przechowuje informacje pochodzące z SELECT lub język manipulacji danymi (DML) oświadczenie (INSERT, UPDATE, DELETE lub połączyć). Kursor posiada wiersze (jedna lub więcej) zwracane przez SQL. Zestaw wierszy, które trzyma kursor, jest określany jako zestaw aktywny.

Kursor może być wyraźna lub dorozumiana. W pętli FOR należy użyć jawnego kursora, jeśli zapytanie będzie ponownie użyte, w przeciwnym razie preferowany jest niejawny kursor. Jeśli używasz kursora w pętli, użyj FETCH jest zalecane, gdy musisz zebrać zbiorczo lub gdy potrzebujesz dynamicznego SQL.

Zapętlanie

Jako język proceduralny z definicji, PL / SQL udostępnia kilka iteracji konstrukcje, w tym podstawowych sprawozdań pętla, pętle, podczas gdy , dla pętli , a kursor dla pętli. Od wersji Oracle 7.3 wprowadzono typ REF CURSOR, aby umożliwić zwracanie zestawów rekordów z procedur i funkcji składowanych. Oracle 9i wprowadził predefiniowany typ SYS_REFCURSOR, co oznacza, że ​​nie musimy już definiować własnych typów REF CURSOR.

Oświadczenia LOOP

<<parent_loop>>
LOOP
	statements

	<<child_loop>>
	loop
		statements
		exit parent_loop when <condition>; -- Terminates both loops
		exit when <condition>; -- Returns control to parent_loop
	end loop child_loop;
        if <condition> then
           continue; -- continue to next iteration
        end if;

	exit when <condition>;
END LOOP parent_loop;

Pętle można zakończyć za pomocą EXIT słowa kluczowego lub przez zgłoszenie wyjątku .

Pętle FOR

DECLARE
    var NUMBER;
BEGIN
    /* N.B. for loop variables in PL/SQL are new declarations, with scope only inside the loop */
    FOR var IN 0 .. 10 LOOP
        DBMS_OUTPUT.PUT_LINE(var);
    END LOOP;

    IF var IS NULL THEN
        DBMS_OUTPUT.PUT_LINE('var is null');
    ELSE
        DBMS_OUTPUT.PUT_LINE('var is not null');
    END IF;
END;

Wyjście:

 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 var is null

Kursor FOR pętle

FOR RecordIndex IN (SELECT person_code FROM people_table)
LOOP
  DBMS_OUTPUT.PUT_LINE(RecordIndex.person_code);
END LOOP;

Pętle kursora-for automatycznie otwierają kursor , wczytują dane i ponownie zamykają kursor.

Alternatywnie, programista PL/SQL może z góry zdefiniować instrukcję SELECT kursora, aby (na przykład) umożliwić ponowne użycie lub uczynić kod bardziej zrozumiałym (szczególnie przydatne w przypadku długich lub złożonych zapytań).

DECLARE
  CURSOR cursor_person IS
    SELECT person_code FROM people_table;
BEGIN
  FOR RecordIndex IN cursor_person
  LOOP
    DBMS_OUTPUT.PUT_LINE(recordIndex.person_code);
  END LOOP;
END;

Koncepcja person_code w pętli FOR jest wyrażana za pomocą notacji kropkowej ("."):

RecordIndex.person_code

Dynamiczny SQL

Podczas gdy programiści mogą łatwo osadzić instrukcje języka manipulacji danymi (DML) bezpośrednio w kodzie PL/SQL za pomocą prostych instrukcji SQL, język definicji danych (DDL) wymaga bardziej złożonych instrukcji „Dynamic SQL” w kodzie PL/SQL. Jednak instrukcje DML stanowią podstawę większości kodu PL/SQL w typowych aplikacjach.

W przypadku dynamicznego SQL PL/SQL, wczesne wersje bazy danych Oracle wymagały użycia skomplikowanej DBMS_SQLbiblioteki pakietów Oracle . Jednak nowsze wersje wprowadziły prostszy „natywny dynamiczny SQL” wraz z powiązaną EXECUTE IMMEDIATEskładnią.

Podobne języki

PL/SQL działa analogicznie do wbudowanych języków proceduralnych związanych z innymi relacyjnymi bazami danych . Na przykład Sybase ASE i Microsoft SQL Server mają Transact-SQL , PostgreSQL ma PL/pgSQL (który do pewnego stopnia emuluje PL/SQL), MariaDB zawiera parser zgodności PL/SQL, a IBM DB2 zawiera SQL Procedural Language, który jest zgodny z SQL ISO „s SQL / PSM standardem.

Projektanci PL/SQL wzorowali się na składni języka Ada . Zarówno Ada, jak i PL/SQL mają Pascala jako wspólnego przodka, więc PL/SQL również przypomina Pascala w większości aspektów. Jednak struktura pakietu PL/SQL nie przypomina podstawowej struktury programu Object Pascal implementowanej przez jednostkę Borland Delphi lub Free Pascal . Programiści mogą definiować publiczne i prywatne globalne typy danych, stałe i zmienne statyczne w pakiecie PL/SQL.

PL/SQL pozwala również na definiowanie klas i tworzenie ich jako obiektów w kodzie PL/SQL. Przypomina to użycie w obiektowych językach programowania , takich jak Object Pascal , C++ i Java . PL/SQL odnosi się do klasy jako „abstrakcyjny typ danych” (ADT) lub „typ zdefiniowany przez użytkownika” (UDT) i definiuje ją jako typ danych Oracle SQL, w przeciwieństwie do typu zdefiniowanego przez użytkownika, co pozwala jego użycie zarówno w Oracle SQL Engine, jak i Oracle PL/SQL. Konstruktor i metody abstrakcyjnego typu danych są napisane w PL/SQL. Wynikowy abstrakcyjny typ danych może działać jako klasa obiektów w PL/SQL. Takie obiekty mogą również trwać jako wartości kolumn w tabelach bazy danych Oracle.

PL/SQL zasadniczo różni się od Transact-SQL , pomimo powierzchownych podobieństw. Przenoszenie kodu z jednego na drugi zwykle wiąże się z nietrywialną pracą, nie tylko ze względu na różnice w zestawach funkcji obu języków, ale także ze względu na bardzo istotne różnice w sposobie, w jaki Oracle i SQL Server radzą sobie ze współbieżnością i blokowaniem .

StepSqlite produkt jest PL / SQL kompilator popularnej małej bazy danych SQLite , który obsługuje podzbiór PL / SQL składnia. W wydaniu Oracle Berkeley DB 11g R2 dodano obsługę SQL opartą na popularnym API SQLite, dołączając wersję SQLite do Berkeley DB. W związku z tym StepSqlite może być również używany jako narzędzie innej firmy do uruchamiania kodu PL/SQL w Berkeley DB.

Zobacz też

Bibliografia

Dalsza lektura

Linki zewnętrzne