OID連続取得とトランザクション


ArcGIS 10.0のHelpにはi登録IDのプロシージャについて記載有。
http://help.arcgis.com/ja/arcgisdesktop/10.0/help/index.html#//006z00000017000000

が10.1には存在しない?
http://resources.arcgis.com/ja/help/main/10.1/index.html#//006z00000017000000

かつ内部でトランザクション張ってるんで排他レベルで挙動確認してみたが、
ネストトランザクションになるので想定では被りなしで問題なく動作しそう。
https://technet.microsoft.com/ja-jp/library/ms189336%28v=sql.105%29.aspx

NextRowIdだけだと大量レコードが遅いのでとりあえず使っとく。

とりあえずプロシージャをさらに名称呼び出し可能にしとく。
アプリ側では別に名称保持して問い合わせしないほうがいい気はするが(テーブル消される想定するか次第だが)

CREATE PROCEDURE get_oid_range
  @idrange AS INT,
  @owner AS NVARCHAR(32),
  @tabName AS NVARCHAR(128) ,
  @id AS INT OUTPUT
AS
--DECLARE @idrange AS INT = 10;
--DECLARE @owner AS NVARCHAR(32) = 'すきーまめい';
--DECLARE @tabName AS NVARCHAR(128) = 'てーぶるめい';

DECLARE @regid AS INT;

SELECT
 @regid = registration_id
FROM
 dbo.SDE_table_registry
WHERE
 database_name = DB_NAME()
  AND
 owner = UPPER(@owner)
  AND
 table_name = @tabName
;

DECLARE @sql AS NVARCHAR(MAX);

DECLARE @num_ids AS INT;

DECLARE @sParam AS NVARCHAR(MAX) = N'@id AS INT OUTPUT, @num_ids AS INT OUTPUT';  
SET @sql = N'EXEC ' + @owner + N'.i'+ CONVERT(NVARCHAR(13) ,@regid) +'_get_ids 2, '
                                    + CONVERT(NVARCHAR(13) ,@idrange) + N', @id output, @num_ids output;';

EXECUTE sp_executesql @sql, @sParam, @id output, @num_ids output;

RETURN;

GO

使う方はとりあえず、IDの進捗と同時実行性みとくが、Insertは基本的にWaitに入る仕組みなので微妙。
シーケンス使って管理してくれたほうが楽だが同名プロシージャを内部的に以下略したらダメなのかな。。。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRANSACTION

DECLARE @owner AS NVARCHAR(128) = N'gis';
DECLARE @nextrowId INT;
DECLARE @rowcount INT = 10;

EXEC get_oid_range
 @idrange = @rowcount,
 @owner = @owner,
 @tabName = N'TEST_TABLE',
 @id = @nextrowId OUTPUT;

PRINT @nextrowId 

--50秒間待機する
WAITFOR DELAY '00:00:50'


ROLLBACK TRANSACTION
カテゴリー: 開発 タグ: パーマリンク