Professional Documents
Culture Documents
DB 2 - Leksion 5
DB 2 - Leksion 5
SQL e Avancuar
Zbritja e nje date/ore/timestamp nga nje tjeter jep nje interval kohor
Objekte me medha (foto, video, etj) ruhen si objekte te medha (large objects):
blob: binary large object objekti eshte nje koleksion I madh I te dhenash
binare jo te interpretuara( interpretimi behet nga aplikime jashte sistemit
database)
clob: character large object objekti eshte nje koleksion I madh I te
dhenave te tipit karakter
Kur si rezultat i query-t eshte nje objekt I madh, ne fakt nuk kthehet vete
objekti por nje shenjues (pointer).
Kushtet e Integritetit
se $10,000.00
Rroga e nje punonjesi banke nuk mund te jete me e vogel
se $4.00/ora
Nje klient duhet te kete nje nr. telefoni not-null.
Kushtet mbi nje Relacion te vetem
not null
primary key
unique
check (P ), ku P eshte nje predikat
Kushti Not Null
Ben te mundur qe nje vlere qe shfaqet ne nje relacion per nje bashkesi
atributesh te shfaqet edhe ne nje relacion tjeter.
Shembull: Nqs Perryridge eshte emri I bankes qe shfaqet ne nje nga
tuplat ne relacionin account,atehere ekziston nje tupel ne relacionin
branch per degen Perryridge.
Celesat Primare, Kandidate dhe ato te Jashtem mund te specifikohen si
pjese e statement create table:
Klauzola primary key liston atributet qe perbejne celesin primar.
Nje assertion eshte nje predikat qe shpreh nje kusht i cili duhet te
permbushet gjithmone nga nje database.
Kur behet nje assertion, sistemi teston per validitetin e tij, dhe e teston
ate per cdo update qe mund te shkele assertion-in.
Ky testim mund te coje ne ngarkim te sistemit; prandaj duhet te
perdoren me kujdes.
Shembull
Cdo kredi ka te pakten nje huamarres I cili mban nje llogari me nje minimum
balance ose $1000.00
create assertion balance_constraint check
(not exists (
select *
from loan
where not exists (
select *
from borrower, depositor, account
where loan.loan_number = borrower.loan_number
and borrower.customer_name = depositor.customer_name
and depositor.account_number = account.account_number
and account.balance >= 1000)))
Shembull i nje Assertion
Nje rol
branch:
grant select on branch to U1, U2, U3
insert: aftesia per te shtuar tupla
update: aftesia per te updatuar
delete: aftesia per te fshire tupla
all privileges: perdoret si nje forme e shkurtuar per te lejuar te
gjithe llojet e privilegjeve.
Nderprerja (Revoke) e Autorizimit ne SQL
ODBC (Open Database Connectivity) punon me C, C++, C#, dhe Visual Basic
JDBC (Java Database Connectivity) punon me Java
ODBC
Open DataBase Connectivity(ODBC) standard
Standarte per aplikimet qe duan te komunikojne me nje database.
application program interface (API) per te
int ODBCexample()
{
RETCODE error;
HENV env; /* ambienti */
HDBC conn; /* lidhja me databazen*/
SQLAllocEnv(&env);
SQLAllocConnect(env, &conn);
SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi",
SQL_NTS, "avipasswd", SQL_NTS);
{ . Kryen veprimet qe i nevojiten }
SQLDisconnect(conn);
SQLFreeConnect(conn);
SQLFreeEnv(env);
}
Kodi ODBC (Vazhd.)
Programi dergon komanda drejt databazes permes SQLExecDirect
Tuplat e rezulti merren permes SQLFetch()
SQLBindCol() lidh variablat e gjuhes C me atributetet e rezultatit te query
Kur kthehet nje tuple, atributet e saj automatikisht ruhen ne variablat
korrespondues ne C.
Argumentet e SQLBindCol()
Variabla ODBC stmt, atribute pozicioni ne rezultatin e queryt
Tipi I konvertimit nga SQL ne C.
Adresen e variablit.
Per tipet e variablave te gjata, si psh array karakteresh:
Gjatesia Maksimale e variablit
Shenim: Nje vlere negative e kthyer per fushen e gjatesise tregon nje vlere
null
Kodi ODBC (Vazhd.)
Trupi i nje programi
char branchname[80];
float balance;
int lenOut1, lenOut2;
HSTMT stmt;
SQLAllocStmt(conn, &stmt);
char * sqlquery = "select branch_name, sum (balance)
from account
group by branch_name";
error = SQLExecDirect(stmt, sqlquery, SQL_NTS);
if (error == SQL_SUCCESS) {
SQLBindCol(stmt, 1, SQL_C_CHAR, branchname , 80,
&lenOut1);
SQLBindCol(stmt, 2, SQL_C_FLOAT, &balance, 0,
&lenOut2);
while (SQLFetch(stmt) >= SQL_SUCCESS) {
printf (" %s %g\n", branchname, balance);
}
}
SQLFreeStmt(stmt, SQL_DROP);
Karakteristika te tjera te ODBC
Statement e Parapregatitura
Statement SQL I parapregatitur: kompiluar ne database
Mund te kete ruajtes-vendi: psh. insert into account values(?,?,?)
Karakteristikat e Metadatave
Mbajne te gjitha lidhjet ne database
Mbajne emrat dhe tipet e kolonave e nje rezultati te nje query ose nje
relacion ne db.
Per default, cdo statement SQL trajtohet si nje transaksion I vecuar qe
ekzekutohet automatikisht.
Nuk mund te nderpritet ekzekutimi automatik ne nje lidhje
Update databazen
try {
stmt.executeUpdate( "insert into account values
('A-9732', 'Perryridge', 1200)");
} catch (SQLException sqle) {
System.out.println("Could not insert tuple. " + sqle);
}
Execute query and fetch and print results
ResultSet rset = stmt.executeQuery( "select branch_name,
avg(balance)
from account
group by branch_name");
while (rset.next()) {
System.out.println(
rset.getString("branch_name") + " " +
rset.getFloat(2));
}
Detajet e kodit JDBC
Percaktoni nje funksion qe, dhene emri I nje klienti, kthen numrin
llogarive qe ka nje klient.
create function account_count (customer_name varchar(20))
returns integer
begin
declare a_count integer;
select count (* ) into a_count
from depositor
where depositor.customer_name = customer_name
return a_count;
end
Gjeni emrin dhe adresen e cdo klienti qe ka me shume se nje llogari.
select customer_name, customer_street, customer_city
from customer
where account_count (customer_name ) > 1
Funksionet Tabela
Perdorimi
select *
from table (accounts_of (Smith))
Procedurat SQL
perbere
While dhe repeat statements:
declare n integer default 0;
while n < 10 do
set n = n + 1
end while
repeat
set n = n 1
until n = 0
end repeat
Konstruktet procedurale(Vazhd.)
Cikli loop: