SQL Serverの関数とストアドプロシージャ


831

私は関数とストアドプロシージャをかなり長い間学習してきましたが、関数やストアドプロシージャを使用する理由と時期がわかりません。彼らは私には同じように見えます、それはおそらく私がそれについて少し初心者だからです。

誰かが理由を教えてもらえますか?





3
スピードはどうですか?どちらが同じクエリをより速く実行しますか?
AmiNadimi、2018

回答:


708

関数は計算された値であり、永続的な環境変更を実行できませんSQL Server(つまり、許可されていない、INSERTまたはUPDATEステートメントが許可されています)。

関数SQLは、スカラー値を返す場合はステートメント内でインラインで使用でき、結果セットを返す場合は結合できます。

回答をまとめたコメントから注目に値するポイント。@Sean K Andersonに感謝:

関数は値を返す必要があり、パラメーター(引数)として受け取ったデータを変更できないという点で、コンピューターサイエンスの定義に従います。関数は何も変更できません。少なくとも1つのパラメーターが必要で、値を返す必要があります。ストアドプロシージャはパラメータを持つ必要がなく、データベースオブジェクトを変更でき、値を返す必要はありません。

SQLストアドプロシージャから関数を呼び出す 方法と、ストアドプロシージャの代わりに関数を使用する場合。

こんにちは。今日は、ストアドプロシージャをいつ使用し、いつ関数を使用するかについて説明します。単純なチームの場合いくつかの値を計算したい場合、単一の値を返すため、必要ありません。

https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html


13
基本的にDMLは許可されていませんか?
david blaine 2013

173
関数は値を返さなければならず、パラメーター(引数)として受け取ったデータを変更できないという点で、コンピューター科学の定義に従います。関数は何も変更できません。少なくとも1つのパラメーターが必要で、値を返す必要があります。ストアドプロシージャは、パラメータを持つ必要がなく、データベースオブジェクトを変更でき、値を返す必要はありません。
ショーンアンダーソン

23
実際、ローカルテーブル変数を変更するために、関数内にINSERT、UPDATE、およびDELETEステートメントを含めることができます。
Ani

14
@Ani-関数内でローカル変数をいくつでもインスタンス化して変更できますが、関数のスコープ外では変更できません。
MyItchyChin 14

40
@SeanKAnderson関数「少なくとも1つのパラメータが必要」は真ではありません。
リャン2015年

624

SPとUDFの違いは次のとおりです。

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+

21
関数は1つの値またはセットを返す必要があります。
Rafareino、2015

8
これは3年後のことですが、読みやすく広範囲にわたるため、トップになるはずです。
DanteTheSmith 2017

SPは一時テーブルとテーブル変数の両方を使用できますが、UDFはテーブル変数のみを使用できます。テーブル変数は、インデックスを使用しない場合があります。SPとは異なり、UDFはCROSS APPLYで呼び出すことができます
Ludovic Aubert '

190

関数とストアドプロシージャは別の目的で使用されます。これは最良の類推ではありませんが、関数は文字通り、任意のプログラミング言語で使用する他の関数と見なすことができますが、ストアドプロシージャは、個々のプログラムやバッチスクリプトに似ています。

関数には通常、出力とオプションで入力があります。出力は、他の機能(SQL Serverが内蔵例えば等DATEDIFF、LENなど)またはSQLクエリの述語としての入力として使用することができる-例えば、SELECT a, b, dbo.MyFunction(c) FROM table若しくはSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)

ストアドプロシージャは、SQLクエリをトランザクションにバインドし、外界とのインターフェースをとるために使用されます。ADO.NETなどのフレームワークは、関数を直接呼び出すことはできませんが、ストアドプロシージャを直接呼び出すことはできます。

ただし、関数には隠れた危険があります。それらは誤用され、かなり厄介なパフォーマンスの問題を引き起こす可能性があります。次のクエリを検討してください。

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

MyFunctionは次のように宣言されています。

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

ここでは、テーブルMyTableのすべての行に対して関数MyFunctionが呼び出されます。MyTableに1000行ある場合、それはデータベースに対する別の1000アドホッククエリです。同様に、列仕様で指定されたときに関数が呼び出された場合、SELECTによって返された各行に対して関数が呼び出されます。

したがって、関数の作成には注意が必要です。関数内のテーブルからSELECTを実行する場合は、親ストアドプロシージャのJOINまたは他のSQL構文(CASE ... WHEN ... ELSE ...など)を使用して、より適切に実行できるかどうかを自問する必要があります。終わり)。


