Documente Academic
Documente Profesional
Documente Cultură
58
Exemplu:
begin dbms_output.put_line('Hello World'); end; /
n fereastra SQL*Plus secvena de cod scris va fi precedat de comanda set serveroutput on Aceasta trebuie dat la nceputul sesiunii de lucru i realizeaz activarea afirii la consol a rezultatului operaiilor de ieire.
Dac se folosete interfaa grafic nu mai este necesar comanda set serveroutput on.
59
Exemplul urmtor conine declaraia unei variabile, nr. Pentru a afia valoarea acesteia se realizeaz conversia ei n ir de caractere folosind funcia to_char():
Codul PL/SQL poate fi coninut n blocuri anonime sau n blocuri care conin subprograme memorate n baza de date (proceduri sau funcii). Un bloc anonim se introduce n fereastra n care se introduc comenzi SQL. El nu este memorat n mod normal n baza de date n vederea reutilizrii ulterioare. Interfaa serverului Oracle XE permite totui memorarea unui bloc, ntocmai ca i memorarea unei comenzi SQL orecare. Cele dou exemple anterioare sunt blocuri anonime. Un subprogram memorat (denumit uneori stocat) este un subprogram PL/SQL pe care serverul Oracle l compileaz i l memoreaz n baza de date. Subprogramul memorat poate fi ulterior apelat dintr-o aplicaie sau dintr-un alt bloc PL/SQL. Subprogramele pot fi proceduri sau funcii. Diferena dintre cele dou este faptul c o funcie returneaz o valoare. Un pachet (engl. package) este format dintr-un un grup de subprograme i de declaraii de variabile. Serverul Oracle memoreaz elementele coninute ntr-un pachet, acestea putnd fi apelate din alte pachete sau subprograme.
60
Bloc anonim DECLARE declaratii de variabile BEGIN cod program EXCEPTION cod tratare exceptii END;
Dac blocul conine o procedur memorat n baza de date, sintaxa sa este urmtoarea:
Subprogram memorat de tip procedur CREATE OR REPLACE PROCEDURE "nume" (lista_parametri) IS declaratii variabile BEGIN cod program EXCEPTION cod tratare exceptii END;
Seciunea de declaraii (DECLARE n cazul blocului anonim) cuprinde declaraii de variabile simple, variabile structurate, variabile tip cursor, funcii sau proceduri ajuttoare. Zona de declaraii este opional. Pentru funcii, proceduri i triggere cuvntul DECLARE lipsete, blocul de declaraii fiind implicit cuprins ntre linia de declarare a funciei sau a procedurii i BEGIN. Blocul introdus prin EXCEPTION este opional i realizeaz tratarea erorilor aprute n timpul execuiei codului programului. Caracterul ';' se folosete pentru a marca sfritul unei instruciuni sau a unui bloc, dac apare dup END. Codul poate cuprinde blocuri interioare. Exemplu:
DECLARE declaraii variable BEGIN -- cod program BEGIN codul blocului inclus EXCEPTION tratare exceptii END; -- cod program (continuare) END;
61
Pentru transformarea exemplelor din urmtoarele subcapitole n exemple executabile, naintea declaraiilor de variabile va fi introdus fie numele seciunii de date, DECLARE fie secvena de declarare a unei proceduri stocate (CREATE OR REPLACE PROCEDURE "nume" IS).
Comentarii
n PL/SQL comentariile n linie se introduc prin dou caractere '-' iar comentariile pe mai multe linii sunt cuprinse ntre /* respectiv */, ca n limbajul C. Exemplu:
62
3. tipuri specifice structurate: TABLE, VARRAY i RECORD. Exemplu:
-- Declaratii de variabile nume VARCHAR2(30); prenume VARCHAR2(25); marca NUMBER(6); activ BOOLEAN; salar_lunar NUMBER(6); nb_zile_lucrate NUMBER(2); salar_zilnic NUMBER(6,2); medie_zile_lucr CONSTANT NUMBER(2) := 21; -- o constanta BEGIN NULL; END; / -- NULL indica lipsa corpului. Este permisa pt. testare.
Obs. Pentru a defini constanta medie_zile_lucr s-a folosit cuvntul rezervat CONSTANT i imediat s-a atribuit valoarea corespunztoare. Variabilele declarate servesc de multe ori la memorarea unor valori din tabelele bazei de date, obinute folosind comenzi SELECT. n astfel de cazuri este esenial ca tipul declarat pentru o astfel de variabil s coincid cu tipul coloanei tabelului din care va primi valori. Pentru a evita erorile greu de depistat cauzate de declararea eronat a acestor variabile, PL/SQL ofer soluia simpl a prelurii tipului cmpului care va furniza valori folosind %TYPE, astfel:
coded edituri.cod_edit%TYPE;
Variabila coded va fi NUMBER(5), de acelai tip cu cmpul cod_edit din tabelul edituri. O situae asemntoare apare n cazul variabilelor structurate (de tipul RECORD). O astfel de variabil va avea mai multe cmpuri. Dac variabila trebuie s preia valorile coninute ntr-o linie a unui tabel, la declararea ei se va folosi %ROWTYPE, astfel: editura edituri%ROWTYPE; Variabila editura va fi de tip RECORD i va avea aceleai cmpuri cu tabelul edituri. Accesul la cmpuri se realizeaz folosind operatorul '.' (punct). Exemplu: editura.cod_edit, editura.nume etc.
63
Cursoare
Cursoarele permit programatorului s preia date dintr-o mulime de selecie, linie cu linie, n vederea prelucrrii lor. n PL/SQL un cursor poate fi implicit sau explicit. Cursorul implicit presupune utilizarea unei mulimi de selecie avnd o singur linie i este folosit pentru a atribui valori unui set de variabile. Exemplu:
SELECT cont, data, valoare into cnt, dt, val from operatii where cod_op = 3;
n vederea selectrii unei singure linii se impune valoarea cheii primare. Cursorul explicit are nume i este declarat n seciunea de declaraii a blocului (procedurii, funciei), astfel: CURSOR c1 IS SELECT ... ; Exemplu:
Identificatori
Numele unei variabile const dintr-un ir avnd maximum 30 caractere i format dintr-o liter urmat opional de alte litere, cifre, $, _. Caracterele '&', '-', '/' i ' ' (spaiu) nu sunt permise. PL/SQL nu este sensibil la tipul literelor majuscule sau litere mici. Exemple:
-- Declaratii de variabile numeprenume VARCHAR2(30); -- identificator acceptat
64
nume_prenume VARCHAR2(30); -- identificator acceptat, _ permis nume$prenume VARCHAR2(30); -- identificator acceptat, $ permis nume#prenume VARCHAR2(30); -- identificator acceptat, # permis -- nume-prenume identificator neacceptat, minus nepermis -- nume/prenume identificator neacceptat, / nepermis -- nume prenume identificator neacceptat, spatiu nepermis -- NUMEPRENUME NumePrenume -- NumePrenume NUMEPRENUME BEGIN NULL; END; / identif. identif. neacceptat, neacceptat, acelasi acelasi cu cu numeprenume numeprenume si si
Operatori
La scrierea codului n PL/SQL se folosesc urmtoarele tipuri de operatori: a. aritmetici: + - * / b. logici : '=' '>' '<' '>=' '<=', '!=' (sau '<>') c. de concatenare a irurilor '||' d. de atribuire: ':=' Exemple:
-- Declaratii de variabile salar NUMBER(6,2); ore_lucrate NUMBER := 40; salar_orar NUMBER := 22.50; bonus NUMBER := 150; tara VARCHAR2(128); numarator NUMBER := 0; gata BOOLEAN := FALSE; id_valid BOOLEAN; BEGIN salar := (ore_lucrate * salar_orar) + bonus; -- calcul salar tara := 'Suedia'; -- atrib. un literal de tip string tara := UPPER('Canada'); -- idem, caracterele transf in majuscule gata := (contor > 100); -- atrib. BOOLEAN, literalul FALSE id_valid := TRUE; -- atrib. BOOLEAN
65
END; /
Literali
Exemple:
-- Declaratii de variabile number1 PLS_INTEGER := 32000; -- literal numeric, val ntreag number2 NUMBER(8,3); BEGIN number2 := 3.125346e3; -- literal numeric number2 := -8300.00; -- literal numeric number2 := -14; -- literal numeric END;
char1 VARCHAR2(1) := 'x'; -- literal caracter char2 VARCHAR2(1); BEGIN char2 := '5'; -- literal caracter END; /
-- Declaratii de variabile string1 VARCHAR2(1000); string2 VARCHAR2(32767); BEGIN string1 := '555-111-2323'; -- daca un sir contine apostrof, acesta se dubleaza string2 := 'Here''s an example of two single quotation marks.'; END; /
-- Declaratii de variabile gata BOOLEAN := TRUE; -- BOOLEAN literal complet BOOLEAN; true_or_false BOOLEAN; BEGIN gata := FALSE; -- literal BOOLEAN
66
complet := NULL; -- literal BOOLEAN (valoare nedefinita) true_or_false := (3 = 4); true_or_false := (3 < 4); END; /
-- Declaratii de variabile date1 DATE := '11-AUG-2005'; -- literal DATE time1 TIMESTAMP; BEGIN time1 := '11-AUG-2005 11:01:01 PM'; -- literal TIMESTAMP END; /
folosi variabile,
literali i valori
din
linia
-- Declaratii de variabile procent_bonus CONSTANT NUMBER(2,3) := 0.05; bonus NUMBER(8,2); ang_id NUMBER(6) := 120; -- atribuie o val. pt testare BEGIN -- preia salar din tabelul angajati, calculeaza bonusul i atribuie -rezultatul -> variabila bonus SELECT salar * procent_bonus INTO bonus FROM angajati WHERE angajat_id = ang_id; -- listeaza codul angajat_id, bonusul si procent_bonus DBMS_OUTPUT.PUT_LINE ( 'Angajat: ' || TO_CHAR(ang_id) || ' Bonus: ' || TO_CHAR(bonus) || ' Procent bonus: ' || TO_CHAR(procent_bonus*100));
67
END; /
n aceeai fraz SELECT pot fi atribuite valori mai multor variabile. Exemplu: SELECT Nume, Prenume, salar*procent_bonus INTO m_nume, m_prenume, m_salar FROM angajati WHERE angajat_id = ang_id;
Funcii uzuale
PL/SQL cuprinde un numr mare de funcii. n tabelul de mai jos sunt incluse cele mai des folosite. Funcia Funcii pentru prelucrarea irurilor upper(s), lower(s) ltrim(s), rtrim(s) substr(s, start, lungime) length(s) convertete s n majuscule/minuscule nltura spaiile de la stnga / dreapta returneaz un subir definit prin poz. start i lungime returneaz lungimea irului de caractere s Descriere
Funcii pentru prelucrarea datei calendaristice sysdate to_date(data, format) data din sistem returneaza o dat formatat conform formatului Ex. : to_date('31-12-2007', 'dd-mm-yyyy') to_char(data, format) Convertete o dat calendaristic n ir, conform formatului format. Exemplu: to_date(d, 'dd-mm-yyyy') Funcii pentru date numerice round(x) mod(n, p) abs(x) power(x,n) dbms_random.random() Conversii de tip to_char(n) to_number(s) Alte funcii user returneaz numele utilizatorului serverului Oracle convertete n n ir de caractere convertete irul s n numr rotunjete x returneaz restul mpririi ntregi n/p returneaz val. absolut returneaz xn genereaz un numr aleator ntreg
68
Instruciuni
Secvenele de cod scrise n PL/SQL pot conine comenzi SQL (CREATE, INSERT, DELETE, DROP sau ALTER). Exemplu:
Insert into deponent values (124, 'Ionescu Valer', 'Str. Crinilor Nr. 7, Craiova', '0743123989');
Pe lng comenzile SQL sau atribuirile de valori limbajul PL/SQL dispune de un set complet de instruciuni necesare controlului execuiei programului, ca oricare limbaj procedural.
Instruciunea de decidere - IF
n limbajul PL/SQL instruciunea IF poate prezenta trei forme.
a. IF-THEN
Exemplu:
-- Declaratii de variabile vanzari NUMBER(8,2) := 10100; cota NUMBER(8,2) := 10000; bonus NUMBER(6,2); ang_id NUMBER(6) := 120; BEGIN IF vanzari > (cota + 200) THEN bonus := (vanzari - cota)/4; UPDATE angajati SET salar = salar + bonus WHERE angajat_id = ang_id; END IF; END; /
Astfel scris IF servete la condiionarea unei aciuni. Aciunea este declanat dac expresia logic are valoarea adevrat. Secvena de cod care descrie aciunea este plasat ntre THEN i END IF.
69
b. IF-THEN-ELSE
Exemplu:
-- Declaratii de variabile vanzari NUMBER(8,2) := 12100; cota NUMBER(8,2) := 10000; bonus NUMBER(6,2); ang_id NUMBER(6) := 120; BEGIN IF vanzari > (cota + 200) THEN bonus := (vanzari - cota)/4; ELSE bonus := 50; END IF; UPDATE angajati SET salar = salar + bonus WHERE angajat_id = ang_id; END; /
n secvena anterioar prezena clauzei ELSE permite definirea a dou blocuri de instruciuni, unul cuprins ntre THEN i ELSE i al doilea cuprins ntre ELSE i END IF. n funcie de valoarea de adevr a expresiei logice va fi executat primul bloc sau al doilea.
c. IF-THEN-ELSIF
Uneori este necesar alegerea unei secvene de cod din mai multe, fiecare fiind condiionat de cte o expresie logic. n acest caz se recomand folosirea structurii IF-THEN-ELSIF. Exemplu:
-- Declaratii de variabile vanzari NUMBER(8,2) := 20000; bonus NUMBER(6,2); ang_id NUMBER(6) := 120; BEGIN IF vanzari > 50000 THEN bonus := 1500; ELSIF vanzari > 35000 THEN bonus := 500; ELSE
70
bonus := 100; END IF; UPDATE angajati SET salar = salar + bonus WHERE angajat_id = ang_id; END; /
Instruciunea CASE
Instruciunea CASE permite impunerea blocului care va fi executat n funcie de valoarea unei expresii. De cele mai multe ori expresia se reduce la o variabil. Exemplu:
-- Declaratii de variabile grade CHAR(1); BEGIN nivel := 'B'; CASE nivel WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excelent'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Foarte bun'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Bun'); WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Corect'); WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Slab'); ELSE DBMS_OUTPUT.PUT_LINE('Nu ma pot pronunta'); END CASE; END; /
n exemplul prezentat valoarea variabilei nivel condiioneaz blocul care va fi executat. Valorile posibile sunt introduse prin clauze WHEN iar blocul de instruciuni care trebuie executat se scrie dup THEN. Dac valoarea variabilei nivel nu se regsete printre valorile introduse prin WHEN, se va executa blocul introdus prin clauza ELSE, plasat ultima. Instruciunea se ncheie cu END CASE.
Instruciuni de ciclare
n limbajul PL/SQL exist trei instruciuni de coclare: LOOP, WHILE-LOOP i FOR-LOOP.
71
a. LOOP
Un bloc LOOP - END LOOP permite definirea unui ciclu din care se iese prin executarea unei instruciuni EXIT. Instruciunea EXIT este de regul plasat ntr-un IF a crui condiie trebuie s ajung s fie satisfcut pentru a se evita rularea blocului LOOP n ciclu infinit. Exemplu:
credit_rating NUMBER := 0; BEGIN LOOP credit_rating := credit_rating + 1; IF credit_rating > 3 THEN EXIT; -- iesire imediata din loop END IF; END LOOP; -- dupa EXIT, executia se continu de aici DBMS_OUTPUT.PUT_LINE ('Credit rating: ' || TO_CHAR(credit_rating)); IF credit_rating > 3 THEN RETURN; -- n afara blocului LOOP se folosete RETURN, nu EXIT END IF; DBMS_OUTPUT.PUT_LINE ('Credit rating: ' || TO_CHAR(credit_rating)); END; /
Dac ieirea din ciclu se poate realiza printr-un simplu IF, se poate nlocui IF prin instruciunea EXIT WHEN conditie_iesire. Exemplu: IF count > 100 THEN EXIT; ENDIF; EXIT WHEN count > 100; Exemplu:
LOOP credit_rating := credit_rating + 1; EXIT WHEN credit_rating > 3 END LOOP;
72
b. WHILE - LOOP
n PL/SQL pentru realizarea unei structuri repetitive condiionate anterior se utilizeaz instruciunea WHILE - LOOP. Sintaxa unei astfel de structuri repetitive este urmtoarea: WHILE condiie LOOP bloc de instruciuni END LOOP
c. FOR - LOOP
Ca i n alte limbaje, parcurgerea unui ir de valori se realizeaz folosind o instruciune FOR - LOOP. Exemplu de utilizare:
-- Declaratii de variabile p NUMBER := 0; BEGIN FOR k IN 1..500 LOOP -- calcul pi ca suma a 500 termeni p := p + ( ( (-1) ** (k + 1) ) / ((2 * k) - 1) ); END LOOP; p := 4 * p; DBMS_OUTPUT.PUT_LINE( 'pi este aproximativ : ' || p ); END; /
n exemplul dat variabila i va lua valori n intervalul de valori ntregi introdus prin IN. Valorile sunt de regul consecutive i cresctoare. Dac irul valorilor introduse prin IN trebuie parcurs n ordine invers se va folosi clauza REVERSE, ca n exemplul urmtor:
BEGIN FOR i IN REVERSE 1..5 LOOP DBMS_OUTPUT.PUT_LINE (TO_CHAR(i)); END LOOP; END;
/ Se interzice modificarea variabilei folosite la controlul ciclului n interiorul acestuia. Un exemplu tipic de utilizare a ciclului FOR n domeniul bazelor de date este cel n care se actualizeaz ntr-un ciclu nregistrrile dintr-un tabel. Exemple:
73
-- Declaratii de variabile CURSOR ang_cursor IS SELECT * FROM angajati; REC angajati%ROWTYPE; -- var. structurata de tip record BEGIN FOR REC IN ang_cursor LOOP UPDATE angajati SET salar = ... WHERE ang_id = REC.ang_id; END LOOP; END;
/
CREATE OR REPLACE PROCEDURE Afisez AS CURSOR c1 IS SELECT * FROM edituri order by nume; REC edituri%ROWTYPE; -- var. structurata de tip record BEGIN FOR REC IN c1 LOOP DBMS_OUTPUT.PUT_LINE (rec.nume); END LOOP; END; /
BEGIN OPEN c2; LOOP FETCH c2 INTO REC; EXIT WHEN c2%NOTFOUND; DBMS_OUTPUT.PUT_LINE( RPAD(REC.prenume, 25, ' ') || REC.id_meserie ); END LOOP; CLOSE c2; -- preia linia curenta in REC
Not Funcia RPAD() construiete un ir de caractere avnd lungimea dat de al doilea argument. irul se obine prin completarea la dreapta a irului dat ca prim argument cu irul dat ca al treilea argument. n exemplul urmtor cursorul c1 conine doar dou valori din tabelul angajai. Instruciunea FETCH va prelua cele dou valori n dou variabile locale.
74
jobid angajati.job_id%TYPE; -- variabila pentru id_functie pren angajati.prenume%TYPE; -- variabila pentru prenume CURSOR c1 IS SELECT prenume, id_functie FROM angajati WHERE id_functie LIKE '%ZIDAR'; BEGIN OPEN c1; -- deschid cursorul - execut select LOOP FETCH c1 INTO pren, jobid; -- preiau 2 coloane in variabile EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.PUT_LINE( RPAD(pren, 25, ' ') || jobid ); END LOOP; CLOSE c1;
75
Declararea unei proceduri folosind fereastra SQL Command sau SQL*Plus ncepe cu secvena : CREATE OR REPLACE PROCEDURE nume ... Pentru verificarea crerii procedurii se selecteaz Object Browser / Browse / Procedures i n fereastra care se afieaz se selecteaz procedura (SALUT).
Exemplu:
76
n pasul urmtor se definesc parametrii de intrare i de ieire ai procedurii, dac este cazul.
Rezultat:
77
Astfel generat, procedurii i lipsete seciunea destinat declarrii variabilelor locale. Pentru adugarea acestora se selecteaz Edit i se insereaz declaraiile necesare. Apelul procedurii se poate realiza din fereastra destinat introducerii de comenzi SQL (SQL / SQL Commands) :
Dac un parametru este declarat de intrare (IN) modificarea sa n subprogram nu afecteaz valoarea eventualei variabile folosite ca parametru efectiv la apelarea funciei.
78
La apelul unei proceduri avnd parametri de tip OUT sau IN OUT, pe poziiile corespunztoare acestora din lista de parametri efectivi trebuie utilizate variabile de acelai tip cu cel al parametrilor procedurii. Un bloc anonim sau o procedur poate avea n zona de declaraii o declaraie de procedur. Exemplu :
DECLARE -- declaratii de variabile si subprograme nume VARCHAR2(20) := 'ionescu'; prenume VARCHAR2(25) := 'marin'; PROCEDURE nume_maj ( v1 IN OUT VARCHAR2, v2 IN OUT VARCHAR2) AS BEGIN v1 := UPPER(v1); -- trec sirurile in majuscule v2 := UPPER(v2); END; BEGIN DBMS_OUTPUT.PUT_LINE(nume || ' ' || prenume ); -- afisez val. initiale nume_maj (nume, prenume); -- apelez procedura cu parameteri DBMS_OUTPUT.PUT_LINE(nume || ' ' || prenume ); -- afisez noile valori END; /
Deoarece procedura nume_maj este cuprins ntr-un bloc anonim, executarea blocului nu va determina memorarea acesteia n baza de date.
79
Funcia salar poate fi apelat n mai multe moduri, cel mai simplu fiind n fraze select:
a.
Lista
nup := nup || ' ' || casatorit; END IF; RETURN nup; -- returneaza valoarea lui nup END; /
Laborator nr. 5
80
Laborator nr. 4 Relaii ntre tabele. Comenzi SQL care selecteaz date din mai multe tabele
1. Pornii aplicaia Start -> Programs -> Oracle Database 10g Express Edition -> Go To Database Home Page sau scriei adresa http://127.0.0.1:8080/apex/ n browser-ul dv. 2. Creai un utilizator nou, caine, cu parola caine 3. Creai o baz de date pentru evidena cinilor de ras din diferite ri. Pentru aceasta creai urmtoarele tabele TARI cod_tara - cheie primar (numr) tara tara de origine (caracter) TALIE cod_talie - cheie primar (numr) talie marimea cainelui (caracter) SCOP cods - cheie primar (numr) scop - caracter CAINE cod_caine - cheie primar (numr) cod_tara tara de origine (numar) cod_talie talia cainelui (numr) rasa rasa cainelui (caracter) cods scopul folosirii cainelui (numr) 4. Se cere: S se adauge 10 ri, 5 talii, 6 scopuri i 14 cini
de diferite talii;
TARI
81
TALIE
SCOP
CAINE Folosind editorul de interogri (Query Builder) i salvnd interogrile sub forma lab04_interogare1: S se afieze toi cinii din toate rile: Fraza SQL corespunztoare: select "CAINE"."RASA" as "RASA", "TARI"."TARA" as "TARA" from "TARI" "TARI", "CAINE" "CAINE" where "CAINE"."COD_TARA" =tari.cod_tara order by CAINE.RASA ASC
82
S se afieze toi cinii dintr-o ar (de ex. Germania), indiferent de ras. select "CAINE"."RASA" as "RASA", "TARI"."TARA" as "TARA" from "TARI" "TARI", "CAINE" "CAINE" where "TARI"."TARA" ='Germania' and "CAINE"."COD_TARA" =tari.cod_tara
rezultatul:
S se afieze toi cinii de talie medie dintr-o ar. select "CAINE"."RASA" as "RASA", "TARI"."TARA" as "TARA", "TALIE"."TALIE" as "TALIE" from "CAINE" "CAINE", "TALIE" "TALIE", "TARI" "TARI" where "TARI"."TARA" ='Germania' and "TALIE"."TALIE" ='medie' and "CAINE"."COD_TALIE" =talie.cod_talie and "CAINE"."COD_TARA" =TARI.COD_TARA order by CAINE.RASA ASC
rezultatul:
S se afieze toi cinii utilitari, indiferent de ar sau talie. select "CAINE"."RASA" as "RASA", "SCOP"."SCOP" as "SCOP", "TALIE"."TALIE" as "TALIE", "TARI"."TARA" as "TARA" "TARI" "TARI", "TALIE" "TALIE",
from
83 "SCOP" "SCOP", "CAINE" "CAINE" where "CAINE"."CODS" =scop.cods and "SCOP"."CODS" =1 and and rezultat: "CAINE"."COD_TALIE" =talie.cod_talie "CAINE"."COD_TARA" =tari.cod_tara
S se afieze cinii de companie de talie mic din Frana select "CAINE"."RASA" as "RASA", "TARI"."TARA" as "TARA", "TALIE"."TALIE" as "TALIE", "SCOP"."SCOP" as "SCOP" from "SCOP" "SCOP", "TALIE" "TALIE", "TARI" "TARI", "CAINE" "CAINE" where "TARI"."TARA" ='Franta' and "CAINE"."COD_TARA" =tari.cod_tara and "CAINE"."COD_TALIE" =1 and "TALIE"."COD_TALIE" =caine.cod_talie and "SCOP"."SCOP" ='de companie' and "CAINE"."CODS" =scop.cods
rezultat :
5. Creai cteva vederi (View): afiai cinii de talie mic, indiferent de scop i ar
84
select
"CAINE"."RASA" as "RASA", "TALIE"."TALIE" as "TALIE" from "TALIE" "TALIE", "CAINE" "CAINE" where "CAINE"."COD_TALIE" =1 and "TALIE"."COD_TALIE" =caine.cod_talie
rezultat :
85
6. Scriei o comand SQL care s selecteze toi cnii dintr-o ar, indiferent de talie (numerotarea nregistrrilor se poate face apelnd funcia rownum: select rownum, rasa, tara, talie from CAINe, tari, talie where caine.cod_tara = tari.cod_tara and caine.cod_talie = talie.cod_talie and tari.tara='Germania' rezultat :
86
87
DEPONENT
CONTURI
OPERATII
rezultatul este
89
90
S se afieze toate conturile unui deponent precum i suma total pe care acesta o are n fiecare dintre conturi;
91