sql >> Databáze >  >> RDS >> Database

PL/SQL silný referenční kurzor s uživatelem definovaným datovým typem záznamu

Silný referenční kurzor s uživatelem definovaným datovým typem záznamu

V předchozím tutoriálu jsme se naučili, jak vytvořit silný referenční kurzor PL/SQL pomocí proměnné datového typu záznamu založené na tabulce. Tam jsem demonstroval použití silného referenčního kurzoru pro zpracování dat ze všech sloupců tabulky zaměstnanců. V důsledku toho to vyvolává obavy. Co když chceme data z nějakého konkrétního sloupce tabulky? To je přesně to, čemu se budeme věnovat v dnešním tutoriálu.

Než se však pustíte do tohoto tutoriálu, doporučuji vám seznámit se se znalostmi referenčních kurzorů PL/SQL. Speciálně silný referenční kurzor a datový typ uživatelem definovaného záznamu. Kromě toho zde pro vaše pohodlí uvádím všechny potřebné odkazy:

  • Jak vytvořit silný referenční kurzor pomocí záznamu založeného na tabulce
  • Co jsou datové typy záznamů definované uživatelem?

Předchozí tutoriál úspěšně ukázal, jak PL/SQL Strong referenční kurzor načítal a zpracovával data ze všech sloupců řádku. Ale co když chceme data z konkrétního sloupce řádku? Řekněme, že chceme vidět pouze e-mail nebo plat zaměstnance. V důsledku toho nechceme utrácet drahé prostředky na získávání všech nepotřebných informací. Můžeme k tomu tedy použít stejný referenční kurzor? Pojďme to zjistit.

Můžeme použít silný referenční kurzor, který jsme vytvořili v předchozím tutoriálu, k načtení dat z konkrétního sloupce?

Odpověď na tuto otázku je Ne, nemůžeme .

Protože tento silný referenční kurzor byl vytvořen pomocí datového typu záznamu založeného na tabulce. Pro ilustraci, když vytvoříme datový typ záznamu založený na tabulce, Oracle engine vytvoří složenou datovou strukturu. Tato struktura je plná polí odpovídajících každému sloupci zadané tabulky.

Navíc se všem těmto polím automaticky přiřadí stejný název a stejný datový typ jako sloupcům základní tabulky. Ale pokud jde o inicializaci záznamu pomocí konkrétního sloupce, musíme veškerou tuto práci provést ručně.

Abyste tomu porozuměli jasněji, podívejte se do PL/SQL tutoriálu 34. Zde jsem podrobně popsal, jak inicializovat datový typ záznamu a jeho fungování.

Jaké je tedy řešení tohoto problému?

Tento problém můžeme snadno vyřešit. Můžeme vytvořit PL/SQL silný referenční kurzor s uživatelsky definovanou proměnnou datového typu záznamu.

Příklad:PL/SQL silný referenční kurzor s uživatelsky definovanou proměnnou datového typu záznamu.

Například chceme vytvořit silný referenční kurzor pomocí příkazu SELECT. Což vrátí pouze plat zaměstnance, jehož ID zaměstnance je 100.

SET SERVEROUTPUT ON;
DECLARE
	--Create User-Defined Record Datatype
    TYPE my_rec IS RECORD (
        emp_sal employees.salary%TYPE
        );
	--Declare Strong Ref Cursor
    TYPE RefCur IS REF CURSOR RETURN my_rec;
    cur_var REFCUR;
	--Another anchored datatype variable for holding data
    at_var  employees.salary%TYPE;
BEGIN
   OPEN cur_var FOR SELECT salary FROM employees WHERE employee_id = 100;
    FETCH cur_var INTO at_var;
    CLOSE cur_var;
    DBMS_OUTPUT.PUT_LINE ('Salary of the employee is '||at_var);
END;
/

Pojďme tedy tento kód prolomit a podívat se, co se zde děje.

Část prohlášení