2
「ADO.NETなどのフレームワークでは関数を直接呼び出せない」について詳しく教えてください。問題なくADO.NETデータプロバイダーで関数を実行しました。
Ian Kemp

24
一部のSELECTステートメントを介して関数を呼び出す必要があります-関数をそれ自体で独立したコードとして呼び出すことはできません-SQLステートメントがそれ以上でなくても、より大きなSQLステートメントの一部として呼び出す必要がありますよりSELECT * from dbo.MyTableValuedFunction()。一方、Sprocsは、に設定SqlCommand.CommandTypeすることにより、ADO.NETで直接呼び出すことができますCommandType.StoredProcedure
Chris J

60

ストアドプロシージャとユーザー定義関数の違い:

  • ストアドプロシージャはSelectステートメントでは使用できません。
  • ストアドプロシージャは、遅延名前解決をサポートしています。
  • ストアドプロシージャは通常、ビジネスロジックの実行に使用されます。
  • ストアドプロシージャは任意のデータ型を返すことができます。
  • ストアドプロシージャは、ユーザー定義関数よりも多くの入力パラメーターを受け入れることができます。ストアドプロシージャは、最大21,000の入力パラメーターを持つことができます。
  • ストアドプロシージャは動的SQLを実行できます。
  • ストアドプロシージャはエラー処理をサポートします。
  • 非決定的関数は、ストアドプロシージャで使用できます。

  • ユーザー定義関数は、Selectステートメントで使用できます。
  • ユーザー定義関数は、遅延名前解決をサポートしていません。
  • ユーザー定義関数は、一般的に計算に使用されます。
  • ユーザー定義関数は値を返す必要があります。
  • ユーザー定義関数は画像を返すことができません。
  • ユーザー定義関数は、ストアード・プロシージャーよりも少ない数の入力パラメーターを受け入れます。UDFは最大1,023個の入力パラメーターを持つことができます。
  • 一時テーブルは、ユーザー定義関数では使用できません。
  • ユーザー定義関数は動的SQLを実行できません。
  • ユーザー定義関数はエラー処理をサポートしていません。 RAISEERROROR @@ERRORはUDFでは許可されていません。
  • 非決定的関数はUDFでは使用できません。たとえばGETDATE()、UDFでは使用できません。

1
reの下に@curiousBoyを引用します。他の未入金(@Ankitによる)答えが(< -私はそれをした方法を見る;?)):「あなたは、ソースの参照を与えている必要があります。これは、(からである。blogs.msdn.microsoft.com/pradeepsvs/2014/10 / 08 /…)他の人が行う作業を尊重してください!」
トム・

7
このブログは2014年10月8日以降に作成され、この回答は2013年5月2日以降に作成されました@Tom
Kumar Manish

1
@Code Rider:ああ、申し訳ありません!気付かなかったなんて信じられない!それで、ブログはクレジットなしであなた(または他の誰か)をコピーしましたか?
トム

GETDATE()関数で使用できます。非決定論のピボットは良いものではありません。
PerformanceDBA

56

他のSQLステートメントで使用する値を計算して返す場合は、ユーザー定義関数を記述します。複雑なSQLステートメントのセットをグループ化する場合は、代わりにストアドプロシージャを作成します。結局のところ、これらは2つのまったく異なる使用例です!


18
ユーザー定義関数にはさまざまなタイプがあります。スカラーのものは値のみを返します。他のタイプは結果セットを再実行します。
AK

44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.

1
SPとは異なり、UDFはCROSS APPLYで呼び出すことができます
Ludovic Aubert

24

基本的な違い

関数は値を返す必要がありますが、ストアドプロシージャではオプションです(プロシージャは値0またはnを返すことができます)。

関数は入力パラメータのみを持つことができますが、プロシージャは入力/出力パラメータを持つことができます。

関数は必須の入力パラメーターを1つ取りますが、ストアード・プロシージャーはoからnの入力パラメーターを取る場合があります。

関数はプロシージャから呼び出すことができますが、プロシージャは関数から呼び出すことはできません。

事前差異

プロシージャではSELECTとDML(INSERT / UPDATE / DELETE)ステートメントを使用できますが、関数ではSELECTステートメントのみを使用できます。

プロシージャはSELECTステートメントでは使用できませんが、関数はSELECTステートメントに埋め込むことができます。

ストアドプロシージャはSQLステートメントでWHERE / HAVING / SELECTセクションのどこにも使用できませんが、関数は使用できます。

