sql >> Databáze >  >> RDS >> Oracle

Datový typ záznamu založený na kurzoru s kurzorem vracejícím více hodnot v databázi Oracle

Již jsme viděli v předchozím tutoriálu, jak vytvořit proměnnou typu záznamu založenou na kurzoru založenou na jednoduchém kurzoru, který vrací jeden řádek dat. Nyní vyvstává otázka, zda můžeme použít stejnou proměnnou datového typu záznamu s kurzorem, který vrací více řádků dat? Chcete-li znát odpověď, přečtěte si a zjistěte, jak zacházet s více hodnotami vrácenými kurzorem pomocí proměnné datového typu záznamu založeného na jediném kurzoru.

Vzhledem k tomu, že máme co do činění se záznamy založenými na kurzoru, je vyžadována malá znalost kurzoru. V zájmu jednoduchosti a pro usnadnění pochopení tohoto konceptu použiji pro demonstraci jednoduchý explicitní kurzor.

Krok 1:Deklarujte jednoduchý explicitní kurzor

Datový typ záznamu založený na kurzoru vyžaduje již vytvořený kurzor. Tento kurzor se stane podkladem pro naši proměnnou typu záznamu. Všechna pole proměnné typu záznamu, která je vytvořena pomocí tohoto kurzoru, budou mít stejný název a datový typ jako sloupce použité ve SELECT-List kurzoru.

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

Na rozdíl od kurzoru z předchozího kurzu, který vrací jeden řádek dat, tento kurzor vrátí více řádků. Všechny tyto řádky budou obsahovat křestní jméno a plat všech zaměstnanců s ID zaměstnance větším než 200.

Krok 2:Deklarujte proměnnou datového typu záznamu založeného na kurzoru

Když jsme vytvořili kurzor, nyní jsme všichni připraveni deklarovat proměnnou záznamu pomocí tohoto kurzoru.

var_emp    cur_RebellionRider%ROWTYPE;

Var_emp je proměnná typu záznamu a jelikož je založena na kurzoru cur_RebellionRider, můžeme ji hrdě nazývat proměnná typu záznamu založená na kurzoru. Nyní musíme zjistit, zda je tato proměnná jednoho záznamu schopna pojmout všechna data vrácená základním kurzorem cur_RebellionRider.

Krok 3:Inicializujte proměnnou záznamu kurzoru

Jak jsme diskutovali v tutoriálu PL/SQL 34, že inicializace proměnné záznamu je proces přiřazení nějakých hodnot k ní. V případě kurzorů to funguje příkazem FETCH-INTO. Ale musíme se ujistit, že jsme správně dodržovali životní cyklus kurzoru.

Pokud nevíte, co je tento životní cyklus kurzoru a jaké kroky k vytvoření kurzoru potřebujete, podívejte se na tento blog na téma „Úvod do databázového kurzoru“.

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;

Výše uvedená sekce provádění bloku PL/SQL, kterou zde vytváříme, byla vysvětlena řádek po řádku ve výukovém videu na mém kanálu YouTube. Zkontrolujte to.

Takže to je ono. To je vše, co musíme. Nyní zkombinujme všechny tyto části kódu, které jsme viděli v různých krocích výše, do jediného anonymního bloku PL/SQL.

Proměnná datového typu záznamu založená na kurzoru v databázi 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;

Když zkompilujete a spustíte výše uvedený kód, získáte všechna data, která příkaz FETCH-INTO načetl z kurzoru cur_RebellionRider a uložil do proměnné záznamu založeného na kurzoru var_emp. To znamená, že můžeme skutečně zpracovat více řádků dat pomocí jediného záznamu založeného na kurzoru.

Ve svém video tutoriálu PL/SQL jsem se zeptal, zda můžeme tento kód zjednodušit, nebo existuje nějaký jiný způsob, jak provést stejný úkol. Odpověď zní ano, existuje několik způsobů, jak dosáhnout stejného výsledku, a jedním z nich je použití „Cursor For-Loop“. Toto je speciální druh smyčky, která deklaruje proměnnou záznamu a také otevírá, načítá a zavírá základní kurzor implicitně na pozadí. Zde si můžete přečíst více Cursor For-Loop.

Referenční kniha pro SQL Expert 1z0-047 Přidružený odkaz
OCA Oracle Database SQL Certified Expert Exam Guide (zkouška 1Z0-047)

Zde je kód vytvořený pomocí Cursor For-Loop, který je ekvivalentní výše uvedenému kódu. Jak můžete vidět, je mnohem méně komplexní s několika řádkovými kódy (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 kódy vrátí stejný výsledek, protože oba provádějí stejný úkol.

Doufám, že se vám tento podrobný tutoriál PL/SQL líbil. Nezapomeňte to prosím sdílet na své sociální síti a označit mě, protože každý měsíc rozdávám zboží RebellionRider náhodně vybranému uživateli. Sledujte mě také na mých sociálních sítích [Twitter/Facebook/Instagram] pro pravidelné aktualizace.

Děkuji a přeji hezký den!


  1. Připojení k databázi Oracle pomocí SQLAlchemy

  2. Oracle Database 21c

  3. Pgbackrest Restore and Restore Delta

  4. Jak funguje sp_describe_first_result_set na serveru SQL Server