gpt4 book ai didi

delphi - 如果未预定义值的数量,如何在单个参数中传递多个值

转载 作者:行者123 更新时间:2023-12-05 05:32:35 29 4
gpt4 key购买 nike

我在 dbgrid 中选择了一些行,然后必须在存储过程或查询的参数中传递一组值。我使用 Firebird 3。如果未预定义值的数量,如何在单个参数中传递多个值?例如,对于 good_id 的 3 个值,我得到错误:

conversion error from string "7802 ,8403 ,11461"

create or alter procedure sp_goods (id varchar(60))
returns (
good varchar(50),
good_id integer)
as
begin
for select good_id, good from goods where good_id in (:id)
into :good_id, :good
do suspend;
end


procedure Button1Click(Sender: TObject);
var
str : String;
i : Integer;
begin
Query1.Close;
Query1.SQL.Text := 'select * from sp_goods(:id) ';

with DBGridGoods do
begin
if SelectedRows.Count > 0 then
begin
str := '';
With DataSource.DataSet do
for i := 0 to SelectedRows.Count - 1 do
begin
GotoBookmark(SelectedRows.Items[i]) ;
str := str + FieldByName('good_id').asString + ', ';
end;
str := copy( str, 1, length( str ) - 2 );
end;
end;

Query1.Params[0].AsString:=str;
Query1.Open;

结束;

如果我在 IBExpert 中调用存储过程

select * from sp_goods('8403') 

它有效,但是

select * from sp_goods('8403','7802')

返回错误

Input parameter mismatch for procedure sp_goods.

如果我使用查询而不是存储过程,也会出现同样的错误。

我尝试使用数组作为值,但得到的是空数据集:

 procedure Button1Click(Sender: TObject);
var
a: array of integer;
begin
Query1.Close;
Query1.SQL.Text := 'select * from sp_goods(:id) ';

setlength(a, 2);
a[0]:= 7802;
a[1]:=8403;
Query1.Params[0].Value:= a;
Query1.Open;
end;

最佳答案

在 Firebird 中无法将一组值传递给单个参数。

在您的示例中,整个存储过程毫无意义,使用连接将所有值一次选择到原始网格中更简单、更快速。如果您只想获取选定商品的商品并将它们放入单独的网格中,最好的方法是在循环中执行查询而不是收集 id 列表。如果您准备一次查询(在循环内执行 prepare() 调用是一个常见的错误),它将非常快。

关于delphi - 如果未预定义值的数量,如何在单个参数中传递多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74043494/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com