8 Dynamiczny SQL

Dynamiczny SQL to technika programowania, która umożliwia dynamiczne tworzenie instrukcji SQL w czasie wykonywania. Korzystając z dynamicznego języka SQL, można tworzyć bardziej uniwersalne, elastyczne aplikacje, ponieważ pełny tekst instrukcji SQL może być nieznany podczas kompilacji. Na przykład dynamiczny SQL umożliwia utworzenie procedury działającej na tabeli, której nazwa nie jest znana do czasu wykonania.

W poprzednich wersjach Oracle jedynym sposobem na zaimplementowanie dynamicznego SQL w aplikacji PL / SQL był używając pakietu DBMS_SQL. Oracle8i wprowadza natywny dynamiczny SQL, alternatywę dla pakietu DBMS_SQL. Używając natywnego dynamicznego SQL, możesz umieścić dynamiczne instrukcje SQL bezpośrednio w blokach PL / SQL.

W tym rozdziale omówiono następujące tematy:

  • Co to jest dynamiczny SQL?
  • Kiedy używać dynamicznego SQL
  • Scenariusz dynamicznego SQL z użyciem natywnego dynamicznego SQL
  • Natywny dynamiczny SQL a pakiet DBMS_SQL
  • Aplikacja Języki programowania inne niż PL / SQL

Co to jest dynamiczny SQL?

Dynamiczny SQL umożliwia pisanie programów odwołujących się do instrukcji SQL, których pełny tekst nie jest znany do czasu wykonania. Przed szczegółowym omówieniem dynamicznego SQL, jasna definicja statycznego SQL może stanowić dobry punkt wyjścia do zrozumienia dynamicznego SQL. Statyczne instrukcje SQL nie zmieniają się od wykonania do wykonania. Pełny tekst statycznych instrukcji SQL jest znany podczas kompilacji, co zapewnia następujące korzyści:

  • Pomyślna kompilacja potwierdza, że instrukcje SQL odwołują się do prawidłowych obiektów bazy danych.
  • Pomyślna kompilacja weryfikuje, czy masz uprawnienia niezbędne do uzyskania dostępu do obiektów bazy danych.
  • Wydajność statycznego SQL jest ogólnie lepsza niż dynamicznego SQL.

Ze względu na te zalety powinieneś używać dynamicznego SQL tylko wtedy, gdy nie możesz użyć statycznego SQL do osiągnięcia swoich celów lub jeśli użycie statycznego SQL jest kłopotliwe w porównaniu z dynamicznym SQL. Jednak statyczny SQL ma ograniczenia, które można pokonać za pomocą dynamicznego SQL. Nie zawsze możesz znać pełny tekst instrukcji SQL, które muszą zostać wykonane w procedurze PL / SQL. Twój program może akceptować dane wejściowe użytkownika, które definiują instrukcje SQL do wykonania, lub może być konieczne wykonanie pewnych prac przetwarzania w celu określenia prawidłowego sposobu działania. W takich przypadkach powinieneś użyć dynamicznego SQL.

Weźmy na przykład aplikację raportującą, która wykonuje standardowe zapytania dotyczące tabel w środowisku hurtowni danych, w którym dokładna nazwa tabeli jest nieznana do czasu wykonania. Aby efektywnie pomieścić dużą ilość danych w hurtowni danych, co kwartał tworzy się nową tabelę do przechowywania informacji o fakturach za kwartał. Wszystkie te tabele mają dokładnie taką samą definicję i są nazwane zgodnie z początkowym miesiącem i rokiem kwartału, na przykład INV_01_1997, INV_04_1997, INV_07_1997, INV_10_1997, INV_01_1998 itd. W takim przypadku możesz użyć dynamicznego SQL w aplikacji raportującej, aby określić nazwę tabeli w czasie wykonywania.

W przypadku statycznego języka SQL wszystkie informacje dotyczące definicji danych, takie jak definicje tabel, do których odwołują się instrukcje SQL w programie, muszą być znane podczas kompilacji. Jeśli definicja danych ulegnie zmianie, należy zmienić i ponownie skompilować program. Dynamiczne programy SQL mogą obsługiwać zmiany w informacjach definicji danych, ponieważ instrukcje SQL mogą się zmieniać „w locie” w czasie wykonywania. Dlatego dynamiczny SQL jest znacznie bardziej elastyczny niż statyczny SQL. Dynamiczny SQL umożliwia pisanie kodu aplikacji, który jest wielokrotnego użytku, ponieważ kod definiuje proces, który jest niezależny od określonych używanych instrukcji SQL.

