Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Typ danych rekordu oparty na kursorze z kursorem zwracającym wiele wartości w bazie danych Oracle

Widzieliśmy już w poprzednim samouczku, jak utworzyć zmienną typu rekordu opartą na kursorze w oparciu o prosty kursor, który zwraca pojedynczy wiersz danych. Teraz pojawia się pytanie, czy możemy użyć tej samej zmiennej typu danych pojedynczego rekordu z kursorem, który zwraca wiele wierszy danych? Aby poznać odpowiedź, czytaj dalej i naucz się obsługiwać wiele wartości zwracanych przez kursor za pomocą zmiennej typu rekordu opartej na pojedynczym kursorze.

Ponieważ mamy do czynienia z rekordami opartymi na kursorze, wymagana jest niewielka znajomość kursora. Ze względu na prostotę i ułatwienie zrozumienia tej koncepcji, do demonstracji użyję prostego, wyraźnego kursora.

Krok 1:Zadeklaruj prosty, wyraźny kursor

Typ danych rekordu oparty na kursorze wymaga już utworzonego kursora. Ten kursor stanie się podstawą dla naszej zmiennej typu rekordu. Wszystkie pola zmiennej typu rekordu utworzonej za pomocą tego kursora będą miały taką samą nazwę i typ danych jak kolumny użyte w liście SELECT kursora.

SET SERVEROUTPUT ON;
DECLARE
 CURSOR cur_RebellionRider IS
 SELECT first_name, salary FROM employees 
 WHERE employee_id > 200;

W przeciwieństwie do kursora z poprzedniego samouczka, który zwraca pojedynczy wiersz danych, ten kursor zwróci wiele wierszy. Wszystkie te wiersze będą zawierać imię i pensję wszystkich pracowników z identyfikatorem pracownika większym niż 200.

Krok 2:zadeklaruj zmienną typu danych rekordu opartego na kursorze

Ponieważ stworzyliśmy kursor, teraz wszyscy jesteśmy gotowi zadeklarować naszą zmienną rekordu za pomocą tego kursora.

var_emp    cur_RebellionRider%ROWTYPE;

Var_emp jest zmienną typu rekordu, a ponieważ jest oparta na kursorze cur_RebellionRider, możemy z dumą nazwać ją zmienną typu rekordu opartego na kursorze. Teraz musimy sprawdzić, czy ta zmienna z pojedynczym rekordem jest w stanie przechowywać wszystkie dane zwrócone przez bazowy kursor cur_RebellionRider.

Krok 3:Zainicjuj zmienną rekordu kursora

Jak omówiliśmy w samouczku PL/SQL 34, inicjalizacja zmiennej rekordu jest procesem przypisywania jej pewnych wartości. W przypadku kursorów działa to polecenie FETCH-INTO. Ale musimy upewnić się, że prawidłowo postępowaliśmy zgodnie z cyklem życia kursora.

Jeśli nie wiesz, co to jest cykl życia kursora i kroki związane z tworzeniem kursora, sprawdź ten blog „Wprowadzenie do kursora bazy danych”.

BEGIN
   OPEN cur_RebellionRider; 
  LOOP 
    FETCH cur_RebellionRider INTO var_emp;  
    EXIT WHEN cur_RebellionRider%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary );
  END LOOP;--Simple Loop End
  CLOSE cur_RebellionRider;
END;

Powyższa sekcja wykonania bloku PL/SQL, który tutaj tworzymy, została wyjaśniona linijka po linijce w samouczku wideo na moim kanale YouTube. Sprawdź to.

Więc to jest to. To wszystko, co musimy. Teraz połączmy wszystkie te fragmenty kodu, które widzieliśmy w różnych krokach powyżej, w jeden anonimowy blok PL/SQL.

Zmienna typu danych rekordu oparta na kursorach w bazie danych Oracle

SET SERVEROUTPUT ON;
DECLARE
  CURSOR cur_RebellionRider IS
  SELECT first_name, salary FROM employees
  WHERE employee_id > 200; 
  var_emp   cur_RebellionRider%ROWTYPE;
BEGIN
  OPEN cur_RebellionRider;
  LOOP
    FETCH cur_RebellionRider INTO var_emp;
    EXIT WHEN cur_RebellionRider%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary);
  END LOOP;
  CLOSE cur_RebellionRider;
END;

Kiedy skompilujesz i uruchomisz powyższy kod, otrzymasz wszystkie dane, które instrukcja FETCH-INTO została pobrana z kursora cur_RebellionRider i zapisana w zmiennej rekordu opartej na kursorze var_emp. Oznacza to, że rzeczywiście możemy obsłużyć wiele wierszy danych za pomocą jednego rekordu opartego na kursorze.

W moim samouczku wideo dotyczącym PL/SQL zapytałem, czy możemy uprościć ten kod, czy też istnieje inny sposób wykonania tego samego zadania. Odpowiedź brzmi:tak, istnieje wiele sposobów na osiągnięcie tego samego wyniku, a jednym z nich jest użycie „kursora w pętli”. Jest to specjalny rodzaj pętli, która deklaruje zmienną rekordu, a także otwiera, pobiera i zamyka leżący poniżej kursor niejawnie w tle. Możesz przeczytać więcej Cursor For-Loop tutaj.

Książka informacyjna dla SQL Expert 1z0-047 Link afiliacyjny
Przewodnik po egzaminach OCA Oracle Database SQL Certified Expert (egzamin 1Z0-047)

Oto kod wykonany za pomocą Cursor For-Loop, który jest odpowiednikiem powyższego kodu. Jak widać, jest to znacznie mniej skomplikowane z kilkoma linijkami kodów (LOC).

SET SERVEROUTPUT ON;
BEGIN
  FOR var_emp IN (SELECT first_name, salary FROM employees
 WHERE employee_id >200)
  LOOP
    DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary);
  END LOOP;
END; 

Oba kody zwrócą ten sam wynik, ponieważ oba wykonują to samo zadanie.

Mam nadzieję, że podobał Ci się ten szczegółowy samouczek dotyczący PL/SQL. Upewnij się, że udostępnisz to w swojej sieci społecznościowej i oznacz mnie tagiem, ponieważ co miesiąc rozdaję gadżety RebellionRider losowo wybranemu użytkownikowi. Obserwuj mnie również na moich mediach społecznościowych [Twitter/Facebook/Instagram], aby otrzymywać regularne aktualizacje.

Dzięki i miłego dnia!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak wybrać nawet rekordy z tabeli w oracle?

  2. Tworzenie bazy danych Oracle 12c – krok po kroku

  3. Jak korzystać z partycji lub max?

  4. Znajdowanie przyczyny błędu zakleszczenia w pliku śledzenia Oracle

  5. czy jest jakaś funkcja do tłumaczenia danych w sql