構文
説明
ストアドプロシージャを作成します。 既定では、ルーチンは既定のデータベースに関連付けられています。 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 SQL
MariaDBは現在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
- プロシージャのステータス
- ストアドルーチン権限
- 情報スキーマルーチンテーブル