最初のオフ私はまだDelphiに対して少し環境に配慮しているので、これは見過ごされている「ありふれた詳細」である可能性があります。【ごめんなさい】
パッケージに含まれているOracle11gカーソルから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を介してparam値を割り当てようとしました。TDataSetが簡単であるか結果が得られる場合は、関数からTDataSetを返す必要はありません。データは、カスタムオブジェクト属性を設定するために使用されます。