Во-первых, я все еще немного зеленый для Delphi, так что это может быть «приземленная деталь», которую упускают из виду. [извините заранее]
Мне нужно создать TSQLDataset или TClientDataSet из курсора Oracle 11g, содержащегося в пакете. Я использую 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;
У меня нет проблем с выполнением этой процедуры в 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 из функции, если это проще или дает результаты. Данные используются для заполнения настраиваемых атрибутов объекта.
TCLientDataSet.ProviderName-> TDataSetProvider.Dataset-> TSQLStoredProc.SQLConnection -> TSQLConnection TSQLStoredProc.PackageName -> 'KP_DATASNAPTEST' TSQLStoredProc.StoredProcName -> 'GETFAXDATA' TSQLStoredProc.Params.ABBR -> 'ZZZTOP'
Функция привязки данных просто открывает ClientDataset, возвращает ClientDataSet.Data, а затем закрывает соединение. Как-то мне нужно сделать это более динамичным. - person Troy Harris   schedule 25.10.2012