tsunamigue

PL/SQL

Apr 21st, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 8.12 KB | None | 0 0
  1. -- MySQL programación
  2. -- http://dev.mysql.com/doc/refman/5.0/es/create-procedure.html
  3.  
  4. CREATE PROCEDURE sp_name ([parameter[,...]])
  5.     [characteristic ...] routine_body
  6.  
  7. CREATE FUNCTION sp_name ([parameter[,...]])
  8.     RETURNS TYPE
  9.     [characteristic ...] routine_body
  10.  
  11. parameter:
  12.     [ IN | OUT | INOUT ] param_name TYPE
  13.  
  14. TYPE:
  15.     ANY valid MySQL data TYPE
  16.  
  17. characteristic:
  18.     LANGUAGE SQL
  19.   | [NOT] DETERMINISTIC
  20.   | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  21.   | SQL SECURITY { DEFINER | INVOKER }
  22.   | COMMENT 'string'
  23.  
  24. routine_body:
  25.     procedimientos almacenados o comandos SQL válidos
  26.  
  27.  
  28.  
  29.  
  30. -- DROP PROCEDURE y DROP FUNCTION
  31.  
  32. DELIMITER $$
  33. DROP {PROCEDURE | FUNCTION} [IF EXISTS] holamundo$$
  34. CREATE PROCEDURE holamundo()
  35. BEGIN
  36. SELECT 'hola mundo';
  37. END $$
  38.  
  39.  
  40. -- EJEMPLO
  41.  
  42. DELIMITER $$
  43.  
  44. CREATE DEFINER=`dam`@`%` FUNCTION `MACarmonaimpar`(numero INT) RETURNS INT
  45. BEGIN
  46.     DECLARE impar INT;
  47. IF MOD(numero,2)=0 THEN
  48.         SET impar=0;
  49. ELSE
  50.         SET impar=1;
  51. END IF;
  52. RETURN (impar);
  53.     END$$
  54.  
  55. DELIMITER ;
  56.  
  57.  
  58.  
  59. ---
  60.  
  61. DELIMITER $$
  62. CREATE FUNCTION estado (in-estado CHAR(1))
  63. RETURN VARCHAR(25)
  64. BEGIN
  65.     DECLARE estado VARCHAR(25);
  66.     IF in_estado='p' THEN
  67.         SET estado='pagado';
  68.     ELSEIF in_estado='c' THEN
  69.         SET estado='cobrado';
  70.     ELSEIF in_estado='e' THEN
  71.         SET estado='enviado'
  72.     END IF
  73.     RETURN (estado);
  74. END;
  75. $$
  76.  
  77.  
  78. --
  79.  
  80.  
  81. DELIMITER $$
  82. DROP PROCEDURE IF EXISTS m_estado $$
  83. CREATE PROCEDURE m_estado (IN numero INT)
  84. BEGIN
  85.     IF (esimpar(numero)) THEN
  86.         SELECT CONCAT(numero, " es impar");
  87.     ELSE
  88.         SELECT CONCAT(numero, " es par");
  89.     ENDIF;
  90.     END;   
  91.     $$
  92.  
  93.  
  94. CONDICIONALES
  95. --------------
  96. IF search_condition THEN statement_list
  97.     [ELSEIF search_condition THEN statement_list] ...
  98.     [ELSE statement_list]
  99. END IF
  100.  
  101.  
  102.  
  103.  
  104. -- CASE
  105. ---------
  106. CASE case_value
  107.     WHEN when_value THEN statement_list
  108.     [WHEN when_value THEN statement_list] ...
  109.     [ELSE statement_list]
  110. END CASE
  111. O:
  112.  
  113. CASE
  114.     WHEN search_condition THEN statement_list
  115.     [WHEN search_condition THEN statement_list] ...
  116.     [ELSE statement_list]
  117. END CASE
  118.  
  119.  
  120. -- LOOPS
  121. ---------
  122.  
  123.  
  124. -- Simple
  125.  
  126. [begin_label:] LOOP
  127.     statement_list
  128.  LEAVE label1; -- < --  Para salir
  129. END LOOP [end_label]
  130.  
  131. -- Ejemplo
  132.  
  133. CREATE PROCEDURE doiterate(p1 INT)
  134. BEGIN
  135.   label1: LOOP
  136.     SET p1 = p1 + 1;
  137.     IF p1 < 10 THEN
  138.       ITERATE label1;
  139.     END IF;
  140.     LEAVE label1;
  141.   END LOOP label1;
  142.   SET @x = p1;
  143. END;
  144.  
  145.  
  146. -- Repeat
  147.  
  148. [begin_label:] REPEAT
  149.     statement_list
  150. UNTIL search_condition
  151. END REPEAT [end_label]
  152.  
  153.  
  154. -- Ejemplo
  155.  
  156. mysql> CREATE PROCEDURE dorepeat(p1 INT)
  157.     -> BEGIN
  158.     ->   SET @x = 0;
  159.     ->   REPEAT
  160.     ->     SET @x = @x + 1;
  161.     ->   UNTIL @x > p1 END REPEAT;
  162.     -> END
  163.     -> //
  164.  
  165. -- While
  166.  
  167. [begin_label:] WHILE search_condition DO
  168.     statement_list
  169. END WHILE [end_label]
  170.  
  171.  
  172. -- Ejemplo
  173.  
  174. CREATE PROCEDURE dowhile()
  175. BEGIN
  176.   DECLARE v1 INT DEFAULT 5;
  177.  
  178.   WHILE v1 > 0 DO
  179.     ...
  180.     SET v1 = v1 - 1;
  181.   END WHILE;
  182. END;
  183.  
  184. --Case/When
  185. -------------
  186.  
  187. CASE case_value
  188.     WHEN when_value THEN statement_list
  189.     [WHEN when_value THEN statement_list] ...
  190.     [ELSE statement_list]
  191. END CASE
  192.  
  193.  
  194. -- O
  195.  
  196. CASE
  197.     WHEN search_condition THEN statement_list
  198.     [WHEN search_condition THEN statement_list] ...
  199.     [ELSE statement_list]
  200. END CASE
  201.  
  202.  
  203.  
  204. -- Cursor
  205. -----------
  206. OPEN
  207. FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
  208. CLOSE
  209.  
  210.  
  211.  
  212. DECLARE cursor1 CURSOR FOR
  213.     SELECT titulo, contenido, fecha
  214.     FROM noticia;
  215. ----
  216. DELIMITER $$
  217.  
  218. CREATE PROCEDURE build_email_list (INOUT email_list VARCHAR(4000))
  219. BEGIN
  220.  
  221.     DECLARE v_finished INTEGER DEFAULT 0;
  222.         DECLARE v_email VARCHAR(100) DEFAULT "";
  223.  
  224.     -- declare cursor for employee email
  225.     DECLARE email_cursor CURSOR FOR
  226.         SELECT email FROM employees;
  227.  
  228.     -- declare NOT FOUND handler
  229.     DECLARE CONTINUE HANDLER
  230.         FOR NOT FOUND SET v_finished = 1;
  231.  
  232.     OPEN email_cursor;
  233.  
  234.     get_email: LOOP
  235.  
  236.         FETCH email_cursor INTO v_email;
  237.  
  238.         IF v_finished = 1 THEN
  239.             LEAVE get_email;
  240.         END IF;
  241.  
  242.         -- build email list
  243.         SET email_list = CONCAT(v_email,";",email_list);
  244.  
  245.     END LOOP get_email;
  246.  
  247.     CLOSE email_cursor;
  248.  
  249. END$$
  250.  
  251. DELIMITER ;
  252.  
  253.  
  254.  
  255.  
  256. SET @email_list = "";
  257. CALL build_email_list(@email_list);
  258. SELECT @email_list;
  259.  
  260.  
  261.  
  262. -- Handler
  263. ------------
  264.  
  265. DECLARE CONTINUE HANDLER FOR
  266.     NOT FOUND SET L_last_row_fetched=1;
  267.  
  268.  
  269. DECLARE $$
  270. CP c3()
  271. BEGIN
  272.     DEC temp VAR(30);
  273.     DEC lrf BOOLEAN;
  274.     DEC nn INT;
  275.     DEC C2 CURSOR FOR SELECT titulo FROM algo;
  276.     DEC CONTINUE HANDLER FOR NOT FOUND
  277.     SET lrf=1; SET nn=0;
  278.     OPEN C2;
  279.     l_cursor:LOOP
  280.         FETCH C2 INTO tmp;
  281.         SET nn=nn+1:
  282.         IF lrf=1 THEN
  283.             LEAVE l_cursor;
  284.         END IF;
  285.     END LOOP l_cursor;
  286.     CLOSE C2;
  287.     SELECT nn;
  288.     END;$$
  289.  
  290. ---------------------------------------ELIMINACIÓN Y CONSULTA----------------------------------------------------
  291.  
  292. DROP {PROCEDURE | FUNCTION } IF EXISTS rutina
  293. SHOW  {PROCEDURE | FUNCTION } STATUS [LIKE 'patron']
  294. SHOW CREATE rutina
  295. ---------------------------------------EJEMPLO CURSOR LOOP----------------------------------------------------
  296. DELIMITER $$
  297.  
  298. CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `noticias_autor`()
  299.     READS SQL DATA
  300. BEGIN
  301.         DECLARE vautor , na_cont INT;
  302.         DECLARE fin BOOL;
  303.         DECLARE autor_cursor CURSOR FOR
  304.                 SELECT id_autor FROM autor;
  305.         DECLARE noticia_cursor CURSOR FOR
  306.                 SELECT autor FROM noticias
  307.                 WHERE autor=vautor;
  308.         DECLARE CONTINUE HANDLER FOR
  309.                 NOT FOUND SET fin=1;
  310.         SET na_cont=0;
  311.         OPEN autor_cursor;
  312.         autor_loop: LOOP
  313.                 FETCH autor_cursor INTO vautor;
  314.                 IF fin=1 THEN
  315.                         LEAVE autor_loop;
  316.                 END IF;
  317.         OPEN noticia_cursor;
  318.         SET na_cont=0;
  319.         noticias_loop : LOOP
  320.                 FETCH noticia_cursor INTO vautor;
  321.                 IF fin=1 THEN
  322.                         LEAVE noticias_loop;
  323.                 END IF;
  324.         SET na_cont=na_cont+1;
  325.         END LOOP noticias_loop;
  326.         CLOSE noticia_cursor;
  327.         SET fin=0;
  328.         SELECT CONCAT ('El autor ', vautor, ' tiene ', na_cont , ' noticias.');
  329.         END LOOP autor_loop;
  330.         CLOSE autor_cursor;
  331. END
  332.  
  333.  
  334.  
  335.  
  336.  
  337. -- Handler
  338. DECLARE (CONTINUE | EXIT) HANDLER FOR
  339.     (SQL STATE sqlatate_code  | MySQL error_code | condicion_nombre)
  340.     handler_actions
  341.  
  342. EXIT: Bloque termina. Si bloque principal -> proceimiento termina-> devuelve control a procedimiento/prog externo
  343. CONTINUE: Continua en la declaracion siguiente donde ocasionó el error.
  344.  
  345. Ej:
  346. DECLARE CONTINUE HANDLER FOR  1062 SET DUPLICATE_KEY =1 ;
  347. -   -   -    FOR SQLSTATE '2300' SET -  -
  348.  
  349.  
  350.  
  351.  
  352. Ejemplo:
  353.  
  354. DELIMETER $$
  355. CREATE PROCEDURE inserta_autor (pautor int, plogin VARCHAR(45))
  356. MODIFIES SQLDATE
  357. BEGIN
  358. DECLARE duplicate_key INT DEFAULT 0;
  359.     BEGIN
  360.     DECLARE EXIT HANDLER FOR 1062
  361.     SET duplicate_key=1;
  362.     INSERT INTO autors (id_autorm login) VALUES
  363.         (pautor, plogin);
  364.     END;   
  365. IF duplicate_key=1 THEN
  366.     SELECT CONCAT('ERROR, CLAVE DUPLICADA') AS 'Resultado'
  367. ELSE
  368.     SELECT CONCAT('Autor ', plogin, ' creado') AS 'Resultado';
  369. ENDIF;
  370. END;$$
  371.  
  372.  
  373.  
  374.  
  375. -- TRIGGERS
  376.  
  377. se activa (INSERT, UPDATE, DELETE)
  378.  
  379. CREATE TRIGGER nombre
  380.     BEFORE INSERT SET @SUM=@SUM+NEW.cantidad
  381.  
  382. CREATE TRIGER nombre (BEFORE | AFTER) (INSERT | UPDATE | DELETE)
  383.     ON tabla FOR EACH ROW sentencias
  384.  
  385.  
  386. -- EJEMPLO
  387.  
  388. DELIMETER $$
  389. CREATE TRIGGER comp_saldo
  390.     BEFORE UPDATE ON MOVIMIENTO
  391.     FOR EACH ROW
  392.     BEGIN
  393.         IF NEW.cantidad<0 THEN
  394.             SET NEW.cantidad=0;
  395.         ELSEIF NEW.cantidad>100 THEN
  396.             SET NEW.cantidad=100;
  397.         END IF;
  398.     END;$$
  399.  
  400.  
  401.  
  402.  
  403. DELIMETER $$
  404. CREATE TRIGGER actuadas
  405.     BEFORE INSERT ON MOVIMIENTO
  406.     FOR EACH ROW
  407.     BEGIN
  408.         UPDATE cuenta SET saldo=saldo+NEW.cantidad WHERE cod_cuenta=OLD.cod_cuenta;
  409.     END;$$
  410.  
  411.  
  412.  
  413. DELIMETER $$
  414. CREATE TRIGGER ASDD
  415.     AFTER INSERT ON movimiento
  416.     FOR EACH ROW
  417.     BEGIN
  418.         IF existe(MOTH(NEW.fecha),idia)) =0 THEN
  419.             INSERT INTO idia (cantidad, fecha)
  420.             VALUES (NEW.cantidad, NEW.fecha);
  421.         ELSE UPDATE idia SET cantidad = NEW.cantidad+cantidad WHERE mes=MONTH(NEW.fecha);
  422.         ENDIF;
  423.     END;$
Advertisement
Add Comment
Please, Sign In to add comment