DECLARE
    TYPE my_rec IS RECORD (
        emp_sal employees.salary%TYPE
        );
    TYPE RefCur IS REF CURSOR RETURN my_rec;
    cur_var REFCUR;
    at_var  employees.salary%TYPE;

Zde je naše sekce prohlášení. V prvních třech řádcích této sekce jsme vytvořili náš uživatelsky definovaný datový typ záznamu s názvem my_rec. Navíc tento uživatelsky definovaný datový typ záznamu má pouze jedno pole, které je emp_sal. Emp_sal je ukotvené pole datového typu, které je navrženo nad sloupcem platů v tabulce zaměstnanců. Protože emp_sal má ukotvený datový typ, automaticky dostane přiřazený datový typ a šířku dat základního sloupce, což je v tomto případě plat.

Hned poté jsme deklarovali náš silný referenční kurzor PL/SQL s názvem „RefCur“. Návratový typ tohoto silného referenčního kurzoru je “my_rec” . Po deklaraci kurzoru jsme vytvořili proměnnou kurzoru s názvem cur_var. Tato proměnná se navíc používá k odkazování na silný referenční kurzor v kódu.

Kromě kurzorové proměnné máme v této sekci deklarovanou i další proměnnou. Tato proměnná je „at_var“, jedná se opět o ukotvenou proměnnou datového typu. Používá se pro ukládání dat vrácených kurzorem.

Nyní pojďme do sekce provádění.

Sekce provádění

BEGIN
    OPEN cur_var FOR SELECT salary FROM employees WHERE employee_id = 100;
    FETCH cur_var INTO at_var;
    CLOSE cur_var;
    DBMS_OUTPUT.PUT_LINE('Salary of the employee is '||at_var);
END;
/

Tato prováděcí část má čtyři spustitelné řádky kódů. Podívejme se, které to jsou.

Řádek 1:Otevřít pro výpis

Tento příkaz dynamicky otevře zmíněný kurzor. Poté připojí příkaz SELECT, který je uveden hned za klíčovým slovem FOR.

V našem případě je tento příkaz otevření silného referenčního kurzoru pomocí kurzorové proměnné „cur_var“ – příkaz SELECT. Což vrací data pouze ze „sloupec plat“ tabulky zaměstnanců.

Řádek 2:Načtení výpisu

Tento příkaz načte data z referenčního kurzoru a uloží je do proměnné „at_var“. Stejně důležité je ujistit se, že datový typ načítaných dat a datový typ proměnné, do které se data ukládají, se musí shodovat. Jinak dojde k chybě.

Řádek 3:Zavřít příkaz

Třetí řádek je zavřít prohlášení. Zavření kurzoru, se kterým jste skončili, je dobrým zvykem.

Řádek 4:Výstupní prohlášení

Konečně posledním příkazem sekce provádění je příkaz DBMS_OUTPUT. A zobrazuje plat zaměstnance zpět uživateli.

Tyto čtyři řádky doplňují spouštěcí část tohoto bloku PL/SQL. Úspěšné provedení tohoto kódu by vám navíc mělo ukázat plat s formátovaným řetězcem.

Patříte k těm, kteří se lépe učí sledováním videa? Pak je zde výukové video o silném referenčním kurzoru s uživatelem definovaným datovým typem záznamu.

To je pro tento tutoriál vše. Nezapomeňte sdílet tento blog na svých sociálních sítích a pomozte ostatním učit se. Pro další zajímavé návody se můžete přihlásit k odběru kanálu YouTube. Děkuji a přeji hezký den!


  1. jak deklarovat %ROWTYPE proměnné, která má slabý typ SYS_REFCURSOR?

  2. Python &MySql:Unicode a kódování

  3. Příkaz Oracle CREATE TABLE v PL/SQL s 10 příklady

  4. Emotikony pro iPhone se vloží do MySQL, ale stanou se prázdnou hodnotou