テーブルを返す関数は、別の行セットとして扱うことができます。これは、他のテーブルとのJOINで使用できます。

インライン関数は、パラメーターを取り、JOINやその他の行セット操作で使用できるビューと考えることができます。

例外はプロシージャのtry-catchブロックで処理できますが、try-catchブロックは関数では使用できません。

手続きではトランザクション管理に行くことができますが、関数では行くことができません。

ソース


25
ソース参照を指定する必要があります。これはdotnet-tricks.com/Tutorial/sqlserver/…からです。他の人の仕事を尊重してください!
curiousBoy 2014

16
ソース参照を与えないのは理由ではありません。最後に言及できます!
curiousBoy 2014

2
再 "関数は値を返す必要がありますが、ストアドプロシージャではオプションです...":私は明確にします: "関数 1つだけの値を返す必要があります(Returnsキーワードを介して実行する必要があり、スカラーまたはテーブル型でなければなりません) 、ただしストアドプロシージャはオプションで次を返すことができます:a)ステートメントIntによる1 タイプの結果コードReturnおよび/またはb)キーワードによる1+パラメータ(Cursorタイプを含む)Outputおよび/またはc)Selectステートメントによる1+行セット。1行セットのみの場合が返された場合、「Insert Into」ステートメントの「execute_statement」引数として使用できます。」
トム・

20

ユーザー定義関数は、SQLサーバープログラマが利用できる重要なツールです。あなたはそのようなSQLステートメントでそれをインラインで使うことができます

SELECT a, lookupValue(b), c FROM customers 

どこlookupValueがUDFになります。ストアドプロシージャを使用する場合、この種の機能は使用できません。同時に、UDF内では特定のことを実行できません。ここで覚えておくべき基本的なことは、UDFのことです。

  • 永続的な変更を作成できません
  • データを変更できません

ストアドプロシージャはこれらのことを実行できます。

私にとって、UDFのインライン使用はUDFの最も重要な使用法です。


14

ストアドプロシージャ はスクリプトとして使用されます。これらは一連のコマンドを実行し、特定の時間に実行するようにスケジュールすることができます。通常、INSERT、UPDATE、DELETEなどの複数のDMLステートメント、またはSELECTを実行します。

関数 はメソッドとして使用されます。何かを渡すと、結果が返されます。小さくて高速でなければなりません-その場でそれを行います。通常、SELECTステートメントで使用されます。


2
これは、2つをすばやく簡単に考える方法の良い要約です。
Eric Bishard、2015

2
確かに良い要約です。他の回答は2つの理論的な違いに焦点を当てていますが、実際にどちらを使用するかはまだわかりません。
jf328 2016

8

ストアドプロシージャ:

  • SQL Serverのミニチュアプログラムのようなものです。
  • selectステートメントのように単純にすることも、データベース内の複数のテーブルからデータを追加、削除、更新、読み取りする長いスクリプトのように複雑にすることもできます。
  • (ループとカーソルを実装できます。どちらを使用しても、データの結果を小さくしたり、行ごとに操作したりできます。)
  • EXECor EXECUTEステートメントを使用して呼び出す必要があります。
  • テーブル変数を返しますが、OUTパラメーターは使用できません。
  • トランザクションをサポートします。

関数:

  • データベースのレコードの更新、削除、追加には使用できません。
  • 単一の値またはテーブル値を返すだけです。
  • レコードの選択にのみ使用できます。ただし、次のように、標準SQL内から非常に簡単に呼び出すことができます。

    SELECT dbo.functionname('Parameter1')

    または

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • 単純な再利用可能な選択操作の場合、関数はコードを簡略化できます。JOIN関数での句の使用には注意してください。関数にJOIN句があり、複数の結果を返す別の選択ステートメントからそれを呼び出す場合、その関数呼び出しは、結果セットで返される行ごとにJOIN それらのテーブルをまとめて行います。したがって、一部のロジックを簡略化するのに役立ちますが、適切に使用されない場合、パフォーマンスのボトルネックになる可能性もあります。

  • OUTパラメータを使用して値を返します。
  • トランザクションはサポートしていません。

8

ユーザー定義関数。

  1. 関数は値を返す必要があります。
  2. Selectステートメントのみを許可し、DMLステートメントの使用を許可しません。
  3. 入力パラメーターのみが許可され、出力パラメーターはサポートされません。
  4. try-catchブロックを使用することはできません。
  5. 関数内でのトランザクションは許可されていません。
  6. テーブル変数のみを使用できます。一時テーブルは使用できません。
  7. ストアドプロシージャは関数から呼び出すことはできません。
  8. 関数は、selectステートメントから呼び出すことができます。
  9. UDFは、結果セットとして結合句で使用できます。

