Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Praca z kursorami SQL

W SQL kursory służą jako wskaźnik, który umożliwia językowi programowania aplikacji radzenie sobie z wynikami zapytania po jednym wierszu. W tym artykule szybko badamy koncepcję i pokazujemy, jak deklarować kursory, otwierać, pobierać z nich dane, a następnie je zamykać.

Kursory SQL

Dane w relacyjnej bazie danych są zarządzane w postaci zestawów. W rezultacie wyniki zapytania zwracane przez instrukcje SQL SELECT są określane jako zestawy wyników. Zestawy wyników to nic innego jak kombinacje co najmniej jednego wiersza i kolumny wyodrębnione z co najmniej jednej tabeli. Możesz przewijać zestawy wyników, aby wyodrębnić potrzebne informacje. Zwrócone elementy danych są używane przez języki programowania, takie jak Java lub inne, do określonych celów aplikacji. Ale tutaj leży problem niedopasowania impedancji ze względu na różnicę w konstrukcji między modelem bazy danych a modelem języka programowania.

Model bazy danych SQL ma trzy główne konstrukcje:

  • kolumny (lub atrybuty) i ich typy danych
  • wiersze (rekordy lub krotki)
  • tabele (zbieranie rekordów)

Dlatego podstawowe niezgodności między dwoma modelami to:

  1. Typy danych atrybutów dostępne w modelu bazy danych nie są takie same jak typy zmiennych używane w językach programowania. Istnieje wiele języków hostów, a każdy z nich ma inny typ danych. Na przykład typy danych C/C++ i Java są różne, podobnie jak typy danych SQL. Dlatego niezbędny jest mechanizm wiążący, aby złagodzić problem niezgodności.
  2. Wyniki zwracane przez instrukcje SQL SELECT to wiele zestawów rekordów, w których każdy rekord jest kolekcją atrybutów. Języki programowania hosta zwykle działają na poszczególnych wartościach danych krotki zwróconej przez zapytanie. Dlatego ważne jest, aby wyniki zapytania SQL były mapowane ze strukturą danych obsługiwaną przez język programowania. Mechanizm zapętlania krotek jest niezbędny do iteracji krotek i ich wartości atrybutów.

Kursor działa jak zmienna iteratora, aby zapętlić krotki zwrócone przez zapytanie SQL i wyodrębnić indywidualne wartości z każdej krotki, które następnie można zmapować do odpowiedniego typu zmiennych programu.

Kursor służy zatem jako wskaźnik, który umożliwia językowi programowania przetwarzanie wyników zapytania po jednym rekordzie na raz. Kursor może przechodzić przez wszystkie wiersze wyniku zapytania, skupiając się na jednym wierszu na raz. Rozważ następujące zapytanie SQL:

SELECT emp_no, first_name, last_name, birth_date
FROM employees
WHERE MONTH(birth_date) = MONTH(CURRENT_DATE)
AND DAY(birth_date) = DAY(CURRENT_DATE);

Wynik zapytania z powyższego zestawienia zwraca dane wszystkich pracowników, których data urodzenia przypada na bieżący dzień danego miesiąca. Wynik może zawierać wiele wierszy, ale język aplikacji hosta może obsługiwać jeden wiersz na raz. W rezultacie kursor jest deklarowany jako osadzona instrukcja SQL w aplikacji języka programowania. Kursor jest wtedy otwierany podobnie jak plik i wyodrębnia pojedynczy wiersz z wyniku zapytania. Kolejne wiersze są wyodrębniane kolejno, aż do zamknięcia kursora.

Deklarowanie kursora

Kursory są deklarowane podobnie jak zmienne. Podana jest nazwa, istnieją instrukcje otwierające kursor, pobierające wynik zapytania i wreszcie zamykające kursor. Zauważ, że różne implementacje SQL obsługują użycie kursorów w inny sposób. Ale istnieje ogólna zgoda co do tego, jak powinien być napisany kursor.

