2010 06 Stored Code
2010 06 Stored Code
Sheeri K. Cabral
At ODTUG Kaleidoscope 2010
Who I Am
MySQL DBA
2009/2010 Pythian
No pl/sql
Stored Routines
Stored procedures
Stored functions
Views
Triggers
Triggers
Invoked automatically
BEFORE, AFTER
TRUNCATE
DROP
REPLACE
insert
Creating a trigger
TRIGGER privilege
Conflicts
BEFORE / AFTER
Sample Trigger
CREATE TRIGGER staff_update_date
BEFORE INSERT ON staff
FOR EACH ROW
SET NEW.create_date = NOW();
NEW
OLD
BEFORE INSERT
BEFORE UPDATE
AFTER UPDATE
AFTER DELETE
NONE
AFTER INSERT
BEFORE DELETE
Dropping a Trigger
Will be using ;
Changing a Trigger
No ALTER TRIGGER
SELECT * FROM
INFORMATION_SCHEMA.TRIGGERS WHERE
TRIGGER_SCHEMA='db_name' AND
TRIGGER_NAME='trg_name'
SHOW CREATE TRIGGER trg_name;
Views
Temporary tables
sql_mode
Same as creator
Permissions
CREATE DEFINER=[ user@host | CURRENT_USER() ]
TRIGGER trg_name
[ BEFORE | AFTER ] [ INSERT|UPDATE|DELETE]
ON tbl_name FOR EACH ROW BEGIN END;
Finding Triggers
SELECT * FROM
INFORMATION_SCHEMA.TRIGGERS WHERE
TRIGGER_SCHEMA='db_name';
SHOW TRIGGERS;
SHOW TRIGGERS FROM 'db_name';
SHOW TRIGGERS LIKE 'trg_name';
Statement-based replication
Row-based replication
Triggers Cannot:
Triggers Cannot:
Use prepared statement commands
PREPARE, EXECUTE, DEALLOCATE PREPARE
Use RETURN
Stored Routines
Performance
Stored procedure
Stored function
Similar to Triggers
DELIMITER |
CREATE PROCEDURE store_offerings
(IN p_store_id TINYINT UNSIGNED, OUT
p_count INT UNSIGNED)
SELECT COUNT(*) INTO p_count
FROM inventory WHERE
store_id=p_store_id; |
DELIMITER ;
No Input/Output
DELIMITER |
CREATE PROCEDURE update_all_staff_time ()
UPDATE staff
SET last_update=NOW() WHERE 1=1; |
DELIMITER ;
INOUT arguments
DELIMITER |
CREATE PROCEDURE increment_counter
(INOUT p_count INT UNSIGNED)
BEGIN SET p_count:=p_count+1;
END |
DELIMITER ;
Local variables
DELIMITER |
CREATE PROCEDURE pct_increase
(INOUT p_int INT, IN p_incr INT,
OUT p_pct_incr DECIMAL (5,2))
BEGIN DECLARE p_int_new INT;
SET p_int_new := p_int + p_incr;
SET p_pct_incr := (p_int_new-p_int) /
p_int * 100;
SET p_int:=p_int_new;
END |
DELIMITER ;
sql_mode
charset
collation
Security
DEFINER and SQL SECURITY
CREATE
[ DEFINER = {user@host |
CURRENT_USER} ]
PROCEDURE p_name ( [param list] )
[SQL SECURITY
BEGIN END
{ DEFINER | INVOKER }
COMMENT
[ NOT ] DETERMINISTIC
SQL usage
Stored Function
cond_stmt
condition_name
Example
DELIMITER |
CREATE PROCEDURE pct_incr (INOUT p_int
INT, IN p_incr INT, OUT p_pct_incr DECIMAL
(5,2))
BEGIN DECLARE p_int_new INT UNSIGNED;
DECLARE CONTINUE HANDLER FOR 1265 SET
@warn_count:@warn_count+1;
SET p_int_new:=p_int+p_incr
SET p_pct_incr:=(p_int_new-p_int)/p_int *
100;
SET p_int:=p_int_new;
SELECT p_int, p_pct_incr, @warn_count;
END |
DELIMITER ;
Conditions
DECLARE condition_name CONDITION FOR
{mysql_err_code | SQLSTATE [VALUE]
sqlstate }
Instead of
DECLARE CONTINUE HANDLER FOR 1265 SET
@warn_count:=@warn_count+1;
DECLARE data_truncation CONDITION FOR
1265;
DECLARE CONTINUE HANDLER FOR
data_truncation SET
@warn_count:=@warn_count+1;
Loops
[label:] WHILE condition
DO statement_list
END WHILE [label]
[label:] REPEAT statement_list
UNTIL condition
END REPEAT [label]
Loops
[label:] LOOP
statement_list
END LOOP [label]
ITERATE label
LEAVE label
Cursors
DECLARE cursor_name CURSOR FOR
select_stmt;
OPEN cursor_name;
FETCH cursor_name INTO var_name [,
var_name]
CLOSE cursor_name;
Example cursor
DELIMITER |
CREATE PROCEDURE check_actors()
BEGIN DECLARE cur_actor SMALLINT UNSIGNED;
DECLARE film_count INT UNSIGNED;
DECLARE done,actor_count INT UNSIGNED DEFAULT 0;
DECLARE c_all_actors CURSOR FOR SELECT actor_id
FROM actor;
OPEN c_all_actors;
WHILE done=0 DO
FETCH c_all_actors INTO cur_actor;
SET actor_count:=actor_count+1;
SELECT COUNT(*) INTO film_count FROM film_actor
WHERE actor_id=cur_actor;
END WHILE;
CLOSE c_all_actors;
SELECT actor_count;
END |
DELIMITER ;
Views
Post with links to play/download video,
download slides, notes:
http://www.technocation.org/node/621