Ponadto dynamiczny SQL umożliwia wykonywanie instrukcji SQL, które nie są obsługiwane w statycznej Programy SQL, takie jak instrukcje języka definicji danych (DDL). Obsługa tych instrukcji pozwala osiągnąć więcej z programami PL / SQL.

Uwaga:

Wyrażenie „dynamiczne programy SQL” oznacza programy zawierające dynamiczny SQL; takie programy mogą również zawierać statyczny SQL. Statyczne programy SQL to takie programy, które zawierają tylko statyczny SQL, a nie dynamiczny SQL.

Kiedy używać dynamicznego SQL

Dynamicznego SQL należy używać w przypadkach, gdy statyczny SQL nie obsługuje operacja, którą chcesz wykonać, lub w przypadkach, gdy nie znasz dokładnych instrukcji SQL, które muszą zostać wykonane przez procedurę PL / SQL. Te instrukcje SQL mogą zależeć od danych wejściowych użytkownika lub mogą zależeć od przetwarzania wykonywanego przez program. Poniższe sekcje opisują typowe sytuacje, w których należy używać dynamicznego SQL i typowe problemy, które można rozwiązać za pomocą dynamicznego SQL.

Aby wykonać dynamiczne instrukcje DML

Do wykonania można użyć dynamicznego SQL Instrukcje DML, w których dokładna instrukcja SQL nie jest znana do czasu wykonania.Aby zapoznać się z przykładami, zobacz przykłady DML w sekcji „Przykłady kodu pakietu DBMS_SQL i natywnego dynamicznego kodu SQL” i „Przykładowa operacja DML”.

Aby wykonać instrukcje nieobsługiwane przez statyczny SQL w PL / SQL

W PL / SQL nie można wykonywać następujących typów instrukcji za pomocą statycznego SQL:

  • Instrukcje języka definicji danych (DDL), takie jak CREATE, DROP, GRANT i REVOKE
  • Instrukcje języka kontroli sesji (SCL), takie jak ALTER SESSION i SET ROLE
    Zobacz też:

    Oracle8i SQL Reference, aby uzyskać informacje na temat instrukcji DDL i SCL.

Używaj dynamicznego SQL, jeśli chcesz wykonać którekolwiek z tych typów instrukcji w PL / Blok SQL.

Ponadto statyczny SQL w PL / SQL nie pozwala na użycie klauzuli TABLE w SELECT instrukcje. W dynamicznym SQL nie ma takiego ograniczenia. Na przykład następujący blok PL / SQL zawiera instrukcję SELECT, która używa klauzuli TABLE i natywnego dynamicznego SQL:

Wykonywanie zapytań dynamicznych

Dynamicznego SQL można używać do tworzenia aplikacji wykonujących zapytania dynamiczne, czyli zapytania, których pełny tekst nie jest znany do czasu wykonania. Wiele typów aplikacji wymaga dynamicznych zapytań, w tym:

  • Aplikacje, które umożliwiają użytkownikom wprowadzanie lub wybieranie kryteriów wyszukiwania lub sortowania zapytań w czasie wykonywania
  • Aplikacje, które umożliwiają użytkownikom wprowadzanie danych lub wybierz wskazówki optymalizatora w czasie wykonywania
  • Aplikacje, które wysyłają zapytania do bazy danych, w której definicje danych tabel ulegają ciągłym zmianom
  • Aplikacje wysyłające zapytania do bazy danych, w której często tworzone są nowe tabele

Aby zapoznać się z przykładami, zobacz „Przykład zapytania” i zapoznaj się z przykładami zapytań w „Scenariusz dynamicznego SQL używającego natywnego dynamicznego języka SQL”.

Aby odwołać się do obiektów bazy danych, które nie istnieją podczas kompilacji

Wiele typów aplikacji musi współdziałać z danymi, które są generowane okresowo. Na przykład podczas kompilacji może być możliwe określenie definicji tabel bazy danych, ale nie nazw tabel, ponieważ okresowo generowane są nowe tabele. Twoja aplikacja musi mieć dostęp do danych, ale nie ma możliwości poznania dokładnych nazw tabel do czasu uruchomienia.

Dynamiczny SQL może rozwiązać ten problem, ponieważ dynamiczny SQL umożliwia czekanie do czasu wykonania, aby określić nazwy tabel, do których potrzebujesz dostępu. Na przykład w przykładowej aplikacji hurtowni danych omówionej w sekcji „Co to jest dynamiczny SQL?” Nowe tabele są generowane co kwartał, a te tabele mają zawsze tę samą definicję. W takim przypadku możesz pozwolić użytkownikowi określić nazwę tabeli w czasie wykonywania za pomocą dynamicznego zapytania SQL podobnego do następującego:

Dynamiczna optymalizacja wykonywania

Jeśli używasz statycznej SQL, podczas kompilacji musisz zdecydować, w jaki sposób chcesz konstruować swoje instrukcje SQL, czy mają zawierać wskazówki, a jeśli zawierają wskazówki, które dokładnie mają być. Można jednak użyć dynamicznego języka SQL do zbudowania instrukcji SQL w sposób, który optymalizuje wykonywanie i / lub dynamicznie łączy wskazówki w instrukcję SQL. Pozwala to na zmianę podpowiedzi w oparciu o aktualne statystyki bazy danych, bez konieczności ponownej kompilacji.

Na przykład poniższa procedura wykorzystuje zmienną o nazwie a_hint, aby umożliwić użytkownikom aby przekazać opcję podpowiedzi do instrukcji SELECT:

W tym przykładzie użytkownik może przekazać dowolną z następujących wartości dla a_hint:

Aby wywołać dynamiczne bloki PL / SQL

Możesz użyć EXECUTE IMMEDIATE w celu wywołania anonimowych bloków PL / SQL. Możliwość wywoływania dynamicznych bloków PL / SQL może być przydatna przy rozszerzaniu i dostosowywaniu aplikacji, gdzie moduł do wykonania jest określany dynamicznie w czasie wykonywania.

Załóżmy na przykład, że chcesz napisać aplikację, która przyjmuje zdarzenie number i wysyła do programu obsługi zdarzenia. Nazwa programu obsługi ma postać EVENT_HANDLER_ numer_zdarzenia, gdzie numer_zdarzenia to numer zdarzenia. Jednym podejściem byłoby zaimplementowanie dispatchera jako instrukcji switch, jak pokazano poniżej, gdzie kod obsługuje każde zdarzenie, wykonując statyczne wywołanie do odpowiedniej procedury obsługi.

Ten kod nie jest zbyt rozszerzalny, ponieważ kod wysyłający należy aktualizować za każdym razem, gdy dodawany jest program obsługi nowego zdarzenia. Jednak używając natywnego dynamicznego języka SQL, możesz napisać rozszerzalny rozsyłacz zdarzeń podobny do następującego:

Aby wykonywać dynamiczne operacje przy użyciu Invoker-Rights

Używając funkcji invoker-rights z dynamicznym SQL, można budować aplikacje, które wydają dynamiczne instrukcje SQL w ramach uprawnień i schematu wywołującego.Te dwie funkcje, prawa wywołującego i dynamiczny SQL, umożliwiają tworzenie podskładników aplikacji wielokrotnego użytku, które mogą działać na danych i modułach osoby wywołującej oraz uzyskiwać do nich dostęp.

Zobacz też:

PL / Podręcznik i dokumentacja użytkownika SQL zawierająca informacje o używaniu praw wywołujących i natywnego dynamicznego SQL.

Scenariusz dynamicznego SQL wykorzystujący natywny dynamiczny SQL

Scenariusz opisany w tej sekcji ilustruje możliwości i elastyczność natywnego dynamicznego SQL. Ten scenariusz zawiera przykłady, które pokazują, jak wykonać następujące operacje przy użyciu natywnego dynamicznego SQL:

  • Wykonywanie operacji DDL i DML
  • Wykonywanie zapytań jedno- i wielowierszowych

Model danych

Baza danych w tym scenariuszu to baza danych zasobów ludzkich firmy (o nazwie hr) z następującym modelem danych :

Główna tabela o nazwie offices zawiera listę wszystkich lokalizacji firmy. Tabela offices ma następującą definicję :

Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)

Wiele emp_ tabel lokalizacji zawiera informacje o pracownikach, gdzie lokalizacja to nazwa miasta, w którym znajduje się biuro się znajduje. Na przykład tabela o nazwie emp_houston zawiera informacje o pracownikach biura firmy w Houston, a tabela o nazwie emp_boston zawiera informacje o pracownikach informacje dla biura firmy w Bostonie.

Każdy emp_ tabela lokalizacji ma następującą definicję:

W poniższych sekcjach opisano różne natywne dynamiczne operacje SQL, które można wykonać na danych w hr

Przykładowa operacja DML

Następująca natywna procedura dynamicznego SQL daje podwyżkę wszystkim pracownikom o określonym stanowisku pracy:

Przykładowa operacja DDL

Instrukcja EXECUTE IMMEDIATE może wykonywać operacje DDL. Na przykład poniższa procedura dodaje lokalizację biura:

Poniższa procedura usuwa lokalizację biura:

Przykładowe dynamiczne zapytanie jednorzędowe

EXECUTE IMMEDIATE może wykonywać dynamiczne zapytania jednowierszowe. Możesz określić zmienne wiązania w klauzuli USING i pobrać wynikowy wiersz do celu określonego w klauzuli INTO instrukcji.

Następująca funkcja pobiera liczbę pracowników w określonej lokalizacji wykonujących określone zadanie:

Przykładowe dynamiczne zapytanie wielowierszowe

, FETCH i CLOSE mogą wykonywać dynamiczne zapytania wielowierszowe. Na przykład poniższa procedura zawiera listę wszystkich pracowników wykonujących określone zadanie w określonej lokalizacji:

Natywny dynamiczny SQL a pakiet DBMS_SQL

Oracle udostępnia dwie metody korzystania z dynamicznego SQL w PL / SQL: natywny dynamiczny SQL i pakiet DBMS_SQL. Natywny dynamiczny SQL umożliwia umieszczanie dynamicznych instrukcji SQL bezpośrednio w kodzie PL / SQL. Te instrukcje dynamiczne obejmują instrukcje DML (w tym zapytania), anonimowe bloki PL / SQL, instrukcje DDL, instrukcje kontroli transakcji i instrukcje kontroli sesji.

Aby przetworzyć większość natywnych dynamicznych instrukcji SQL, należy użyć funkcji EXECUTE IMMEDIATE. Jednak aby przetworzyć zapytanie złożone z wielu wierszy (instrukcja SELECT), należy użyć OPEN-FOR, FETCH i CLOSE.

Uwaga:

Aby używać natywnego dynamicznego języka SQL, COMPATIBLE musi mieć wartość 8.1.0 lub wyższą. Więcej informacji na temat parametru COMPATIBLE można znaleźć w artykule Migracja Oracle8i.

Pakiet DBMS_SQL to biblioteka PL / SQL oferująca programowy interfejs API do wykonywać instrukcje SQL dynamicznie. Pakiet DBMS_SQL ma interfejsy programistyczne do otwierania kursora, analizowania kursora, łączenia dostaw itp. Programy korzystające z pakietu DBMS_SQL wykonują wywołania do tego pakietu, aby wykonywać dynamiczne operacje SQL.

Poniższe sekcje zawierają szczegółowe informacje o zaletach obu metod.

Zobacz też:

Podręcznik użytkownika języka PL / SQL i dokumentacja zawierająca szczegółowe informacje na temat używania natywnego dynamicznego języka SQL oraz Dokumentacja pakietów PL / SQL dostarczonych przez Oracle8i w celu uzyskania szczegółowych informacji na temat korzystania z DBMS_SQL pakiet. W Podręczniku użytkownika PL / SQL i informacjach, natywny dynamiczny SQL jest nazywany po prostu dynamicznym SQL.

Zalety natywnego dynamicznego SQL

Natywny dynamiczny SQL zapewnia następujące korzyści w porównaniu z :

Łatwość użycia

Natywny dynamiczny SQL jest znacznie prostszy w użyciu niż pakiet DBMS_SQL.Ponieważ natywny dynamiczny SQL jest zintegrowany z SQL, możesz go używać w taki sam sposób, jak obecnie używasz statycznego SQL w kodzie PL / SQL. Ponadto natywny kod dynamicznego SQL jest zwykle bardziej zwarty i czytelny niż równoważny kod, który korzysta z pakietu DBMS_SQL.

