コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
USE testDB
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DROP PROCEDURE IF EXISTS dbo.usp_CursorTest
GO
CREATE PROCEDURE dbo.usp_CursorTest
@RetCode INT OUTPUT --エラーコード
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #Order
(
OrderCode INT,
OrderPrice MONEY
);
CREATE TABLE #OrderDetails
(
OrderCode INT,
Seq INT,
ProductCode VARCHAR(10),
ProductName NVARCHAR(100),
UnitPrice MONEY,
Qty MONEY
);
--------------------------------------------------------------------
--変数宣言
--------------------------------------------------------------------
DECLARE @OrderCode INT;
DECLARE @Seq INT;
DECLARE @OrderPrice MONEY;
DECLARE @UnitPrice MONEY
DECLARE @Qty MONEY;
--------------------------------------------------------------------
--カーソル宣言
--------------------------------------------------------------------
DECLARE cur_Order CURSOR LOCAL FOR
SELECT OrderCode
FROM #Order
;
--初期化
SET @RetCode = 1;
BEGIN TRY
BEGIN TRANSACTION
--カーソルオープン
OPEN cur_Order
FETCH NEXT FROM cur_Order
--最初の行[0番目]の値の格納
INTO @OrderCode;
--@@FETCH_STATUS:最後の行を超えたときは-2が設定される。
WHILE @@FETCH_STATUS = 0
BEGIN
--初期化
SET @OrderPrice = 0;
--2つ目のカーソルは1つ目のカーソルの注文番号を条件にしている為、ここに記述します。
--明細のカーソルを宣言
DECLARE cur_OrderDetails CURSOR LOCAL FOR
SELECT Seq
,UnitPrice
,Qty
FROM #OrderDetails
WHERE OrderCode = @OrderCode
;
--カーソルオープン
OPEN cur_OrderDetails
FETCH NEXT FROM cur_OrderDetails
--最初の行[0番目]の値の格納
INTO @Seq
,@UnitPrice
,@Qty
;
--@@FETCH_STATUS:最後の行を超えたときは-2が設定される。
WHILE @@FETCH_STATUS = 0
BEGIN
--明細の金額を計算して合計に加算する
SET @OrderPrice += @UnitPrice * @Qty;
FETCH NEXT FROM cur_OrderDetails
--次の行の値の格納
INTO @Seq
,@UnitPrice
,@Qty
;
END;
--カーソル終了
IF CURSOR_STATUS('local', 'cur_OrderDetails') > 0
BEGIN
CLOSE cur_OrderDetails;
DEALLOCATE cur_OrderDetails;
END;
--注文番号毎に合計値を更新
UPDATE #Order
SET OrderPrice = @OrderPrice
WHERE OrderCode = @OrderCode
;
FETCH NEXT FROM cur_Order
--次の行の値の格納
INTO @OrderCode;
END;
COMMIT TRANSACTION;
SET @RetCode = 0;
END TRY
BEGIN CATCH
--エラーの場合ロールバックして終了
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END;
END CATCH;
--------------------------------------------------------------------
--終了処理
--------------------------------------------------------------------
IF CURSOR_STATUS('local', 'cur_Order') > 0
BEGIN
CLOSE cur_Order ;
DEALLOCATE cur_Order;
END;
IF CURSOR_STATUS('local', 'cur_OrderDetails') > 0
BEGIN
CLOSE cur_OrderDetails ;
DEALLOCATE cur_OrderDetails;
END;
END
GO
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。