Aby w pełni zaimplementować funkcjonalność kursora, musimy użyć instrukcji SQL, ponieważ samo zadeklarowanie kursora nie wystarczy do wyodrębnienia danych z bazy danych SQL. Istnieją cztery podstawowe kroki, aby zadeklarować kursor:

ZADEKLARUJ KURSORA: Deklaracja rozpoczyna się od nadania kursorowi nazwy i przypisania wyrażenia zapytania, które ma być wywołane po otwarciu kursora.

OTWÓRZ: Instrukcja open wykonuje przypisane wyrażenie zapytania i przygotowuje wynik zapytania dla kolejnego FETCH.

FETCH: Pobiera wartości danych do zmiennych, które następnie można przekazać do języka programowania hosta lub do innych wbudowanych instrukcji SQL.

ZAMKNIJ: Kursor jest zamknięty przed pobraniem dalszych wyników zapytania.

Składnia jest następująca:

DECLARE <cursor_name>
[SENSITIVE | INSENSITIVE | ASENSITIVE]
[SCROLL | NO SCROLL] CURSOR
[ WITH HOLD | WITHOUT HOLD]
[ WITH RETURN | WITHOUT RETURN]
FOR <sql_query_expression>
[ ORDER BY <sort_expression>]
[ FOR {READ ONLY | UPDATE [ OF <list_of_column>]}]

Zasadnicza część deklaracji kursora jest następująca:

 DECLARE <cursor_name> FOR <sql_query_expression>

Część opcjonalna, taka jak [SENSITIVE | NIEWRAŻLIWY | ASENSITIVE] wskazuje, czy kursor jest wrażliwy na zmiany i czy ma je odzwierciedlać w wyniku zapytania. SENSITIVE oznacza, że ​​zmiany mają wpływ na kursor, INSENSITIVE oznacza, że ​​nie mają wpływu na kursor, a ASENSITIVE oznacza, że ​​zmiany mogą być lub nie być widoczne dla kursora. Jeśli nie określono, zakłada opcję WRAŻLIWĄ.

Opcjonalny [PRZEWIJAJ | NOSCROLL] określa zdolność przewijania kursora. Jeśli nie jest określony, zakłada opcję NO SCROLL.

Opcjonalne [ Z PRZYTRZYMANIEM | BEZ WSTRZYMANIA] określa, czy wstrzymać, czy automatycznie zamknąć, gdy transakcja spowodowana kursorem zostanie zatwierdzona. Jeśli nie określono, zachowuje opcję BEZ WSTRZYMANIA.

Opcjonalny [ Z ZWROTEM | WITHOUT RETURN] określa, czy zwrócić zestaw wyników kursora do wywołującego, takiego jak inna procedura SQL lub język hosta. Jeśli nie określono, oznacza to BEZ ZWROTU.

Klauzula ORDER BY służy do sortowania zwróconych wyników zapytania zgodnie z określoną techniką sortowania.

Opcja UPDATE odnosi się do użycia instrukcji UPDATE lub DELETE jest skojarzeniem z wierszami zwracanymi przez instrukcję SELECT kursora. Taka modyfikacja nie jest możliwa w przypadku wybrania opcji TYLKO DO ODCZYTU. Jeśli nie określono, domyślnie przyjmowana jest opcja UPDATE.

Dlatego prosty kursor można zadeklarować w następujący sposób:

DECLARE mycursor CURSOR
 FOR
SELECT emp_no, first_name, last_name, birth_date
  FROM employees
 WHERE MONTH(birth_date) = MONTH(CURRENT_DATE)
  AND DAY(birth_date) = DAY(CURRENT_DATE);

Kursory w MySQL

