web-dev-qa-db-ja.com

ストアドプロシージャ、関数、およびルーチンの違いは何ですか?

MySQLデータベースのコンテキストでは、これら3つの用語の違いは何ですか:

  • ストアドプロシージャ
  • ストアド関数
  • ストアドルーチン

また、これらの日時関数のような組み込み関数(たとえば、WEEKDAY()など)は何と見なされますか?

71
Yang

Googleはあなたの友達です。 「mysql routine function procedure」の最初の一致は次のとおりです。 http://dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html

簡単な要約:

ストアドルーチンは、プロシージャまたは関数のいずれかです。

プロシージャはCALLステートメントを使用して呼び出され、出力変数を使用してのみ値を返すことができます。

関数は、他の関数と同様にステートメント内から呼び出すことができ、スカラー値を返すことができます。

81
Jakob

ここで、関数と手順の違いを要約しようとしました。

  1. FUNCTION alwaysは、returnステートメントを使用して値を返します。手順mayパラメーターを介して1つ以上の値を返すか、まったく返さない場合があります。
  2. Functionsは通常、計算に使用されますが、proceduresは通常、ビジネスロジックの実行に使用されます。
  3. 関数は1つの値のみを返します。プロシージャは複数の値を返すことができます(最大1024)。
  4. ストアドプロシージャは、デフォルトで常にゼロの整数値を返します。一方、関数の戻り値の型は、スカラー値またはテーブル値またはテーブル値です。
  5. ストアドプロシージャには、プリコンパイルされた実行計画がありますが、関数はそうではありません。
  6. 関数は、SELECT func_name FROM DUALなどのSQLステートメントによって直接呼び出すことができますが、プロシージャはできません。
  7. ストアドプロシージャにはセキュリティがあり、ネットワークトラフィックを減らします。また、一度に任意の数のアプリケーションでストアドプロシージャを呼び出すことができます。
  8. SQLクエリではFunctionを使用できますが、SQLクエリではプロシージャを使用できません。これにより、関数とプロシージャの間に大きな違いが生じます。
38
Sujeet Kumar

MySQL関数とmysqlプロシージャの違い

MYSQL関数

値を返す必要があります。 INOUT、およびINOUTは関数では使用できません。ただし、関数を作成するときは、戻り値のデータ型を宣言する必要があります。関数は、SQLステートメントから呼び出すことができます。関数は1つの値を返します。

MYSQLプロシージャ

戻り値は必須ではありませんが、OUTパラメータを使用してプロシージャを返すことができます。 INを使用できます| OUT | INOUTパラメーター。 SQLステートメントからプロシージャーを呼び出すことはできません。プロシージャは、OUTまたはINOUTパラメータを使用して複数の値を返します。

28
Deepak Mani

手順と機能

1.  PROCEDURES may or may not return a value but FUNCTION must return a value
2.  PROCEDURES can have input/output parameter but FUNCTION only has input parameter.
3.  We can call FUNCTION from PROCEDURES but cannot call PROCEDURES from a function. 
4.  We cannot use PROCEDURES in SQL statement like SELECT, INSERT, UPDATE, DELETE, MERGE etc. but we can use them with FUNCTION.
5.  We can use try-catch exception handling in PROCEDURES but we cannot do that in FUNCTION. 
6.  We can use transaction in PROCEDURES but it is not possible in FUNCTION.
5
venkat

関数は値を返す必要がありますが、ストアドプロシージャではオプションです(プロシージャは0またはn値を返すことができます)。関数は入力パラメータのみを持つことができますが、プロシージャは入力/出力パラメータを持つことができます。関数はプロシージャから呼び出すことができますが、プロシージャは関数から呼び出すことはできません。

2
James