Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Baze de date Client-Server - Proiect SQL server

FACULTATEA DE MATEMATICA INFORMATICA

SECTIA INFORMATICA



Baze de date Client-Server - Proiect SQL server




1.      Specificatiile bazei de date

Structura unei baze de date se stabileste in concordanta cu viitoarele obiective, pe care aceasta trebuie sa le satisfaca. Consideram in cazul de fata exemplul unei fabrici de jucarii. Obiectivul acestei BD este de a pastra cantitatile produse din fiecare obiect, de a avea o evidenta clara a componentelor fiecarui produs final, a operatiilor implicate si a timpului necesar pentru obtinerea fiecarei componente in parte, precum si a profesiilor implicate in producerea fiecarei componente in parte.





2.     Lista entitatilor

Am stabilit o lista de entitati despre care trebuie sa pastram informatiile in Baza de date. Pentru exemplul de fata, acetse entitati sunt urmatoarele: Produse, Repere, Operatii, Profesii, Relatii Repere-Operatii si Relatii Repere-Produse.


Structura fiecarei entitati este urmatoarea :


Produse(CodProdus, DenumireProdus, CantitateProdus)


RepereProduse(CodRelatie,CodReper,CodProdus,CantitateReper)


Repere(CodReper, DenumireReper)


RepereOperatii(CodRelatie,CodReper,CodOperatie,TimpOperatie)


Operatii(CodOperatie, DenumireOperatie,CodProfesie)


Profesii(CodProfesie,DenumireProfesie,TarifProfesie)


Semnificatiile sunt urmatoarele:


Un produs este identificat printr-un cod unic, si este descris in tabelul Produse prin acel cod unic, printr-o denumire, si prin cantitatea produsa (numarul de produse existente la un moment dat in magazia fabricii). De exemplu: 101 - bicicleta - 20 de bucati.

Reperele reprezinta componentele care intra in alcatuirea fiecarui produs ; ele sunt descrise in tabelul Repere doar printr-un cod unic, si denumire. De exemplu : 201 - surub de tip A.

Tabelul RepereProduse ilustreaza legaturile dintre componente si produsul final, in sensul ca un produs e alcatuit din mai multe repere, fiecare reper la randul sau putand fi regasit intr-un numar variabil de bucati in cadrul produsului. Fiecare relatie de acest gen este unica, si presupune o legatura reper-produs-cantitate( numarul de repere cu codul CodReper care se gasec in componenta Produsul cu codul CodProdus).

De exemplu: surubul de tip A sa gaseste in produsul bicicleta in numar de 7 bucati, si in produsul tricicleta in numar de 12 bucati, samd.

Operatiile sunt identificate printr-o cheie unica, si sunt descrise printr-o denumire si codul unei profesii asociate. Pornim de la premiza ca o operatie poate fi executata doar de muncitori cu calificarea corespunzatoare, neexistand mai multe profesii care sa permita executarea aceleasi operatiuni. De exemplu : 501 - strunjire surub - 601, unde 501 reprezinta codul reperului, iar 601 codul profesiei care califica muncitorul sa execute acea operatie.

Tabelul ReperOperatii descrie relatiile dintre un anumit reper si operatiile care contribuie la realizarea acestuia, in sensul ca finalizarea unui reper presupune cumularea mai multor operatii. Tabelul are de asemenea o cheie primara, si fiecare inregistrare e descrisa de codul reperului implicat, una din operatiile necesare, precum si timpul necesar desfasurarii acelei operatii.

De exemplu, o inregistare ca :

301 - 201 - 501 - 10 se interpreteaza in felul urmator : in cadrul relatiei 301, pentru reperul cu codul 201 este necesara inclusiv operatia cu codul 501, a carei executie in acest caz dureaza 10 minute.

Profesiile sunt descrise printr-un cod unic, prin denumire si tarif pe ora. De retinut ca un muncitor cu o profesie poate executa mai multe operatii, iar reciproca nu este valabila.

3. Structura bazei de date si relatiile intre tabele

Pentru a ilusta precizarile de mai sus, urmeaza schema bazei de data, incluzand structura tabelelor precum si relatiile dintre ele :


4.      Prezentarea tabelelor

Tabelul Produse

Cod Produs : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999], cu alte cuvinte sa fie de 3 cifre ; cheie externa pentru RepereProduse

DenumireProdus : de tip sir de caractere, de lungime maxim 15, nenul

CantProdus : de tip intreg, nenul

Tabelul Repere 

CodReper : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt RepereProduse, RepereOperatii

DenumireReper : de tip sir de caractere, de lungime maxim 15, nenul

Tabelul Operatii :

CodOperatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt RepereOperatii

DenumireOperatie : de tip sir de caractere, de lungime maxim 15, nenul

CodProfesie : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;

Tabelul Profesii :

CodProfesie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt Operatii

DenumireProfesie : de tip sir de caractere, de lungime maxim 15, nenul

TarifProfesie : de tip intreg, nenul, constrangere : sa fie in intervalul [10-80] .

Tabelul RepereOperatii :

CodRelatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ;

CodReper : de tip intreg, nenula, constrangere : sa fie in intervalul [100-999] ;

CodOperatie : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;

TimpOperatie : de tip intreg, nenul, constrangere : sa fie in intervalul [20-900] .

Tabelul RepereProduse :

CodRelatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ;

CodReper : de tip intreg, nenula, constrangere : sa fie in intervalul [100-999] ;

CodProdus : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;

CantitateReper : de tip intreg, nenul, constrangere : sa fie in intervalul [1-100] ;

In continuare sunt listate statement-urile care genereaza aceaste tabele, si relatiile dintre ele . De remarcat: intai se verifica existenta deja in baza de date a unui table cu acelasi nume, in caz afirmativ el se sterge si se construieste altul ; apoi se construiesc tabelele, si in final se adauga constragerile.


