Advertisement
Guest User

Untitled

a guest
Sep 12th, 2017
704
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 45.84 KB | None | 0 0
  1. --------------------------------------
  2. ---- KOLOKWIUM TRIGGERY I FUNKCJE ----
  3. --------------------------------------
  4.  
  5.  
  6. /********************/
  7. --- ZADANIE 1 - 8 ----
  8. ------ TRIGGERY ------
  9. ----------------------
  10. --- ZADANIE 9 - 12 ---
  11. ----- PORCEDURY ------
  12. ----------------------
  13. --- ZADANIE 13 - 18 --
  14. ------- FUNKCJE ------
  15. /********************/
  16.  
  17.  
  18. /*********************/
  19. ----------------------
  20. ------ Triggery ------
  21. ----------------------
  22. /*********************/
  23.  
  24.  
  25. /*
  26. -------------
  27. --Zadanie 1--
  28. -------------
  29. Do tabeli działy dopisz kolumnę data_przyjęcia.
  30. Przy tworzeniu nowego pracownika z ustawionym działem
  31. ustawiaj wartość kolumny data_przyjęcia dla zadanego działu
  32. wpisując w nią komunikat z obecną datą oraz imieniem i nazwiskiem pracownika.
  33. Format komunikatu:
  34. 'Ostatni zatrudniony pracownik Jan Kowalski: Dec 18 2006 9:01PM'
  35. */
  36.  
  37. select * from dzialy
  38. alter table dzialy add data_przyjecia varchar(200)
  39. alter table dzialy drop column data_przyjecia
  40.  
  41.  
  42. create trigger zadanie1 on pracownicy
  43. for insert
  44. as
  45. declare @imie varchar(30)
  46. declare @nazwisko varchar(30)
  47. declare @data datetime
  48.  
  49. set @imie = (select imie from inserted)
  50. set @nazwisko = (select nazwisko from inserted)
  51. set @data = getdate()
  52.  
  53. begin
  54. update dzialy set data_przyjecia = 'Ostatni zatrudniony pracownik '+@imie+' '+@nazwisko+': '+cast(@data as varchar(30))
  55. where dzialID = (select dzialID from inserted)
  56. end
  57.  
  58. insert into pracownicy(imie,nazwisko,dzialID) values('Jan','Kowalski',3)
  59.  
  60. delete from dzialy where dzialID > 4
  61.  
  62. drop trigger zadanie1
  63.  
  64. /*
  65. -------------
  66. --Zadanie 2--
  67. -------------
  68. Do tabeli pracownicy dodaj kolumnę tekstową last_sallary.
  69. Przy tworzeniu nowego wpisu w tabeli zarobki ustawiaj wartość nowo dodanej kolumny
  70. dla pracownika, który otrzymał wynagrodzenie wpisując w nią komunikat z obecną datą.
  71. Wymagany format komunikatu:
  72. 'Data ostatniej wypłaty: Jan 03 2006 10:11PM'
  73. */
  74. alter table pracownicy add last_sallary varchar(200)
  75. alter table pracownicy drop column last_sallary
  76.  
  77. create trigger zadanie2 on zarobki
  78. for insert
  79. as
  80. begin
  81. update pracownicy set last_sallary = 'Data ostatniej wypłaty: '+cast(getdate() as varchar(30))
  82. where pracID = (select pracID from inserted)
  83. end
  84.  
  85. select * from pracownicy
  86. select * from zarobki
  87. drop trigger zadanie2
  88. insert into zarobki(brutto,pracID) values (12345,6)
  89.  
  90.  
  91.  
  92. /*
  93. ------------- ----------------------------------------------------------------- NO IDEA, zadanko z ubiegłych lat, na jakiejś innej bazie chyba
  94. --Zadanie 3--
  95. -------------
  96. Stworzyć wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony jest po wstawieniu rekordu do tej tabeli.
  97. Wyzwalacz ma wstawić do tabeli – dane – dane klienta z tabeli – klienci – oraz zaktualizować kolumny w tabeli – zamowienia:
  98. - numer zamówienia – zwiększyć o 1 ostatnią wartość;
  99. - data realizacji zamówienia – dodać 7 dni do daty dodania zamówienia.
  100. */
  101.  
  102.  
  103. -- KOD Z ZAJĘC
  104.  
  105. CREATE TRIGGER test
  106. ON zamowienia
  107. AFTER INSERT
  108. AS
  109. DECLARE @ID BIGINT, @ID_K BIGINT;
  110. DECLARE @NR INT, @data DATETIME;
  111. SELECT @ID = [ID_zamowienia], @ID_k = [ID_klienta] FROM [inserted];
  112. SELECT @NR = MAX([numer_zamowienia]) FROM [zamowienia];
  113. SELECT @data = [data_zamowienia] FROM [zamowienia] WHERE [ID_zamowienia] = @ID;
  114. BEGIN
  115. IF(@ID IS NOT NULL) AND (@ID_k IS NOT NULL)
  116. BEGIN
  117. INSERT INTO [dane](ID_zamowienia, imie, nazwisko, adres, miasto, kod_pocztowy)
  118. (SELECT @ID, imie, nazwisko, adres, miasto, kod_pocztowy FROM klienci WHERE [ID_klienta] = @ID_k);
  119.  
  120. IF @NR IS NULL
  121. BEGIN
  122. SET @NR = 0;
  123. END
  124.  
  125. UPDATE [zamowienia] SET numer_zamowienia = (@NR + 1) , [data_realizacji] =
  126. DATEADD(DAY, 7, @data) WHERE ID_zamowienia = @ID;
  127. END
  128. END;
  129.  
  130.  
  131.  
  132. /*
  133. ------------- ----------------------------------------------------------------- NO IDEA, zadanko z ubiegłych lat, na jakiejś innej bazie chyba, ponoć nie mielismy takich zagadnień na zajęciach
  134. --zadanie 4--
  135. -------------
  136. Utwórz wyzwalacz na tabeli – zamowienia_pozycje – który uruchamiany jest zamiast INSERT INTO.
  137. Wyzwalacz ma sprawdzić różnicę ilości w magazynie oraz ilości sztuk zamawianych produktu. Ich różnica ma być większa bądź równa 0 i jest to warunek.
  138.  
  139. - Jeśli spełniony jest warunek wyzwalacz ma obliczyć wartość netto, brutto oraz VAT-u następnie wstawić rekord do tabeli – zamowienia_pozycje – uzupełniając
  140. wszystkie pola danymi z odpowiedniej tabeli oraz wynikami z wyliczeń. Zaktualizować w tabeli – produkty – ilość w magazynie o wartość z różnicy.
  141. - Jeśli nie jest spełniony warunek wyzwalacz ma przypisać 0 do wartości netto, brutto oraz VAT-u, a w uwadze dodać informację: „!!UWAGA!! Zbyt mało towaru,
  142. aby zamówić” następnie wstawić rekord do tabeli – zamowienia_pozycje – uzupełniając wszystkie pola danymi z odpowiedniej tabeli.
  143.  
  144. Obliczyć sumę wartości netto, brutto oraz VAT-u na podstawie tabeli – zamowienia_pozycje – następnie zaktualizować w tabeli – zamowienia – odpowiednie pola
  145. o wyniki z wyliczeń.
  146. */
  147.  
  148.  
  149.  
  150.  
  151. /*
  152. -------------
  153. --Zadanie 5--
  154. -------------
  155. Do tabeli pracownicy dodaj kolumne tekstowa email o dlugosci 100 znakow.
  156. Podczas tworzenia pracownika lub jego modyfikacji uzupełnij tą kolumnę
  157. emailem skladającym się z:
  158. pierwszych trzech liter imienia, kropki,
  159. pierwszych pięciu liter nazwiska oraz ciągu '@p.lodz.pl'
  160. Pamiętaj, aby usunąc ewentualne zewnętrzne białe znaki oraz
  161. aby zamienic wewnętrzne spacje na znak podkreslenia.
  162. */
  163.  
  164. select * from pracownicy
  165. alter table pracownicy add email varchar(100)
  166.  
  167. create trigger email on pracownicy
  168. for insert, update
  169. as
  170. begin
  171. declare @imie varchar(30)
  172. declare @nazwisko varchar(30)
  173. declare @email varchar(100)
  174.  
  175. set @imie = (select imie from inserted)
  176. set @nazwisko = (select nazwisko from inserted)
  177. set @email = (SUBSTRING(@imie,1,3) +'.'+ SUBSTRING(@nazwisko, 1,5) +'@p.lodz.pl')
  178.  
  179.  
  180. update pracownicy set email = SUBSTRING(@imie,1,3) +'.'+ SUBSTRING(@nazwisko, 1,5) +'@p.lodz.pl'
  181. where pracID = (select pracID from inserted)
  182. end
  183.  
  184. drop trigger email
  185.  
  186. update pracownicy set imie = 'Janusz', nazwisko = 'Moooras' where pracID = 2;
  187.  
  188. /*
  189. ------------- ----------------------------------------------------------------- NO IDEA, a chuj to wie jak to zrobic
  190. --Zadanie 6--
  191. -------------
  192. stwórz triggera który przenosi dane dotyczące zarobków
  193. do tabeli historycznej będącej dokładną kopią tabeli
  194. zarobki bez kolumny aktualny. Uwzględnij w tej tabeli datę
  195. przenosin oraz użytkownika który kasował dane
  196. */
  197. select * from zarobki
  198.  
  199.  
  200. /*
  201. -------------
  202. --Zadanie 7--
  203. -------------
  204. Dodaj kolumnę tekstową login1 do tabeli pracownicy.
  205. Przy tworzeniu nowego pracownika lub modyfikacji istniejącego
  206. w tabeli pracownicy ustawiaj wartość kolumny login1
  207. na pierwszą i ostatnią literę z imienia i pierwszą i ostatnią literą nazwiska. W tak stworzonej
  208. wartości zastosuj wielkie litery.
  209. Przykład dla osoby: Tomasz Pawlak login1 będzie skłądał się z TZPK
  210. */
  211.  
  212. alter table pracownicy add login1 varchar(200)
  213.  
  214. create trigger login1 on pracownicy
  215. for insert, update
  216. as
  217. declare @imie varchar(30)
  218. declare @nazwisko varchar(30)
  219. declare @login varchar(200)
  220.  
  221. set @imie = (select imie from inserted)
  222. set @nazwisko = (select nazwisko from inserted)
  223. set @login = upper(left(@imie,1))+upper(right(@imie,1))+upper(left(@nazwisko,1))+upper(right(@nazwisko,1))
  224. begin
  225. update pracownicy set login1 = @login
  226. where pracid = (select pracID from inserted)
  227. end
  228.  
  229. insert into pracownicy(imie, nazwisko) values('Kurdeco','Dzialaj')
  230. drop trigger login1
  231.  
  232. /*
  233. --------------
  234. --Zadanie 8--
  235. --------------
  236. Do tabeli pracownicy dodaj kolumne tekstowa poczta o dlugosci 200 znakow.
  237. Podczas dodawania i modyfikacji osoby ustaw tą kolumnę ciągiem złożonym z:
  238. pierwszych 5 liter nazwiska, myślnika,
  239. pierwszych trzech liter imienia oraz ciągu '@wp.pl'
  240. Pamiętaj, aby usunąc ewentualne zewnętrzne białe znaki oraz
  241. aby zamienic wewnętrzne spacje na znak '_'.
  242. */
  243.  
  244. select * from pracownicy
  245.  
  246. alter table pracownicy add poczta varchar(200)
  247.  
  248. create trigger email on pracownicy
  249. for insert, update
  250. as
  251. declare @imie varchar(30)
  252. declare @nazwisko varchar(30)
  253. declare @email varchar(200)
  254.  
  255. set @imie = (select imie from inserted)
  256. set @nazwisko = (select nazwisko from inserted)
  257. begin
  258. update pracownicy set poczta = SUBSTRING(@nazwisko,1,5)+ '_' +substring(@imie,1,3)+ '@wp.pl'
  259. where pracid = (select pracID from inserted)
  260. end
  261.  
  262. drop trigger email
  263. insert into pracownicy(imie, nazwisko) values('Imie', 'Nazwisko')
  264. select * from pracownicy
  265.  
  266.  
  267.  
  268.  
  269. /**********************/
  270. -----------------------
  271. ------ PROCEDURY ------
  272. -----------------------
  273. /**********************/
  274.  
  275.  
  276. /*
  277. -------------
  278. --Zadanie 9--
  279. -------------
  280. Utwórz procedurę , która wyświetli w formie tekstowej (w oknie messages) wszystkich pracowników i liczbę ich wypłat. Pod uwagę bierz tylko tych pracowników,
  281. którzy posiadają więcej niż X (gdzie X to pierwszy parametr procedury) wpisów w tabeli zarobki. Dodatkowo wybierz tylko te wpisy, które zostały stworzone po
  282. dacie podanej w drugim parametrze. W przypadku nie podania w wywołaniu procedury drugiego parametru nie uwzględniaj kryterium daty.
  283. Przykładowy wynik wywołania:
  284. 'Pracownik Jan Kowalski od dnia Jan 1 2001 12:00AM otrzymał 5 wypłat'
  285. lub
  286. 'Pracownik Jan Kowalski otrzymał 5 wypłat'
  287. */
  288.  
  289. select p.pracID, imie, nazwisko, count(zarID) as ile from pracownicy p
  290. join zarobki z on z.pracID = p.pracID
  291. where od > '01-01-2006'
  292. group by imie, nazwisko, p.pracID
  293.  
  294. select * from pracownicy
  295. select * from zarobki
  296. select * from zarobki
  297. where od > '01-01-2006'
  298.  
  299. select max(pracID) from pracownicy
  300. select pracID from zarobki
  301.  
  302.  
  303. alter procedure Zadanie9
  304. @X int,
  305. @od_kiedy datetime = ''
  306. as
  307. begin
  308. declare @imie varchar(50)
  309. declare @nazwisko varchar(50)
  310. declare @ile_wyplat int
  311. declare @od DATETIME
  312. declare @i int = 1
  313. declare @pracID int
  314. declare @y int
  315.  
  316. select @y = max(pracID) from zarobki
  317. while @i <= @y
  318. begin
  319. select @imie = imie, @nazwisko = nazwisko, @ile_wyplat = count(zarID), @pracID = z.pracID from pracownicy p
  320. join zarobki z on z.pracID = p.pracID
  321. where p.pracID = @i and od > @od_kiedy
  322. group by imie, nazwisko, z.pracID
  323.  
  324. if @i = @pracID
  325. begin
  326. if @ile_wyplat > @X
  327. begin
  328. print ' Pracownik nr.' + cast(@i as varchar) +' '+ cast(@imie as varchar) + ' ' + cast(@nazwisko as varchar) +' otrzymal '+ cast(@ile_wyplat as varchar) + ' wyplat'
  329. end
  330. end
  331. set @i = @i + 1
  332. end
  333. end
  334.  
  335. exec Zadanie9 0, '01-01-2006'
  336.  
  337.  
  338. /*
  339. --------------
  340. --Zadanie 10--
  341. --------------
  342. Napisz procedurę która zwróć adres w posatci
  343.  
  344. Piotrkowska
  345. 123/23
  346. m.30
  347. 90-123
  348. Łódź
  349. */
  350.  
  351. create PROC Zadanie10
  352. @caly_adres VARCHAR(100)
  353. AS
  354. BEGIN
  355. DECLARE @dl_ul INTEGER
  356. DECLARE @pozycja INTEGER
  357. DECLARE @reszta VARCHAR(100)
  358.  
  359. SET @reszta = @caly_adres
  360. SET @pozycja = CHARINDEX(' ', @reszta)
  361. PRINT SUBSTRING(@reszta,0,@pozycja+1)
  362.  
  363. WHILE(LEN(@reszta)>2)
  364. BEGIN
  365. SET @reszta = SUBSTRING(@reszta, @pozycja+1, LEN(@reszta))
  366. SET @pozycja = CHARINDEX(' ', @reszta)
  367. PRINT SUBSTRING(@reszta,0,@pozycja+1)
  368. END
  369. END
  370.  
  371. EXEC Zadanie10 'Piotrkowska 123/23 m.30 90-123 Łódź '
  372.  
  373.  
  374.  
  375. /*
  376. --------------
  377. --Zadanie 11--
  378. --------------
  379. Stwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  380. co trzeciego pracownika licząc od konca, którego wiek jest pomiędzy 2 parametrami zadanymi w definicji procedury.
  381. W przypadku nie podania parametru pierwszego domyślnie ustaw 18 a w przypadku nie podania drugiego
  382. ustaw 30.
  383.  
  384. Przykłąd wyniku:
  385. 'Osoba Tomasz Kozak 20 lat'
  386. 'Osoba Piotr Wozniak 19 lat'
  387. 'Osoba Anna Wozniak 36 lat'
  388. */
  389.  
  390. select * from pracownicy
  391. where wiek >= 18 and wiek <= 30
  392.  
  393. alter procedure Zadanie11
  394. @X int = 18,
  395. @Y int = 30
  396. as
  397. begin
  398. declare @imie varchar(30)
  399. declare @nazwisko varchar(30)
  400. declare @i int = 1
  401. declare @j int = 1
  402. declare @ilu int
  403. declare @pracID int
  404.  
  405.  
  406. select @ilu = max(pracID) from pracownicy
  407.  
  408. while @i <= @ilu
  409. begin
  410. select @imie = imie, @nazwisko = nazwisko, @pracID =pracID from pracownicy
  411. where wiek >= @X and wiek <= @Y
  412. and pracID = @i
  413.  
  414. if @i = @pracID
  415. begin
  416. if @j % 3 = 1
  417. begin
  418. print ' Pracownik nr. '+ cast(@i as varchar) +' '+ cast(@imie as varchar) + ' ' + cast(@nazwisko as varchar)
  419. end
  420. set @j = @j +1
  421. end
  422. set @i = @i + 1
  423.  
  424. end
  425. end
  426.  
  427. exec Zadanie11 @y = 50
  428.  
  429. /*
  430. --------------
  431. --Zadanie 12--
  432. --------------
  433. Stwórz procedurę, która wyświetli w formie tekstowej (w oknie messages) co drugiego pracownika
  434. pracownika, którego nazwisko zaczyna się na literę podaną w parametrze. W przypadku nie podania
  435. parametru uwzględniaj tylko osby o nazwisku na literę 'Z'. W przypadku podania w parametrze wartosci
  436. null nie uwzględniaj kryterium.
  437. Przykłąd wyniku:
  438. 'Pracownik nr #1 Jan Kowalski 25 lat'
  439. 'Pracownik nr #3 Tomasz Kowalski 26 lat'
  440. 'Pracownik nr #5 Piotr Kowalski 29 lat'
  441. */
  442.  
  443.  
  444. select * from pracownicy
  445. where nazwisko like 'N%'
  446.  
  447. create procedure Zadanie12
  448. @X varchar(5) = 'Z%'
  449. as
  450. begin
  451. declare @imie varchar(30)
  452. declare @nazwisko varchar(30)
  453. declare @i int = 1
  454. declare @j int = 1
  455. declare @ilu int
  456. declare @pracID int
  457.  
  458.  
  459. select @ilu = max(pracID) from pracownicy
  460.  
  461. while @i <= @ilu
  462. begin
  463. select @imie = imie, @nazwisko = nazwisko, @pracID =pracID from pracownicy
  464. where nazwisko like @X
  465. and pracID = @i
  466.  
  467. if @i = @pracID
  468. begin
  469. if @j % 2 = 1
  470. begin
  471. print ' Pracownik nr. '+ cast(@i as varchar) +' '+ cast(@imie as varchar) + ' ' + cast(@nazwisko as varchar)
  472. end
  473. set @j = @j +1
  474. end
  475. set @i = @i + 1
  476.  
  477. end
  478. end
  479.  
  480. exec Zadanie12 'N%'
  481.  
  482. drop procedure Zadanie12
  483.  
  484. /************************/
  485. -------------------------
  486. -------- FUNKCJE --------
  487. -------------------------
  488. /************************/
  489.  
  490.  
  491. /*
  492. --------------
  493. --Zadanie 13--
  494. --------------
  495. Dodaj funkcję fun_kol, która zwróci tekstową nazwę dnia tygodnia powstałą
  496. z daty powstałej z dodania X dni (gdzie X to drugi parametr) do daty podanej
  497. w pierwszym parametrze.
  498. W przypadku ustawienia null w parametrze X dodaj 10 dni. Przykładowy wynik wywołania funkcji:
  499. 'Otrzymany dzień to: Sunday'
  500. */
  501.  
  502. create function fun_kol(@data datetime, @ileDni int)
  503. returns varchar(100)
  504. as
  505. begin
  506. declare @wynik datetime
  507. if @ileDni is null
  508. begin
  509. set @wynik = dateadd(day,10,@data)
  510. return cast(datename(weekday, @wynik) as varchar(50))
  511. end
  512. set @wynik = dateadd(day,@ileDni,@data)
  513. return cast(datename(WEEKDAY,@wynik) as varchar(50))
  514. end
  515.  
  516. select dbo.fun_kol('09/09/2017',null)
  517.  
  518.  
  519.  
  520.  
  521. /*
  522. --------------
  523. --Zadanie 14--
  524. --------------
  525. Utwórz funkcje, która będzie zwracać powtórzony ciag znaków podany w parametrze tyle razy
  526. ile podane to będzie w następnym parametrze. Co drugie powielenie ciągu wejściowego ma mieć
  527. odwróconą kolejność znaków poczynając od pierwszego. Pomiedzy powieleniami dodaj podkreslnik.
  528. Przykładowe wywołanie dla ciągu 'XYZ' i powielenia 3 - 'ZYX_XYZ_ZYX'.
  529. */
  530.  
  531. create function Zadanie14(@ciag varchar(50), @ileRazy int) returns varchar(200)
  532. as
  533. begin
  534. declare @wynik varchar(200)
  535. declare @licznik int
  536. set @licznik = 0
  537. set @wynik = ''
  538.  
  539. while @licznik < @ileRazy
  540. begin
  541. if @licznik % 2 = 0
  542. begin
  543. set @wynik = @wynik+reverse(@ciag);
  544. set @licznik = @licznik + 1
  545. end
  546. else
  547. begin
  548. set @wynik = @wynik+@ciag;
  549. set @licznik = @licznik + 1
  550. end
  551. if @licznik <> @ileRazy
  552. begin
  553. set @wynik = @wynik + '_'
  554. end
  555. end
  556. return @wynik
  557. end
  558.  
  559. select dbo.Zadanie14('XYZ',3)
  560.  
  561.  
  562.  
  563. /*
  564. --------------
  565. --Zadanie 15--
  566. --------------
  567. Utwórz funkcję, która będzie zwracać komunikat o różnicy w dniach
  568. między datą bieżącą a datą podaną w parametrze.
  569. W przypadku tego samego dnia zwróć komunikat o równości dat.
  570. Przykład:
  571. 'Między datą obecną a datą Dec 12 2012 12:00AM jest XXX dni różnicy.'
  572. lub
  573. 'Daty data podana w parametrze jest datą dzisiejszą.'
  574. */
  575.  
  576. create function Zadanie15(@data datetime) returns varchar(100)
  577. as
  578. begin
  579. declare @wynik int
  580. declare @dzis datetime
  581. declare @opis varchar(100)
  582.  
  583. set @dzis = getdate()
  584. set @wynik = datediff(day,@dzis,@data)
  585.  
  586. if @wynik = 0
  587. begin
  588. set @opis = 'Podana data jest data dzisiejsza!'
  589. end
  590. else
  591. begin
  592. set @opis = 'Miedzy data obecną a datą '+cast((@data) as varchar(20))+' jest '+cast((@wynik) as varchar(20))+' dni roznicy!'
  593. end
  594.  
  595. return @opis
  596. end
  597.  
  598. select dbo.Zadanie15('10/10/2017')
  599.  
  600. /*
  601. --------------
  602. --Zadanie 16--
  603. --------------
  604. STWÓRZ FUNKCJĘ, KTÓRA BĘDZIE PRZYJMOWAĆ 2 ARGUMENTY BĘDĄCE CIĄGAMI ZNAKÓW(MAX. DO 100 ZNAKÓW)
  605. I ZWRÓCI CIĄGI ZNAKÓW POWSTAŁE Z WYMIESZANIA NA PRZEMIAN ZNAKÓW Z CIĄGU PIERWSZEGO Z CIĄGIEM DRUGIM.
  606. DODATKOWO FUNKCJA TA MA ZMIENIAĆ KOLEJNOŚĆ ZNAKÓW.
  607. PRZYKLAD:
  608. - funkcja('ABCDE', '12345')
  609. - ZWRÓCI: '5E4D3C2B1A'
  610.  
  611. W PRZYPADKU NIEZGODNOŚCI DŁUGOŚCI CIĄGÓW WEJŚCIOWYCH WYŚWIETL KOMUNIKAT TYPU:
  612. - 'Blad dlugosci znakow: X, Y'
  613. GDZIE 'X' I 'Y' TO DŁUGOŚCI CIĄGÓW WEJŚCIOWYCH
  614. */
  615.  
  616. create FUNCTION Zadanie16(@X VARCHAR(100), @Y VARCHAR(100))
  617. RETURNS VARCHAR(200)
  618. AS
  619. BEGIN
  620. IF(LEN(@X) != LEN(@Y))
  621. RETURN 'Błąd długości znaków: ' + CAST(LEN(@X) AS VARCHAR) + ' <> ' + CAST(LEN(@Y) AS VARCHAR)
  622. ELSE
  623. DECLARE @licznik INT;
  624. DECLARE @result VARCHAR(200);
  625. SET @licznik = 0;
  626. SET @result = '';
  627. WHILE(@licznik <= LEN(@X))
  628. BEGIN
  629. SET @licznik = @licznik + 1;
  630. SET @result = @result + SUBSTRING(@X, @licznik-1, 1)
  631. SET @result = @result + SUBSTRING(@Y, @licznik-1, 1)
  632. END
  633. RETURN REVERSE(@result)
  634. END
  635.  
  636. SELECT dbo.Zadanie16('ABCDE', '12345')
  637.  
  638. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  639. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  640. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  641. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  642. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  643. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  644. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  645. tworzyć tabele o nazwie: zarobki_audyt.
  646. Tabela ta zawiera kolumny:
  647. - identyfikator główny (auto inkrementacja);
  648. - identyfikator zarobku (z tabeli zarobki - brak relacji);
  649. - data (z tabeli zarobki);
  650. - brutto (z tabeli zarobki);
  651. - id_pracownicy (z tabeli zarobki - brak relacji);
  652. - operacja;
  653. - data operacji.
  654. Ustawić na kolumnie - operacja - ograniczenie, które przyjmuje tylko
  655. nazwy INSERT, UPDATE i DELETE.
  656.  
  657. Na tabeli - zarobki - utworzyć trigger o nazwie: audyt - który
  658. wywoływany jest po operacjach wstawiania, aktualizacji i usuwania.
  659. Wyzwalacz ten ma wstawiać odpowiedni rekord do tabeli
  660. - zarobki_audyt - w zależności od wykonywanej operacji.
  661. */
  662.  
  663.  
  664. Stworzyć wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony
  665. jest po wstawieniu rekordu do tej tabeli.
  666. Wyzwalacz ma wstawić do tabeli – dane – dane klienta z tabeli –
  667. klienci – oraz zaktualizować kolumny w tabeli – zamowienia:
  668. - numer zamówienia – zwiększyć o 1 ostatnią wartość;
  669. - data realizacji zamówienia – dodać 7 dni do daty dodania
  670. zamówienia.
  671.  
  672. Stwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  673. co trzeciego pracownika licząc od konca, którego wiek jest pomiędzy 2 parametrami zadanymi w definicji procedury.
  674. W przypadku nie podania parametru pierwszego domyślnie ustaw 18 a w przypadku nie podania drugiego
  675. ustaw 30.
  676.  
  677. Przykłąd wyniku:
  678. 'Osoba Tomasz Kozak 20 lat'
  679. 'Osoba Piotr Wozniak 19 lat'
  680. 'Osoba Anna Wozniak 36 lat'
  681. */
  682.  
  683. create proc procedurakolokwium
  684. @wiekA int,
  685. @wiekB int,
  686. @licznik int,
  687. @temp int
  688. as
  689. begin
  690. if @wiekA is null
  691. begin
  692. set @wiekA = 18;
  693. end
  694. if @wiekB is null
  695. begin
  696. set @wiekB = 30;
  697. end
  698. set @licznik = (select count(nazwisko) from pracownicy);
  699. set @temp = 1;
  700. while @temp <= @licznik
  701. begin
  702. print ('Osoba' + (select imie, nazwisko, wiek from pracownicy where wiek >= @wiekA and wiek <= @wiekB))
  703. set @temp=(@temp + 1);
  704. end
  705. end
  706.  
  707.  
  708.  
  709.  
  710.  
  711. Zadanie 1
  712. Dodaj kolumnę tekstową login1 do tabeli pracownicy.
  713. Przy tworzeniu nowego pracownika lub modyfikacji istniejącego
  714. w tabeli pracownicy ustawiaj wartość kolumny login1
  715. na pierwszą i ostatnią literę z imienia i pierwszą i ostatnią literą nazwiska. W tak stworzonej
  716. wartości zastosuj wielkie litery.
  717. Przykład dla osoby: Tomasz Pawlak login1 będzie skłądał się z TZPK
  718.  
  719. ALTER TABLE pracownicy
  720. ADD login1 varchar(100)
  721.  
  722. select * from pracownicy
  723.  
  724. alter TRIGGER triggerek
  725. ON pracownicy
  726. AFTER UPDATE, INSERT
  727. AS
  728. DECLARE @imie varchar(100);
  729. DECLARE @nazwisko varchar(100);
  730. DECLARE @1stname varchar;
  731. DECLARE @2ndname varchar;
  732. DECLARE @1stsurname varchar;
  733. DECLARE @2ndsurname varchar;
  734. DECLARE @position int;
  735. DECLARE @position1 int;
  736. DECLARE @str varchar(100);
  737. BEGIN
  738.  
  739. SET @imie = (SELECT imie
  740. from inserted)
  741.  
  742. SET @nazwisko = (SELECT nazwisko
  743. from inserted)
  744.  
  745. SET @position = LEN(@imie)
  746. SET @position1 = LEN(@nazwisko)
  747. SET @1stname = substring(@imie, 0, 2)
  748. SET @2ndname = substring(@imie, @position, @position+1)
  749. SET @1stsurname = substring(@nazwisko, 0, 2)
  750. SET @2ndsurname = substring(@nazwisko, @position1, @position1+1)
  751.  
  752. set @str = @1stname + @2ndname + @1stsurname + @2ndsurname
  753.  
  754. UPDATE pracownicy
  755. SET login1 = @str
  756.  
  757. END
  758.  
  759.  
  760.  
  761. Zadanie 2
  762. Do tabeli działy dopisz kolumnę data_przyjęcia.
  763. Przy tworzeniu nowego pracownika z ustawionym działem
  764. ustawiaj wartość kolumny data_przyjęcia dla zadanego działu
  765. wpisując w nią komunikat z obecną datą oraz imieniem i nazwiskiem pracownika.
  766. Format komunikatu:
  767. 'Ostatni zatrudniony pracownik Jan Kowalski: Dec 18 2006 9:01PM'
  768.  
  769.  
  770. ALTER TABLE dzialy
  771. ADD data_przyjęcia varchar(100)
  772.  
  773. select * from dzialy
  774. select * from pracownicy
  775.  
  776. ALTER TRIGGER trig
  777. ON pracownicy
  778. AFTER INSERT
  779. AS
  780. BEGIN
  781. declare @imie varchar(40)
  782. declare @nazwisko varchar(40)
  783. declare @dzialIDh int
  784. declare @data date
  785.  
  786. declare @strout varchar(200)
  787.  
  788. set @dzialIDh = (SELECT dzialID FROM INSERTED)
  789. set @imie = (SELECT imie from INSERTED)
  790. set @nazwisko = (SELECT nazwisko from INSERTED)
  791.  
  792. set @strout = 'Ostatni zatrudniony pracownik ' + @imie + ' ' + @nazwisko + ': ' + cast(getdate() as varchar)
  793.  
  794. UPDATE dzialy
  795. set data_przyjęcia = @strout
  796. where dzialID = @dzialIDh
  797.  
  798. END
  799.  
  800. insert into dbo.pracownicy(nazwisko,imie,wiek,dzialID,wzrost,dousuniecia2) values('Kowalik','Janek',30,3, 2, 3)
  801.  
  802.  
  803.  
  804. zadanie 3
  805. Utwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  806. wszystkich pracowników i liczbę ich wypłat. Pod uwagę bierz tylko tych pracowników,
  807. którzy posiadają więcej niż X (gdzie X to pierwszy parametr procedury)
  808. wpisów w tabeli zarobki. Dodatkowo wybierz tylko te wpisy, które zostały stworzone po
  809. dacie podanej w drugim parametrze. W przypadku nie podania w wywołaniu procedury
  810. drugiego parametru nie uwzględniaj kryterium daty.
  811. Przykładowy wynik wywołania:
  812. 'Pracownik Jan Kowalski od dnia Jan 1 2001 12:00AM otrzymał 5 wypłat'
  813. lub
  814. 'Pracownik Jan Kowalski otrzymał 5 wypłat'
  815.  
  816. select * from pracownicy
  817. select * from zarobki
  818.  
  819.  
  820. create procedure procka2
  821. @wpisy int,
  822. @data date = null
  823. AS
  824. BEGIN
  825.  
  826. declare @table table
  827. (
  828. ID INT IDENTITY(1,1),
  829. Imie varchar(50),
  830. Nazwisko varchar(50),
  831. Ilosc_wyplat int
  832. )
  833.  
  834. insert into @table
  835. select imie, nazwisko, count(brutto) as ilosc
  836. from pracownicy
  837. join zarobki ON pracownicy.pracID = zarobki.pracID
  838. group by pracownicy.pracid, pracownicy.imie, pracownicy.nazwisko
  839. having count(brutto) > @wpisy
  840.  
  841. declare @imie varchar(50)
  842. declare @nazwisko varchar(50)
  843. declare @ilosc int
  844. declare @i int
  845. declare @licznik int
  846. declare @str varchar(50)
  847.  
  848. set @licznik = 0
  849. set @i = (SELECT COUNT(*) FROM @table)
  850.  
  851. while(@licznik < @i)
  852. begin
  853. set @imie = ( SELECT imie
  854. from @table
  855. where ID = @licznik+1 )
  856.  
  857. set @nazwisko = ( SELECT nazwisko
  858. from @table
  859. where ID = @licznik+1 )
  860.  
  861. set @ilosc = ( SELECT Ilosc_wyplat
  862. from @table
  863. where ID = @licznik+1 )
  864. set @str = 'Pracownik ' + @imie + ' ' + @nazwisko + ' otrzymal ' + cast(@ilosc as varchar) + ' wplat'
  865. print @str
  866. set @licznik = @licznik + 1
  867. end
  868.  
  869. END
  870.  
  871. exec procka2 2
  872.  
  873.  
  874.  
  875.  
  876.  
  877. zadanie 4
  878. Stwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  879. co trzeciego pracownika licząc od konca, którego wiek jest pomiędzy 2 parametrami zadanymi w definicji procedury.
  880. W przypadku nie podania parametru pierwszego domyślnie ustaw 18 a w przypadku nie podania drugiego
  881. ustaw 30.
  882.  
  883. Przykłąd wyniku:
  884. 'Osoba Tomasz Kozak 20 lat'
  885. 'Osoba Piotr Wozniak 19 lat'
  886. 'Osoba Anna Wozniak 36 lat'
  887.  
  888. select * from pracownicy
  889.  
  890. alter PROCEDURE procka
  891. @1st int = 18,
  892. @2nd int = 30
  893. AS BEGIN
  894.  
  895. DECLARE @tabelka table
  896. (
  897. ajdi int not null identity(1,1),
  898. imie varchar(100) not null,
  899. nazwisko varchar(100) not null,
  900. wiek int not null
  901. )
  902.  
  903. INSERT INTO @tabelka
  904. SELECT imie, nazwisko, wiek
  905. from pracownicy
  906. where wiek > @1st AND wiek < @2nd
  907.  
  908. declare @imie varchar(40)
  909. declare @nazwisko varchar(40)
  910. declare @wiek int
  911. declare @strout varchar(100)
  912.  
  913. declare @i int
  914. set @i = 1
  915. declare @size int
  916. set @size = (SELECT COUNT(*) FROM @tabelka)
  917.  
  918. while(@i < @size)
  919. BEGIN
  920. if(@i % 3 = 0)
  921. BEGIN
  922. set @imie = (SELECT imie from @tabelka where ajdi = @i )
  923. set @nazwisko = (SELECT nazwisko from @tabelka where ajdi = @i )
  924. set @wiek = (SELECT wiek from @tabelka where ajdi = @i )
  925. set @strout = 'Osoba ' + @imie + ' ' + @nazwisko + ' ' + cast(@wiek as varchar) + ' lat'
  926. print @strout
  927. END
  928. set @i = @i + 1
  929.  
  930. END
  931.  
  932.  
  933. END
  934.  
  935. procka 20, 40
  936.  
  937. -- Zadanie 1
  938. --Dodaj kolumnę tekstową login1 do tabeli pracownicy.
  939. --Przy tworzeniu nowego pracownika lub modyfikacji istniejącego
  940. --w tabeli pracownicy ustawiaj wartość kolumny login1
  941. --na pierwszą i ostatnią literę z imienia i pierwszą i ostatnią literą nazwiska. W tak stworzonej
  942. --wartości zastosuj wielkie litery.
  943. --Przykład dla osoby: Tomasz Pawlak login1 będzie skłądał się z TZPK
  944.  
  945. alter table pracownicy add login1 varchar(200)
  946.  
  947. select * from pracownicy
  948.  
  949. create trigger zad1 on pracownicy
  950. for insert, update
  951. as
  952. begin
  953. declare @imie varchar(50)=(select imie from inserted)
  954. declare @nazwisko varchar(50)=(select nazwisko from inserted)
  955. declare @wynik varchar(50)=''
  956. set @wynik=LEFT(@imie,1)+UPPER((RIGHT(@imie,1)))+LEFT(@nazwisko,1)+UPPER((RIGHT(@nazwisko,1)))
  957. update pracownicy set login1=@wynik where imie=(select imie from inserted) and nazwisko=(select nazwisko from inserted)
  958. end
  959.  
  960. insert into pracownicy(imie,nazwisko) values('Tomasz','Pawlak')
  961.  
  962.  
  963. --Zadanie 2
  964. --Do tabeli działy dopisz kolumnę data_przyjęcia.
  965. --Przy tworzeniu nowego pracownika z ustawionym działem
  966. --ustawiaj wartość kolumny data_przyjęcia dla zadanego działu
  967. --wpisując w nią komunikat z obecną datą oraz imieniem i nazwiskiem pracownika.
  968. --Format komunikatu:
  969. --Ostatni zatrudniony pracownik Jan Kowalski: Dec 18 2006 9:01PM'
  970.  
  971. alter table dzialy add data_przyjęcia date
  972.  
  973.  
  974. alter trigger zad3 on dzialy
  975. for insert, update
  976. as
  977. begin
  978. declare @imie varchar(50)=(select imie from pracownicy)
  979. declare @data date
  980. declare @nazwisko varchar(50)=(select nazwisko from pracownicy)
  981. declare @dzial int=(select dzialID from pracownicy)
  982. declare @wynik varchar(100)=''
  983. set @data=getDate()
  984. set @wynik='Ostatni zatrudniony pracownik '+@imie+@nazwisko+': '+cast(@data as varchar(100))
  985. end
  986.  
  987. insert into pracownicy(imie,nazwisko) values('Jasio','Kotek')
  988. select * from pracownicy
  989. select * from dzialy
  990.  
  991. --zadanie 3
  992. --Utwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  993. --wszystkich pracowników i liczbę ich wypłat. Pod uwagę bierz tylko tych pracowników,
  994. --którzy posiadają więcej niż X (gdzie X to pierwszy parametr procedury)
  995. --wpisów w tabeli zarobki. Dodatkowo wybierz tylko te wpisy, które zostały stworzone po
  996. --dacie podanej w drugim parametrze. W przypadku nie podania w wywołaniu procedury
  997. --drugiego parametru nie uwzględniaj kryterium daty.
  998. --Przykładowy wynik wywołania:
  999. --'Pracownik Jan Kowalski od dnia Jan 1 2001 12:00AM otrzymał 5 wypłat'
  1000. --lub
  1001. --'Pracownik Jan Kowalski otrzymał 5 wypłat'
  1002.  
  1003.  
  1004. --brak
  1005.  
  1006.  
  1007. --zadanie 4
  1008. --Stwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  1009. --co trzeciego pracownika licząc od konca, którego wiek jest pomiędzy 2 parametrami zadanymi w definicji procedury.
  1010. --W przypadku nie podania parametru pierwszego domyślnie ustaw 18 a w przypadku nie podania drugiego
  1011. --ustaw 30.
  1012.  
  1013. --Przykłąd wyniku:
  1014. --'Osoba Tomasz Kozak 20 lat'
  1015. --'Osoba Piotr Wozniak 19 lat'
  1016. --'Osoba Anna Wozniak 36 lat'
  1017.  
  1018. create procedure zadanie4
  1019. @a int, @b int
  1020. as
  1021. begin
  1022. if @a is NULL
  1023. begin
  1024. set @a=18
  1025. end
  1026.  
  1027. if @b is NULL
  1028. begin
  1029. set @b=30
  1030. end
  1031. end
  1032.  
  1033. exec zadanie4 3
  1034.  
  1035. --Zadanie 3
  1036. --Utwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  1037. --wszystkich pracowników i liczbę ich wypłat. Pod uwagę bierz tylko tych pracowników,
  1038. --którzy posiadają więcej niż X (gdzie X to pierwszy parametr procedury)
  1039. --wpisów w tabeli zarobki. Dodatkowo wybierz tylko te wpisy, które zostały stworzone po
  1040. --dacie podanej w drugim parametrze. W przypadku nie podania w wywołaniu procedury
  1041. --drugiego parametru nie uwzględniaj kryterium daty.
  1042. --Przykładowy wynik wywołania:
  1043. --'Pracownik Jan Kowalski od dnia Jan 1 2001 12:00AM otrzymał 5 wypłat'
  1044.  
  1045. alter procedure zadanie3 @X int, @data datetime
  1046. as
  1047. declare @opis varchar(100)
  1048. declare @licznik int
  1049. declare @ileWyplat int
  1050. declare @ilePracownikow int
  1051. declare @pierwszaWyplata datetime
  1052. set @licznik = 1
  1053. set @ilePracownikow = (select count(iloscWyplat) as 'ilePracownikow' from
  1054. (select count(pracid) as 'iloscWyplat' from zarobki group by pracid) as t1)
  1055. begin
  1056. while @licznik <= @ilePracownikow
  1057. begin
  1058. if @data = ''
  1059. begin
  1060. set @ileWyplat = (select count(pracID) from zarobki where pracID=@licznik)
  1061. if @ileWyplat > @X
  1062. begin
  1063. set @pierwszaWyplata = (select min(od) from zarobki where pracID = @licznik)
  1064. set @opis = (select 'Pracownik '+imie+' '+nazwisko+' od dnia '+cast((@pierwszaWyplata) as varchar(15))+
  1065. ' otrzymal '+cast((@ileWyplat) as varchar(5))+' wyplat' from pracownicy
  1066. where pracID=@licznik)
  1067. print @opis
  1068. end
  1069. end
  1070. else
  1071. begin
  1072. set @ileWyplat = (select count(pracID) from zarobki where pracID = @licznik and od > @data)
  1073. if @ileWyplat > @X
  1074. begin
  1075. set @opis = (select 'Pracownik '+imie+' '+nazwisko+' od dnia '+cast((@data) as varchar(15))+
  1076. ' otrzymal '+cast((@ileWyplat) as varchar(5))+' wyplat' from pracownicy
  1077. where pracID=@licznik)
  1078. print @opis
  1079. end
  1080. end
  1081. set @licznik = @licznik + 1
  1082. end
  1083. end
  1084.  
  1085. exec zadanie3 2, ''
  1086. exec zadanie3 1, '01/01/2006'
  1087.  
  1088.  
  1089.  
  1090.  
  1091. --Zadanie 1
  1092. --Dodaj kolumnę tekstową login1 do tabeli pracownicy.
  1093. --Przy tworzeniu nowego pracownika lub modyfikacji istniejącego
  1094. --w tabeli pracownicy ustawiaj wartość kolumny login1
  1095. --na pierwszą i ostatnią literę z imienia i pierwszą i ostatnią literą nazwiska. W tak stworzonej
  1096. --wartości zastosuj wielkie litery.
  1097. --Przykład dla osoby: Tomasz Pawlak login1 będzie skłądał się z TZPK
  1098. --Nie uwzględniaj liczb
  1099.  
  1100. alter table pracownicy add login1 varchar(100)
  1101.  
  1102. create trigger zadanie1 on pracownicy
  1103. for insert, update
  1104. as
  1105. begin
  1106. declare @login varchar(10)
  1107. declare @imie varchar(20)
  1108. declare @nazwisko varchar(20)
  1109. set @imie = (select imie from inserted)
  1110. set @nazwisko = (select nazwisko from inserted)
  1111. set @login = left(@imie,1)+right(@imie,1)+left(@nazwisko,1)+right(@nazwisko,1)
  1112. set @login = upper(@login)
  1113. update pracownicy set login1 = @login
  1114. where @login NOT LIKE '%[^a-z]%'and pracID=(select pracID from inserted)
  1115. end
  1116.  
  1117. insert into pracownicy(imie, nazwisko) values('Jerzy', 'Killer') -- przypadek pierwszy
  1118. insert into pracownicy(imie, nazwisko) values('Jerzy', 'Killer234') -- przypadek drugi
  1119. select * from pracownicy
  1120. drop trigger zadanie1
  1121.  
  1122.  
  1123. --Zadanie 2
  1124. --Do tabeli działy dopisz kolumnę data_przyjęcia.
  1125. --Przy tworzeniu nowego pracownika z ustawionym działem
  1126. --ustawiaj wartość kolumny data_przyjęcia dla zadanego działu
  1127. --wpisując w nią komunikat z obecną datą oraz imieniem i nazwiskiem pracownika.
  1128. --Format komunikatu:
  1129. --Ostatni zatrudniony pracownik Jan Kowalski: Dec 18 2006 9:01PM'
  1130.  
  1131. alter table dzialy add data_przyjecia varchar(100)
  1132. select * from dzialy
  1133.  
  1134. create trigger zadanie2 on pracownicy
  1135. for insert, update
  1136. as
  1137. begin
  1138. declare @imie varchar(20)
  1139. declare @nazwisko varchar(20)
  1140. declare @komunikat varchar(100)
  1141. set @imie = (select imie from inserted)
  1142. set @nazwisko = (select nazwisko from inserted)
  1143. set @komunikat = 'Ostatni zatrudniony pracownik: '+@imie +' '+@nazwisko+' '+cast((getdate()) as varchar(20))
  1144. update dzialy set data_przyjecia = @komunikat
  1145. where dzialID = (select dzialID from inserted)
  1146. end
  1147.  
  1148. insert into pracownicy(imie, nazwisko, dzialID) values('Jerzy', 'Killer', 1)
  1149. drop trigger zadanie2
  1150. select * from pracownicy
  1151.  
  1152.  
  1153.  
  1154. --Zadanie 4
  1155. --Stwórz procedurę , która wyświetli w formie tekstowej (w oknie messages)
  1156. --co trzeciego pracownika licząc od konca, którego wiek jest pomiędzy 2 parametrami zadanymi w definicji procedury.
  1157. --W przypadku nie podania parametru pierwszego domyślnie ustaw 18 a w przypadku nie podania drugiego
  1158. --ustaw 30.
  1159.  
  1160. create procedure zadanie4 @param1 int, @param2 int
  1161. as
  1162. if @param1 = ''
  1163. set @param1 = 18
  1164. if @param2 = ''
  1165. set @param2 = 30
  1166. declare @wiersze int
  1167. declare @opis varchar(50)
  1168. begin
  1169. declare @tabela table(ID int identity(1,1), imie varchar(20), nazwisko varchar(20))
  1170. insert into @tabela
  1171. select imie, nazwisko from pracownicy where wiek between @param1 and @param2
  1172. set @wiersze = (select count(ID) from @tabela)
  1173. while @wiersze >= 3
  1174. begin
  1175. set @opis = (select imie+' '+nazwisko from @tabela where ID = @wiersze)
  1176. print @opis
  1177. set @wiersze = @wiersze - 3
  1178. end
  1179. end
  1180.  
  1181. exec zadanie4 '', ''
  1182. --lub exec zadanie4 15 30
  1183. select * from pracownicy
  1184.  
  1185. /*
  1186. zadanie 1
  1187. Do tabeli pracownicy dodaj kolumne tekstowa poczta o dlugosci 200 znakow.
  1188. Podczas dodawania i modyfikacji osoby ustaw tą kolumnę ciągiem złożonym z:
  1189. pierwszych 5 liter nazwiska, myślnika,
  1190. pierwszych trzech liter imienia oraz ciągu '@wp.pl'
  1191. Pamiętaj, aby usunąc ewentualne zewnętrzne białe znaki oraz
  1192. aby zamienic wewnętrzne spacje na znak '_'.
  1193. */
  1194.  
  1195. ALTER TABLE pracownicy ADD poczta varchar (200)
  1196.  
  1197.  
  1198. CREATE TRIGGER zadanie1
  1199. ON Pracownicy
  1200. AFTER INSERT, UPDATE
  1201. AS
  1202. BEGIN
  1203. DECLARE @nazwisko varchar(100), @mail varchar (100), @imie varchar(100), @id BIGINT
  1204. SET @nazwisko = (select Nazwisko from inserted);
  1205. SET @imie = (select Imię from inserted);
  1206. set @imie = ltrim(rtrim(@imie));
  1207. set @imie = replace(@imie, ' ', '_');
  1208. set @nazwisko = replace(@nazwisko, ' ', '_');
  1209. SET @id = select ( IDPracownika from inserted);
  1210. SET @mail = Substring(@nazwisko,1,5) + '-' + Substring(@imie,1,3) + '@wp.pl'
  1211. UPDATE [pracownicy] SET poczta = @mail WHERE IDpracownika = @id
  1212. END
  1213.  
  1214.  
  1215. INSERT INTO Pracownicy (IDpracownika,Imię, Nazwisko) values(91,'Tom ', 'Ziom');
  1216. INSERT INTO Pracownicy (IDpracownika,Imię, Nazwisko) values(92,'Tom ', 'Zomo');
  1217. INSERT INTO Pracownicy (IDpracownika,Imię, Nazwisko) values(93,'Tom ', 'Ziemo');
  1218. INSERT INTO Pracownicy (IDpracownika,Imię, Nazwisko) values(94,'Tom ', 'Złom');
  1219.  
  1220.  
  1221.  
  1222. UPDATE [Pracownicy] SET Imię ='Andrzej', Nazwisko = 'Nowakowski'
  1223. WHERE IDpracownika = 9;
  1224.  
  1225. DELETE FROM Pracownicy WHERE Nazwisko like 'Kowalski '
  1226.  
  1227. select * from Pracownicy order by Nazwisko
  1228.  
  1229. /*
  1230. zadanie 2
  1231. Stwórz procedurę, która wyświetli w formie tekstowej (w oknie messages) co drugiego pracownika
  1232. pracownika, którego nazwisko zaczyna się na literę podaną w parametrze. W przypadku nie podania
  1233. parametru uwzględniaj tylko osby o nazwisku na literę 'Z'. W przypadku podania w parametrze wartosci
  1234. null nie uwzględniaj kryterium.
  1235. */
  1236.  
  1237.  
  1238. ALTER PROCEDURE proc2
  1239. @parametr varchar (2) = 'Z'
  1240. AS
  1241. BEGIN
  1242. DECLARE @id int;
  1243. DECLARE @i int;
  1244. DECLARE @pracownik varchar (100);
  1245. DECLARE @tabela table(ID int identity(1,1), imie varchar(10), nazwisko varchar(10))
  1246. SET @id = 1;
  1247.  
  1248. IF (@parametr IS NOT NULL)
  1249. BEGIN
  1250. INSERT INTO @tabela (imie, nazwisko)
  1251. (SELECT Imię, Nazwisko from pracownicy where SUBSTRING(nazwisko,1,1) = @parametr)
  1252. SET @i = 1;
  1253. WHILE (@i <= (Select max(id) from @tabela) )
  1254. BEGIN
  1255. SET @pracownik = (SELECT imie from @tabela where ID = @i) + (SELECT nazwisko from @tabela where ID = @i);
  1256. print @pracownik;
  1257. SET @i = @i + 2;
  1258. END
  1259. END
  1260. ELSE
  1261. BEGIN
  1262. INSERT INTO @tabela (imie, nazwisko)
  1263. (SELECT Imię, Nazwisko from pracownicy)
  1264. SET @i = 1;
  1265. WHILE (@i <= (Select max(id) from @tabela) )
  1266. BEGIN
  1267. SET @pracownik = (SELECT imie from @tabela where ID = @i) + (SELECT nazwisko from @tabela where ID = @i);
  1268. print @pracownik;
  1269. SET @i = @i + 1;
  1270. END
  1271. END
  1272.  
  1273. END
  1274.  
  1275. exec proc2 null
  1276.  
  1277. SELECT * from Pracownicy
  1278.  
  1279. DELETE ROW FROM Pracownicy WHERE Imię = 'Aleksander'
  1280.  
  1281.  
  1282. /*
  1283. zadanie 3
  1284. Utwórz funkcję, która będzie zwracać komunikat o różnicy w dniach
  1285. między datą bieżącą a datą podaną w parametrze.
  1286. W przypadku tego samego dnia zwróć komunikat o równości dat.
  1287. Przykład:
  1288. 'Między datą obecną a datą Dec 12 2012 12:00AM jest XXX dni różnicy.'
  1289. lub
  1290. 'Daty data podana w parametrze jest datą dzisiejszą.'
  1291.  
  1292.  
  1293. */
  1294.  
  1295. ALTER FUNCTION zad3 (@data DATETIME) RETURNS varchar(100)
  1296. AS
  1297. BEGIN
  1298. DECLARE @data2 DATETIME
  1299. DECLARE @wynik varchar(100)
  1300. SET @data2 = GETDATE()
  1301. IF (@data IS NULL)
  1302. SET @wynik = 'Nieprawidłowa data'
  1303. ELSE IF ( DATEDIFF (day,@data,@data2) <> 0 )
  1304. SET @wynik = 'Między obecną datą a datą ' + cast(@data as varchar) + ' jest ' + cast (DATEDIFF(day,@data2,@data) as varchar) + ' dni różnicy'
  1305. ELSE
  1306. SET @wynik = 'Data podana w parametrze jest datą dzisiejszą.'
  1307.  
  1308. return @wynik
  1309. END
  1310.  
  1311.  
  1312. select dbo.zad3 ('06/25/2017') from pracownicy
  1313.  
  1314. print cast('06/25/2017' as datetime)
  1315.  
  1316. SELECT DATEDIFF(day, '2004-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
  1317.  
  1318. /*
  1319.  
  1320.  
  1321. zadanie 4
  1322.  
  1323. Stworzyć wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony jest po wstawieniu rekordu do tej tabeli.
  1324. Wyzwalacz ma wstawić do tabeli – dane – dane klienta z tabeli – klienci – oraz zaktualizować kolumny w tabeli – zamowienia:
  1325. - numer zamówienia – zwiększyć o 1 ostatnią wartość;
  1326. - data realizacji zamówienia – dodać 7 dni do daty dodania zamówienia.
  1327. */
  1328.  
  1329. ALTER TRIGGER zad4
  1330. ON zamowienia
  1331. AFTER INSERT
  1332. AS
  1333. DECLARE @id INT, @klient INT;
  1334. DECLARE @data DATETIME;
  1335. SELECT @id = [ID_zamowienia], @klient = [Klient] FROM [inserted];
  1336. SELECT @data = [data_zam] FROM [zamowienia] WHERE [ID_zamowienia] = @id;
  1337. BEGIN
  1338. IF(@id IS NOT NULL) AND (@klient IS NOT NULL)
  1339. BEGIN
  1340. INSERT INTO [dane](ID_zamowienia, imie, nazwisko, adres, miasto, kod_pocztowy)
  1341. (SELECT @id, imie, nazwisko, adres, miasto, kod_pocztowy FROM klienci WHERE [ID_klienta] = @klient);
  1342.  
  1343. UPDATE [zamowienia] SET ID_zamowienia = (@id + 1) , [data_dos] =
  1344. DATEADD(DAY, 7, @data) WHERE ID_zamowienia = @id;
  1345. END
  1346. END;
  1347. Zadanie 1
  1348.  
  1349. stwórz triggera który przenosi dane dotyczące zarobków
  1350. do tabeli historycznej będącej dokładną kopią tabeli
  1351. zarobki bez kolumny aktualny. Uwzględnij w tej tabeli datę
  1352. przenosin oraz użytkownika który kasował dane
  1353.  
  1354. Zadanie 2
  1355.  
  1356. Stworzyć wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony jest po wstawieniu rekordu do tej tabeli.
  1357. Wyzwalacz ma wstawić do tabeli – dane – dane klienta z tabeli – klienci – oraz zaktualizować kolumny w tabeli – zamowienia:
  1358. - numer zamówienia – zwiększyć o 1 ostatnią wartość;
  1359. - data realizacji zamówienia – dodać 7 dni do daty dodania zamówienia.
  1360.  
  1361. zadanie 3
  1362. Do tabeli pracownicy dodaj kolumne tekstowa poczta o dlugosci 200 znakow.
  1363. Podczas dodawania i modyfikacji osoby ustaw tą kolumnę ciągiem złożonym z:
  1364. pierwszych 5 liter nazwiska, myślnika,
  1365. pierwszych trzech liter imienia oraz ciągu '@p.lodz.pl'
  1366. Pamiętaj, aby usunąc ewentualne zewnętrzne białe znaki oraz
  1367. aby zamienic wewnętrzne spacje na znak '_'.
  1368.  
  1369. zadanie 4
  1370.  
  1371. Stwórz procedurę, która wyświetli w formie tekstowej (w oknie messages) co drugiego pracownika
  1372. pracownika, którego nazwisko zaczyna się na literę podaną w parametrze. W przypadku nie podania
  1373. parametru uwzględniaj tylko osby o nazwisku na literę 'Z'. W przypadku podania w parametrze wartosci
  1374. null nie uwzględniaj kryterium.
  1375.  
  1376.  
  1377. Przykłąd wyniku:
  1378. 'Pracownik nr #1 Jan Kowalski 25 lat'
  1379. 'Pracownik nr #3 Tomasz Kowalski 26 lat'
  1380. 'Pracownik nr #5 Piotr Kowalski 29 lat
  1381.  
  1382.  
  1383. zadanie z pocztą
  1384.  
  1385. ALTER TABLE pracownicy ADD poczta varchar (200)
  1386.  
  1387.  
  1388. CREATE TRIGGER zadanie1
  1389. ON Pracownicy
  1390. AFTER INSERT, UPDATE
  1391. AS
  1392. BEGIN
  1393. DECLARE @nazwisko varchar(100), @mail varchar (100), @imie varchar(100), @id BIGINT
  1394. SET @nazwisko = (select Nazwisko from inserted);
  1395. SET @imie = (select Imię from inserted);
  1396. set @imie = ltrim(rtrim(@imie));
  1397. set @imie = replace(@imie, ' ', '_');
  1398. set @nazwisko = replace(@nazwisko, ' ', '_');
  1399. SET @id = select ( IDPracownika from inserted);
  1400. SET @mail = Substring(@nazwisko,1,5) + '-' + Substring(@imie,1,3) + '@p.lodz.pl'
  1401. UPDATE [pracownicy] SET poczta = @mail WHERE IDpracownika = @id
  1402. END
  1403.  
  1404. zad 4
  1405.  
  1406. create procedure pr
  1407. @lit varchar(1) ='Z'
  1408. as
  1409. begin
  1410. declare @pracownik varchar(120)
  1411. declare @i int, @rtoprocess int
  1412. declare @tabl table(id int IDENTITY ,nazw varchar(50), im varchar(50), wiek int )
  1413. if @lit is not null
  1414. begin
  1415. insert into @tabl
  1416. select nazwisko, imie, wiek from pracownicy where nazwisko LIKE @lit+'%'
  1417. select * from @tabl
  1418. end
  1419. else
  1420. insert into @tabl
  1421. select nazwisko, imie, wiek from pracownicy
  1422. set @i=1
  1423. select @rtoprocess = count(nazw) from @tabl
  1424. while @i < @rtoprocess
  1425. begin
  1426. if @i % 2 =0
  1427. begin
  1428. select @pracownik = nazw from @tabl where id = @i
  1429. set @pracownik = @pracownik + ' '
  1430. select @pracownik = @pracownik + im from @tabl where id = @i
  1431. set @pracownik = @pracownik + ' '
  1432. if (select wiek from @tabl where id = @i) is null
  1433. set @pracownik = @pracownik + ' niewiadomo ile lat'
  1434. else
  1435. begin
  1436. select @pracownik = @pracownik + convert(varchar(4),wiek) from @tabl where id = @i
  1437. set @pracownik = @pracownik + ' lat'
  1438. end
  1439. print('Pracownik nr' +' '+ convert(varchar(4),@i) +' '+@pracownik )
  1440. end
  1441. set @i = @i +1
  1442. end
  1443. end
  1444.  
  1445. zad 2
  1446.  
  1447. CREATE TRIGGER zad2
  1448. ON zamowienia
  1449. for INSERT
  1450. AS
  1451. DECLARE @id INT, @klient INT;
  1452. DECLARE @data DATETIME;
  1453. SELECT @id = [ID_zamowienia], @klient = [Klient] FROM [inserted];
  1454. SELECT @data = [data_zam] FROM [zamowienia] WHERE [ID_zamowienia] = @id;
  1455. BEGIN
  1456. IF(@id IS NOT NULL) AND (@klient IS NOT NULL)
  1457. BEGIN
  1458. INSERT INTO [dane](ID_zamowienia, imie, nazwisko, adres, miasto, kod_pocztowy)
  1459. (SELECT @id, imie, nazwisko, adres, miasto, kod_pocztowy FROM klienci WHERE [ID_klienta] = @klient);
  1460.  
  1461. UPDATE [zamowienia] SET ID_zamowienia = (@id + 1) , [data_dos] =
  1462. DATEADD(DAY, 7, @data) WHERE ID_zamowienia = @id;
  1463. END
  1464. END
  1465.  
  1466. zadanie 1.
  1467.  
  1468. create table zarobki_historia(
  1469. zarID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  1470. od datetime,
  1471. brutto money,
  1472. pracID int FOREIGN KEY REFERENCES pracownicy(pracID),
  1473. data_przenosin date,
  1474. uzytkownik varchar(20)
  1475. )
  1476.  
  1477. ZADANIE 5
  1478.  
  1479. drop trigger zadanie5
  1480. create trigger zadanie5 on zarobki
  1481. for delete
  1482. as
  1483. begin
  1484. insert into zarobki_historia(zarID, od, brutto, pracID) select * from deleted
  1485. update zarobki_historia set data_przenosin = getdate() where zarID = (select zarID from deleted)
  1486. update zarobki_historia set uzytkownik = user_name() where zarID = (select zarID from deleted)
  1487. end
  1488.  
  1489. SET IDENTITY_INSERT zarobki_historia ON
  1490. delete from zarobki where zarID=3;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement