ホームページ >データベース >mysql チュートリアル >カーソルなしでテーブルの各行に対してストアド プロシージャを実行できますか?

カーソルなしでテーブルの各行に対してストアド プロシージャを実行できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 21:05:45785ブラウズ

Can Stored Procedures Be Executed for Each Table Row Without Cursors?

カーソルを使用せずにテーブルの行ごとにストアド プロシージャを実行する

テーブル内のすべての行に対してストアド プロシージャを呼び出すタスクに直面したときテーブルの場合、カーソルを使用して行を反復処理するアプローチを考慮するのが自然です。ただし、カーソルに依存せずにこのタスクを達成することは可能です。

セットベースのアプローチの利用

セットベースのアプローチでは、すべての行に対して同時に操作を実行する方法。たとえば、テーブル内のすべての行の列を更新することが目標の場合、適切な WHERE 句を含む UPDATE ステートメントを利用して、関連するレコードを一度に変更できます。

特定のケース:行列の反復

ただし、行の列をストアド プロシージャの入力パラメーターとして使用する必要があるシナリオを扱う場合、若干異なるアプローチが必要です。提供された回答で説明されているように:

  • 変数の宣言と初期化: 現在処理している顧客を追跡する変数を定義します。
  • 反復over Rows: SELECT ステートメントで WHILE ループを使用して、CustomerID 変数を取得し、その ID で CustomerID 変数を更新します。テーブル内の次の顧客。
  • 終了条件: 顧客がいなくなったときにループから抜け出す条件を設定します。
  • ストアド プロシージャを実行: 顧客ごとに、CustomerID を使用して指定されたストアド プロシージャを呼び出します。

コード サンプル

提供されたコード スニペットは、このアプローチの実装方法を示しています。

-- Declare & initialize (2008 syntax)
DECLARE @CustomerID INT = 0

-- Iterate over all customers
WHILE (1 = 1) 
BEGIN  

  -- Get next customerId
  SELECT TOP 1 @CustomerID = CustomerID
  FROM Sales.Customer
  WHERE CustomerID > @CustomerId 
  ORDER BY CustomerID

  -- Exit loop if no more customers
  IF @@ROWCOUNT = 0 BREAK;

  -- call your sproc
  EXEC dbo.YOURSPROC @CustomerId

END

以上がカーソルなしでテーブルの各行に対してストアド プロシージャを実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。