是否可以在Firebird中定义存储过程的表类型输入参数



我需要用表类型输入参数定义存储过程,所以例如,如果我从C#调用存储过程,并将datatable作为参数传递给存储过程,那么它会自动映射到列和字段吗?

我读过关于创建全局临时表的文章,但如何在Firebird中用作输入参数?我不知道这是否可能。

Firebird存储过程只接受标量值,因此不能传递表类型的输入参数。解决方法是将全局临时表(GTT(定义为存储过程的伴随表,并在调用存储过程之前填充该全局临时表。然后,存储过程从全局临时表中读取。

需要明确的是,全局临时表是持久的定义(只需创建一次,然后所有连接和用户都可以重用它们(假设用户已被授予正确的权限((,而GTT中的数据仅对当前事务(on commit delete rows;默认值(或当前连接(on commit preserve rows(可见。它们不像SQL Server中的(本地(临时表。

换句话说,这种类型的临时表的定义是全局的和持久的,但数据是特定于事务或连接的。

因此,您要做的是定义一个全局临时表:

create global temporary table input_sp_example (
col1 integer,
col2 varchar(100)
) on commit delete rows

以及示例存储过程

create procedure sp_example
returns (result1 integer, result2 varchar(8192))
as
declare col1_value integer;
declare col2_value varchar(100);
begin
for select col1, col2 from input_sp_example order by col1, col2 into col1_value, col2_value do
begin
if (col1_value is distinct from result1) then
begin
result1 = col1_value;
result2 = col2_value;
end
else
begin
result2 = result2 || col2_value;
end
suspend;
end
end

然后你可以这样称呼它:

insert into input_sp_example (col1, col2) values (1, 'a');
insert into input_sp_example (col1, col2) values (1, 'b');
insert into input_sp_example (col1, col2) values (1, 'c');
insert into input_sp_example (col1, col2) values (2, 'a');
select * from sp_example;

这个基本的例子将产生的结果

RESULT1RESULT2
1a
1ab
1abc
2a

最新更新