Oracleには、これらのプロシージャで使用されるすべての変数を基本的に格納(カプセル化)および初期化するパッケージを使用する多くのストアドプロシージャがあります。パッケージには、すべてのパッケージ変数の初期化を処理する関数も 1 つあります。
私の質問は、これを SQL Server に移植する方法ですか?
私の最初の試みは、すべてのパッケージ変数を宣言し、それらを初期化するプロシージャの OUTPUT パラメータとして使用することですが、その後、それらを使用する各プロシージャでこれらの変数を何度も何度も宣言する必要があります (パッケージにはそれらがたくさんあります)。 )。SQL Server でこれを行うためのより良い (そして DRY) 方法はありますか?
それを説明するいくつかのコード:
オラクル:
その包み:
create or replace
PACKAGE MYPARAMS AS
/**
param container
*/
type rc_params is record
(
var1 varchar2(30),
var2 integer
);
/**
init param container
use: v_params rc_pkp_plan_params := MYPARAMS.f_get_params(initvar)
*/
function f_get_params(initvar number) return rc_params;
END MYPARAMS;
/
パッケージ本体:
CREATE OR REPLACE
PACKAGE BODY MYPARAMS AS
function f_get_params(initvar number) return rc_params AS
retval rc_params;
BEGIN
retval.var1 := 'MY_VAR1';
retval.var2 := initvar;
return retval;
END f_get_params;
END MYPARAMS;
/
いくつかの使用例:
declare
initvar integer := 22;
v_params MYPARAMS.rc_params := MYPARAMS.f_get_params(initvar);
begin
dbms_output.put_line(v_params.var1 || ' initialized by ' || v_params.var2);
end;
SQLサーバー:
if exists (select * from sysobjects where id = object_id('f_get_params'))
drop procedure f_get_params
go
create procedure f_get_params(
@initvalue integer,
@var1 varchar(30) OUTPUT,
@var2 integer OUTPUT
)
as
set @var1 = 'MYVAR1'
set @var2 = @initvalue
go
-- this block i would like to avoid:
declare
@initvalue integer = 33,
@var1 varchar(30),
@var2 integer
exec f_get_params @initvalue, @var1 OUTPUT, @var2 OUTPUT
print @var1 + ' initialized by ' + convert(varchar(2), @var2)
説明が十分に明確であることを願っています...