DBMS_SQL nie jest tak łatwy w użyciu jak natywny dynamiczny SQL. Istnieje wiele procedur i funkcji, których należy używać w ściśle określonej kolejności. Zwykle wykonywanie prostych operacji wymaga dużej ilości kodu, gdy używasz pakietu DBMS_SQL. Możesz uniknąć tej złożoności, używając zamiast tego natywnego dynamicznego SQL.

Tabela 8-1 ilustruje różnicę w ilości kodu wymaganego do wykonania tej samej operacji przy użyciu DBMS_SQL pakiet i natywny dynamiczny SQL.

Tabela 8-1 Porównanie kodu pakietu DBMS_SQL i natywnego dynamicznego SQL

Ulepszenia wydajności

Wydajność natywnego dynamicznego SQL w PL / SQL jest porównywalna z wydajnością statycznego SQL, ponieważ interpreter PL / SQL ma wbudowaną obsługę natywnego dynamicznego SQL. Dlatego wydajność programów używających natywnego dynamicznego SQL jest znacznie lepsza niż programów używających pakietu DBMS_SQL. Zwykle natywne instrukcje dynamicznego SQL działają od 1,5 do 3 razy lepiej niż równoważne instrukcje korzystające z pakietu DBMS_SQL. Oczywiście wzrost wydajności może się różnić w zależności od aplikacji.

Pakiet DBMS_SQL jest oparty na proceduralnym interfejsie API, w wyniku czego wiąże się z dużym obciążeniem wywołaniami procedur i kopiowaniem danych. Na przykład za każdym razem, gdy wiążesz zmienną, pakiet DBMS_SQL kopiuje zmienną powiązania PL / SQL do swojej przestrzeni w celu późniejszego użycia podczas wykonywania. Podobnie, za każdym razem, gdy wykonujesz pobieranie, najpierw dane są kopiowane do przestrzeni zarządzanej przez pakiet DBMS_SQL, a następnie pobierane dane są kopiowane, po jednej kolumnie, do odpowiedniego Zmienne PL / SQL, powodujące znaczne obciążenie wynikające z kopiowania danych. W przeciwieństwie do tego, natywny dynamiczny SQL łączy etapy przygotowania, wiązania i wykonywania instrukcji w jedną operację, co minimalizuje nakłady związane z kopiowaniem danych i wywoływaniem procedur oraz poprawia wydajność.

Porada dotycząca wydajności

Korzystając z natywnego dynamicznego SQL lub pakietu DBMS_SQL, można zwiększyć wydajność, używając zmiennych wiążących, ponieważ użycie zmiennych wiążących umożliwia Oracle współdzielenie pojedynczego kursora dla wielu instrukcji SQL.

Na przykład poniższy natywny dynamiczny kod SQL nie używa zmiennych wiążących:

Dla każdej odrębnej zmiennej my_deptno tworzony jest nowy kursor, który może powodować rywalizację o zasoby i niską wydajność. Zamiast tego powiąż my_deptno jako zmienną powiązania, jak w poniższym przykładzie:

Tutaj ten sam kursor jest ponownie używany dla różnych wartości wiązania my_deptno, poprawiając w ten sposób wydajność i skalowalność.

Obsługa typów zdefiniowanych przez użytkownika

Natywny dynamiczny SQL obsługuje wszystkie typy obsługiwane przez statyczny SQL w PL / SQL. Dlatego natywny dynamiczny SQL zapewnia obsługę typów zdefiniowanych przez użytkownika, takich jak obiekty zdefiniowane przez użytkownika, kolekcje i REFs. Pakiet DBMS_SQL nie obsługuje tych typów zdefiniowanych przez użytkownika.

Uwaga:

Pakiet DBMS_SQL zapewnia ograniczoną obsługę tablic. Aby uzyskać więcej informacji, zobacz Dokumentację pakietów PL / SQL dostarczonych przez Oracle8i.

Obsługa pobierania do rekordów

Natywny dynamiczny SQL i statyczny SQL obsługują pobieranie do rekordów, ale Pakiet DBMS_SQL nie. W przypadku natywnego dynamicznego języka SQL wiersze wynikające z zapytania można bezpośrednio pobrać do rekordów PL / SQL.

W poniższym przykładzie wiersze z zapytania są pobierane do emp_rec rekord:

Zalety pakietu DBMS_SQL

Pakiet DBMS_SQL zapewnia następujące korzyści w porównaniu z natywnym dynamicznym SQL:

Obsługa programów po stronie klienta