if exists (select * from sysobjects where id = object_id(N'[dbo]. [Repere]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [Repere]

GO


if exists (select * from sysobjects where id = object_id(N'[dbo]. [Operatii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [Operatii]

GO


if exists (select * from sysobjects where id = object_id(N'[dbo]. [Produse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [Produse]

GO


if exists (select * from sysobjects where id = object_id(N'[dbo]. [Profesii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [Profesii]

GO


if exists (select * from sysobjects where id = object_id(N'[dbo]. [RepereOperatii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [RepereOperatii]

GO


if exists (select * from sysobjects where id = object_id(N'[dbo]. [RepereProduse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo]. [RepereProduse]

GO


CREATE TABLE [dbo]. [Repere] (

[CodReper] [int] NOT NULL ,

[DenReper] [char] (15) NOT NULL

) ON [PRIMARY]

GO


CREATE TABLE [dbo]. [Operatii] (

[CodOperatie] [int] NOT NULL ,

[DenOperatie] [char] (15) NOT NULL ,

[CodProfesie] [int] NOT NULL

) ON [PRIMARY]

GO


CREATE TABLE [dbo]. [Produse] (

[CodProdus] [int] NOT NULL ,

[DenProdus] [char] (15) NOT NULL ,

[CantProdus] [int] NOT NULL

) ON [PRIMARY]

GO


CREATE TABLE [dbo]. [Profesii] (

[CodProfesie] [int] NOT NULL ,

[DenProfesie] [char] (15) NOT NULL ,

[TarifProfesie] [int] NOT NULL

) ON [PRIMARY]

GO


CREATE TABLE [dbo]. [RepereOperatii] (



[CodRel] [int] NOT NULL ,

[CodReper] [int] NOT NULL ,

[CodOperatie] [int] NOT NULL ,

[TimpOperatie] [int] NOT NULL

) ON [PRIMARY]

GO


CREATE TABLE [dbo]. [RepereProduse] (

[CodRel] [int] NOT NULL ,

[CodReper] [int] NOT NULL ,

[CodProdus] [int] NOT NULL ,

[CantReper] [int] NOT NULL

) ON [PRIMARY]

GO


ALTER TABLE [dbo]. [Repere] WITH NOCHECK ADD

CONSTRAINT [PK_Repere] PRIMARY KEY NONCLUSTERED

(

[CodReper]

) ON [PRIMARY] ,

CONSTRAINT [CK_Repere] CHECK ([CodReper] > = 100 and [CodReper] < = 999)

GO


ALTER TABLE [dbo]. [Operatii] WITH NOCHECK ADD

CONSTRAINT [PK_Operatii] PRIMARY KEY NONCLUSTERED

(

[CodOperatie]

) ON [PRIMARY] ,

CONSTRAINT [CK_Operatii] CHECK ([CodOperatie] > = 100 and [CodOperatie] < = 999)

GO


ALTER TABLE [dbo]. [Produse] WITH NOCHECK ADD

CONSTRAINT [PK_Produse] PRIMARY KEY NONCLUSTERED

(

[CodProdus]

) ON [PRIMARY] ,

CONSTRAINT [CK_Produse] CHECK ([CodProdus] > = 100 and [CodProdus] < = 999)

GO


ALTER TABLE [dbo]. [Profesii] WITH NOCHECK ADD

CONSTRAINT [CK_Profesii] CHECK ([CodProfesie] > = 100 and [CodProfesie] < = 999),

CONSTRAINT [CK_Profesii_1] CHECK ([TarifProfesie] > = 10 and [TarifProfesie] < = 50)

GO


ALTER TABLE [dbo]. [RepereOperatii] WITH NOCHECK ADD

CONSTRAINT [PK_RepereOperatii] PRIMARY KEY NONCLUSTERED

(

[CodRel]

) ON [PRIMARY] ,

CONSTRAINT [CK_RepereOperatii] CHECK ([CodRel] > = 100 and [CodRel] < = 999),

CONSTRAINT [CK_RepereOperatii_1] CHECK ([TimpOperatie] > = 5 and [TimpOperatie] < = 900)

GO


ALTER TABLE [dbo]. [RepereProduse] WITH NOCHECK ADD

CONSTRAINT [PK_RepereProduse] PRIMARY KEY NONCLUSTERED

(

[CodRel]

) ON [PRIMARY] ,

CONSTRAINT [CK_RepereProduse] CHECK ([CodRel] > = 100 and [CodRel] < = 999),

CONSTRAINT [CK_RepereProduse_1] CHECK ([CantReper] > 0)

GO



5.      Inserarea de date in tabele

Orice baza de date, pentru a fi utilizata, trebuie populata, adica in fiecare tabel se introduc inregistari :

USE Fabrica

INSERT INTO Produse VALUES(101,'bicicleta',10)

INSERT INTO Produse VALUES(102,'trotineta',20)

INSERT INTO Produse VALUES(103,'masinuta',10)

INSERT INTO Produse VALUES(104,'tricicleta',30)

INSERT INTO Repere VALUES(201,'surub tip A')

INSERT INTO Repere VALUES(202,'surub tip B')

INSERT INTO Repere VALUES(203,'cadru')

INSERT INTO Repere VALUES(204,'cauciuc subtire')

INSERT INTO Repere VALUES(205,'cauciuc gros')

INSERT INTO RepereOperatii VALUES(301,201,501,10)

INSERT INTO RepereOperatii VALUES(302,201,502,15)

INSERT INTO RepereOperatii VALUES(303,202,502,15)

INSERT INTO RepereOperatii VALUES(304,202,502,13)

INSERT INTO RepereOperatii VALUES(305,203,502,20)

INSERT INTO RepereOperatii VALUES(306,204,503,15)

INSERT INTO RepereOperatii VALUES(307,205,503,25)

INSERT INTO Operatii VALUES(501,'strunjire surub',601)

INSERT INTO Operatii VALUES(502,'frezare',601)

INSERT INTO Operatii VALUES(503,'topire cauciuc',602)

INSERT INTO Operatii VALUES(504,'asamblare bi',603)

INSERT INTO Operatii VALUES(505,'asamblare tri',603)

INSERT INTO RepereProduse VALUES(401,201,101,10)

INSERT INTO RepereProduse VALUES(402,201,102,20)

INSERT INTO RepereProduse VALUES(403,201,103,30)

INSERT INTO RepereProduse VALUES(404,202,101,15)

INSERT INTO RepereProduse VALUES(405,202,104,30)

INSERT INTO RepereProduse VALUES(406,203,101,1)

INSERT INTO RepereProduse VALUES(407,203,102,1)

INSERT INTO Profesii VALUES(601,'strungar',35)

INSERT INTO Profesii VALUES(602,'topitor',37)

INSERT INTO Profesii VALUES(603,'asamblator',32)

6.      Interogari asupra bazei de date

Interogarile sunt destinate extragerii de informatii din baza de date, pe baza anumitor criterii.

determina cat costa in total operatiile pt fiecare reper in parte

SELECT Repere. CodReper, Repere. DenReper, Cost_Total = sum(RepereOperatii. TimpOperatie*TarifProfesie)

FROM Repere, RepereOperatii, Operatii, Profesii

WHERE Repere. CodReper = RepereOperatii. CodReper AND

RepereOperatii. CodOperatie = Operatii. CodOperatie AND

Operatii. CodProfesie = Profesii. CodProfesie

GROUP BY Repere. CodReper, Repere. DenReper

-- determina cat costa in total operatiile pt fiecare produs in parte

SELECT Produse. CodProdus, Produse. DenProdus, Cost_Total = sum(RepereProduse. CantReper * RepereOperatii. TimpOperatie * TarifProfesie)

FROM Repere, RepereOperatii, Operatii, Profesii, Produse, RepereProduse

WHERE Produse. CodProdus = RepereProduse. CodProdus AND

Repere. CodReper = RepereOperatii. CodReper AND

RepereOperatii. CodOperatie = Operatii. CodOperatie AND

Operatii. CodProfesie = Profesii. CodProfesie

GROUP BY Produse. CodProdus, Produse. DenProdus

determina cate ore din fiecare meserie sunt necesare

SELECT Profesii. CodProfesie, Profesii. DenProfesie, Numar_Ore = SUM(Produse. CantProdus * RepereProduse. CantReper * RepereOperatii. TimpOperatie)

FROM Profesii, Operatii, RepereProduse, RepereOperatii, Produse, Repere

WHERE Produse. CodProdus = RepereProduse. CodProdus AND

RepereProduse. CodReper = Repere. CodReper AND

Repere. CodReper = RepereOperatii. CodReper AND

Profesii. CodProfesie = Operatii. CodProfesie AND

RepereOperatii. CodReper = RepereProduse. CodReper AND

Operatii. CodProfesie = Profesii. CodProfesie AND

Operatii. CodOperatie = RepereOperatii. CodOperatie



GROUP BY Profesii. CodProfesie, Profesii. DenProfesie

-- determina toate reperele care au manopera mai mare decat media

SELECT Repere. CodReper, Repere. DenReper, Manopera = SUM(RepereOperatii. TimpOperatie*TarifProfesie)

FROM Repere, RepereOperatii, Operatii, Profesii

WHERE Repere. CodReper = RepereOperatii. CodReper AND

RepereOperatii. CodOperatie = Operatii. CodOperatie AND

Operatii. CodProfesie = Profesii. CodProfesie

GROUP BY Repere. CodReper, Repere. DenReper

HAVING SUM(RepereOperatii. TimpOperatie*TarifProfesie) > AVG(RepereOperatii. TimpOperatie*TarifProfesie)

-- determina cate repere de fiecare tip se folosesc in total

SELECT Repere. CodReper, Repere. DenReper, Nr_total_repere = SUM(Produse. CantProdus * RepereProduse. CantReper)

FROM Repere, RepereOperatii, RepereProduse, Produse

WHERE Repere. CodReper = RepereOperatii. CodReper AND

RepereProduse. CodReper = Repere. CodReper AND

Produse. CodProdus = RepereProduse. CodProdus

GROUP BY Repere. CodReper, Repere. DenReper

--cat timp dureaza manopera unui produs

SELECT DenProdus, Timp_total = SUM(TimpOperatie * CantReper)

FROM Produse, RepereProduse, Repere, RepereOperatii

WHERE Produse. CodProdus = RepereProduse. CodProdus AND

RepereProduse. CodReper = Repere. CodReper AND

Repere. CodReper = RepereOperatii. CodReper

GROUP BY Produse. denProdus

7.      Proceduri stocate

Procedurile stocate se salveaza in interiorul bazei de date, pot prelua sau returna parametrii utilizator, pot fi create pentru uz permanent sau temporar, in cadrul uneia sau mai multor sesiuni. De remarcat ca, in cadrul unei proceduri, initial se verifica daca ea a fost deja create; in caz afirmativ, ea se va sterge si recrea din nou, conform instructiunilor. O procedura se apeleaza prin :

EXECUTE Nume_procedura lista_parametrii_utilizator

--procedura returneaza cate repere intra in alcatuirea unui produs, si le si afiseaza

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'nr_repere' AND type = 'P')

DROP PROCEDURE nr_repere

GO

CREATE PROCEDURE nr_repere

@codP int,

@numar int OUTPUT

AS

DECLARE @denP char(15)

SELECT @numar = COUNT(*), @denP = denProdus

FROM Produse, Repere, RepereProduse

WHERE Produse. CodProdus = RepereProduse. CodProdus AND

RepereProduse. CodReper = Repere. CodReper AND

Produse. CodProdus = @codP

GROUP BY denProdus

PRINT 'Produsul ' + RTRIM(@denP) + ' are ' + CONVERT(varchar(3),@numar) + ' componente(repere)'

RETURN

GO

-- determina produsele care necesita meseria X (data ca parametru)

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'prod_meserie' AND type = 'P')

DROP PROCEDURE prod_meserie

GO

CREATE PROCEDURE prod_meserie

@codProf int

AS

SELECT DISTINCT Produse. CodProdus, Produse. DenProdus, Repere. denReper

FROM Profesii, Operatii, RepereOperatii, Repere, RepereProduse, Produse

WHERE Profesii. CodProfesie = Operatii. CodProfesie AND

Operatii. CodOperatie = RepereOperatii. CodOperatie AND

RepereOperatii. CodReper = Repere. CodReper AND

Repere. CodReper = RepereProduse. CodReper AND

RepereProduse. CodProdus = Produse. CodProdus AND

Profesii. CodProfesie = @codProf

ORDER BY Produse. codProdus

RETURN

GO

8.      Declansatori / triggeri

Un declansator sau trigger este o procedura care este executata in mod implicit, atunci cand asupra tabelului asociat este lansata o comanda de INSERT, UPDATE, DELETE. Triggerii pot contine instructiuni SQL, pot invoca alte proceduri si alti declansatori. Limbajul SQL prevede existenta a 2 tabele conceptuale: inserted si deleted, care arata identic dpdv al structurii cu tabelul in care este creat declansatorul, si care sunt folosite pentru a pastra ultimele modificari facute tabelului curent.


-- trigger pt insert


IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'tr_produse1' AND type = 'TR')

DROP TRIGGER tr_produse1

GO

CREATE TRIGGER [tr_produse1] ON [Produse]

FOR INSERT

AS

DECLARE @rows int

DECLARE @totalProd1 int

SET @rows = @@rowcount

IF (@rows = 0) RETURN

IF EXISTS (SELECT * FROM Produse, inserted

WHERE Produse. DenProdus = inserted. DenProdus

AND Produse. CodProdus <> inserted. CodProdus)

BEGIN

RAISERROR ('Ati introdus deja 1 produs cu acest nume', 16, 1)

--select CodProdus, DenProdus, CantProdus from inserted

ROLLBACK TRANSACTION

END

ELSE

BEGIN

PRINT 'Produsul a fost adaugat cu succes'

--select CodProdus, DenProdus, CantProdus from inserted

--RETURN

END

select CodProdus, DenProdus, CantProdus from inserted

GO

-- trigger pt update

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'tr_produse2' AND type = 'TR')

DROP TRIGGER tr_produse2

GO

CREATE TRIGGER [tr_produse2] ON [Produse]

FOR UPDATE

AS

DECLARE @rows int

DECLARE @totalProd1 int

SET @rows = @@rowcount

IF (@rows = 0) RETURN



IF EXISTS (SELECT * FROM Produse, inserted

WHERE Produse. DenProdus = inserted. DenProdus

AND Produse. CodProdus <> inserted. CodProdus)

BEGIN

RAISERROR ('Ati introdus deja 1 produs cu acest nume', 16, 1)

ROLLBACK TRANSACTION

END

ELSE

BEGIN

PRINT 'Produsul a fost modificat cu succes'

--SELECT CodProdus, DenProdus, CantProdus FROM inserted

--RETURN

END

SELECT CodProdus, DenProdus, CantProdus FROM inserted

GO

9.      Cursori

Un cursor este o constructie care permite utilizatorului sa creeze arii de lucru, sa le denumeasca si sa acceseze informatia din ele.


-- cursor care parcurge si listeaza inregistrarile din tabelul Produse

--IF EXISTS (SELECT name FROM sysobjects

--WHERE name = 'prod_cursor1' AND type = 'cur')

--DEALLOCATE prod_cursor1

--GO

DECLARE @nume varchar(15)

DECLARE @cant int

DECLARE prod_cursor1 SCROLL CURSOR

FOR

SELECT DenProdus, CantProdus FROM Produse

OPEN prod_cursor1

FETCH NEXT FROM prod_cursor1 INTO @nume, @cant

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT 'PRODUS: ' + @nume + ' ' + CONVERT(varchar(4),@cant)

FETCH NEXT FROM prod_cursor1 INTO @nume, @cant

END

CLOSE prod_cursor1

DEALLOCATE prod_cursor1


-- cursor care parcurge tabelul Profesii si pt fiecare profesie apeleaza procedura care determina produsele care necesita meseria X (prod_meserie)

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'prod_cursor2' AND type = 'cur')

DEALLOCATE prod_cursor2

GO

DECLARE @den varchar(15)

DECLARE @cod int

DECLARE @prof varchar(15)

DECLARE prod_cursor2 SCROLL CURSOR

FOR

SELECT DenProfesie, CodProfesie FROM Profesii

OPEN prod_cursor2

FETCH NEXT FROM prod_cursor2 INTO @den, @cod

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT 'Meseria ' + @den

EXEC prod_meserie @cod

FETCH NEXT FROM prod_cursor2 INTO @den, @cod

END

CLOSE prod_cursor2

DEALLOCATE prod_cursor2

-- cursor care parcurge si listeaza inregistrarile din tabelul Meserii

-- si permite UPDATE: incrementeaza cu 1 valorile din campul TarifMeserie

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'prod_cursor3' AND type = 'cur')

DEALLOCATE prod_cursor3

GO

DECLARE @cod int

DECLARE @den varchar(15)

DECLARE @tarif int

DECLARE prod_cursor3 CURSOR SCROLL_LOCKS

FOR

SELECT CodProfesie, DenProfesie, TarifProfesie

FROM Profesii

FOR UPDATE OF TarifProfesie

OPEN prod_cursor3

FETCH NEXT FROM prod_cursor3 INTO @Cod, @Den, @Tarif

WHILE @@FETCH_STATUS = 0

BEGIN

UPDATE Profesii

SET TarifProfesie = TarifProfesie + 1

WHERE CURRENT OF prod_cursor3

PRINT CONVERT(VARCHAR(5),@cod) + ' ' + @den + ' ' + CONVERT(VARCHAR(5),@tarif+1)

FETCH NEXT FROM prod_cursor3 INTO @Cod, @Den, @Tarif

END

CLOSE prod_cursor3

DEALLOCATE prod_cursor3

10.          View-uri

Un view tot o procedura care se salveaza in baza de date, si are rolul de a facilita accesul utilizatorului la tabele, in cazul in care acestea sunt foarte complexe, de exemplu.


-- creaza un view pt a vizualiza doar reperele necesare producerii unei biciclete / triciclete

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'bicicleta' AND type = 'v')

DROP VIEW bicicleta

GO

CREATE VIEW bicicleta

AS

SELECT Produse. DenProdus, Repere. CodReper, Repere. DenReper, RepereProduse. CantReper

FROM Produse, RepereProduse, Repere

WHERE Produse. CodProdus = RepereProduse. CodProdus AND

RepereProduse. CodReper = Repere. CodReper AND

Produse. DenProdus LIKE '%cicleta'

GO

--SELECT * FROM bicicleta

-- creaza un view pt a vizualiza produsele in care intra reperul 'surub'

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'surub' AND type = 'v')

DROP VIEW surub

GO

CREATE VIEW surub

AS

SELECT Produse. CodProdus, Produse. DenProdus, Repere. DenReper

FROM Produse, RepereProduse, Repere

WHERE Repere. DenReper LIKE '%surub%' AND

Repere. CodReper = RepereProduse. CodReper AND

RepereProduse. CodProdus = Produse. CodProdus

GO

--SELECT * FROM surub