MySQL5でストアドプロシージャのサポートが追加されました。
操作を完了するには、複数のSQLステートメントが必要な場合があります。1つ以上のSQLステートメントを格納するストアドプロシージャを作成できます。
ストアドプロシージャを使用する理由:
1。処理を使いやすい単位にカプセル化することにより、複雑な操作を簡素化します。
2.全員が同じストアドプロシージャを使用して複雑な操作を置き換えます。これにより、エラーを防ぎ、全員が同じコードを使用し、データの整合性を確保できます。
3.変更の管理を簡素化します。テーブル名や列名などを変更する必要がある場合は、ストアドプロシージャで変更するだけで、使用者はこれらの変更を知る必要がありません。
4.ストアドプロシージャを使用すると、個別のSQLを使用するよりも高速になり、パフォーマンスが向上します。
5. 1つのリクエストでのみ使用できる機能がいくつかあり、ストアドプロシージャを使用して、より強力で柔軟なコードを記述できます。
ストアドプロシージャの欠陥:
1。書き込みはSQLよりも複雑です。
2.ストアドプロシージャを作成するためのセキュリティアクセスがない可能性があります。多くのDBAはストアドプロシージャの作成を制限していますが、ユーザーはストアドプロシージャを使用できます。
ストアドプロシージャを実行します。
CALL procedureName(parameterList);
ストアドプロシージャを作成します。
CREATE PROCEDURE procedureName()
BEGIN
存储过程内容
END;
コマンドラインクライアントを使用する場合、デフォルトのMySQLステートメント区切り文字は;
です。コマンドラインでストアドプロシージャを作成すると、ストアドプロシージャの区切り文字が、;
ストアドプロシージャによって作成されるターミネータになり、構文エラーが発生します。解決策は、ステートメントセパレータを一時的に変更することです。
DELIMITER // # 将分隔符改为//
CREATE PROCEDURE procedureName()
BEGIN
存储过程内容
END//
DELIMITER ;
\を除いて、任意の文字をステートメント区切り文字として使用できます。
ストアドプロシージャを削除します。
DROP PROCEDURE procedureName;
このストアドプロシージャが存在しない場合、エラーを報告したくない場合は、エラーが報告されます。
DROP PROCEDURE IF EXISTS procedureName;
次に、販売情報テーブルを示し
ます。ストアドプロシージャを作成して、最低価格、最高価格、および平均価格を取得します。
CREATE PROCEDURE productpricing(
OUT pl DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT MIN(amount), MAX(amount), AVG(amount)
INTO pl, ph, pa # 将三个聚集函数的结果插入参数
FROM payment;
END;
MySQLは、IN(ストアドプロシージャに渡される)、OUT(ストアドプロシージャから渡される)、およびINOUT(ストアドプロシージャに出入りする)の3種類のパラメータをサポートします。
ストアドプロシージャのパラメータで許可されるデータ型は、表で使用されているものと同じです。戻り値の型をレコードセットにすることはできないため、1つのパラメーターで複数の行と列を返すことはできません。
上記のストアドプロシージャを呼び出し
ます。MySQLの変数は@で始まります。
変数の取得:
複雑なストアドプロシージャ:
-- NAME: ordertotal
-- Patameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxable
-- ototal = order total variable
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
-- Declare variable for total
DECLARE total DECIMAL(8,2);
-- Declare tax pricentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order total
SELECT Sum(item_price * quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
-- Yes, so add taxrate to the total
SELECT total + (total / 100 * taxrate) INTO total;
END IF;
-- And finally, save to our variable
SELECT total INTO ototal;
END;
上記の例で--
は、(その後のスペース)で始まるコメントが追加されています。MySQLは3種類のコメントをサポートし#
、ともサポートしてい/*...*/
ます。
上記の例では、DECLAREステートメントを使用して2つのローカル変数を定義し、変数名とデータ型を指定する必要があります。また、オプションのデフォルト値をサポートしています。
上記の例のIFは、課税対象がtrueであるかどうかを確認し、ELSEIF(THEN句を使用)およびELSE(THEN句を使用しない)句もサポートします。
COMMENTキーワードはにSHOW PROCEDURE STATUS
表示できます。このコマンドは、ストアドプロシージャのリストを、いつ、誰が作成したかなどの詳細情報とともに表示することもできます。次のSQLを使用して、出力を制限できます。
SHOW PROCEDURE STATUS LIKE 'pattern';
ストアドプロシージャの作成ステートメントを表示します。
SHOW CREATE PROCEDURE procedureName;