Erinevus lehekülje "PostgreSQL SQL" redaktsioonide vahel
(→Protseduurilised keeled) |
(→Trigger) |
||
88. rida: | 88. rida: | ||
===Trigger=== | ===Trigger=== | ||
− | + | Triggeriks nimetatakse sellist funktsiooni, mille täitmine kaasneb automaatselt vastavas tabelis toimuva muudatusega. Nt olgu olemas tabel customers | |
+ | |||
+ | CREATE TABLE customers | ||
+ | ( | ||
+ | customer_id integer primary key, | ||
+ | customer_name character varying(50) not null, | ||
+ | phone character(8) , | ||
+ | birth_date date, | ||
+ | balance decimal(7,2) | ||
+ | ); | ||
+ | |||
+ | ning tabel customers_archive | ||
+ | |||
+ | CREATE TABLE customer_archive | ||
+ | ( | ||
+ | customer_id integer, | ||
+ | customer_name character varying(50) not null, | ||
+ | phone character(8) , | ||
+ | birth_date date, | ||
+ | balance decimal(7,2) , | ||
+ | user_changed varchar, | ||
+ | date_changed date, | ||
+ | operation varchar | ||
+ | ); | ||
+ | |||
+ | Eesmärgiks on kõik customers tabelis toimunud muudatused arhiveerida tabelis customers_archive. Selleks sobib kirjeldada funktsioon | ||
+ | |||
+ | CREATE FUNCTION archive_customer() RETURNS TRIGGER AS $$ | ||
+ | BEGIN | ||
+ | INSERT INTO customer_archive | ||
+ | VALUES | ||
+ | ( | ||
+ | OLD.customer_id, | ||
+ | OLD.customer_name, | ||
+ | OLD.phone, | ||
+ | OLD.birth_date, | ||
+ | OLD.balance, | ||
+ | CURRENT_USER, | ||
+ | now() , | ||
+ | TG_OP | ||
+ | ); | ||
+ | RETURN NULL; | ||
+ | END; | ||
+ | $$ LANGUAGE ‘plpgsql’; | ||
+ | |||
+ | Ning lõpuks moodustada trigger archive_customer seostades funktsiooni tabeliga customers | ||
+ | |||
+ | CREATE TRIGGER archive_customer | ||
+ | AFTER DELETE OR UPDATE | ||
+ | ON customers | ||
+ | FOR EACH ROW | ||
+ | EXECUTE PROCEDURE archive_customer(); | ||
===Protseduurilised keeled=== | ===Protseduurilised keeled=== |
Redaktsioon: 8. märts 2010, kell 21:39
Sisukord
Sissejuhatus
TODO
Andmebaasi klientprogramm
Reeglina sisaldab andmebaasitarkvara lisaks andmebaasi serverile ka mingit terminalil kasutatavat nö käsurea klientprogrammi, nt PostgreSQL puhul on selleks programm psql.
- andmebaasi kliendi kasutamine kalkulaatorina
select (5 * 5); ?column? ---------- 25 (1 row)
- andmebaasi klient töötab sõnedega
select 'Hello' || ' World!'; ?column? -------------- Hello World! (1 row)
- Andmebaasi kliendi juures saab määrata esituse formaati, nt (vaikimisi on see aligned)
\pset format html
Select
select lausega saab lihtsamal juhul kasutada andmebaasis kirjeldatud funktsioone, nt
select sqrt(25);
Andmetüübid
TODO
Sekventsid
TODO
Join
TODO
Mõisted
- result set - vastus andmebaasile esitatud päringule, või sisaldada mitte midagi, ühte või enamat rida
Misc laused
- tabel ühte tehtud päringu tulemuste lisamine tabel kahte
insert into tabel2 (nimi, aadress) select nimi, aadress from tabel1
- Andmete kopeerimine failisüsteemi
copy customers to '/tmp/customers.txt';
- Andmete kopeerimine failisüsteemist
copy customers from '/tmp/customers.txt';
Indeksid
TODO
Vaated
TODO
Transaktsioon
TODO
Jõudlus
explain verbose select * from teenused where nimi='teenuse nimi_O_13437'; QUERY PLAN ---------------------------------------------------------------------------- Bitmap Heap Scan on teenused2 (cost=6.60..196.17 rows=48 width=48) Output: id, nimi, aadress Recheck Cond: ((nimi)::text = 'teenuse nimi_O_13437'::text) -> Bitmap Index Scan on teenused_idx (cost=0.00..6.59 rows=48 width=0) Index Cond: ((nimi)::text = 'teenuse nimi_O_13437'::text)
Trigger
Triggeriks nimetatakse sellist funktsiooni, mille täitmine kaasneb automaatselt vastavas tabelis toimuva muudatusega. Nt olgu olemas tabel customers
CREATE TABLE customers ( customer_id integer primary key, customer_name character varying(50) not null, phone character(8) , birth_date date, balance decimal(7,2) );
ning tabel customers_archive
CREATE TABLE customer_archive ( customer_id integer, customer_name character varying(50) not null, phone character(8) , birth_date date, balance decimal(7,2) , user_changed varchar, date_changed date, operation varchar );
Eesmärgiks on kõik customers tabelis toimunud muudatused arhiveerida tabelis customers_archive. Selleks sobib kirjeldada funktsioon
CREATE FUNCTION archive_customer() RETURNS TRIGGER AS $$ BEGIN INSERT INTO customer_archive VALUES ( OLD.customer_id, OLD.customer_name, OLD.phone, OLD.birth_date, OLD.balance, CURRENT_USER, now() , TG_OP ); RETURN NULL; END; $$ LANGUAGE ‘plpgsql’;
Ning lõpuks moodustada trigger archive_customer seostades funktsiooni tabeliga customers
CREATE TRIGGER archive_customer AFTER DELETE OR UPDATE ON customers FOR EACH ROW EXECUTE PROCEDURE archive_customer();
Protseduurilised keeled
Nt PL/pgSQL on üks PostgreSQL andmebaasi protseduuriline keel.
$ createlang -h 127.0.0.1 -U postgres plpgsql movies
Ja tulemuse kontrollimiseks
movies=# select * from pg_language ; lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl ----------+----------+---------+--------------+---------------+--------------+-------- internal | 10 | f | f | 0 | 2246 | c | 10 | f | f | 0 | 2247 | sql | 10 | f | t | 0 | 2248 | plpgsql | 10 | t | t | 16446 | 16447 | (4 rows)
Lihsamal juhul võiks kirjeldada funktsiooni selline järgnevus
CREATE OR REPLACE FUNCTION liitja (INTEGER, INTEGER) RETURNS INTEGER AS $$ BEGIN return $1 + $2; END; $$ LANGUAGE 'plpgsql';
Faktoriaali arvutamise kirjeldab nt selline PL/pgSQL funktsioon, kusjuures tegu on rekursiivse funktsiooniga
CREATE OR REPLACE FUNCTION my_factorial( value INTEGER) RETURNS INTEGER AS $$ DECLARE arg INTEGER; BEGIN arg := value; IF arg IS NULL OR arg < 0 THEN RAISE NOTICE 'Invalid Number' ; RETURN NULL; ELSE IF arg = 1 THEN RETURN 1; ELSE DECLARE next_value INTEGER; BEGIN next_value := my_factorial(arg - 1) * arg; RETURN next_value; END; END IF; END IF; END; $$ LANGUAGE 'plpgsql';
Funktsiooni kasutamiseks sobib öelda
select my_factorial();
Funktsiooni kustutamiseks sobib öelda
drop function liitja(integer, integer);
Kursorite kasutamine
TODO
Kasulikud lisamaterjalid
- http://www.conjectrix.com/ - PostgreSQL, 2nd edition