Zazwyczaj w MySQL można znaleźć dwa typy kursorów:kursory tylko do odczytu i tylko do przodu. Te kursory mogą być używane do procedury składowanej MySQL. Te kursory pomagają nam iterować po wynikach zapytania po jednym wierszu i pobierać zmienne do dalszego przetwarzania. Możliwe jest zadeklarowanie więcej niż jednego kursora i zagnieżdżenie ich w pętlach. Zauważ, że kursory są tylko do odczytu, ponieważ są używane do iteracji po tabelach tymczasowych. Kursor zazwyczaj wykonuje zapytanie, gdy je otwieramy.

Jednym z problemów z kursorem w MySQL jest to, że mogą spowolnić działanie zapytania z powodu dodatkowych operacji we/wy, które wykonują. Dotyczy to szczególnie dużych typów danych, takich jak BLOB i TEXT. Ponieważ kursory działają z tabelami tymczasowymi, te typy nie są obsługiwane w tabelach w pamięci. Dlatego podczas pracy z tymi typami MySQL musi tworzyć tymczasowe tabele na dysku, a to wymaga dużej ilości operacji we/wy i to również w powolnych urządzeniach, takich jak dyski. To jest główny powód powolnego działania kursora.

MySQL nie obsługuje również kursorów po stronie klienta, jednak interfejs API klienta może je emulować w razie potrzeby. Ale wtedy nie różni się to zbytnio od pobrania wyniku w tablicy w języku programowania takim jak Java i manipulowania nimi zamiast tego.

Oto przykład, jak pisać kursory w MySQL.

CREATE PROCEDURE 'cursor_demo'()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE id INT(11);
    DECLARE fn varchar(14);
    DECLARE ln varchar(16);
    DECLARE bdate date;
  DECLARE mycursor CURSOR FOR
  SELECT emp_no, first_name, last_name, birth_date
    FROM employees
    WHERE MONTH(birth_date)=MONTH(CURRENT_DATE)
      AND DAY(birth_date)=DAY(CURRENT_DATE);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN mycursor;
  fetch_loop: LOOP
    FETCH mycursor INTO id, fn, ln, bdate;
  IF done THEN
      LEAVE fetch_loop;
    END IF;
    SELECT id, fn, ln, bdate;
  END LOOP;
  CLOSE mycursor;
END

Wywołaj procedurę składowaną w następujący sposób:

mysql> CALL cursor_demo

Procedura pobiera wiersze z tabeli o nazwie pracownik którego data urodzenia jest zgodna z bieżącym dniem i miesiącem w kursorze o nazwie mycursor i po prostu drukuje je za pomocą instrukcji SELECT.

Więcej informacji można znaleźć w dokumentacji MySQL na temat Cursor.

Wniosek

Kursory to nic innego jak wskaźniki do zestawów rekordów zwróconych przez zapytanie SQL. Wskaźnik zazwyczaj wskazuje na jeden wiersz na raz i można go przemieścić w pętli, aby pobrać poszczególne rekordy. SQL jest zwykle używany do bezpośredniego wywoływania w celu uzyskania dostępu i tworzenia obiektów danych. Kursory zapewniają technikę interaktywnego języka SQL, w której umożliwiają wykonywanie ad hoc instrukcji SQL ułatwianych przez aplikację kliencką. Mechanizm kursora wykorzystuje model dostępu do danych, w którym instrukcje SQL są osadzone w języku hosta, takim jak C, C++ lub Java itp. To tylko rzut oka na to, od czego ma zacząć się kursor. Zapoznaj się z odpowiednią dokumentacją bazy danych SQL, aby uzyskać szczegółowe informacje na temat określonych norm różnych implementacji.

# # #


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL a MySQL:który jest najlepszy?

  2. JSON_ARRAYAGG() – Utwórz tablicę JSON z wierszy zapytania w MySQL

  3. MySQL Nieprawidłowa wartość daty i godziny:'0000-00-00 00:00:00'

  4. Kiedy używać pojedynczych cudzysłowów, podwójnych cudzysłowów i znaków wstecznych w MySQL

  5. Wydajność MySQL:MySQL kontra MariaDB