Oracle PL/SQL-tietuetyyppi esimerkkien kanssa
โก รlykรคs yhteenveto
PL/SQL-tietuetyyppi on monimutkainen tietotyyppi, joka ryhmittelee useita sarakkeita, joilla kullakin on oma nimi ja tietotyyppi, yhdeksi uudeksi tyypiksi. Tietue voidaan mรครคritellรค tietokantatasolla tallennetuksi objektiksi tai aliohjelman sisรคllรค, ja sen kenttiin pรครคstรครคn pisteoperaattorilla.

Mikรค on tietuetyyppi?
Tietuetyyppi on monimutkainen tietotyyppi, jonka avulla ohjelmoija voi luoda uuden tietotyypin halutulla sarakerakenteella. Sen pรครคominaisuudet ovat:
- Se ryhmittelee yhden tai useamman sarakkeen muodostaakseen uuden tietotyypin.
- Jokaisella nรคistรค sarakkeista on oma nimi ja tietotyyppi.
- Tietuetyyppi voi hyvรคksyรค tiedot yhtenรค tietueena, joka koostuu useista sarakkeista, tai se voi hyvรคksyรค tietueen yhden tietyn sarakkeen arvon.
- Tietuetyyppi on yksinkertaisesti uusi tietotyyppi. Kun se on luotu, se tallennetaan uutena tietotyyppinรค ja sitรค voidaan kรคyttรครค muuttujan mรครคrittรคmiseen ohjelmissa.
- Se kรคyttรครค avainsanaa 'TYYPPI' ohjeistaakseen kรครคntรคjรครค, ettรค uutta tietotyyppiรค luodaan.
- Se voidaan luoda osoitteessa tietokannan tasolla, tallennetaan tietokantaobjektina ja kรคytetรครคn koko tietokannassa tai aliohjelman tasolla, nรคkyvissรค vain aliohjelman sisรคllรค.
- Taulukon sarakkeille voidaan myรถs mรครคrittรครค tietokantatason tietuetyyppi, jolloin yksi sarake voi sisรคltรครค monimutkaista dataa.
- Tietoihin pรครคstรครคn viittaamalla muuttujan nimeen, sitten pisteoperaattoriin (.) ja lopuksi sarakkeen nimeen muodossa ' . ".
Tietuetyypin mรครคrittรคmisen syntaksi
Ilmoituksen syntaksi tietokantatasolla:
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
Ensimmรคisessรค syntaksissa avainsana 'CREATE TYPE' kรคskee kรครคntรคjรครค luomaan tietokantaobjektina tietuetyypin nimeltรค "type_name_db" mรครคritetyillรค sarakkeilla. Tรคmรค annetaan erillisenรค lausekkeena, ei minkรครคn lohkon sisรคllรค.
Aliohjelmatason mรครคrittelyn syntaksi:
DECLARE TYPE <type_name> IS RECORD ( <column1> <datatype>, ); BEGIN <execution_section>; END;
Tรคssรค syntaksissa luomme โtyypin_nimiโ-nimisen tietuetyypin vain aliohjelman sisรคllรค. Molemmissa menetelmissรค sarake- ja tietotyyppi mรครคritellรครคn samalla tavalla.
Esimerkki 1: Tietuetyyppi tietokantaobjektina
Tรคssรค ohjelmassa nรคemme, miten tietuetyyppi luodaan tietokantaobjektina. Luomme tietuetyypin 'emp_det', jossa on neljรค saraketta. Sarakkeet ja niiden tietotyypit ovat:
- EMP_NO (NUMBER)
- EMP_NAME (VARCHAR2 (150))
- JOHTAJA (NUMERO)
- PALKKA (NUMERO)
CREATE TYPE emp_det IS OBJECT ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); /
lรคhtรถ:
Type created
Code Selitys
- Yllรค oleva koodi luo tyypin emp_det tietokantaobjektiksi.
- Siinรค on neljรค saraketta: tyรถntekijรคn_numero, tyรถntekijรคn_nimi, esimies ja palkka, kuten on mรครคritelty.
- Nyt 'emp_det' on samanlainen kuin mikรค tahansa muu tietotyyppi (kuten NUMBER tai VARCHAR2) ja on nรคkyvissรค koko tietokannassa. Siksi sitรค voidaan kรคyttรครค missรค tahansa tietokannassa tรคmรคn tyyppisen muuttujan mรครคrittรคmiseen.
Esimerkki 2: Aliohjelmataso, saraketason kรคyttรถoikeus
Tรคssรค esimerkissรค nรคemme, miten luodaan tietuetyyppi aliohjelmatasolla ja miten tรคytetรครคn ja noudetaan siitรค arvoja sarakkeittain. Luomme 'emp_det'-tietuetyypin aliohjelmatasolla ja kรคytรคmme sitรค tietojen tรคyttรคmiseen ja nรคyttรคmiseen.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN guru99_emp_rec.emp_no:= 1001; guru99_emp_rec.emp_name:= 'XXX'; guru99_emp_rec.manager:= 1000; guru99_emp_rec.salary:= 10000; dbms_output.put_line('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
lรคhtรถ:
Employee Detail Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000
Code Selitys
- Code rivi 2โ8: Tietuetyyppi 'emp_det' on mรครคritelty sarakkeilla emp_no, emp_name, manager ja salary, joiden tietotyypit ovat NUMBER, VARCHAR2, NUMBER ja NUMBER.
- Code rivi 9: guru99_emp_rec-muuttuja on mรครคritelty tietotyypiksi 'emp_det'. Tรคmรค muuttuja voi sisรคltรครค arvon, joka sisรคltรครค kaikki neljรค kenttรครค.
- Code rivi 11: Tรคytetรครคn guru99_emp_rec-kentรคn emp_no arvolla 1001.
- Code rivi 12: Tรคytรค 'emp_name'-kenttรค arvolla XXX.
- Code rivi 13: Tรคytรค 'pรครคllikkรถ'-kenttรค arvolla 1000.
- Code rivi 14: Tรคytรค 'palkka'-kenttรค arvolla 10000.
- Code rivi 15โ19: Nรคyttรครค 'guru99_emp_rec'-arvon tulosteessa.
Esimerkki 3: Aliohjelmataso, rivitason kรคyttรถoikeus
Tรคssรค esimerkissรค nรคemme, miten luodaan tietuetyyppi aliohjelmatasolla ja tรคytetรครคn se rivitasolla. Luomme 'emp_det'-tietuetyypin aliohjelmatasolla ja kรคytรคmme sitรค tietojen tรคyttรคmiseen ja nรคyttรคmiseen.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); COMMIT; SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002; dbms_output.put_line ('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Code Selitys
- Code rivi 2โ8: Tietuetyyppi 'emp_det' on mรครคritelty sarakkeilla emp_no, emp_name, manager ja salary, joiden tietotyypit ovat NUMBER, VARCHAR2, NUMBER ja NUMBER.
- Code rivi 9: guru99_emp_rec-muuttuja on mรครคritelty tietotyypiksi 'emp_det', ja se voi sisรคltรครค kaikki neljรค kenttรครค.
- Code rivi 11: Tรคytetรครคn taulukko emp siten, ettรค tyรถntekijรคn_numero on 1002, tyรถntekijรคn_nimi on YYY, palkka on 15000 ja esimiesnumero on 1000.
- Code rivi 12: Sisรคltรถtapahtuman sitominen.
- Code rivi 13: Tรคytetรครคn 'guru99_emp_rec'-muuttuja rivitasolla tyรถntekijรคn numeron 1002 valintakyselystรค.
- Code rivi 15โ19: Nรคyttรครค 'guru99_emp_rec'-arvon tulosteessa.
lรคhtรถ:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
Huomautus: Tietuetyyppiin pรครคsee kรคsiksi vain saraketasolla, kun sen arvo ohjataan mihin tahansa tulostustilaan. Huomaa, ettรค tรคssรค esimerkissรค SELECT-luettelon jรคrjestys ei vastaa tietuekenttien jรคrjestystรค, minkรค vuoksi palkan ja esimiehen arvot nรคkyvรคt tulosteessa vaihtaneina.
PL/SQL-tietueiden tyypit
Yllรค olevan ohjelmoijan mรครคrittelemรคn tietueen lisรคksi Oracle tarjoaa kaksi ankkuroitua tietuetyyppiรค, jotka kopioivat rakenteensa automaattisesti. Niiden kรคyttรถ vรคlttรครค sarakkeiden uudelleenmรครคrittelyn ja pitรครค tietueen tahdissa sen perustana olevan taulukon tai kohdistimen kanssa.
| Tietueen tyyppi | Ilmoitettu | Rakenne tulee |
|---|---|---|
| Taulukkoon perustuva tietue | taulukon_nimi%RIVITYYPPI | Taulukon kaikki sarakkeet |
| Kursoriin perustuva tietue | kohdistimen_nimi%RIVITYYPE | Kohdistimen valintalista |
| Ohjelmoijan mรครคrittรคmรค tietue | TYYPPI โฆ ON TIETUE | Kรคsin listaamasi sarakkeet |
%ROWTYPE-tietue on turvallisin valinta, kun muodon on seurattava taulukkoa tai kohdistin, koska sarakkeen muutos poimitaan automaattisesti seuraavan kรครคnnรถksen yhteydessรค.




