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!