MySQLのストアドプロシージャとトリガ
ストアドプロシージャ
まず、簡単なストアドプロシージャ
図1に示すように、単純なストアドプロシージャ
$$ DELIMITER 作成手順テスタは、() 開始 EMPから選択*を、 DEPTから選択*; END; $$; DELIMITER; -ストアドプロシージャ呼び出し コールの種皮を();
構造ストアドプロシージャの構成は次のとおりです。
1、フォーマットを作成:手順ストアドプロシージャ名を作成
図2に示すように、開始と終了は、使用して1つまたは複数のコードブロック、コードブロックを含む間
図3に示すように、コマンドラインの区切りの区切りで定義する必要が作成$$
図2に示すように、ストアドプロシージャの特性
図1に示すように、複雑な計算と決意を完了する
2、強力なプログラム可能、フレキシブル
3、SQLプログラミングコードを再利用することができます
4、実行速度は比較的速いです
5、お金を節約するために、ネットワークとの間のデータ伝送を減らすために
第二に、ストレージ・プロセス変数
図1に示すように、プロセス変数格納されています
要件:ストアドプロシージャを記述し、EMPNOを取るために変数を使用= 7369のユーザ名
$$ DELIMITER、 作成手順テスタ(); BEGIN DECLAREのmy_uname VARCHAR(32)デフォルト""; -定義された変数はmy_uname SETのmy_uname = 'スミス'; -変数代入my_uname - EMPNO = 7369は、ユーザ名を照会しmy_unameに値を割り当てる 変数を割り当てる- ; EMPNO = 7369 EMP INTO my_unameからSELECT ENAMEを my_unameを選択する; -のmy_uname戻り値 END; $$; デリミタ。
特徴:
1は、単に変数を宣言宣言し、宣言する使用して変数宣言は、変数は使用前に宣言する必要があります。
2、MySQLのSQLデータ型と一致する変数のデータ・タイプと長さを有するだけでなく、デフォルト値、文字セットと照合等を指定します。
図3に示すように、変数がセットを通じて割り当てることができ、それは、ファッションに選択することによって割り当てることができます。
4、変数のような、あなたはselect文を使用することができ、返却する必要があります:変数名を選択します
図2に示すように、プロセス変数記憶されたアプリケーションの例
要件:テーブルEMP、DEPTと最新のエントリー日、最も初期の行数のemp表。
区切り文字$$; 手続きstats_empを作成します(); BEGIN -统计EMP和DEPT表中的记录数 BEGIN DECLAREのemp_sum intデフォルト0; dept_sumのint型のデフォルトの0を宣言する。 SELECT COUNT(*)emp_sumにEMPから。 SELECT COUNT(*)DEPTからdept_sumに。 emp_sum、dept_sumを選択します。 終わり; -统计最早、最晚入职日期 BEGIN DECLAREのMAX_TIMEのTIMESTAMPを、 MIN_TIME TIMESTAMPを宣言。 MAX_TIME、EMPからMIN_TIMEにMAX(HIREDATE)、分(HIREDATE)を選択します。 MAX_TIME、MIN_TIMEを選択します。 終わり; END $$; 区切り文字;
第三に、ストアドプロシージャのパラメータ
1、渡されたストアドプロシージャのパラメータ
要件:ストアドプロシージャ、入ってくるEMPNOを書くには、ユーザーのENAMEに戻りました。
区切り文字$$; (my_empno int型IN)手続きtest_paramを作成します。 -------- BEGIN DECLAREのmy_enameのVARCHAR(32)デフォルト''; ここでEMPNO = my_empno EMPからmy_enameにENAMEを選択します。 my_enameを選択します。 終わり; $$ 区切り文字; -调用 コールtest_param(7369);
ヒント:
1は、パラメータを渡す:で入力し、ストアドプロシージャを呼び出すときに、デフォルトのタイプであり、のように指定された表示されない場合は、このパラメータの値は、指定する必要があります表しています。
図2は、タイプパラメータの一般の着信のために使用される、ストアドプロシージャ一般変性返されていないを呼び出します。
図3に示すように、ストアド・プロシージャ・コールを変更し、値を返す必要がタイプOUTパラメータを使用することができる場合。
out発信2、ストアドプロシージャのパラメータ
要件:EMPNOを渡し、ストアドプロシージャを呼び出すとき、ユーザーのENAMEに戻りました。
区切り文字$$; 手続きtest_param(my_empno int型IN、OUT my_ename varcahr(32))を作成します。 -------- BEGIN EMPNO = my_empno EMPからmy_enameに選択ENAMEを、 my_enameを選択します。 終わり; $$ 区切り文字; -调用 のuname = '' @設定します。 (7369、のuname @)をtest_param_out呼び出します。
ヒント:
1、送信パラメータは:あなたは、その値を変更することができ、ストアドプロシージャを呼び出し、返すことができます。
2は、広がっているパラメータは、パラメータ値を渡すために使用することはできません。
ストアドプロシージャを呼び出すとき、図3に示すように、OUTパラメータも指定する必要があるが、それは変数ではなく定数でなければなりません。
4.あなたが出て行く必要があり、同時に、あなたはINOUTの型パラメータを使用することができ、両方に合格する必要がある場合。
図3に示すように、可変パラメータストアドプロシージャINOUT
要件:ストアドプロシージャのパラメータを呼び出しmy_empnoとmy_ename、両方の着信も送信パラメータ。
区切り文字$$; プロシージャtest_param_inout(INOUTのmy_empno int型、INOUTのmy_enameのVARCHAR(32))を作成します。 BEGIN my_empno = 7369に設定。 設定my_ename =「スミス」。 、ENAME、EMPNO my_enameにEMP EMPNO = my_empnoからmy_empnoを選択します。 終わり; $$ 区切り文字; -调用 設定@uname:= ''; @empno設定:= 7399; (EMPNOは、@のuname @)test_param_inout呼び出します。 uname @、EMPNO @選択します。
特徴:
図1に示すように、可変INOUT変数は、コールの値が通話中、通過することができ、その値は変更することができるだけでなく、値を返すことができます。
タイプINとOUTの2、INOUTパラメータ設定機能パラメータ
着信が可変INOUTなく一定である3、
第四に、ストアドプロシージャ条件文
1、条件文のストアドプロシージャ
要件:ユーザーがEMPNO指定された場合のみ、そうでない場合は、EMPNO返し、ENAMEさえあり、ストアドプロシージャを記述します。
区切り文字$$; (my_empno int型IN)手続きtest_ifを作成します。 BEGIN DECLAREのmy_ename VARCHAR(32)デフォルトは''; 次いで、(my_empno%2 = 0)であれば EMPNO = my_empno EMPからmy_enameにENAMEを選択します。 my_enameを選択します。 他に 選択my_empno。 場合は終了。 終わり; $$ 区切り文字; -调用 コールtest_if(7369);
特徴:
1、条件文の基本構造:)(あれば...他の... END IF;
ロジックが真または偽のリターンを決定した場合2、発現は、真または偽を返し、任意の表現であってもよいです
図2に示すように、条件文ストアドプロシージャの適用例
要件:決定するために、ユーザの入EMPNOパラメータに応じて:
(1)ユーザーSALが2000未満の場合、ユーザーは200を支払います
(2)ユーザーSAL 1000未満では、ユーザーを調達する場合には500
(3)それ以外の場合は100を支払います
区切り文字$$; (my_empno int型IN)手続きtest_if_elseを作成します。 BEGIN DECLAREのmy_sal intデフォルト0; ここでEMPNO = my_empno EMPからmy_salにSALを選択します。 (my_sal <1000)、次いで場合 EMPセットSALを更新= SAL + 500ここでEMPNO = my_empno。 ELSEIF(my_sal <2000) 、その後EMPセットSAL = SAL + 200 EMPNO = my_empnoを更新します。 他の更新EMPセットSAL = SAL + 100 EMPNO = my_empno。 場合は終了。 終わり; $$ 区切り文字; -调用 (7369)test_if_elseを呼び出します。
特徴:
マルチ条件付き構造:
()の場合
それから
...
エルス(あれば)
それから
...
エルス
...
場合END;
第五に、ストアドプロシージャのループ
1、しばらく循環
需要:使用ループ、10は、emp表のEMPNOの連続記録に挿入されています。
区切り文字$$; 手続きtest_whileを作成します(); BEGIN 、私はデフォルトの0をint型DECLAREを。 (私は10 <)はないが 、BEGIN I = I + 1セットと、 ACC(ID)の値(I)に挿入します。 終わり; ENDのWHILE; 終わり; $$ 区切り文字; -调用 コールtest_while();
特徴:
1、しばらく基本的な文の構造:()が始まるんが...エンドエンド間;;
ロジックが真または偽のリターンを決定しながら2、発現は、真または偽を返し、任意の表現であってもよいです
2、リピートループ
需要:テーブルIDに10件の連続したレコードを挿入リピートループACCを使用して
区切り文字$$; 手続きtest_repeatを作成します(); BEGIN 、私は100をデフォルトのint型DECLAREを。 REPEAT BEGIN iは= iは1 +セットを、 ACC(ID)の値(I)に挿入します。 終わり; I> = 110 UNTIL ENDのREPEAT。 終わり; $$ 区切り文字; -调用 )(test_repeatを呼び出します。
特徴:
1、基本的な文の構造を繰り返し:リピート終了まで...開始終了を繰り返し;;
ロジックが真または偽のリターンを決定しながら2、発現は、真または偽を返し、任意の表現であってもよいです
カーソルを使用して第六に、ストアドプロシージャ
1.カーソルは何ですか
要件:UIDレコードユーザー名を更新するために一つ一つの偶数であり、カーソルを使用して、ストアドプロシージャを書き込みます。
$$ DELIMITER; ()プロシージャTEST_CURSORを作成し、 BEGIN INTは、DEFAULT 0ストップフラグDECLARE; -カーソル停止フラグ0:停止1:停止 DECLAREのmy_uname VARCHAR(32)デフォルト' 「; - ユーザ名格納されたクエリ DECLARE uname_cursor ACCから場所を選択のunameのカーソル UID%2 = 0; - カーソルuname_cursorを定義し、結果セットを指定 DECLAREを見つけていないセットストップフラグのハンドラを継続 = 1; - カーソルをストップフラグに設定された後、1。 オープンuname_cursorと、 -オープンカーソル my_unameにuname_cursor FETCH; - - my_unameにレコードに取り込ま前方カーソルステップは、my_uname しばらく(ストップフラグ= 0) DO BEGIN WHEREのuname = my_uname更新にはuname ACC SET = CONCAT(my_uname、 "CUR _を"); ; uname_cursor INTOはFETCH my_uname ENDを、 WHILEを終了し、 閉じるuname_cursorを; END; $$ デリミタ; -呼び出す コールtest_repeatを();
特徴:
ACCからの選択のunameためuname_curカーソルを宣言する場合、UID%2 = 0。
1は、カーソルはクエリ結果一時記憶領域を節約するためであります
図2は、uname_curカーソル変数は、クエリ結果セットは、実際には、クエリの暫定結果を保持します
設定したストップフラグ= 1が見つかりませんのハンドラを続ける宣言します。
カーソル変数は、クエリの結果は再び(トラバース)が成立する場合、図3に示すように、エンド、1変数ストップフラグに達します。
4、my_unameにuname_cursor FETCH; - my_unameにレコードに取り込ま前方カーソルステップ、
MySQLの機能
、簡単な関数
需要:UIDを渡して、機能を書くには、ユーザーでのunameを返します。
区切り文字$$; varchar型を返す関数のf01_simple(my_uid int型)を作成します(32)UTF8がCHARSET BEGIN DECLAREのmy_unameのVARCHAR(32)デフォルトは''; ここで、UID = my_uid ACCからmy_unameには、unameを選択します。 my_unameを返します。 END $$ 区切り文字。 -调用 選択f01_simple(2);
特徴:
図1は、関数の関数名を作成する(パラメータ)が戻り、戻り値を使用する関数を作成します
図2に示すように、関数は、開始と終了部材との間に配置されます
3、指定された関数の戻り値を返します
4は、関数が呼び出されます:選択関数名(引数);
第二に、カスタム機能統合されたアプリケーションの例
1、模範的なカスタム関数01
デマンド:ユーザーの一意の識別として、ユーザーのUID、UUID値を得たaccountId、UID、のunameの組み合わせを入力します。
区切り文字$$; varchar型を返す関数のtest_uuid(my_uid int型)を作成します(32)UTF8がCHARSET BEGIN DECLAREのUUIDのVARCHAR(32)デフォルトは''; ここで、UID = my_uid ACCからUUID INTO CONCAT(accountIdを、 "_"、UID、 "_"のuname)を選択します。 RETURNのUUID。 END $$; 区切り文字; -调用 (2)test_uuid選択します。
2、模範的なカスタム関数02
要件:アカウントでの全注文の合計価格を計算するために、ユーザのUID、UIDを入力します。
トリガートリガー
シーン:一般的には監査のための、ビジネスデータの整合性
1、トリガーは何ですか
需要:監査目的で、誰かがテーブルのユーザ、挿入UID、操作のunameと操作時間にレコードを挿入し、記録しました。
$$ DELIMITER; TRIGGERをCREATE `tr_users_insert`挿入した後ON users` EACH ROW FOR BEGIN -現在のユーザ情報の後に挿入された新しい oplogに(UID、のuname、挿入アクション、OPTIME)VALUES(NEW.uid、NEW.unameを今'INSERT'、()); END; $$; デリミタ。
特徴:
1、トリガーのトリガー名を作成使用してトリガを作成します。
図2に示すように、トリガー?ユーザーに挿入した後、ならびに処置後の前、後(前)または(後)であるテーブル操作トリガアクションペアの前に。
3、どのようなイベントトリガの動作?ユーザーへの挿入後、挿入、更新などの作業時間は、削除します
4、どのようなテーブルをトリガ?ユーザーへの挿入後
図5に示すように、スコープの影響?行ごとに
トリガー:トリガーは、挿入、更新、削除、および他の変更操作可能なアクションの数をトリガする、テーブル上のイベントに応じて動作することができるオブジェクトとして機能する、ストアドプロシージャ、を有します。
フリップフロップの2、製造例
要件:ユーザーがテーブルを削除すると、監査目的で、削除する前に、レコードの主なフィールドの値を記録します。
区切り文字$$; 前に開始EACH ROW FOR users` `ON DELETE tr_user_delete`` TRIGGERをCREATE - OLDは对字段表更新前的数据 oplog(UID、のuname、アクション、OPTIME、OLD_VALUE)の値(OLD.uid、OLD.uname、」挿入今、「削除()、OLD.regtime)。 終わり; $$; 区切り文字;