Advertisement
Guest User

Untitled

a guest
Feb 6th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.17 KB | None | 0 0
  1.  
  2. ALTER TABLE utilizator add nr_likeuri NUMBER;
  3.  
  4. DECLARE
  5.     TYPE rexord IS RECORD (userId utilizator.id%TYPE, nr_likeuri NUMBER);
  6.     TYPE coll IS TABLE OF rexord;
  7.     collectie coll;
  8. BEGIN
  9.     SELECT u.id ,COUNT(l.id)
  10.     BULK COLLECT INTO collectie
  11.     FROM utilizator u
  12.     join postare p
  13.     ON u.id = p.id_utilizator
  14.     join likes l
  15.     ON p.id = l.id_postare
  16.     GROUP BY u.id;
  17.    
  18.    
  19.     FOR i IN collectie.FIRST..collectie.LAST LOOP
  20.         UPDATE utilizator SET nr_likeuri = i.nr_likeuri
  21.         WHERE id = i.userId;
  22.     END LOOP;
  23. END;
  24. /
  25.  
  26. CREATE OR REPLACE PROCEDURE p1 (UName utilizator.nume%TYPE) AS
  27.     TYPE rexord IS RECORD (ID utilizator.id%TYPE, Nume utilizator.nume%TYPE);
  28.     TYPE coll IS TABLE OF rexord;
  29.     TYPE text_nrLike IS RECORD (text postare.text%TYPE, nrLikeuri NUMBER);
  30.     TYPE coll1 IS TABLE OF text_nrLike;
  31.     v_text_likeuri coll1;
  32.     v_prieteni coll;
  33.     v_id utilizator.id%TYPE;
  34. BEGIN
  35.     SELECT id
  36.     INTO v_id
  37.     FROM utilizator
  38.     WHERE nume LIKE UName;
  39.  
  40.     SELECT pr.id_utilizator2, u.nume
  41.     BULK COLLECT INTO v_prieteni
  42.     FROM utilizator u
  43.     join prieteni pr
  44.     ON u.id = pr.id_utilizator2
  45.     WHERE pr.id_utilizator1 = v_id;
  46.    
  47.     FOR i IN v_prieteni.FIRST..v_prieteni.LAST LOOP
  48.         DBMS_OUTPUT.put_line(v_prieteni(i).Nume);
  49.        
  50.         SELECT p.text, COUNT(l.data)
  51.         BULK COLLECT INTO v_text_likeuri
  52.         FROM postare p
  53.         join likes l
  54.         ON p.id = l.id_postare
  55.         WHERE p.id_utilizator = v_prieteni(i).ID
  56.         GROUP BY p.text;
  57.        
  58.         FOR j IN v_text_likeuri.FIRST..v_text_likeuri.LAST LOOP
  59.             DBMS_OUTPUT.put_line(v_text_likeuri(j).text || '  ' || v_text_likeuri(j).nrLikeuri);
  60.         END LOOP;
  61.     END LOOP;
  62.    
  63. END;    
  64. /
  65.  
  66. CREATE OR REPLACE TRIGGER t instead OF INSERT ON shares
  67.     referencing NEW AS nou OLD AS vechi
  68. DECLARE
  69.     CURSOR c IS
  70.     SELECT id_utilizator2 AS ID
  71.     FROM prieteni
  72.     WHERE id_utilizator1 = nou.id_utilizator_sursa;
  73.     v_prieteni_ids id_utilizator2%TYPE;
  74.     v_gasit INT := 0;
  75. BEGIN
  76.     FOR i IN c LOOP
  77.         IF (nou.id_destinatie = i.ID) THEN
  78.             v_gasit := 1;
  79.         END IF;
  80.     END LOOP;
  81.     IF (v_gasit = 0) THEN
  82.         raise_application_error(-20000,'NU');
  83.     END IF;
  84.     INSERT INTO shares VALUES (nou.id_utilizator_sursa, nou.id_utilizator_destinatie, nou.id_postare, nou.tip_destinatie);
  85. END;
  86. /
  87.  
  88. CREATE OR REPLACE TYPE lista_turisti IS TABLE OF turist.id%TYPE;
  89. ALTER TABLE excursie add participanti lista_turisti;
  90.  
  91. DECLARE
  92.     CURSOR exc IS
  93.     SELECT id_excursie FROM excursie;
  94.     v_coduri_turisti lista_turisti := lista_turisti();
  95.     CURSOR c IS
  96.     SELECT * FROM excursie
  97.     WHERE participanti.COUNT < 10;
  98. BEGIN
  99.     FOR i IN exc LOOP
  100.         v_coduri_turisti := lista_turisti();
  101.         SELECT a.cod_turist
  102.         BULK COLLECT INTO v_coduri_turisti
  103.         FROM excursie e
  104.         join achizitioneaza a
  105.         ON excursie.id_excursie = achizitioneaza.cod_excursie
  106.         WHERE e.id_excursie = i;
  107.         UPDATE excursie SET participanti = v_coduri_turisti WHERE id_excursie = i;
  108.        
  109.     END LOOP;
  110.    
  111.     FOR i IN c LOOP
  112.         UPDATE excursie SET este_anulata = 1 WHERE id_excursie = i.id_excursie;
  113.     END LOOP;
  114.    
  115. END;
  116. /
  117.  
  118.  
  119. CREATE OR REPLACE PROCEDURE ex2 (cod agentie.cod_agentie%TYPE) AS
  120.     CURSOR c IS
  121.     SELECT * FROM excursie
  122.     WHERE cod_agentie = cod;
  123.     nr_excursii INT := 0;
  124. BEGIN
  125.     FOR i IN c LOOP
  126.         nr_excursii := nr_excursii + 1;
  127.         DBMS_OUTPUT(i.pret || TO_CHAR(sysdate-i.data_inceput, 'DD') || i.numar_locuri - i.participanti.COUNT);
  128.     END LOOP;
  129.     dmbs_output(nr_excursii);
  130. END;
  131. /
  132.  
  133. CREATE OR REPLACE PROCEDURE ex3 (nume agentie.nume_agentie%TYPE) AS
  134.     cod_excursie excursie.id_excursie%TYPE;
  135.     cod_agentie agentie.id_agentie%TYPE;
  136.     id_turist turist.id_turist%TYPE;
  137. BEGIN
  138.    
  139.     SELECT id_agentie
  140.     INTO cod_agentie
  141.     FROM agentie
  142.     WHERE agentie.nume_agentie LIKE nume;
  143.    
  144.     SELECT id_excursie
  145.     INTO cod_excursie
  146.     FROM excursie
  147.     WHERE excursie.cod_agentie = cod_agentie AND pret =
  148.             (SELECT MAX(pret)
  149.              FROM excursie
  150.              WHERE excursie.cod_agentie = cod_agentie);
  151.              
  152.     SELECT t.id_turist
  153.     INTO id_turist
  154.     FROM turist t
  155.     join achizitioneaza a
  156.     ON a.cod_turist = t.id_turist
  157.     WHERE a.cod_excursie = cod_excursie AND varsta =
  158.     (SELECT MIN(t1.varsta)
  159.      FROM turist t1
  160.      join achizitioneaza a1
  161.      ON a1.cod_cutist = t1.id_turist
  162.      WHERE a1.cod_excursie = cod_excursie
  163.     );
  164. EXCEPTION
  165.     WHEN TOO_MANY_ROWS THEN
  166.         raise_application_error(-200001, 'Mai multe agentii cu acelasi nume');
  167.     WHEN NO_DATA_FOUND THEN
  168.         raise_application_error(-200002, 'Nu am gasit excursia cu pret maxim');
  169. END;
  170. /
  171.  
  172.  
  173. CREATE OR REPLACE TRIGGER t1 before INSERT ON achizitioneaza
  174. FOR each ROW
  175. DECLARE
  176.     v_exc excursie%ROWTYPE;
  177. BEGIN
  178.     SELECT *  
  179.     INTO v_exc
  180.     FROM excursie
  181.     WHERE id_excursie = :NEW.cod_excursie;
  182.     IF (v_exc.numar_locuri = v_exc.participanti.COUNT) THEN
  183.         raise_application_error(-20003, 'S-au epuizat locurile');
  184.     END IF;
  185. END;
  186. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement