1

最初のオフ私はまだ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を返す必要はありません。データは、カスタムオブジェクト属性を設定するために使用されます。

4

2 に答える 2

3

paulsm4で説明したようにthis answer、Delphiはストアドプロシージャのパラメータ記述子を取得する必要がないため、自分で取得する必要があります。パッケージから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;
于 2012-10-25T01:55:24.423 に答える
2

DelphiがOracleパラメータ名を自動的に認識して入力してくれるとは思いません。パラメータを追加する必要があると思います。例えば:

with strProc.Params.Add do
 begin
   Name := 'abbr';
   ParamType := ptInput;
   Value := ZZZTOP';
   ...
 end;
于 2012-10-25T00:22:47.973 に答える