0

現在、私のストアド プロシージャでは、以下の状況で Cursor を使用しています。私が知っていることは、できる限り Cursors の使用を避ける必要があるということです。

それで、私はあなたがそれを解決するのを助けることができるようにここに状況を投稿します.

  1. テーブル A では、Cursor を使用して 1 つずつ UserID を取得します
  2. 各 UserID を使用して、2 つの関数を呼び出してビジネスを処理します。結果は 2 文字列です。
  3. これら 2 つの文字列はテーブル B に保存されます。
  4. 成功した場合は、2 つのアクションを実行します。テーブル A の Status = 1 を更新します。そして、メッセージを返します。
  5. 失敗した場合、1 つのアクションを実行します: メッセージを返します。
  6. ループカーソル

ステップ 2 から 5 までのビジネスで、カーソルを使用してストアド プロシージャを作成するにはどうすればよいでしょうか。

これを解決するためのアドバイスをいただければ幸いです。

4

2 に答える 2

1

カーソルの使用を避ける必要があると誰が言いますか?
カーソルは理由のために提供されており、カーソルを使用したり、レコードをフェッチしてプログラミング言語でロジックを処理したりする必要がある場合があります。

レコードごとの成功または失敗が必要な場合は、ストアドプロシージャ内であっても、データベース内でカーソルが必要になります。(はい、トリガーの後に挿入がありますが、それはあなたのロジックを複雑にするだけです)

于 2012-08-17T09:08:36.453 に答える
1

大まかに言うと、次のようなことができます(更新が必要になると思うので、テーブルBにinsertDateを追加しました)

まず、tableAからtableBにデータを挿入します。

insert into tableB (ID, column1, column2, insertDate)
select ID, callFunction1(userID), callFunction2(userID), getdate()

次に、挿入されたレコードについて、status=1を設定します

update tableA
set status=1 
where ID in (select ID from tableB where insertDate=today)

現在、返されるメッセージの種類はやや複雑です。行ごとにメッセージを返すことはできません。いずれかが「失敗」すると、バッチ全体が失敗します。

あなたの場合、正確に何が失敗を引き起こしますか?

于 2012-08-17T09:10:11.587 に答える