Obecnie pakiet DBMS_SQL jest obsługiwany w programach po stronie klienta, ale natywny dynamiczny SQL nie. Każde wywołanie pakietu DBMS_SQL z programu po stronie klienta jest tłumaczone na zdalne wywołanie procedury PL / SQL (RPC); wywołania te występują, gdy trzeba powiązać zmienną, zdefiniować zmienną lub wykonać instrukcję.

Obsługa DESCRIBE

Procedura DESCRIBE_COLUMNS w pakiecie DBMS_SQL może służyć do opisz kolumny dla kursora otwartego i przeanalizowanego przez DBMS_SQL. Funkcjonalność jest podobna do polecenia DESCRIBE w SQL * Plus. Natywny dynamiczny SQL nie ma funkcji DESCRIBE.

Obsługa Bulk Dynamic SQL

Bulk SQL to możliwość przetwarzania wielu wierszy danych w jednej instrukcji DML. Bulk SQL poprawia wydajność, zmniejszając ilość przełączania kontekstu między SQL a językiem hosta. Obecnie pakiet DBMS_SQL obsługuje zbiorcze dynamiczne SQL.

Chociaż nie ma bezpośredniej obsługi operacji zbiorczych w natywnym dynamicznym języku SQL, można symulować natywny dynamiczny zbiorczy SQL instrukcji, umieszczając zbiorczą instrukcję SQL w bloku „BEGINEND” i wykonując blok dynamicznie. To obejście umożliwia wykorzystanie zalet masowego SQL w ramach natywnego dynamicznego programu SQL. Na przykład następujący natywny dynamiczny kod SQL kopiuje kolumnę ename z jednej tabeli do drugiej:

Aktualizacje i usuwanie wielu wierszy z klauzulą RETURNING

Pakiet DBMS_SQL obsługuje instrukcje z klauzulą RETURNING, które aktualizują lub usuwają wiele wierszy. Natywny dynamiczny SQL obsługuje tylko klauzulę RETURNING, jeśli zwracany jest pojedynczy wiersz.

Zobacz też:

„Przykład zwracania DML” zawiera przykłady DBMS_SQL kod pakietu i natywny kod dynamicznego SQL, który używa klauzuli RETURNING.

Obsługa instrukcji SQL większych niż 32 KB

DBMS_SQL pakiet obsługuje instrukcje SQL większe niż 32 KB; natywny dynamiczny SQL nie.

Ponowne użycie instrukcji SQL

Procedura PARSE w DBMS_SQL pakiet analizuje raz instrukcję SQL. Po wstępnym przeanalizowaniu instrukcja może być używana wiele razy z różnymi zestawami argumentów wiązania.

W przeciwieństwie do tego, natywny dynamiczny SQL przygotowuje instrukcję SQL do wykonania za każdym razem, gdy jest używana. Przygotowanie instrukcji zazwyczaj obejmuje analizę, optymalizację i generowanie planu. Przygotowanie zestawienia za każdym razem, gdy jest ono używane, wiąże się z niewielkim spadkiem wydajności. Jednak mechanizm współdzielonego kursora Oracle minimalizuje koszty, a spadek wydajności jest zwykle trywialny w porównaniu z korzyściami wynikającymi z wydajności natywnego dynamicznego SQL.

Przykłady kodu pakietu DBMS_SQL i natywnego dynamicznego kodu SQL

Poniższe przykłady ilustrują różnice w kodzie niezbędnym do wykonania operacji z pakietem DBMS_SQL i natywnym dynamicznym SQL. W szczególności przedstawiono następujące typy przykładów:

  • Zapytanie
  • Operacja DML
  • Operacja zwracająca DML

Ogólnie rzecz biorąc, natywny dynamiczny kod SQL to bardziej czytelne i kompaktowe, co może zwiększyć produktywność programistów.

Przykład zapytania

Poniższy przykład zawiera instrukcję zapytania dynamicznego z jedną zmienną powiązania (:jobname) i dwie wybrane kolumny (ename i sal):

stmt_str := "SELECT ename, sal FROM emp WHERE job = :jobname";

W tym przykładzie są zapytania dotyczące pracowników z j opis ob SALESMAN w kolumnie job tabeli emp. Tabela 8-2 przedstawia przykładowy kod, który wykonuje to zapytanie przy użyciu pakietu DBMS_SQL i natywnego dynamicznego SQL.

