MySQLのストアド・プロシージャprocedureと関数functionの違いと使用方法

8755 ワード

ストレージ・プロシージャと関数の違い
本質的に区別はなく、実行の本質は同じです.ただし、関数には、1つの変数のみを返す制限があります.ストレージ・プロシージャは複数を返すことができます.関数はsqlに埋め込むことができて、selectの中で呼び出すことができて、ストレージの過程はsqlのqueryを実行することができて、mysql_を必要としますreal_接続の最後のパラメータをCLIENT_に設定MULTI_STATEMENTS. 関数の制限は、テンポラリ・テーブルが使用できない、テーブル変数しか使用できない、関数が使用できないなど、多くありますが、ストレージ・プロシージャの制限は相対的に少ないです.特性の違いは以下の通りである:1)一般的に,ストレージプロセスで実現される機能は複雑であるが,関数の実現の機能は的確である.ストレージ・プロシージャは、テーブルの変更など、一連のデータベース操作を実行できる強力な機能を備えています.ユーザー定義関数は、グローバル・データベースのステータスを変更する一連の操作を実行するために使用できません.2)ストレージ・プロシージャでは、レコード・セットなどのパラメータを返すことができ、関数では値またはテーブル・オブジェクトのみを返すことができます.関数は1つの変数しか返されません.ストレージ・プロシージャは複数を返すことができます.ストアド・プロシージャのパラメータには、IN、OUT、INOUTの3種類がありますが、関数にはINクラス~~ストアド・プロシージャ宣言時に戻りタイプは必要ありません.関数宣言時に戻りタイプを記述する必要があります.また、関数体には有効なRETURN文が含まれている必要があります.
3)ユーザー定義関数本体に非確定関数を内蔵してはいけない非確定関数を使用することができるストアド・プロシージャ.
4)記憶プロセスは一般に独立した部分として実行される(EXECUTE文実行)が、関数はクエリ文の一部として呼び出される(SELECT呼び出し).関数はテーブルオブジェクトを返すことができるので、クエリ文の中でFROMキーワードの後ろに位置することができる.SQL文では、ストアド・プロシージャは使用できません.関数は使用できます.SQL Managerは、ストアド・プロシージャと関数が実行されると、対応するクエリー・ステートメントをprocedure cacheに取り出します.procedure cacheに対応するクエリー・ステートメントがない場合、ストアド・プロシージャと関数をコンパイルします.Procedure cacheには実行計画(execution plan)が保存されており、コンパイルが完了するとprocedure cacheのexecution planが実行され、SQL SERVERは各execution planの実情に基づいてcacheにこのplanを保存するかどうかを考慮し、評価の基準はこのexecution planが使用可能な頻度である.次に,このplanを生成する代価,すなわちコンパイルにかかる時間である.cacheに保存されているplanは、次回の実行時にコンパイルする必要はありません.
MYSqlストレージ・プロシージャの役割と構文
作用:1、使用したことがあって過程を保存して、多くの類似性の削除、更新、新しいなどの操作は楽になって、しかも後で管理しやすいです!2、ストレージプロセスはSQL文が既にプリコーディングされているため、実行速度が比較的速い.3.ストアド・プロシージャは、パラメータ、出力パラメータ、単一または複数の結果セット、および戻り値を受け入れることができる.エラーの原因をプログラムに返すことができます.4、ストレージプロセスは比較的安定しており、あまり多くのエラーが発生しない.一度成功すれば、後でこのプログラムで実行します.5、ストレージプロセスは主にサーバー上で運行し、クライアントに対する圧力を減らす.6.ストレージ・プロシージャは、プログラム・フロー、論理、およびデータベースに対するクエリーを含むことができる.データロジックをカプセル化して非表示にすることもできます.7.ストアド・プロシージャは、単一のストアド・プロシージャで一連のSQL文を実行することができる.8.ストレージ・プロシージャは、独自のストレージ・プロシージャから他のストレージ・プロシージャを参照することができ、一連の複雑な文を簡略化することができる.
一、ストレージプロセスの作成
create procedure sp_name()
begin
.........
end

二、ストレージプロセスの呼び出し
call sp_name()

注:ストレージ・プロシージャのパラメータが渡されない場合でも、ストレージ・プロシージャ名の後にカッコを付ける必要があります.
三、ストレージプロセスの削除
drop procedure sp_name//

注:1つのストレージ・プロシージャで別のストレージ・プロシージャを削除することはできません.別のストレージ・プロシージャのみを呼び出すことができます.
四、ブロック、条件、ループ1、ブロック定義、常用
begin
......
end;

ブロックに別名を付けることもできます.たとえば、次のようにします.
lable:begin
...........
end lable;

leave lableを使用できます.ブロックから飛び出し、ブロック以降のコードを実行
2、条件文
if    then
statement
else
statement
end if;

3、循環文(1)while循環
[label:] WHILE expression DO

statements

END WHILE [label] ;

(2)、loopサイクル
[label:] LOOP

statements

END LOOP [label];

(3)、repeat untilサイクル
[label:] REPEAT

statements

UNTIL expression

END REPEAT [label] ;

五、その他の常用命令1.show procedure statusは、所属するデータベース、ストアド・プロシージャ名、作成時間など、データベースに格納されているすべてのストアド・プロシージャの基本情報を表示する.show create procedure sp_nameストレージ・プロシージャの詳細を表示
関数functionの例
CREATE DEFINER=`root`@`%` FUNCTION `spr_checkadmin`(acckey varchar(32), accpwd varchar(64)) RETURNS int(11)
BEGIN
DECLARE x INT;
SELECT COUNT(*) INTO x FROM admins WHERE account=acckey AND passwd=accpwd;
RETURN(x);
END;

単一の戻り値のストアド・プロシージャ
CREATE DEFINER=`root`@`%` PROCEDURE `spr_getuserstorage`(tok varchar(128))
BEGIN
DECLARE acc VARCHAR(32);
DECLARE pkgid VARCHAR(32);
DECLARE regdate DATETIME;
DECLARE logindate DATETIME;
DECLARE sumsize BIGINT;
SELECT account INTO acc FROM userinfo WHERE token=tok;
IF (acc != NULL) THEN
SELECT SUM(filesize) INTO sumsize FROM userfiles WHERE account=acc;
SELECT packageid, registerdate, lastlogindate INTO pkgid, regdate, logindate FROM userinfo WHERE account=acc;
SELECT 0,pkgid,regdate,logindate;
ELSE
SELECT(-1);
END IF;

複数の戻り値格納プロシージャ
CREATE DEFINER=`root`@`%` PROCEDURE `spr_queryfolderallfile`(sToken varchar(32), OUT sfid varchar(32), OUT sfext varchar(32))
BEGIN
DECLARE acc CHAR(32);
SELECT account INTO acc FROM userinfo WHERE token=sToken;
IF (acc != NULL) THEN
SELECT fileid, fileext INTO sfid, sfext FROM userfiles WHERE account=acc AND filetype=1;
END IF;
END;