第一次關閉我對Delphi仍然有點綠色,所以這可能是一個「世俗的細節」,它已經被忽略了。 [提前抱歉]如何使用Delphi和DBExpress將Oracle遊標從存儲過程作爲客戶端數據集返回
我需要從軟件包中包含的Oracle 11g光標創建TSQLDataset或TClientDataSet。我使用Delphi XE2和DBExpress連接到數據庫和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;
我有執行的DataSnap服務器上的代碼在SQL Developer中的問題在於這個過程沒有問題:
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。數據用於填充自定義對象屬性。
我能夠在數據模式掉落的部件,使通過該數據庫靜態連接來獲得此功能: '的TClientdataSet .ProviderName-> TDataSetProvider.Dataset-> TSQLStoredProc.SQLConnection - >設爲TSQLConnection TSQLStoredProc.PackageName - > 'KP_DATASNAPTEST' TSQLStoredProc.StoredProcName - > 'GETFAXDATA' TSQLStoredProc.Params.ABBR - >「ZZZTOP'' 數據捕捉功能只是打開ClientDataset,返回Clien tDataSet.Data然後關閉連接。 不知何故,我需要使這更加動態。 –