Tabela 8-2 Zapytania przy użyciu pakietu DBMS_SQL i natywnego dynamicznego SQL

Przykład DML

Poniższy przykład zawiera dynamiczną instrukcję INSERT dla tabeli z trzema kolumnami:

stmt_str := "INSERT INTO dept_new VALUES (:deptno, :dname, :loc)";

Ten przykład wstawia nowy wiersz dla których wartości kolumn znajdują się w zmiennych PL / SQL deptnumber, deptname i location. Tabela 8-3 przedstawia przykładowy kod, który wykonuje tę operację DML przy użyciu pakietu DBMS_SQL i natywnego dynamicznego języka SQL.

Tabela 8-3 Operacja DML przy użyciu pakietu DBMS_SQL i Natywny dynamiczny SQL

Przykład zwracania DML

Poniższy przykład zawiera dynamiczny UPDATE, które aktualizuje lokalizację działu po podaniu numeru działu (deptnumber) i nowej lokalizacji (location), a następnie zwraca nazwa działu:

stmt_str := "UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname";

Ten przykład wstawia nowy wiersz, dla którego wartości kolumn znajdują się w zmiennych PL / SQL deptnumber, deptname i location. Tabela 8-4 przedstawia przykładowy kod, który wykonuje tę operację zwracania DML przy użyciu pakietu DBMS_SQL i natywnego dynamicznego języka SQL.

Tabela 8-4 Zwracająca operacja DML przy użyciu DBMS_SQL Pakiet i natywny dynamiczny SQL

Języki tworzenia aplikacji inne niż PL / SQL

Do tej pory dyskusja w tym rozdziale była o obsłudze PL / SQL dla dynamicznego SQL.Można jednak używać innych języków programowania aplikacji do implementowania programów używających dynamicznego języka SQL. Te języki programowania aplikacji obejmują C / C ++, COBOL i Java.

Jeśli używasz C / C ++, możesz tworzyć aplikacje, które używają dynamicznego SQL z Oracle Call Interface (OCI) lub możesz użyć prekompilatora Pro * C / C ++, aby dodać dynamiczne rozszerzenia SQL do swojego C kod. Podobnie, jeśli używasz języka COBOL, możesz użyć prekompilatora Pro * COBOL, aby dodać dynamiczne rozszerzenia SQL do kodu COBOL. Jeśli używasz języka Java, możesz tworzyć aplikacje, które używają dynamicznego języka SQL z JDBC.

W przeszłości jedynym sposobem używania dynamicznego języka SQL w aplikacjach PL / SQL było użycie DBMS_SQL pakiet. Istnieje wiele ograniczeń dotyczących korzystania z tego pakietu, w tym problemy z wydajnością. W związku z tym programiści aplikacji mogli użyć jednej z omówionych powyżej alternatyw dla PL / SQL do implementacji dynamicznego SQL. Jednak wraz z wprowadzeniem natywnego dynamicznego SQL w PL / SQL, wiele wad używania PL / SQL do dynamicznego SQL zostało wyeliminowanych.

Jeśli masz aplikację korzystającą z OCI, Pro * C / C ++ lub Pro * COBOL do dynamicznego wykonywania SQL, obiegi sieciowe wymagane do wykonywania dynamicznych operacji SQL mogą obniżyć wydajność. Ponieważ te aplikacje zwykle znajdują się na klientach, do wykonania dynamicznych operacji SQL potrzeba więcej wywołań sieciowych. Jeśli masz tego typu aplikację, rozważ przeniesienie funkcji dynamicznego SQL do procedur składowanych i funkcji składowanych w języku PL / SQL, które używają natywnego dynamicznego języka SQL. Może to poprawić wydajność aplikacji, ponieważ procedury składowane mogą znajdować się na serwerze, eliminując w ten sposób obciążenie sieci. Następnie możesz wywołać procedury składowane PL / SQL i funkcje składowane z aplikacji.

Zobacz też:

Aby uzyskać informacje na temat wywoływania procedur składowanych Oracle i funkcji składowanych z aplikacji innych niż PL / SQL patrz:

  • Przewodnik programisty Oracle Call Interface Programmer
  • Podręcznik programisty prekompilatorów Pro * C / C ++
  • Programator prekompilatorów Pro * COBOL „s Guide
  • Oracle8i Java Stored Procedures Developer” s Guide

Leave a Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *