Прелюдия:
Есть оракловый пакетик с процедурой, возвращающей открытый курсор:
create or replace package body defs is
procedure p_staff( xuserid in integer, xdataset out defs.dataset)
is
begin
open xdataset for
select s.rowid, s.vcfirstname, s.vcsecondname
from staff s
where s.iuserid = xuserid;
end;
begin
null;
end defs;
Есть процедурка на Дельфе (7), которая через ADO дергает эту процедуру и передает данные из курсора в TADODataSet:
procedure TfmMain.ButtonClick(Sender: TObject);
var
Con : _Connection;
Cmd : _Command;
Prm : _Parameter;
Rst : _Recordset;
RCount : OleVariant;
begin
RCount := 0;
Con := CoConnection.Create;
Con.ConnectionString := 'Provider=OraOLEDB.Oracle.1;'+
'Persist Security Info=False;'+
'User ID=dbo;Password=111;'+
'Data Source=src';
Con.Open(Con.ConnectionString,'','',0);
Cmd := ADODB_TLB.CoCommand.Create;
Cmd.Set_ActiveConnection(Con);
Cmd.CommandType := ADODB_TLB.adCmdText;
Cmd.Properties['PLSQLRSet'].Value := True;
Cmd.CommandText := '{ CALL DEFS.P_STAFF(?) }';
Prm := Cmd.CreateParameter('XUSERID',adInteger,adParamInput,4,10);
Prm.Value := 10;
Cmd.Parameters.Append(Prm);
Rst := Cmd.Execute(RCount,EmptyParam,adOptionUnspecified);
Rst.Close;
Rst.CursorLocation := adUseClient;
Rst.CursorType := adOpenStatic;
Rst.LockType := adLockOptimistic;
Rst.Open(EmptyParam,EmptyParam,adOpenDynamic,adLockOptimistic,adOptionUnspecified);
DataSet.Recordset := ADOInt.Recordset(Rst);
end;
Результат : все сказочно, за исключением того, что рекордсет только для чтения.
Вопрос:
В чем грабель?
Сотрудничества нет, есть взаимное паразитирование... (С)