В Oracle у меня есть много хранимых процедур с использованием пакета, который в основном хранит (инкапсулирует) и инициализирует все переменные, используемые этими процедурами. В пакете также есть одна функция, которая заботится об инициализации всех ее переменных пакета.Как перевести пакет Oracle на SQL Server?
Мой вопрос: как перенести это на SQL Server?
Моя первая попытка состоит в том, чтобы объявить все переменные пакета и использовать их как параметры OUTPUT для процедуры инициализации, но тогда мне нужно объявлять эти переменные снова и снова в каждой процедуре, используя их (и есть много их в пакете). Есть ли лучший (и DRY) способ сделать это на SQL Server?
Некоторый код, чтобы объяснить это:
ORACLE:
Пакет:
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 Server:
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)
Надежда описание достаточно ясно ...
Вам не нравится 'declare @initvalue integer = 33, var1 varchar (30), @ var2 integer', в частности? –
Да, потому что мне нужны эти вары почти во всех моих процедурах. поэтому я хочу инкапсулировать эти вары и (самое главное для меня) их инициализацию. – Jakob