ストアドプロシージャ

  1. ストアドプロシージャは値を返す場合と返さない場合があります。
  2. selectステートメントと、挿入、更新、削除などのDMLステートメントを含めることができます。
  3. 入力パラメータと出力パラメータの両方を持つことができます。
  4. 例外処理には、try catchブロックを使用できます。
  5. ストアドプロシージャ内でトランザクションを使用できます。
  6. テーブル変数と一時テーブルの両方を使用できます。
  7. ストアドプロシージャは関数を呼び出すことができます。
  8. Select / Where / Havingなどのステートメントからプロシージャを呼び出すことはできません。Execute / Execステートメントは、ストアドプロシージャの呼び出し/実行に使用できます。
  9. プロシージャは結合句では使用できません

6

次のポイントが役立つかもしれないものをいつ使用するかを決定するには

  1. ストアドプロシージャは、関数が実行できる場所でテーブル変数を返すことはできません。

  2. ストアドプロシージャを使用して、サーバー環境パラメーターを変更できますが、関数を使用することはできません。

乾杯


6

カーソルのようなSQL Server関数は、最後の武器として使用するためのものです。それらにはパフォーマンスの問題があるため、テーブル値関数の使用は可能な限り避ける必要があります。パフォーマンスとは、中流ハードウェア上のサーバーでホストされている1,000,000を超えるレコードを持つテーブルのことです。それ以外の場合は、関数によって引き起こされるパフォーマンスへの影響を心配する必要はありません。

  1. 関数を使用して結果セットを外部コード(ADO.Netなど)に返さない
  2. ビューとストアドプロシージャの組み合わせをできるだけ使用します。DTA(データベースチューニングアドバイザ)が(インデックス付きビューや統計など)提供する提案を使用して、将来の成長パフォーマンスの問題から回復できます-ときどき!

詳細については、以下を参照してください。 http //databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


1
ありがとう。1つの列の値を入力するクエリ内で呼び出す関数を今日作成しました。実行が停止する前に3分以上実行されました。それを行うためのJOIN方法を考え出しました。実行は15秒で終了しました。(データセットは3456行でした)。大きなパフォーマンスの違い。
VISQL 2012

編集:実行は、どの列を "ORDER BY"するかに応じて15〜50秒で終了します(データセットは3456行でした)。パフォーマンスの大きな違い。
VISQL 2007

パフォーマンスの違いは、結果を順序付けしている列のさまざまなタイプにルーツがある可能性があります。SQL Serverは、文字データよりも数値の方がはるかにうまく機能します。その50秒のクエリでDTAを使用して、クエリの実行を少し速くするために、ある種の統計/インデックスの提案が考えられるかどうかを確認できます。
アキレス

1
それが最後の手段であるべきだと言うのに十分な証拠が提供されているかどうかはわかりません。関数は、さらに操作できるパラメーター化されたビューと考えることができます。たとえば、顧客を注文に参加させたいが、ミシガン州のみであるとします。単一の州に相当する顧客のみに参加するcustomerOrders(@StateCode)関数を作成します。次に、このセットをSelect FirstName、LastName、OrderTotal、StoreName From CustomerOrders( 'MI')INNER JOIN Stores ON Stores.StoreID = Orders.StoreID WHERE OrderTotal> 100としてさらに操作できます。一時的にコピーする必要があるため、これはSPの問題です。
MPavlak 2012

そのテーブルにはいくつのレコードがありますか?ハードウェアが適切に処理すれば、武器の選択について心配する必要はありません。スプーンは、剣を折るのが難しいときに仕事をすることができます。この硬度はハードウェアと呼ばれます!
アキレス

3

単一の値を返す関数から始めます。良い点は、頻繁に使用するコードを関数に入れて、結果セットの列として返すことができることです。

次に、パラメーター化された都市のリストに関数を使用します。dbo.GetCitiesIn( "NY")結合として使用できるテーブルを返します。

これは、コードを整理する方法です。何かがいつ再利用可能か、そしてそれが時間の無駄であるかを知ることは、試行錯誤と経験を通してのみ得られるものです。

また、SQL Serverでは関数を使用することをお勧めします。それらはより高速で、非常に強力です。インラインおよび直接選択。使いすぎに注意してください。


