gpt4 book ai didi

delphi - 如何使用Delphi和DBExpress从存储的proc作为客户端数据集返回Oracle Cursor

转载 作者:行者123 更新时间:2023-12-03 18:19:35 25 4
gpt4 key购买 nike

第一关我还是对Delphi有点绿色,所以这可能是一个“世俗的细节”,正在被忽略。 [对不起]

我需要从包中包含的Oracle 11g游标创建TSQLDataset或TClientDataSet。我正在使用Delphi XE2和DBExpress连接到DB和DataSnap,以将数据发送回客户端。

我在从Delphi代码执行存储过程时遇到问题。

包装头:

create or replace
PACKAGE KP_DATASNAPTEST AS
procedure GetFaxData(abbr varchar2, Res out SYS_REFCURSOR);
END KP_DATASNAPTEST;


包装体:

create or replace
PACKAGE body KP_DATASNAPTEST AS
procedure GetFaxData(abbr varchar2, Res out SYS_REFCURSOR)is
Begin
open Res for
SELECT Name,
Address1,
City,
fax_nbr
FROM name
JOIN phone on name.Abrv = phone.abrv
WHERE phone.fax_nbr is not null and name.abrv = abbr;
end;
END KP_DATASNAPTEST;


我在SQL Developer中执行此过程没有问题,问题出在DataSnap服务器上的以下代码中:

function TKPSnapMethods.getCDS_Data2(): OleVariant;
var
cds: TClientDataSet;
dsp: TDataSetProvider;
strProc: TSQLStoredProc;
begin
strProc := TSQLStoredProc.Create(self);
try
strProc.MaxBlobSize := -1;
strProc.SQLConnection:= SQLCon;//TSQLConnection

dsp := TDataSetProvider.Create(self);
try
dsp.ResolveToDataSet := True;
dsp.Exported := False;
dsp.DataSet := strProc;
cds := TClientDataSet.Create(self);
try
cds.DisableStringTrim := True;
cds.ReadOnly := True;
cds.SetProvider(dsp);

strProc.Close;
strProc.StoredProcName:= 'KP_DATASNAPTEST.GetFaxData';
strProc.ParamCheck:= true;
strProc.ParamByName('abbr').AsString:= 'ZZZTOP';
strProc.Open; //<--Error: Parameter 'Abbr' not found.

cds.Open;
Result := cds.Data;
finally
FreeAndNil(cds);
end;
finally
FreeAndNil(dsp);
end;
finally
FreeAndNil(strProc);
self.SQLCon.Close;
end;
end;


我也尝试通过ClientDataSet分配参数值,但没有任何运气。
如果函数比较简单或产生结果,我不会反对从函数返回TDataSet。该数据用于填充自定义对象属性。

最佳答案

正如this answer中提到的paulsm4一样,Delphi并不关心获取存储过程参数描述符,因此您必须自己掌握它。要从包中获取Oracle存储过程的参数,可以尝试使用GetProcedureParams方法用参数描述符填充列表,并使用LoadParamListItems过程用该列表Params集合填充。在代码中,它可能如下所示。

请注意,以下代码只是根据文档在浏览器中编写的,因此未经测试。是的,关于释放ProcParams变量,这是通过FreeProcParams过程完成的:

var
ProcParams: TList;
StoredProc: TSQLStoredProc;
...
begin
...
StoredProc.PackageName := 'KP_DATASNAPTEST';
StoredProc.StoredProcName := 'GetFaxData';
ProcParams := TList.Create;
try
GetProcedureParams('GetFaxData', 'KP_DATASNAPTEST', ProcParams);
LoadParamListItems(StoredProc.Params, ProcParams);
StoredProc.ParamByName('abbr').AsString := 'ZZZTOP';
StoredProc.Open;
finally
FreeProcParams(ProcParams);
end;
...
end;

关于delphi - 如何使用Delphi和DBExpress从存储的proc作为客户端数据集返回Oracle Cursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054254/

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