Advertisement
Guest User

bd2013

a guest
May 29th, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Hay cuatro tablas en las cuales hay una bolsa, la bolsa es para tener solamente una pelota,
  2.    Para pasarse cosas entre las tablas debe haber un combustible (token).
  3.    El usuario debe poner cuantas transiciones quiere que haya (eso debe tenerse en cuenta de que,
  4.    para que hayan transiciones debe haber combustible.
  5.    Esta es una serie de triggers que se usaron para el ejercicio, cualquier consulta preguntar.
  6.    Hay partes que no estan bien (se van a dar cuenta porque se habra comentado o algo asi) */
  7.  
  8. /* CREACION DE TABLAS */
  9. CREATE TABLE A (
  10.    BUCKET                  INT4                 NULL
  11. );
  12.  
  13. CREATE TABLE B (
  14.    BUCKET                  INT4                 NULL
  15. );
  16.  
  17. CREATE TABLE C (
  18.    BUCKET                  INT4                 NULL
  19. );
  20.  
  21. CREATE TABLE D (
  22.    BUCKET                  INT4                 NULL
  23. );
  24.  
  25. CREATE TABLE STEP (
  26.    N                  INT4                 NULL
  27. );
  28.  
  29. CREATE TABLE TOKEN (
  30.    T                  INT4                 NULL
  31. );
  32.  
  33.  
  34. /*-----------------------------------------------------------------------*/
  35. /* Para la tabla token */
  36. CREATE OR REPLACE FUNCTION cons_token() RETURNS TRIGGER AS $cons_token$
  37. BEGIN
  38.     IF NEW.t IS NULL THEN
  39.         RAISE EXCEPTION 'token no se puede nulo';
  40.     END IF;
  41.  
  42.     IF NEW.t < 0 THEN
  43.         RAISE EXCEPTION 'token debe ser mayor o igual a cero';
  44.     END IF;
  45.  
  46.     --PARA QUE AL INSERTAR SOLAMENTE PUEDA INSERTAR UN ELEMENTO--
  47.     IF (TG_OP = 'INSERT') THEN
  48.         IF ((SELECT COUNT(t) FROM TOKEN) > 0) THEN
  49.             RAISE EXCEPTION 'solo un campo se puede insertar, favor actualizar';
  50.         END IF;
  51.     END IF;
  52.  
  53.     RETURN NEW;    
  54. END;
  55. $cons_token$ LANGUAGE plpgsql;    
  56.  
  57. CREATE TRIGGER cons_token BEFORE INSERT OR UPDATE ON TOKEN
  58.     FOR EACH ROW EXECUTE PROCEDURE cons_token();
  59.  
  60. /* Para la tabla step */
  61. /*-----------------------------------------------------------------------*/
  62. CREATE OR REPLACE FUNCTION cons_step() RETURNS TRIGGER AS $cons_step$
  63. BEGIN
  64.     IF NEW.n IS NULL THEN
  65.         RAISE EXCEPTION 'token no se puede nulo';
  66.     END IF;
  67.  
  68.     IF NEW.n < 1 THEN
  69.         RAISE EXCEPTION 'token debe ser mayor o igual a uno';
  70.     END IF;
  71.  
  72.     --PARA QUE AL INSERTAR SOLAMENTE PUEDA INSERTAR UN ELEMENTO--
  73.     IF (TG_OP = 'INSERT') THEN
  74.         IF ((SELECT COUNT(n) FROM step) > 0) THEN
  75.             RAISE EXCEPTION 'solo un campo se puede insertar, favor actualizar';
  76.         END IF;
  77.     END IF;
  78.  
  79. RETURN NEW;    
  80. END;
  81. $cons_step$ LANGUAGE plpgsql;    
  82.  
  83. CREATE TRIGGER cons_step BEFORE INSERT OR UPDATE ON STEP
  84.     FOR EACH ROW EXECUTE PROCEDURE cons_step();
  85.  
  86. /*-----------------------------------------------------------------------*/
  87. /* Para la tabla A */
  88. CREATE OR REPLACE FUNCTION trig_A() RETURNS TRIGGER AS $trig_A$
  89. DECLARE
  90.     numedelstep INT;   
  91. BEGIN
  92.     numedelstep := (SELECT n FROM STEP);
  93.     IF NEW.bucket IS NULL THEN
  94.         RAISE EXCEPTION 'no se puede nulo';
  95.     END IF;
  96.  
  97.     --ACA lo que hace es preguntar si es que la cantidad de filas en B es menor que
  98.     --C, eso quiere decir que hay algo que no envio todavia, sin necesidad de
  99.     --preguntar si es que el token esta en cero.
  100.     IF ((SELECT COUNT(bucket) FROM B) > (SELECT COUNT(bucket) FROM C)) THEN
  101.         --select bucket from B order by bucket desc limit 1;
  102.         --MI IDEA ERA LA SIGUIENTE, UTILIZAR PARA MOSTRAR LOS QUE ESTAN EN ESPERA
  103.         --QUE SEGURO ES LA ULTIMA DE B SI ES QUE TIENE ALGUNA EN ESPERA select espera();
  104.         RAISE EXCEPTION 'B tiene algo en espera EL NUMERO %', (SELECT bucket FROM B offset ((SELECT COUNT(bucket) FROM B)-1));
  105.     END IF;
  106.    
  107.     INSERT INTO B(bucket) VALUES (NEW.bucket + numedelstep);
  108.     RETURN NEW;    
  109. END;
  110. $trig_A$ LANGUAGE plpgsql;    
  111.  
  112. -- DROP TRIGGER IF EXISTS trig_1 ON T1;
  113. CREATE TRIGGER trig_A BEFORE INSERT OR UPDATE ON A
  114.     FOR EACH ROW EXECUTE PROCEDURE trig_A();
  115.  
  116. /*-----------------------------------------------------------------------*/
  117. /* Para la tabla B */
  118. CREATE OR REPLACE FUNCTION trig_B() RETURNS TRIGGER AS $trig_B$
  119. BEGIN
  120.     IF ((SELECT t FROM TOKEN) > 0)  THEN
  121.         INSERT INTO C(bucket) VALUES (NEW.bucket + (SELECT n FROM STEP));
  122.         UPDATE TOKEN SET t = t - 1;
  123.     END IF;
  124.     RETURN NEW;    
  125. END;
  126. $trig_B$ LANGUAGE plpgsql;
  127. CREATE TRIGGER trig_B BEFORE INSERT OR UPDATE ON B
  128.     FOR EACH ROW EXECUTE PROCEDURE trig_B();
  129.  
  130. /*-----------------------------------------------------------------------*/
  131. /* Para la tabla C */
  132. CREATE OR REPLACE FUNCTION trig_C() RETURNS TRIGGER AS $trig_C$
  133. BEGIN
  134.     INSERT INTO D(bucket) VALUES (NEW.bucket + (SELECT n FROM STEP));
  135.     RETURN NEW;    
  136. END;
  137. $trig_C$ LANGUAGE plpgsql;
  138. CREATE TRIGGER trig_C BEFORE INSERT OR UPDATE ON C
  139.     FOR EACH ROW EXECUTE PROCEDURE trig_C();
  140.  
  141. /*-----------------------------------------------------------------------*/
  142. /* Para el trigger */
  143. CREATE OR REPLACE FUNCTION trig_token() RETURNS TRIGGER AS $trig_token$
  144. DECLARE
  145.     num1 INT;
  146.     num2 INT;
  147. BEGIN
  148.     num1 := (SELECT COUNT(bucket) FROM B);
  149.     num2 := (SELECT COUNT(bucket) FROM C);
  150.     IF (NEW.t > 0) AND (num1 > num2) THEN
  151.         --inserta el ultimo del bucket de la tabla B + el n del step
  152. --** Sebastian Ortiz:comenté esta línea porque da error de sintaxis
  153.         --insert into C(bucket) values (select bucket from B offset ((select count(bucket) from B)-1) + (select n from STEP));
  154.         NEW.t = NEW.t - 1;      
  155.     END IF;
  156.     RETURN NEW;    
  157. END;
  158. $trig_token$ LANGUAGE plpgsql;
  159.  
  160. CREATE TRIGGER trig_token BEFORE UPDATE ON TOKEN
  161.     FOR EACH ROW EXECUTE PROCEDURE trig_token();
  162.  
  163. /*-----------------------------------------------------------------------*/
  164. /* Los respectivos selects */
  165. SELECT * FROM A;
  166. SELECT * FROM B;
  167. SELECT * FROM C;
  168. SELECT * FROM D;
  169. SELECT * FROM token;
  170. SELECT * FROM step;
  171.  
  172. TRUNCATE a,b,c,d;
  173.  
  174. /*-----------------------------------------------------------------------*/
  175. /* INSERTS / UPDATES */
  176. INSERT INTO token(t) VALUES (2);
  177. INSERT INTO step(n) VALUES (2);
  178. INSERT INTO A(bucket) VALUES (1);
  179. UPDATE token SET t = 1;
  180. INSERT INTO step(n) VALUES (1);
  181. INSERT INTO token(t) VALUES (1);
  182. DELETE FROM step WHERE n = 1;
  183.  
  184. /* FUNCION HAY ALGO ESPERANDO */
  185. CREATE OR REPLACE FUNCTION espera(OUT num INTEGER) RETURNS INTEGER AS $espera$
  186. DECLARE
  187.     num1 INT;
  188.     num2 INT;
  189. BEGIN
  190.     num1 := (SELECT COUNT(bucket) FROM B);
  191.     num2 := (SELECT COUNT(bucket) FROM C);
  192.     IF (num1 > num2) THEN
  193.         --ULTIMO ELEMENTO DE LA B
  194.         num := (SELECT bucket FROM B offset ((SELECT COUNT(bucket) FROM B)-1));
  195.     END IF;
  196. END;
  197. $espera$ LANGUAGE plpgsql;
  198.  
  199.  
  200. TRUNCATE TABLE a; TRUNCATE TABLE b; TRUNCATE TABLE c; TRUNCATE TABLE d;
  201. TRUNCATE TABLE step; TRUNCATE TABLE token;
  202.  
  203.  
  204. INSERT INTO token (t) VALUES (-1);
  205. INSERT INTO step (n) VALUES (-1);
  206.  
  207.  
  208. SELECT 'token ', t, '' FROM token UNION ALL SELECT 'step ', n, '' FROM step UNION ALL
  209. SELECT 'a ', bucket, '' FROM a UNION ALL SELECT 'b ', bucket, '' FROM b UNION ALL
  210. SELECT 'c ', bucket, '' FROM c UNION ALL SELECT 'd ', bucket, '' FROM d;
  211.  
  212. TRUNCATE TABLE a; TRUNCATE TABLE b; TRUNCATE TABLE c; TRUNCATE TABLE d;
  213. TRUNCATE TABLE step; TRUNCATE TABLE token;
  214.  
  215. INSERT INTO token (t) VALUES (1);
  216. INSERT INTO step (n) VALUES (3);
  217.  
  218. INSERT INTO a (bucket) VALUES (1);
  219.  
  220. SELECT 'token ', t, '' FROM token UNION ALL SELECT 'step ', n, '' FROM step UNION ALL
  221. SELECT 'a ', bucket, '' FROM a UNION ALL SELECT 'b ', bucket, '' FROM b UNION ALL
  222. SELECT 'c ', bucket, '' FROM c UNION ALL SELECT 'd ', bucket, '' FROM d;
  223.  
  224. INSERT INTO a (bucket) VALUES (100);
  225.  
  226. SELECT 'token ', t, '' FROM token UNION ALL SELECT 'step ', n, '' FROM step UNION ALL
  227. SELECT 'a ', bucket, '' FROM a UNION ALL SELECT 'b ', bucket, '' FROM b UNION ALL
  228. SELECT 'c ', bucket, '' FROM c UNION ALL SELECT 'd ', bucket, '' FROM d;
  229.  
  230. INSERT INTO a (bucket) VALUES (200);
  231.  
  232. SELECT 'token ', t, '' FROM token UNION ALL SELECT 'step ', n, '' FROM step UNION ALL
  233. SELECT 'a ', bucket, '' FROM a UNION ALL SELECT 'b ', bucket, '' FROM b UNION ALL
  234. SELECT 'c ', bucket, '' FROM c UNION ALL SELECT 'd ', bucket, '' FROM d;
  235.  
  236. UPDATE token SET t = 2;
  237.  
  238. SELECT 'token ', t, '' FROM token UNION ALL SELECT 'step ', n, '' FROM step UNION ALL
  239. SELECT 'a ', bucket, '' FROM a UNION ALL SELECT 'b ', bucket, '' FROM b UNION ALL
  240. SELECT 'c ', bucket, '' FROM c UNION ALL SELECT 'd ', bucket, '' FROM d;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement