【 プロシージャの使用 】

1. 部品化
2. テーブル作成
3. テストデータ作成

  • 以下のコードをコンパイルします

  • if exists(select * from sysobjects where name = 'GET_TANKA_PROC' and type = 'P')
    	drop procedure GET_TANKA_PROC
    go
    -- *********************************************************
    -- 在庫評価単価取得
    -- *********************************************************
    CREATE	PROCEDURE	GET_TANKA_PROC
    	@コード varchar(4)
    AS
     
    DECLARE
    	@新単価	int
     
    select @新単価 = 在庫評価単価 from 在庫マスタ
    		where 商品コード = @コード
    if @@ROWCOUNT <> 0
    	Begin
    		return	@新単価
    	End
    else
    	Begin
    		return	-1
    End
    go
    


  • 上記コードをSQLの窓1.5(改)で実行するには以下のように記述します

  • DECLARE @RET int
    exec @RET = GET_TANKA_PROC @コード = '0001'
    select @RET as 新単価
    


  • 結果は以下のようになります

  • No.新単価
    1110000 


  • このストアードプロシージャを Transact-SQL の中で使うと以下のようになります

  • /******************
     定義
    ******************/
    DECLARE
    	@コード	varchar(4),
    	@商品名	varchar(50),
    	@単価	int,
    	@新単価	int,
    	@LOOP	int
     
    /******************
     初期処理
    ******************/
    set @LOOP = 1
     
    /******************
     前処理
    ******************/
    DECLARE CURSOR_FETCH cursor for
    select 
    	コード,
    	商品名,
    	単価
    	from 商品マスタ
     
    open CURSOR_FETCH
     
    /******************
     ループ
    ******************/
    While(@LOOP = 1)
    Begin
    	Fetch CURSOR_FETCH
    		into
    			@コード,
    			@商品名,
    			@単価
    	if (@@FETCH_STATUS != 0)
    		Begin
    		break
    	End
     
    	exec @新単価 = GET_TANKA_PROC @コード
     
    	IF @新単価 >= 0
    		Begin
    		update 商品マスタ set 単価 = @新単価
    			where current of CURSOR_FETCH
    		select @単価 as 更新前単価,@新単価 as 更新後単価
    	End
     
    End
     
    /******************
     後処理
    ******************/
    close CURSOR_FETCH
    DEALLOCATE CURSOR_FETCH
    


  • 必要な値が数値なので、戻り値として指定できましたが、必要な値が文字列の場合は引数として
    取得する必要があります
  • if exists(select * from sysobjects where name = 'CREATE_USER_TABLES' and type = 'P')
    	drop procedure CREATE_USER_TABLES
    go
    -- *********************************************************
    -- ユーザーテーブル作成
    -- *********************************************************
    CREATE	PROCEDURE	CREATE_USER_TABLES
    AS
    DECLARE
    	@TABLE	varchar(255)
     
    -- *********************************************************
    -- 商品マスタ
    -- *********************************************************
    set @TABLE = '商品マスタ'
    if exists(select * from sysobjects where name = @TABLE and type = 'U')
    	Begin
    		exec( 'drop table ' + @TABLE )
    End
    if exists(select * from sysobjects where name = @TABLE)
    	Begin
    		select 'データベースにオブジェクト名 ' + @TABLE + ' が既に存在します'
    	End
    else
    	Begin
    		CREATE TABLE 商品マスタ (
    			コード varchar(4),
    			商品名 varchar(50),
    			単価 int,
    			primary key(コード)
    		)
    	select @TABLE + '作成に成功しました'
    End
     
     
    -- *********************************************************
    -- 在庫マスタ
    -- *********************************************************
    set @TABLE = '在庫マスタ'
    if exists(select * from sysobjects where name = @TABLE and type = 'U')
    	Begin
    		exec( 'drop table ' + @TABLE )
    End
    if exists(select * from sysobjects where name = @TABLE)
    	Begin
    		select 'データベースにオブジェクト名 ' + @TABLE + ' が既に存在します'
    	End
    else
    	Begin
    		CREATE TABLE 在庫マスタ (
    			コード varchar(4),
    			在庫数量 int,
    			在庫評価単価 int,
    			primary key(コード)
    		)
    	select @TABLE + '作成に成功しました'
    End
     
    go
    


  • exec( 'drop table ' + @TABLE ) は、文字列としてのSQLステートメントの動的実行です

  • テーブル作成部分は、テーブルの CREATE 文以外は共通なので、CREATE 文をテーブルに登録し、
    読み出すようにすれば、ストアードプロシージャとして一つの部品とする事が可能です


  • 以下のコードをコンパイルします

  • if exists(select * from sysobjects where name = 'CREATE_GDATA' and type = 'P')
    	drop procedure CREATE_GDATA
    go
    -- *********************************************************
    -- 商品マスタのテストデータ作成
    -- *********************************************************
    CREATE	PROCEDURE	CREATE_GDATA
    	@MAXCOUNT int
    AS
    /******************
     定義
    ******************/
    DECLARE
    	@コード	varchar(4),
    	@商品名	varchar(50),
    	@単価	int,
    	@LOOP	int,
    	@OK	int,
    	@ERR	int
     
    /******************
     初期処理
    ******************/
    set @OK = 0
    set @LOOP = 1
    set @単価 = round(rand(@MAXCOUNT)*10000,-2)
    truncate table 商品マスタ
     
    /******************
     ループ
    ******************/
    While(@LOOP <= @MAXCOUNT)
    Begin
     
    	set @コード = right('0000'+CAST(@LOOP as varchar),4)
    	set @商品名 = '商品名' + replace(space(40), ' ', '-' ) + @コード
    	set @単価 = round(rand()*10000,-2)
    	insert into 商品マスタ
    		(コード,商品名,単価)
    		values(@コード,@商品名,@単価)
    	set @ERR = @@ERROR
    	if @ERR <> 0
    		Begin
    		select 'エラーコード = ' + CAST(@ERR as varchar)
    		End
    	else
    		Begin
    		set @OK = @OK + 1
    	End
     
    	set @LOOP = @LOOP + 1
     
    End
    select '作成件数 = ' + CAST(@OK as varchar)
    go
    


  • 上記コードでデータを作成した結果は以下のようになります

  • コード 商品名 単価
    10001商品名----------------------------------------00011800
    20002商品名----------------------------------------00025900
    30003商品名----------------------------------------00038500
    40004商品名----------------------------------------00044100
    50005商品名----------------------------------------00051300
    60006商品名----------------------------------------00066100
    70007商品名----------------------------------------00077300
    80008商品名----------------------------------------00085900
    90009商品名----------------------------------------00096100
    100010商品名----------------------------------------00104700