3

これが、ストアドプロシージャよりも関数を優先する実用的な理由です。別のストアドプロシージャの結果を必要とするストアドプロシージャがある場合は、insert-execステートメントを使用する必要があります。つまり、一時テーブルを作成し、execステートメントを使用して、ストアドプロシージャの結果を一時テーブルに挿入する必要があります。乱雑です。これに関する1つの問題は、insert-execをネストできないことです。です。

他のストアード・プロシージャーを呼び出すストアード・プロシージャーに行き詰まっている場合、これに遭遇する可能性があります。ネストされたストアドプロシージャがデータセットを返すだけの場合は、テーブル値関数で置き換えることができ、このエラーは発生しなくなります。

これは、データベースからビジネスロジックを除外する必要があるもう1つの理由です


2
  • ストアドプロシージャではなく、関数が値を返すことは必須です。
  • SelectステートメントはUDFでのみ受け入れられますが、DMLステートメントは必要ありません。
  • ストアドプロシージャは、任意のステートメントとDMLステートメントを受け入れます。
  • UDFは入力のみを許可し、出力は許可しません。
  • ストアドプロシージャでは、入力と出力の両方が可能です。
  • CatchブロックはUDFでは使用できませんが、ストアドプロシージャでは使用できます。
  • UDFの関数ではトランザクションは許可されていませんが、ストアドプロシージャでは許可されています。
  • UDFで使用できるのはテーブル変数のみで、一時テーブルは使用できません。
  • ストアドプロシージャでは、テーブル変数と一時テーブルの両方を使用できます。
  • UDFでは、ストアドプロシージャを関数から呼び出すことはできませんが、ストアドプロシージャでは関数を呼び出すことができます。
  • ストアード・プロシージャーは結合句で使用できませんが、UDFは結合句で使用されます。
  • ストアドプロシージャでは、常にゼロに戻すことができます。逆に、UDFには、あらかじめ決められたポイントに戻る必要がある値があります。

1
  • 関数はselect文で使用できますが、プロシージャでは使用できません。

  • ストアドプロシージャは入力パラメーターと出力パラメーターの両方を受け取りますが、関数は入力パラメーターのみを受け取ります。

  • 関数は、プロシージャのようにtext、ntext、image、timestamp型の値を返すことはできません。

  • 関数はcreate tableでユーザー定義のデータ型として使用できますが、プロシージャは使用できません。

***例:-作成 table <tablename>(name varchar(10),salary getsal(name))

ここで、getsalはユーザー定義関数であり、給与タイプを返します。テーブルが作成されると、給与タイプにストレージが割り当てられず、getsal関数も実行されませんが、このテーブルからいくつかの値をフェッチすると、getsal関数が実行され、 return Typeが結果セットとして返されます。


1

これは非常に古い質問であることに気づきましたが、どの回答にも重要な側面の1つはありません。クエリプランへのインライン化です。

関数は...

  1. スカラー:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. 複数ステートメントのテーブル値:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. インラインテーブル値:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

3番目の種類(インラインテーブル値)は、クエリオプティマイザーによって本質的に(パラメーター化された)ビューとして扱われます。つまり、クエリからの関数の参照は、関数のSQL本文のコピーと貼り付け(実際にはコピーと貼り付けなし)に似ています。次の利点に:

  • クエリプランナーは、他のサブクエリと同じようにインライン関数の実行を最適化できます(たとえば、未使用の列を削除する、述語を押し下げる、さまざまなJOIN戦略を選択するなど)。
  • 複数のインライン関数を組み合わせる場合、最初の関数の結果を次の関数に渡す前に具体化する必要はありません。

上記により、特に複数のレベルの関数を組み合わせる場合に、パフォーマンスを大幅に節約できる可能性があります。


注:SQL Server 2019では、何らかの形式のスカラー関数のインライン化も導入されるようです。


-2

SQL Serverでは、関数とストアドプロシージャは2種類のエンティティです。

関数: SQL Serverデータベースでは、いくつかのアクションを実行するために関数が使用され、アクションはすぐに結果を返します。関数には2つのタイプがあります。

  1. システム定義

  2. ユーザー定義の

ストアドプロシージャ: SQL Serverでは、ストアドプロシージャはサーバーに格納され、ゼロ、単一、および複数の値を返すことができます。ストアドプロシージャには次の2つのタイプがあります。

  1. システムストアドプロシージャ
  2. ユーザー定義プロシージャ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.