MySQLのストアド・プロシージャと関数
1.ストアド・プロシージャと関数
ストレージ・プロシージャと関数は、事前にコンパイルされてデータベースに格納されているSQL文の集合であり、ストレージ・プロシージャと関数を呼び出すことで、アプリケーション開発者の多くの作業を簡素化し、データベースとアプリケーション・サーバ間のデータの転送を低減し、データ処理の効率を向上させることができます.関数:戻り値が必要です.パラメータはINタイプのストレージ関数のみです.戻り値がありません.パラメータはIN,OUT,INOUTタイプを使用できます.他のタイプのデータベースからMySQLに移行する関数がある場合は、関数をストレージ・プロシージャに変更する必要があります.
2.ストアド・プロシージャと関数の関連操作作成、修正
MySQLのストアド・プロシージャおよび関数には、DDL文を含めることができ、ストアド・プロシージャでコミット(Commit、確認前の変更)またはロールバック(Rollback、つまり放棄前の変更)を実行することもできますが、ストアド・プロシージャおよび関数ではload data infile文を実行することはできません.また、ストアド・プロシージャおよび関数では、他のプロシージャまたは関数を呼び出すことができます.
ストレージ・プロシージャと関数は、事前にコンパイルされてデータベースに格納されているSQL文の集合であり、ストレージ・プロシージャと関数を呼び出すことで、アプリケーション開発者の多くの作業を簡素化し、データベースとアプリケーション・サーバ間のデータの転送を低減し、データ処理の効率を向上させることができます.関数:戻り値が必要です.パラメータはINタイプのストレージ関数のみです.戻り値がありません.パラメータはIN,OUT,INOUTタイプを使用できます.他のタイプのデータベースからMySQLに移行する関数がある場合は、関数をストレージ・プロシージャに変更する必要があります.
2.ストアド・プロシージャと関数の関連操作
create procedure sp_name([proc_parameter[,...]])
[characteristic ...] routine_body
create function sp_name([func_parameter[,...]])
returns type
[characteristic ...]routine_body
proc_parameter:
[IN\OUT\INOUT] param_name type
func_parameter:
param_name type
type:
any valid mysql data type
characteristic:
language sql
|[not] deterministic
|{contains sql| not sql |reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment 'string'
routine_body:
valid sql procedure statement or statements
alter {procedure|function} sp_name[characteristic ...]
characteristic:
{contains sql|no sql | reads sql data| modifies sql data}
|sql security {definer|invoker}
|comment 'string'
//
call sp_name([parameter[,...]])
MySQLのストアド・プロシージャおよび関数には、DDL文を含めることができ、ストアド・プロシージャでコミット(Commit、確認前の変更)またはロールバック(Rollback、つまり放棄前の変更)を実行することもできますが、ストアド・プロシージャおよび関数ではload data infile文を実行することはできません.また、ストアド・プロシージャおよび関数では、他のプロシージャまたは関数を呼び出すことができます.
//
delimiter $$ // ”$$“
create procedure film_in_stock( IN p_film_id int,IN p_store_id int,out p_film_count int)
reads sql data
begin
select inventory_id
from inventory
where film_id = p_film_id
and store_id = p_store_id
and inventory_in_stock(inventory_id);
select found_rows() into p_film_count;
end $$
Query OK,0 rows affected(0.00sec)
delimiter ;// ”;“