構文
説明
ストアドプロシージャを作成します。 既定では、ルーチンは既定のデータベースに関連付けられています。 Routineexplicitlyを特定のデータベースに関連付けるには、名前をdb_nameとして指定します。sp_namewhenあなたはそれを作成します。
ルーチンが呼び出されると、暗黙的なUSE db_nameが実行されます(ルーチンが終了すると、そのUSE db_nameが実行されます)。 このルーチンは、実行中に指定された既定のデータベースを持ちます。 インストールされたルーチンでのUSE文は許可されません。,
ストアドプロシージャが作成されたら、CALLステートメントを使用してストアドプロシージャを呼び出します(CALLを参照)。
CREATE PROCEDUREステートメントを実行するには、CREATE ROUTINE権限を持つ必要があります。
ステートメントを実行するには、CREATE ROUTINE権限を持つ必要があります。 デフォルトでは、Mariadbは自動的にALTER ROUTINEおよびEXECUTE権限をルーチン作成者に付与します。 参照も保存されて通常の特典をご利用いただけます。,
DEFINERおよびSQL SECURITY句は、後で説明するように、ルーチン実行時にアクセス権限をチェックするときに使用するセキュリティコンテキストを スーパー権限、またはMariaDB10.5.2からのSET USER権限が必要です。
ルーチン名が組み込みSQLfunctionの名前と同じ場合は、ルーチンを定義するときに名前とfollowingparenthesisの間にスペースを使用する必要があります。 Thisisきもの呼び出しルーチンです。, このため、独自のストアドルーチンに対して既存のSql関数の名前を再利用することは避ける方が良いと考えています。
IGNORE_SPACE SQLモードは、storedroutinesではなく組み込み関数に適用されます。 IGNORE_SPACEが有効かどうかにかかわらず、常にルーチン名の後にスペースを付けることができます。
かっこで囲まれたパラメータリストは常に存在しなければなりません。パラメータがない場合は、()の空のパラメータリストを使用する必要があります。 パラメータの名前は大文字小文字を区別しません。,
各パラメーターは、COLLATE属性を使用できないことを除いて、任意の有効なデータ型を使用するように宣言できます。
プロシージャ名として使用する有効な識別子については、”識別子名”を参照してください。
IN/OUT/INOUT
各パラメータは、デフォルトではINパラメータです。 パラメーターを指定するには、パラメーター名の前にキーワードOUTまたはINOUTを使用します。
INパラメータは、値をプロシージャに渡します。, プロシージャは値を変更することができますが、プロシージャが戻ったときに変更は呼び出し元には表示されません。 OUTパラメーターは、theprocedureから呼び出し元に値を渡します。 その初期値はtheprocedure内でNULLであり、その値はprocedurereturnsときに呼び出し元に表示されます。 INOUTパラメーターは呼び出し元によって初期化され、プロシージャによって変更され、プロシージャが戻ったときにプロシージャによって行われた変更は呼び出し元に表示されます。,
各OUTまたはINOUTパラメーターに対して、プロシージャを呼び出すCALLステートメントにユーザー定義変数を渡します。 別のストアドプロシージャまたは関数内でprocedurefromを呼び出す場合は、INまたはINOUTパラメーターとしてaroutineパラメーターまたはローカルルーチン変数を渡すこともできます。
決定論的/決定論的ではない
DETERMINISTICおよびNOT DETERMINISTIC関数にのみ適用されます。, プロシージャでDETERMINISTCまたはNON-DETERMINISTICを指定しても効果はありません。 デフォルト値はNOT DETERMINISTICです。 関数は、同じ入力に対して常に同じ値を返す場合、DETERMINISTICです。 たとえば、truncate関数またはsubstring関数です。 したがって、データを含む関数は常にNOT DETERMINISTICです。,
SQLを含む/SQLなし/SQLデータを読み取る/SQLデータを変更する
CONTAINS SQL、NO SQL、READS SQL DATA、およびMODIFIES SQL DATAは、関数が何をするかをサーバーに伝える有益な句です。 MariaDBは、指定された句が正しいかどうかをチェックしません。 これらの句が指定されていない場合、デフォルトではCONTAINS SQLが使用されます。
MODIFIES SQL DATA関数には、データベースに格納されているデータを変更する可能性のあるステートメントが含まれていることを意味します。, これは、関数にDELETE、UPDATE、INSERT、REPLACE、DDLなどのステートメントが含まれている場合に発生します。
READS SQL DATAこの関数はデータベースに格納されているデータを読み取りますが、データは変更しません。 これは、SELECT文が使用されていても、書き込み操作が実行されない場合に発生します。
CONTAINS SQL関数には少なくとも一つのSQLステートメントが含まれていますが、データベースに格納されているデータは読み取りまたは書き込みません。 例としては、SETやDOがあります。,
NO SQLMariaDBは現在SQL以外の言語をサポートしていないため、何も意味しません。
routine_bodyは、有効なSQLプロシージャステートメントで構成されます。 これは、SELECTやINSERTなどの単純な文であるか、BEGINとENDを使用して書かれた文であることができます。 複合statementscanには、宣言、ループ、およびその他の制御structurestatementsが含まれます。 参照プ合算のための構文です。
MariaDBでは、CREATEやdropなどのDDL文をルーチンに含めることができます。, MariaDBでは、COMMITなどのSQLトランザクションステートメントをストアドプロシージャ(ストアド関数ではなく)に含めることもできます。
についての追加情報を計算書は以下のような場合にinstoredルーチンは、格納ルーチンでは限界がある。
プログラム内からストアドプロシージャを呼び出す
MariaDB/MySQLインターフェイスを持つ言語で記述されたプログラム内からストアドプロシージャを呼び出す
または置き換えます
10.1以降のMariaDB。,3
オプションのOR REPLACE句が使用されている場合、
DROP PROCEDURE IF EXISTS name;CREATE PROCEDURE name ...;
プロシージャに対する既存の権限が削除されないことを除いて、OR REPLACE
のショートカットとして機能します。
sql_mode
MariaDBは、ルーチンの作成時に有効なsql_modeシステム変数設定を格納し、ルーチンの呼び出し時に有効なサーバー SQLモードにかかわらず、常にこの設定を有効に
文字セットと照合順序
プロシージャパラメータは、任意の文字セット/照合順序で宣言できます。, 文字セットと照合順序が具体的に設定されていない場合は、作成時のデータベースのデフォルトが使用されます。 後でデータベースの既定値が変更された場合、ストアドプロシージャの文字セット/照合順序は同時に変更されないため、データベースと同じ文字セット/照合順序
Oracleモード
MariaDB10.3以降
MariaDB10.3以降では、従来のSQL/PSMベースのMariaDB構文に加えて、OracleのPL/SQL言語のサブセットがサポートされています。, Oracleモードの実行時の変更の詳細については、MariaDB10.3のOracleモードを参照してください。
例
次の例は、OUTパラメーターを使用する簡単なストアドプロシージャを示しています。 これはDELIMITERコマンドを使用して、プロセスの期間中に新しい区切り文字を設定します—mysqlクライアントの区切り文字を参照してください。,
文字セットと照合:
作成または置換:
関連項目
- 識別子名
- ストアドプロシージャの概要
- ALTER PROCEDURE
- DROP PROCEDURE
- SHOW CREATE PROCEDURE
- プロシージャのステータス
- ストアドルーチン権限
- 情報スキーマルーチンテーブル