Oracle Samouczek dotyczący dynamicznego języka SQL PL/SQL: wykonanie natychmiastowe i DBMS_SQL
Co to jest dynamiczny SQL?
Dynamiczny SQL to metodologia programowania służąca do generowania i uruchamiania instrukcji w czasie wykonywania. Używa się go głównie do pisania uniwersalnych i elastycznych programów, w których instrukcje SQL będą tworzone i wykonywane w czasie wykonywania w oparciu o wymagania.
Sposoby pisania dynamicznego SQL
PL/SQL udostępnia dwa sposoby pisania dynamicznego SQL
- NDS – Natywny dynamiczny SQL
- DBMS_SQL
NDS (Native Dynamic SQL) – Wykonaj natychmiast
Native Dynamic SQL to łatwiejszy sposób pisania dynamicznego SQL. Używa polecenia „EXECUTE IMMEDIATE”, aby utworzyć i wykonać SQL w czasie wykonywania. Jednak aby użyć tego sposobu, typ danych i liczba zmiennych, które mają być używane w czasie wykonywania, muszą być znane wcześniej. Zapewnia również lepszą wydajność i mniejszą złożoność w porównaniu do DBMS_SQL.
Składnia
EXECUTE IMMEDIATE(<SQL>) [INTO<variable>] [USING <bind_variable_value>]
- Powyższa składnia przedstawia polecenie EXECUTE IMMEDIATE.
- Klauzula INTO jest opcjonalna i używana tylko wtedy, gdy dynamiczny SQL zawiera instrukcję wyboru, która pobiera wartości. Typ zmiennej powinien odpowiadać typowi zmiennej instrukcji Select.
- Klauzula USING jest opcjonalna i używana tylko wtedy, gdy dynamiczny SQL zawiera jakąkolwiek zmienną wiążącą.
1 przykład: W tym przykładzie pobierzemy dane z tabeli emp dla emp_no '1001' za pomocą instrukcji NDS.
DECLARE lv_sql VARCHAR2(500); lv_emp_name VARCHAR2(50): ln_emp_no NUMBER; ln_salary NUMBER; ln_manager NUMBER; BEGIN ly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHERE emp_no=:empmo:; EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_manager USING 1001; Dbms_output.put_line('Employee Name:‘||lv_emp_name); Dbms_output.put_line('Employee Number:‘||ln_emp_no); Dbms_output.put_line(‘Salary:'||ln_salaiy); Dbms_output.put_line('Manager ID:‘||ln_manager); END; /
Wydajność
Employee Name : XXX Employee Number: 1001 Salary: 15000 Manager ED: 1000
Wyjaśnienie kodu:
- Linia kodu 2-6: Deklarowanie zmiennych.
- Linia kodu 8: Ramkowanie kodu SQL w czasie wykonywania. SQL zawiera zmienną wiązania w warunku „:empno”.
- Linia kodu 9: Wykonanie tekstu SQL w ramce (co odbywa się w 8. linii kodu) przy użyciu polecenia NDS „EXECUTE IMMEDIATE”
- Zmienne w klauzuli „INTO” (lv_emp_name, ln_emp_no, ln_salary, ln_manager) służą do przechowywania wartości pobranych z zapytania SQL (emp_name, emp_no, pay, manager)
- Klauzula „USING” podaje wartości zmiennej wiążącej w zapytaniu SQL (:emp_no).
- Linia kodu 10-13: Wyświetlanie pobranych wartości.
DBMS_SQL dla dynamicznego SQL
PL/SQL dostarcza pakiet DBMS_SQL, który umożliwia pracę z dynamicznym SQL. Proces tworzenia i wykonywania dynamicznego SQL obejmuje następujący proces.
- OTWÓRZ KURSORA: Dynamiczny SQL będzie wykonywany w taki sam sposób jak a kursor. Aby więc wykonać instrukcję SQL, musimy otworzyć kursor.
- PARSE SQL: Następnym krokiem jest przeanalizowanie dynamicznego kodu SQL. Ten proces po prostu sprawdzi składnię i sprawi, że zapytanie będzie gotowe do wykonania.
- POWIĄZANIE ZMIENNYCH Wartości: Następnym krokiem jest przypisanie wartości dla zmiennych wiążących, jeśli takie istnieją.
- DEFINIUJ KOLUMNĘ: Następnym krokiem jest zdefiniowanie kolumny przy użyciu ich względnych pozycji w instrukcji Select.
- WYKONAĆ: Następnym krokiem jest wykonanie przeanalizowanego zapytania.
- POBIERZ WARTOŚCI: Następnym krokiem jest pobranie wykonanych wartości.
- ZAMKNIJ KURSORA: Po pobraniu wyników kursor powinien zostać zamknięty.
1 przykład: W tym przykładzie pobierzemy dane z tabeli emp dla emp_no '1001' za pomocą instrukcji DBMS_SQL.
DECLARE lv_sql VARCHAR2(500); lv_emp_name VARCHAR2(50); ln_emp_no NUMBER; ln_salary NUMBER; ln_manager NUMBER; ln_cursor_id NUMBER; ln_rows_processed; BEGIN lv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHERE emp_no=:empmo’; in_cursor_id:=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE); DBMS_SQL.BIXD_VARLABLE(ln_cursor_id,:‘empno‘,1001); DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name); DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no); DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary); DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager); ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);
LOOP IF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0 THEN EXIT; ELSE DBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager); Dbms_output.put_line('Employee Name:‘||lv_emp_name); Dbms_output.put_line('Employee Number:l‘||ln_emp_no); Dbms_output.put_line(‘Salary:‘||ln_salary); Dbms_output.put_line('Manager ID :‘| ln_manager); END IF; END LOOP; DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id); END: /
Wydajność
Employee Name:XXX Employee Number:1001 Salary:15000 Manager ID:1000
Wyjaśnienie kodu:
- Linia kodu 1-9: Deklaracja zmiennej.
- Linia kodu 10: Tworzenie ramek instrukcji SQL.
- Linia kodu 11: Otwarcie kursora za pomocą DBMS_SQL.OPEN_CURSOR. Zwróci identyfikator kursora, który jest otwarty.
- Linia kodu 12: Po otwarciu kursora następuje analiza kodu SQL.
- Linia kodu 13: Zmienna powiązania „1001” przypisuje identyfikator kursora zamiast „:empno”.
- Linia kodu 14-17: Definiowanie nazwy kolumny na podstawie jej względnej pozycji w instrukcji SQL. W naszym przypadku względną pozycją jest (1) nazwa_emp, (2) nr_emp, (3) wynagrodzenie (4) menadżer. Zatem na podstawie tej pozycji definiujemy zmienną docelową.
- Linia kodu 18: Wykonanie zapytania przy użyciu DBMS_SQL.EXECUTE. Zwraca liczbę przetworzonych rekordów.
- Linia kodu 19-33: Pobieranie rekordów za pomocą pętli i wyświetlanie ich.
- Linia kodu 20: DBMS_SQL.FETCH_ROWS pobierze jeden rekord z przetworzonych wierszy. Można go wywoływać wielokrotnie w celu pobrania wszystkich wierszy. Jeśli nie może pobrać wierszy, zwróci 0, opuszczając w ten sposób pętlę.
Podsumowanie
W tej sekcji omówiliśmy dynamiczny SQL i sposoby wykonywania DYNAMICZNEGO SQL. Widzieliśmy także różne kroki wykonywania dynamicznego SQL na oba sposoby. Widzieliśmy także przykłady, w których ten sam scenariusz jest obsługiwany zarówno w sposób NDS, jak i DBMS_SQL, aby wykonać wykonanie w czasie wykonywania.