sql >> データベース >  >> RDS >> Mysql

MySQLストアドプロシージャと関数、どちらを使用しますか?

    プロシージャと関数の最も一般的な違いは、それらが異なる目的で異なる方法で呼び出されることです。

    1. プロシージャは値を返しません。代わりに、CALLステートメントを使用して呼び出され、テーブルの変更や取得したレコードの処理などの操作を実行します。
    2. 関数は式内で呼び出され、式で使用される単一の値を呼び出し元に直接返します。
    3. CALLステートメントを使用して関数を呼び出すことも、式でプロシージャを呼び出すこともできません。

    ルーチン作成の構文は、プロシージャと関数によって多少異なります:

    1. プロシージャパラメータは、入力のみ、出力のみ、またはその両方として定義できます。これは、プロシージャが出力パラメータを使用して値を呼び出し元に返すことができることを意味します。これらの値には、CALLステートメントに続くステートメントでアクセスできます。関数には入力パラメーターのみがあります。その結果、プロシージャと関数の両方にパラメータを含めることができますが、プロシージャのパラメータ宣言は関数の宣言とは異なります。
    2. 関数は値を返すため、戻り値のデータ型を示すために関数定義にRETURNS句が必要です。また、呼び出し元に値を返すには、関数本体内に少なくとも1つのRETURNステートメントが必要です。 RETURNSとRETURNは、プロシージャ定義には表示されません。

      • ストアドプロシージャを呼び出すには、CALL statementを使用します 。ストアド関数を呼び出すには、式でそれを参照します。この関数は、式の評価中に値を返します。

      • プロシージャはCALLステートメントを使用して呼び出され、出力変数を使用してのみ値を返すことができます。関数は、他の関数と同じように(つまり、関数の名前を呼び出すことによって)ステートメント内から呼び出すことができ、スカラー値を返すことができます。

      • パラメーターをIN、OUT、またはINOUTとして指定することは、PROCEDUREに対してのみ有効です。 FUNCTIONの場合、パラメーターは常にINパラメーターと見なされます。

      パラメータ名の前にキーワードが指定されていない場合、デフォルトではINパラメータです。保存された関数のパラメータの前には、IN、OUT、またはINOUTはありません。 すべての関数パラメーターはINパラメーターとして扱われます。

    ストアドプロシージャまたは関数を定義するには、それぞれCREATEPROCEDUREまたはCREATEFUNCTIONを使用します。

    CREATE PROCEDURE proc_name ([parameters])
     [characteristics]
     routine_body
    
    
    CREATE FUNCTION func_name ([parameters])
     RETURNS data_type       // diffrent
     [characteristics]
     routine_body
    

    ストアドプロシージャ(関数ではない)のMySQL拡張機能は、プロシージャが結果セット、または複数の結果セットを生成できることです。これは、呼び出し元がSELECTステートメントの結果と同じ方法で処理します。ただし、そのような結果セットの内容を式で直接使用することはできません。

    保存されたルーチン (ストアドプロシージャとストアド関数の両方を指します)テーブルやビューと同じように、特定のデータベースに関連付けられています。 データベースを削除すると、データベースに保存されているルーチンもすべて削除されます。

    ストアドプロシージャと関数は同じ名前空間を共有しません。 データベースに同じ名前のプロシージャと関数を含めることができます。

    ストアドプロシージャでは動的SQLを使用できますが、関数やトリガーでは使用できません。

    SQLプリペアドステートメント(PREPARE、EXECUTE、DEALLOCATE PREPARE)は、ストアドプロシージャで使用できますが、ストアド関数またはトリガーでは使用できません。したがって、格納された関数とトリガーは動的SQLを使用できません(ステートメントを文字列として作成してから実行する場合)。 (MySQLストアドルーチンの動的SQL )

    関数とストアドプロシージャのいくつかの興味深い違い:

    1. このポイントはブログ投稿からコピー )ストアドプロシージャはプリコンパイルされた実行プランですが、関数はそうではありません。関数実行時に解析およびコンパイルされます。ストアドプロシージャ。疑似コードとしてデータベースに保存されます。つまり、コンパイルされた形式です。

    2. この点についてはよくわかりません。
      ストアドプロシージャにはセキュリティがあり、ネットワークトラフィックが減少します。また、ストアドプロシージャを任意の番号で呼び出すことができます。一度にアプリケーションの。 リファレンス

    3. 関数は通常、asproceduresがビジネスロジックの実行に通常使用される計算に使用されます。

    4. 関数はデータベースの状態に影響を与えることはできません(明示的または暗黙的なコミットまたはロールバックを行うステートメントは関数で許可されていません)一方、Storedプロシージャはcommitなどを使用してデータベースの状態に影響を与える可能性があります。
      参照:J.1。保存されたルーチンとトリガーの制限

    5. 関数はFLUSH を使用できません ストアドプロシージャが実行できるのに対し、ステートメント。

    6. ストアド関数は再帰的ではありませんが、ストアドプロシージャは再帰的です。注:再帰的ストアドプロシージャはデフォルトで無効になっていますが、サーバーでmax_sp_recursion_depthサーバーシステム変数をゼロ以外の値に設定することで有効にできます。 セクション5.2.3を参照してください。 、「システム変数」 、詳細については。

    7. ストアド関数またはトリガー内で、関数またはトリガーを呼び出したステートメントによって(読み取りまたは書き込みのために)すでに使用されているテーブルを変更することは許可されていません。良い例:MYSQLでの削除時に同じテーブルを更新する方法

    :通常、一部の制限はストアド関数とトリガーに適用されますが、ストアドプロシージャには適用されませんが、これらの制限は、ストアド関数またはトリガー内から呼び出された場合、ストアドプロシージャに適用されます。たとえば、ストアドプロシージャでFLUSHを使用することはできますが、そのようなストアドプロシージャをストアド関数またはトリガーから呼び出すことはできません。



    1. Postgres配列へのデータの選択

    2. SQLiteで月の名前で注文する方法

    3. パート2–大規模なデータベース図を整理する方法

    4. MySQLでログファイルを表示するにはどうすればよいですか?