Advertisement
S_Madanska

23.02.22

Feb 23rd, 2022
1,160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 13.35 KB | None | 0 0
  1.     -------------------------------------------------------------------------------------
  2.     -------------------------------   HOMEWORK   ----------------------------------------
  3.     -------------------------------------------------------------------------------------
  4.     --Задача 5-2.
  5.     --Да се създаде изглед, който съдържа десетимата клиенти с най-голям брой
  6.     --поръчки. Ако последният клиент има равен брой поръчки с други клиенти, те също да участват в изгледа.
  7.  
  8.     CREATE VIEW CUST_ORDER_NUM_TOP_WITH_TIES
  9.     AS
  10.     SELECT TOP 10 WITH TIES C.FNAME + ' ' + C.LNAME AS CUSTOMER,
  11.                             COUNT(O.ORDER_ID)       AS ORDER_NUMBER
  12.     FROM CUSTOMERS C JOIN ORDERS O
  13.     ON C.CUSTOMER_ID=O.CUSTOMER_ID
  14.     GROUP BY  C.FNAME + ' ' + C.LNAME , C.CUSTOMER_ID
  15.     ORDER BY ORDER_NUMBER DESC
  16.  
  17.     SELECT * FROM CUST_ORDER_NUM_TOP_WITH_TIES
  18.  
  19.     --Задача 0.4*
  20.     --Да се създаде изглед с имената на държавите с повече от 5 клиента от тях.
  21.     SELECT COUNT(CU.COUNTRY_ID) , CO.NAME
  22.     FROM COUNTRIES CO JOIN CUSTOMERS CU
  23.     ON CO.COUNTRY_ID = CU.COUNTRY_ID
  24.     GROUP BY CO.NAME
  25.     HAVING COUNT(CU.COUNTRY_ID)> 5
  26.  
  27.     SELECT * FROM CUSTOMERS
  28.     WHERE COUNTRY_ID = 'BG'
  29.  
  30.     --------------------------------------------------------------------------------
  31.     -------------------------------- ТРАНЗАКЦИИ ------------------------------------
  32.     --------------------------------------------------------------------------------
  33.     --6.4.Примери
  34.     --Пример 6-1.
  35.     --Да се създаде транзакция
  36.  
  37.     --1--@@ERROR
  38.     BEGIN TRAN
  39.         --1., която добавя нов клиент
  40.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  41.         VALUES(1001, 'BG', 'Маргарита', 'Розова', 'бул. Марица 10, гр. Пловдив', '[email protected]', 'F')
  42.         IF @@ERROR <>0 ROLLBACK
  43.  
  44.         --2.и създава поръчка за него,
  45.         INSERT INTO ORDERS(ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID, SHIP_ADDRESS)
  46.         VALUES(1, GETDATE(), 1001, 101, 'бул. В. Априлов 18, гр. Пловдив')
  47.         IF @@ERROR <>0 ROLLBACK
  48.  
  49.         --3. , 4. включваща два продукта.
  50.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  51.         VALUES(1, 1745, 1, 340)
  52.         IF @@ERROR <>0 ROLLBACK
  53.  
  54.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  55.         VALUES(1, 2252, 2, 80)
  56.         IF @@ERROR <>0 ROLLBACK
  57.     COMMIT TRAN
  58.  
  59.     --2 --XACT_ABORT
  60.     BEGIN TRAN
  61.     SET XACT_ABORT ON
  62.         --1., която добавя нов клиент
  63.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  64.         VALUES(1002, 'BG', 'Маргарита', 'Розова', 'бул. Марица 10, гр. Пловдив', '[email protected]', 'F')
  65.  
  66.         --2.и създава поръчка за него,
  67.         INSERT INTO ORDERS(ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID, SHIP_ADDRESS)
  68.         VALUES(1, GETDATE(), 1001, 101, 'бул. В. Априлов 18, гр. Пловдив')
  69.  
  70.         --3. , 4. включваща два продукта.
  71.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  72.         VALUES(1, 1745, 1, 340)
  73.  
  74.         INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, QUANTITY, UNIT_PRICE)
  75.         VALUES(1, 2252, 2, 80)
  76.     COMMIT TRAN
  77.  
  78.  
  79.     /*Пример 6-2.
  80.     Транзакция, която променя фамилията на клиент с идентификатор = 1001,
  81.     след което отхвърля направените промени.*/
  82.  
  83.     BEGIN TRAN
  84.  
  85.         --OPER1
  86.         SELECT LNAME FROM CUSTOMERS
  87.         WHERE CUSTOMER_ID = 1001
  88.  
  89.         --OPER2
  90.         UPDATE CUSTOMERS
  91.         SET LNAME = 'Лалева'
  92.         WHERE CUSTOMER_ID = 1001
  93.  
  94.         --OPER3
  95.         SELECT LNAME FROM CUSTOMERS
  96.         WHERE CUSTOMER_ID = 1001
  97.  
  98.     ROLLBACK TRAN
  99.  
  100.         --OPER4
  101.         SELECT LNAME FROM CUSTOMERS
  102.         WHERE CUSTOMER_ID = 1001
  103.  
  104.     /*Пример 6-3.
  105.     Транзакция, която въвежда нов клиент, поставя точка на запис,
  106.     въвежда поръчка, след което отхвърля промените до точката на запис, т.е.
  107.     отхвърля се само поръчката.*/
  108.  
  109.     BEGIN TRAN
  110.  
  111.         --OPER1
  112.         INSERT INTO CUSTOMERS(CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  113.         VALUES(1003, 'BG', 'Илия', 'Георгиев', 'бул. Марица 10, гр. Пловдив', '[email protected]', 'M')
  114.  
  115.     SAVE TRAN POINT1
  116.  
  117.         --OPER2
  118.         INSERT INTO ORDERS(ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID, SHIP_ADDRESS)
  119.         VALUES(2, GETDATE(), 1003, 101, 'бул. В. Априлов 18, гр. Пловдив')
  120.  
  121.     --отхвърля промените до точката на запис
  122.     ROLLBACK TRAN POINT1
  123.  
  124.     COMMIT TRAN
  125.  
  126.     /*Задача 6-1.
  127.     Транзакция, която има за цел да изтрие отдел „Мениджмънт“,
  128.     като преди това прехвърли всички служители от него в отдел „Администрация“.*/
  129.  
  130.     SELECT * FROM DEPARTMENTS
  131.     WHERE DEPARTMENT_ID = 90
  132.  
  133.     BEGIN TRAN
  134.  
  135.         ----Мениджмънт    90 --> Администрация 10  ,
  136.         UPDATE EMPLOYEES
  137.         SET DEPARTMENT_ID = 10
  138.         WHERE DEPARTMENT_ID = 90
  139.  
  140.         ----DELETE Мениджмънт    90
  141.         DELETE FROM DEPARTMENTS
  142.         WHERE DEPARTMENT_ID = 90
  143.  
  144.     COMMIT TRAN
  145.  
  146.     -------------------------------------------------------------------------------------
  147.     ---------------------------------- ПРОЦЕДУРИ ----------------------------------------
  148.     -------------------------------------------------------------------------------------
  149.     --Пример 7-2.
  150.     --Да се създаде процедура, която за подадена като входен параметър идентификатор на
  151.     --поръчка извежда имена на служител, който я е обработил, както и общата й стойност.
  152.     CREATE PROC EMPL_ORDERS_PROC @ORDER INT
  153.     AS
  154.     SELECT FNAME, LNAME, O.ORDER_ID, SUM(OI.QUANTITY*OI.UNIT_PRICE) AS TOTAL
  155.     FROM EMPLOYEES E JOIN ORDERS O ON O.EMPLOYEE_ID = E.EMPLOYEE_ID
  156.                      JOIN ORDER_ITEMS OI ON OI.ORDER_ID = O.ORDER_ID
  157.     WHERE @ORDER = O.ORDER_ID
  158.     GROUP BY FNAME, LNAME, O.ORDER_ID
  159.  
  160.     EXEC EMPL_ORDERS_PROC @ORDER = 2454
  161.  
  162.     -------------------------------------------------------------------------------------
  163.     ---------------------------------- ФУНКЦИИ ------------------------------------------
  164.     -----1.--Скаларни -------------------------------------------------------------------
  165.     --Пример 7-4.
  166.     --Да се създаде функция, връщаща като скаларна стойност текст, съдържащ името на
  167.     --отдел (подаден като параметър) и обща стойност на заплатите в него.
  168.     CREATE FUNCTION DEPT_SALARY_FUNCTION (@DEPT_ID INT ) RETURNS VARCHAR(200)
  169.     AS
  170.     BEGIN
  171.     DECLARE @SUM_SALARY NUMERIC(10,2), @NAME VARCHAR(50)
  172.  
  173.     SELECT @NAME = D.NAME, @SUM_SALARY = SUM(E.SALARY)
  174.     FROM DEPARTMENTS D JOIN EMPLOYEES E
  175.     ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
  176.     WHERE D.DEPARTMENT_ID = @DEPT_ID
  177.     GROUP BY D.DEPARTMENT_ID, D.NAME
  178.  
  179.     RETURN 'Сумата на заплатите в ' + @NAME +
  180.            ' (ID=' + CAST(@DEPT_ID AS VARCHAR) +
  181.            ') е ' + CAST(@SUM_SALARY AS VARCHAR) + '.'
  182.     END
  183.  
  184.     SELECT DBO.DEPT_SALARY_FUNCTION (DEPARTMENT_ID) FROM DEPARTMENTS
  185.  
  186.     -----2.-- Функции, връщащи резултатен набор------------------------------------------
  187.     --Пример 7-5.
  188.     --Да се създаде функция, връщаща като резултат служителите с техните длъжности.
  189.     CREATE FUNCTION EMP_JOBS_FUNCTION () RETURNS TABLE
  190.     AS
  191.     RETURN
  192.         SELECT FNAME, LNAME, JOB_TITLE
  193.         FROM EMPLOYEES E JOIN JOBS J
  194.         ON E.JOB_ID = J.JOB_ID
  195.  
  196.     SELECT * FROM DBO.EMP_JOBS_FUNCTION()
  197.     ORDER BY JOB_TITLE
  198.  
  199.     -------------------------------------------------------------------------------------
  200.     ----------------------------------- КУРСОРИ -----------------------------------------
  201.     -------------------------------------------------------------------------------------
  202.     /*Пример 8-1.
  203.     Да се създаде курсор, който демонстрира прочитане на данни ред по ред от
  204.     курсор. Резултатният набор за целта ще съдържа всички клиенти от Германия.
  205.     Стъпките от жизнения цикъл са обозначени в коментари.*/
  206.  
  207.     DECLARE @CUST_ID VARCHAR(10), @F_NAME VARCHAR(20), @L_NAME VARCHAR(20)
  208.  
  209.     -- 1 Деклариране на курсора чрез конструкцията DECLARE
  210.     DECLARE CUSTOMERS_CURSOR CURSOR FOR
  211.     SELECT CUSTOMER_ID, FNAME, LNAME
  212.     FROM CUSTOMERS
  213.     WHERE COUNTRY_ID = 'DE'
  214.  
  215.     -- 2. Отваряне на курсора.
  216.     OPEN CUSTOMERS_CURSOR
  217.  
  218.     /* 3. Извличане на ред от курсора чрез конструкцията FETCH.
  219.     Това обикновено става в цикъл, в който на всяка итерация се проверява
  220.     стойността на системната променлива @@FETCH_STATUS след всяко извличане.
  221.     Ако стойността й е:
  222.               0 – извличането е било успешно;
  223.              -1 – няма повече редове в курсора;
  224.              -2 – редът вече не съществува в курсора, т.е.
  225.                 той е бил изтрит след отваряне на
  226.                 курсора или променен така, че вече не отговаря на условията,
  227.                 на които отговарят редовете, участващи в резултатния набор на курсора.
  228.     */          
  229.     FETCH NEXT FROM CUSTOMERS_CURSOR INTO @CUST_ID, @F_NAME, @L_NAME
  230.     PRINT 'Клиенти от Германия: '
  231.     PRINT '-----------------------------'
  232.     WHILE @@FETCH_STATUS = 0
  233.     BEGIN
  234.  
  235.     -- 4. Прочитане, актуализиране или изтриване на реда, на който е позициониран курсорът.
  236.      PRINT @F_NAME + ' ' + @L_NAME + ' (ID = ' + @CUST_ID + ')'
  237.  
  238.      FETCH NEXT FROM CUSTOMERS_CURSOR INTO @CUST_ID, @F_NAME, @L_NAME
  239.     END
  240.  
  241.     -- 5. Затваряне на курсора. Това прекратява активното действие на курсора. Той все още
  242.     --може да бъде отворен без да се налага да се декларира отново.
  243.     CLOSE CUSTOMERS_CURSOR
  244.  
  245.     -- 6. Освобождаване на курсора, за да бъдат освободени структурите от данни, които
  246.     --съставят курсора.
  247.     DEALLOCATE CUSTOMERS_CURSOR
  248.  
  249.     -------------------------------------------------------------------------------------
  250.     ----------------------------- Тригери -----------------------------------------------
  251.     -------------------------------------------------------------------------------------
  252.     /*Задача 9-1.
  253.     Да се създаде тригер, който при всяка промяна на фамилия на клиент
  254.     записва ред в нова таблица CUSTOMERS_HISTORY с атрибути:
  255.     • идентификатор на клиент;
  256.     • стара фамилия;
  257.     • нова фамилия.*/
  258.  
  259.     CREATE TABLE CUSTOMER_HISTORY
  260.     (
  261.         CUSTOMER_ID INT,
  262.         OLD_LNAME VARCHAR(50),
  263.         NEW_LNAME VARCHAR(50)
  264.     )
  265.  
  266.     CREATE TRIGGER TGR_CUST_HIST
  267.     ON CUSTOMERS
  268.     FOR UPDATE
  269.     AS
  270.         IF UPDATE(LNAME)
  271.         BEGIN
  272.         INSERT INTO CUSTOMER_HISTORY(CUSTOMER_ID, OLD_LNAME, NEW_LNAME)
  273.         SELECT I.CUSTOMER_ID, D.LNAME, I.LNAME
  274.         FROM inserted I, deleted D
  275.         WHERE I.CUSTOMER_ID = D.CUSTOMER_ID
  276.         END
  277.  
  278.     UPDATE CUSTOMERS
  279.     SET LNAME = LNAME + '-' + 'Колева'
  280.     WHERE CUSTOMER_ID IN (111, 114, 118)
  281.  
  282.     SELECT * FROM CUSTOMERS
  283.  
  284.     SELECT * FROM CUSTOMER_HISTORY
  285.     WHERE CUSTOMER_ID IN (111, 114, 118)
  286.  
  287.  
  288.     -------------------------------------------------------------------------------------
  289.     -------------------------------   HOMEWORK   ----------------------------------------
  290.     -------------------------------------------------------------------------------------
  291.     --Задача 0.5*
  292.     --Да се създаде транзакция, която променя:
  293.     --фамилията на служител с идентификатор 103 на 'Гочев',
  294.     --променя фамилията на служител с идентификатор 114 на 'Петров',
  295.     --както и фамилията на служител с идентификатор 118 на 'Маринов'.
  296.     --Нека след това извлече в резултат име и фамилия само за горепосочените служители,
  297.     --като промените от транзакцията останат постоянни.
  298.  
  299.     /* Задача 6-2.
  300.     Транзакция, която изтрива продукт 1726 -първо го изтрива от всички поръчки
  301.     после от таблицата с продукти, и накрая отхвърля направените промени.*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement