Использование хранимых процедур в MySQL (Константин Осипов)

  • Upload
    ontico

  • View
    1.985

  • Download
    6

Embed Size (px)

Citation preview

(). 3 .

MySQL

Highload++, 26 2010 , [email protected]

: http://forge.mysql.com/tools/tool.php?id=263

( forge.mysql.com, Newest code examples , ).

0 1 2 3 4 5 Dynamic SQL6 SQL/PSM8 9

SQL/PSM

1991 . (Melton, Bauer, Eisenberg)

Ada

ANSI/ISO 1996 .

IBM DB2 MySQL. Microsoft , Oracle, PostgreSQL .

Ada

procedure Demo is type SMALLINT is range 0..256; Idx : SMALLINT; Cnt : SMALLINT:= 10;begin-- Idx := 1;named: loop -- Put_Line("In the loop"); Idx := Idx + 1; if Idx = Cnt then Idx := -Idx; end if; if Idx + Cnt = 0 then exit named; end if; end loop named;exception when Constraint_Error => Put_Line("Error");end;

SQL/PSM vs. Ada

SQL/PSM

create procedure Demo()begin declare Idx SMALLINT UNSIGNED; declare Cnt SMALLINT UNSIGNED default 10; declare exit handler for sqlstate "22003" select "Error";-- set Idx = 1;named: loop -- select "In the loop" as ""; set Idx = Idx + 1; if Idx = Cnt then set Idx = -Idx; end if; if Idx + Cnt = 0 then leave named; end if; end loop;end|

Ada

procedure Demo is type SMALLINT is range 0..256; Idx : SMALLINT; Cnt : SMALLINT:= 10;begin-- Idx := 1;named: loop -- Put_Line("In the loop"); Idx := Idx + 1; if Idx = Cnt then Idx := -Idx; end if; if Idx + Cnt = 0 then exit named; end if; end loop named;exception when Constraint_Error => Put_Line("Error");end;

Oracle PL/SQL vs. Ada

Oracle PL/SQL

create procedure Demois Idx POSITIVE; Cnt POSITIVE default 10;begin-- Idx := 1;

loop -- dbms_output.put_line("In the loop"); Idx := Idx + 1; if Idx = Cnt then set Idx := -Idx; end if; if Idx + Cnt = 0 then exit named; end if; end loop; exception when VALUE_ERROR then dbms_output.put_line("Error");end;

SQL/PSM

, SQL

c

c

4 : PROCEDURE, FUNCTION, TRIGGER, EVENT

SQL/PSM (1)

sp_sql::= create | drop | call | alter *create::= CREATE [DEFINER= user] PROCEDURE name([param_desc[,...]]) [characteristic ...] sp_bodydrop::= DROP PROCEDURE namecall::= CALL name ([parameter[,...]])* CALL name , , [] ,...

SQL/PSM: (2)

create::= CREATE [DEFINER= user] PROCEDURE name([param_desc[,...]]) [characteristic ...] sp_bodyparam_desc::= [ IN | OUT | INOUT ] name typesp_body::= sp_stmt sp_stmt::= simple_sql | if | case | loop | while | repeat | return | leave | open | fetch | close | [label:] BEGIN [sp_decl;[...]] [sp_stmt;[...]] ENDsimple_sql::= SELECT | INSERT | SET | CALL | ...

SQL/PSM (3):

sf_sql::= create | drop | altercreate::= CREATE [DEFINER= user] FUNCTION name([func_param_desc[,...]]) RETURNS type CALL p_proc() -> INSERT

SQL/PSM:

SQL/PSM: (2)

sp_decl::= ... DECLARE name CONDITION FOR cond_desc |DECLARE {CONTINUE|EXIT} HANDLER FOR hand_desc sp_stmthandler_desc::= NOT FOUND | SQLWARNING | SQLEXCEPTION | errcode | SQLSTATE [VALUE] "sqlstate"

CONTINUE HANDLER IGNORE

REPLACE INSERT ON DUPLICATE KEY UPDATE

SQL/PSM:

INVOKER/DEFINER

SQL

statement-based SQL/PSM

SQL/PSM: (characteristic)

characteristic::= [NOT*] DETERMINISTIC | {CONTAINS|NO SQL} SQL | {MODIFIES|READS} SQL DATA | SQL SECURITY {DEFINER|INVOKER}

* NOT

Dynamic SQL

SQL PS: PREPARE name FROM "sql";EXECUTE name USING @uservar[,...];DEALLOCATE PREPARE name;

, uservars -

credentials

SQL/PSM:

Unrolling :mysql> call load_daily_log(curdate());mysql> show binlog events;

DO(f1())

black box

5.1: mixed mode

5.0:

--log-bin-trust-function-creators

SQL/PSM (3):

trg_sql::= create | dropcreate::= CREATE [DEFINER= user] TRIGGER name {BEFORE|AFTER} {INSERT|UPDATE|DELETE} FOR EACH ROW sp_bodydrop::= DROP TRIGGER [IF EXISTS] name

SQL/PSM (3):

ev_sql::= create | drop | altercreate::= CREATE [DEFINER= user] EVENT name ON SCHEDULE schedule DO sp_bodydrop::= DROP EVENT nameschedule::= AT timespec | EVERY interval [STARTS timespec] [ENDS timespec]

: LOCK TABLES

:transactional control (Implicit and Explicit)

SELECT/SHOW

FLUSH statements

no cascading modifications on the same resource

RFE

SQL (CHECK TABLE!)

LIMIT ( 5.5)

FOR

Dynamic SQL

Dynamic SQL

...

SQL/PSM

1)

Pac-man

SQL/PSM

2)

SQL/PSM

3)

SQL/PSM

4) UPDATE

!



[email protected]

Guy Harrison MySQL Stored procedures - , MySQL - http://oreilly.com/catalog/mysqlspp

MySQL Stored Procedures FAQ - http://dev.mysql.com/doc/refman/5.5/en/faqs-stored-procs.htm

- - http://www.brainbell.com/tutorials/MySQL/Using_Stored_Procedures.htm

Giuseppe Maxia - http://www.nongnu.org/mysql-sr-lib/

MySQL.com: - http://forums.mysql.com/read.php?98,222900,222900#msg-222900

MySQL INFORMATION_SCHEMA -- http://www.xcdsql.org/MySQL/information_schema/5.1/MySQL_5_1_INFORMATION_SCHEMA.html

MySQL SQL/PSM: http://www.mydebugger.com http://www.devart.com/dbforge/mysql/studio/code-debugger.html

(1)

Guy Harrison MySQL Stored procedures - , MySQL - http://oreilly.com/catalog/mysqlspp

(2)

Giuseppe Maxia - http://www.nongnu.org/mysql-sr-lib/

(3)

MySQL INFORMATION_SCHEMA -- http://www.xcdsql.org/MySQL/information_schema/5.1/MySQL_5_1_INFORMATION_SCHEMA.html

(4)

MySQL SQL/PSM: http://www.mydebugger.com

Click to edit the title text format

Click to edit the notes format

Page