Sep 29

Instrucţiunile SELECT şi funcţiile PL/pgSQL

Imaginaţi-vă un tabel ce conţine numele unui angajat, numărul camerei în care lucrează angajatul şi salariul acestuia:

CREATE TABLE employees (id serial, name varchar(50), room int4, salary int4);
INSERT INTO employees (name, room, salary) VALUES (’Paul’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Ion’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Linda’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Carla’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Maria’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Alice’, 1, 3000);
INSERT INTO employees (name, room, salary) VALUES (’Victor’, 1, 3000);

Scopul nostru este să scriem o funcţie care să verifice dacă un angajat se află în tabel şi se execută o operaţie INSERT sau o operaţie UPDATE:

CREATE FUNCTION insertupdate(text, int4) RETURNS bool AS ’
DECLARE
intext ALIAS FOR $1;
newsal ALIAS FOR $2;
checkit record;
BEGIN
SELECT INTO checkit * from employees
WHERE name = intext;
IF NOT FOUND THEN
INSERT INTO employees (name, room, salary)
VALUE(intext, ’’1’’, newsal);
RETURN ’’t’’;
ELSE
UPDATE employees SET salary=newsal, room=checkit.room
WHERE name=intext;
RETURN ’’f’’;
ENDIF;
END;
’ LANGUAGE ’plpgsql’;

Read the rest of this entry »

Tags: , , , , , ,

Related posts

Sep 29
PL-PGSQL
icon1 admin | icon2 BD, Romana | icon4 09 29th, 2008| icon3No Comments »

PL/PGSQL

PostgreSQL oferă un limbaj de programare special pentru crearea funcţiilor cu cod SQL. Acest limbaj de programare (de aceea se cheamă PL/pgSQL) îi oferă programatorului un potenţial de execuţie cu mult mai mare decât simplele comenzi SELECT, INSERT sau UPDATE. Puterea limbajului PL/pgSQL poate fi folosită pentru rezolvarea problemelor care nu pot fi rezolvate cu simple instrucţiuni SQL. Pachetul a fost scris iniţial de Jan Wieck. Să vedem acum care sunt ideile şi conceptele de bază ale limbajului PL/pgSQL.
PL/pgSQL este un limbaj procedural şi seamănă cu PL/SQL din Oracle (vezi secţiunea intitulată „De ce aţi folosit PL/pgSQL?” de mai târziu din acest capitol). Ca şi PL/SQL, PL/pgSQL este un limbaj orientat pe blocuri, care foloseşte declaraţii de variabile, bucle, construcţii logice şi tratarea avansată a erorilor.

De ce aţi folosi PL/pgSQL?

PL/pgSQL este o extensie puternică pentru SQL. Nu toate problemele uzuale pot fi rezolvate cu codul SQL simplu. PL/pgSQL a fost conceput ca limbaj de programare care să poată fi folosit în baza de date, din acest motiv fiind o bună alegere pentru integrarea îmbunătăţirilor şi a noilor facilităţi într-o bază de date PostgreSQL.
Un avantaj reprezentat de PL/pgSQL este independenţa de platformă, ceea ce înseamnă că programatorul nu trebuie să se preocupe dacă funcţia rulează pe un procesor x86, pe un calculator Alpha sau pe orice altă platformă compatibilă cu PostgreSQL. Toate aspectele legate de sistemul de calcul reprezintă problema exclusivă a structurii interne a PL/pgSQL (cine vrea să-şi bată capul cu ordinea octeţilor şi alte lucruri de acest gen?), acesta fiind motivul pentru care funcţiile PL/pgSQL nu trebuie portate pe alte platforme. PL/pgSQL este o parte a bazei de date, acesta fiind probabil cel mai semnificativ avantaj faţă de orice altă metodă de construire a funcţiilor în mediile PostgreSQL.
Totuşi, deparazitarea codului PL/pgSQL poate fi o mare bătaie de cap. Inserarea funcţiei în baza de date nu garantează că funcţia va putea fi apelată.
Până acum, nu există niciun deparazitor, iar PostgreSQL adesea nu oferă mesaje de eroare exacte, care să-l ajute pe utilizator să localizeze rapid eroarea. Funcţiile ce conţin multe rânduri de cod sursă pot fi cu greu deparazitate. Noi recomandăm cu tărie să nu scrieţi mai multe funcţii dintr-o dată; adesea este mai bine să începeţi cu ceva de genul „Hello World” şi să îmbunătăţiţi funcţia pas cu pas. Aceasta garantează, într-un fel, că programatorul poate localiza rândurile în care este posibil să fi apărut o eroare de sintaxă. Read the rest of this entry »

Tags: , , , , , , , ,

Related posts