如何从存储过程使用Delphi和dbExpress的返回Oracle游标作为客户端数据集(How t

2019-10-17 08:22发布

第1关我还是有点绿德尔福所以这可能是一个“平凡的细节”那是被漏掉了。 [抱歉预先]

我有一个需要从包含在一个封装中的Oracle 11g光标创建一个将TSQLDataSet或的TClientdataSet。 我使用德尔福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开发这个程序没有问题:

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的帕拉姆值。 我不会被并列从函数返回一个数据集组件如果简单或产生的结果。 的数据被用来填充自定义对象的属性。

Answer 1:

正如paulsm4中提到的this answer ,德尔福并不关心怎样存储过程的参数描述符,所以你自己要它。 要获得从包中的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;


Answer 2:

我不认为德尔福将自动地认识到甲骨文的参数名称,并填写他们给你的。 我认为你需要添加参数。 例如:

with strProc.Params.Add do
 begin
   Name := 'abbr';
   ParamType := ptInput;
   Value := ZZZTOP';
   ...
 end;


文章来源: How to return Oracle Cursor from stored proc as Client Dataset using Delphi and DBExpress