Együttes hozzárendelés

Hasonló dokumentumok
Tranzakciókezelés PL/SQL-ben

Haladó DBMS ismeretek 1

Kivételkezelés 2. SQLCODE lehetséges értékei:

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

A PL/SQL motor. A PL/SQL nyelvű egységek fordítását és futtatását végző rendszer. az adatbázis-kezelőben fejlesztőeszközben (pl.

Adatbázisban tárolt kollekciók

Triggerek. Olyan névvel ellátott adatbázisobjektumok, amelyek eseményorientált feldolgozást tesznek lehetővé

Összetett típusok Rekordtípus

Adatbázisok-I. előadás dr. Hajas Csilla (ELTE IK)

Kalmár György Adatbázis alapú rendszerek

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

PL/SQL (folytatás) Kurzorok, függvények, eljárások

Adatbázis használat I. 5. gyakorlat

A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. Alakja:

Kurzorok, kurzorváltozók

PL/SQL 1. rész. Procedural Language extension to SQL

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

Tankönyvben: SQL/PSM Gyakorlaton: Oracle PL/SQL

8-9.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Adatbázis Rendszerek II. 4. PLSQL Kurzorok, hibakezelés 53/1B IT MAN

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

PL/SQL feladatok 8. gyakorlat

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

B I T M A N B I v: T M A N

Adatbázis Rendszerek II. 2. Gyakorló környezet

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Hozzunk ki többet abból amink van. Fehér Lajos

Adatbázis Rendszerek II. 8. Gyakorló környezet

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

SQL/PSM kurzorok rész

SQL OO elemei aktív komponensek

A könyv tartalomjegyzéke

Kliens oldali SQL-API

Adatok szűrése, rendezése

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

B I T M A N B I v: T M A N

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Java és web programozás

Adatbázis kezelés Delphiben. SQL lekérdezések

Adatbázisok* tulajdonságai

Az SQL*Plus használata

Adatbázis rendszerek SQL nyomkövetés

Adatbázis Rendszerek II. 3. PLSQL alapok 92/1B IT MAN

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 3. Előadás: Tárolt eljárások (folytatás) Nézetek

Adatbázis-kezelés. Harmadik előadás

B I T M A N B I v: T M A N

Indexek és SQL hangolás

Készítette: Szabóné Nacsa Rozália

2007. február 25. TARTALOM

Vektoros grafikát tároló adatbázisok. Katona Endre Térképi adatbázisok diasorozata alapján

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

Hatékony PL/SQL programok írása

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Elemi alkalmazások fejlesztése IV.

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Adatbázisok elmélete 9. előadás

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT


Adatbázis Rendszerek II. 4. Ea: MySQL Tárolt eljárások 110/1 B IT MAN

Bevezetés: Relációs adatmodell

Database Systems II. ZH összefoglaló


ADATBÁZIS RENDSZEREK I BEADANDÓ

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Java és web programozás

Adatbázis rendszerek. Gyakorlati jegyzet. Készítette: Selling István

SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

B I T M A N B I v: T M A N

Adatbázis használata PHP-ből

Jegyz könyv. Adatbázis-rendszerek II. Beadandó feladat. Miskolci Egyetem

Adatbázisok elmélete 9. előadás

SQL parancsok feldolgozása

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Adatbázis másolás Slony-I segítségével

BEVEZETÉS Az objektum fogalma

Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

Webfejlesztés 4. alkalom

Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.

B I T M A N B I v: T M A N

SQL DDL-2 (aktív elemek) triggerek

SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére

Széchenyi István Egyetem

Adatbázis-kezelés, információs-rendszerek

Az SQL adatbázisnyelv: DML

Tranzakciók az SQL-ben

Spatial a gyakorlatban

Átírás:

Együttes hozzárendelés

Együttes hozzárendelés Hozzárendelés: az a tevékenységet, amikor egy PL/SQLváltozónak egy SQL-utasításban adunk értéket. Együttes hozzárendelés: Egy kollekció minden elemének egyszerre történő hozzárendelése. FORALL: PL/SQL-oldali együttes hozzárendelés eszköze BULK COLLECT: SQL-oldali együttes hozzárendelés eszköze.

BULK COLLECT A SELECT, INSERT, DELETE, UPDATE, FETCH utasítások INTO utasításrészében használható Az SQL-motortól az együttes hozzárendelést kéri Alakja: BULK COLLECT INTO kollekciónév [, kollekciónév] A kollekciókat nem kell inicializálni. Az adatokat a kollekcióban az 1-es indextől kezdve helyezi el folyamatosan, felülírva a korábbi elemeket. Csak szerveroldali programokban alkalmazható.

declare type t_nt is table of orszagok%rowtype; v_nt t_nt; begin select * bulk collect into v_nt from orszagok where foldresz='európa'; for i in 1..v_nt.count loop dbms_output.put_line(v_nt(i).orszag); end loop; end;

create table kis_orszagok (nev varchar2(50), terulet number(10), foldresz varchar2(50)); insert into kis_orszagok select orszag, terulet, foldresz from orszagok where terulet<10000; commit;

declare type t_at_nev is table of orszagok.orszag%type index by pls_integer; type t_at_ter is table of orszagok.terulet%type index by pls_integer; v_at_nev t_at_nev; v_at_ter t_at_ter; begin update kis_orszagok set terulet=terulet*1.1 where foldresz='európa' returning nev, terulet bulk collect into v_at_nev,v_at_ter; commit; for i in 1..v_at_nev.count end; loop dbms_output.put_line(v_at_nev(i) v_at_ter(i)); end loop;

create or replace type t_dt_emp is varray(10) of varchar2(50); create or replace FUNCTION reszleg_dolgozoi(p_reszleg varchar2) RETURN t_dt_emp IS v_dt_emp t_dt_emp; -- BULK COLLECT-nél nem kell inicializálni SELECT first_name ' ' last_name nev BULK COLLECT INTO v_dt_emp FROM hr.employees WHERE department_id = (select department_id from hr.departments where department_name=p_reszleg) ORDER BY nev; RETURN v_dt_emp; / SELECT * FROM TABLE(reszleg_dolgozoi('IT'));

declare type t_dt_emp is varray(10) of hr.employees%rowtype; v_dt_emp t_dt_emp; cursor c_emp (p_reszleg hr.departments.department_name%type) is select * FROM hr.employees WHERE department_id = (select department_id from hr.departments where department_name=p_reszleg) ORDER BY last_name; open c_emp('sales'); fetch c_emp bulk collect into v_dt_emp; close c_emp; for i in 1..v_dt_emp.count loop dbms_output.put_line( v_dt_emp(i).first_name ' ' v_dt_emp(i).last_name); end loop; /

declare type t_dt_emp is varray(10) of hr.employees%rowtype; v_dt_emp t_dt_emp; cursor c_emp (p_reszleg hr.departments.department_name%type) is select * FROM hr.employees WHERE department_id = (select department_id from hr.departments where department_name=p_reszleg) ORDER BY last_name; open c_emp('sales'); loop fetch c_emp bulk collect into v_dt_emp limit 10; exit when v_dt_emp.count=0; for i in 1..v_dt_emp.count loop dbms_output.put_line( v_dt_emp(i).first_name ' ' v_dt_emp(i).last_name); end loop; end loop; close c_emp; /

Probléma CREATE TABLE employees2 AS SELECT * FROM HR.employees; DECLARE TYPE NumList IS VARRAY(20) OF NUMBER; depts NumList := NumList(10, 30, 70); --részlegszámok FOR i IN depts.first..depts.last LOOP DELETE FROM employees2 WHERE department_id = depts(i); END LOOP; COMMIT;

FORALL: PL/SQL-oldali együttes hozzárendelés eszköze FORALL index IN {alsó_határ..felső_határ INDICES OF kollekció [BETWEEN alsó_határ AND felső_határ] VALUES OF indexkollekció_név} [SAVE EXCEPTIONS] sql_utasítás; Az SQL-motor az SQL-utasítást a megadott indextartomány minden értéke mellett egyszer végrehajtja. Csak szerverotldali programokban alkalmazható.

FORALL: PL/SQL-oldali együttes hozzárendelés eszköze A FORALL implicit módon a kollekció indexének megfelelő típusúnak deklarálja az indexet INDICES OF kollekció: a megadott kollekció elemeinek az indexeit veszi fel BETWEEN-nel korlátozhatjuk VALUES OF indexkollekció_név: az index által felveendő értékekekt az indexkollekció_név által megnevezett kollekció tartalmazza

CREATE TABLE employees2 AS SELECT * FROM HR.employees; DECLARE TYPE NumList IS VARRAY(20) OF NUMBER; depts NumList := NumList(10, 30, 70); --részlegszámok FORALL i IN depts.first..depts.last DELETE FROM employees2 WHERE department_id = depts(i); COMMIT;

CREATE TABLE employees2 AS SELECT * FROM employees; DECLARE TYPE NumList IS VARRAY(10) OF NUMBER; depts NumList := NumList(5,10,20,30,50,55,57,60,70,75); FORALL j IN 4..7 varray bizonyos elemeire DELETE FROM employees2 WHERE department_id = depts(j); COMMIT;

CREATE TABLE t1 (id number(5), adat varchar2(20)); insert into t1 values(1,'x'); insert into t1 values(2,'x'); insert into t1 values(3,'x'); insert into t1 values(4,'x'); commit; SELECT * FROM t1; /* ID ADAT ---------------------- -------------------- 1 x 2 x 3 x 4 x */

DECLARE TYPE T_Id_lista IS TABLE OF NUMBER; v_id_lista T_Id_lista := T_Id_lista(3,1); -- Törüljük az 1. elemet, 1 elem marad v_id_lista.delete(1); FORALL i IN INDICES OF v_id_lista -- i: {2} UPDATE t1 SET adat = 'INDICES OF' WHERE id = v_id_lista(i); -- T_Id_lista(2) = 1 -> 1-es Id-re fut le az UPDATE / SELECT * FROM t1; /* ID ADAT ---------------------- -------------------- 1 INDICES OF 2 x 3 x 4 x */

DROP TABLE t1; DECLARE TYPE T_Id_lista IS TABLE OF NUMBER; TYPE T_Index_lista IS TABLE OF BINARY_INTEGER; v_id_lista T_Id_lista := T_Id_lista(5,1,4,3,2); v_index_lista T_Index_lista := T_Index_lista(4,5); FORALL i IN VALUES OF v_index_lista -- i: {4, 5} UPDATE t1 SET adat = 'VALUES OF' WHERE id = v_id_lista(i); -- p_id_lista(4) = 3 -- p_id_lista(5) = 2 -- -> 3-as és 2-es Id-kre fut le az UPDATE / SELECT * FROM t1; /* ID ADAT ---------------------- -------------------- 1 INDICES OF 2 VALUES OF 3 VALUES OF 4 x */

drop table forall_kivetel; create table forall_kivetel (szam number(1)); declare type t_nt is table of number(5); v_nt t_nt:=t_nt(1,30,5); begin forall i in indices of v_nt insert into forall_kivetel values (v_nt(i)); /*exception when others then null;*/ end; / select * from forall_kivetel;

CREATE TABLE emp2 AS SELECT * FROM hr.employees; DECLARE TYPE NumList IS TABLE OF NUMBER; depts NumList := NumList(30, 50, 60); FORALL j IN depts.first..depts.last DELETE FROM emp2 WHERE department_id = depts(j); FOR i IN depts.first..depts.last LOOP dbms_output.put_line('iteration #' i ' deleted ' SQL%BULK_ROWCOUNT(i) ' rows.'); END LOOP;

CREATE TABLE emp_by_dept AS SELECT employee_id, department_id FROM hr.employees WHERE 1 = 0; DECLARE TYPE dept_tab IS TABLE OF hr.departments.department_id%type; deptnums dept_tab; SELECT department_id BULK COLLECT INTO deptnums FROM hr.departments; FORALL i IN 1..deptnums.COUNT INSERT INTO emp_by_dept SELECT employee_id, department_id FROM hr.employees WHERE department_id = deptnums(i); FOR i IN 1..deptnums.COUNT LOOP dbms_output.put_line('dept ' deptnums(i) ': inserted ' SQL%BULK_ROWCOUNT(i) ' records'); END LOOP; dbms_output.put_line('total records inserted =' SQL%ROWCOUNT);

CREATE TABLE emp2 AS SELECT * FROM employees; DECLARE TYPE NumList IS TABLE OF NUMBER; num_tab NumList := NumList(10,0,11,12,30,0,20,199,2,0,9,1); errors NUMBER; dml_errors EXCEPTION; PRAGMA exception_init(dml_errors, -24381); FORALL i IN num_tab.first..num_tab.last SAVE EXCEPTIONS DELETE FROM emp2 WHERE salary > 500000/num_tab(i); EXCEPTION WHEN dml_errors THEN errors := SQL%BULK_EXCEPTIONS.COUNT; dbms_output.put_line( 'Number of DELETE statements that failed: ' errors); FOR i IN 1..errors LOOP dbms_output.put_line('error #' i ' occurred during ' 'iteration #' SQL%BULK_EXCEPTIONS(i).ERROR_INDEX); dbms_output.put_line('error message is ' SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); END LOOP;

drop table forall_kivetel; create table forall_kivetel(szam number(1)); declare type t_nt is table of number(5); v_nt t_nt:=t_nt(1,30,5,40,6,10,1,3); begin forall i in indices of v_nt save exceptions insert into forall_kivetel values (v_nt(i)) ; exception when others then for i in 1..sql%bulk_exceptions.count loop dbms_output.put_line(i '; sql%bulk_exceptions(i).error_index '; sql%bulk_exceptions(i).error_code); end loop; end; / select * from forall_kivetel;

CREATE TABLE emp2 AS SELECT * FROM employees; DECLARE TYPE NumList IS TABLE OF NUMBER; depts NumList := NumList(10,20,30); TYPE enum_t IS TABLE OF employees.employee_id%type; TYPE dept_t IS TABLE OF employees.department_id%type; e_ids enum_t; d_ids dept_t; FORALL j IN depts.first..depts.last DELETE FROM emp2 WHERE department_id = depts(j) RETURNING employee_id, department_id BULK COLLECT INTO e_ids, d_ids; dbms_output.put_line('deleted ' SQL%ROWCOUNT ' rows:'); FOR i IN e_ids.first.. e_ids.last LOOP dbms_output.put_line('employee #' e_ids(i) ' from dept #' d_ids(i)); END LOOP;