从 ADO 调用 Oracle SP

Calling an Oracle SP from ADO

我正在尝试使用 ADO 中的输入和输出参数调用存储过程

首先是一个小包装和一个 SP :

CREATE OR REPLACE PACKAGE CD_package IS
   TYPE CD_cursor IS REF CURSOR;
   PROCEDURE CDList ( pCost IN Number, pList OUT CD_Cursor ) ;
END CD_package;
/
CREATE OR REPLACE PACKAGE BODY CD_package AS
PROCEDURE CDList ( pCost IN Number, pList OUT CD_Cursor ) IS
-- returns a list of titles available at cost pCost
BEGIN
   OPEN pList FOR
    SELECT CURRENT_TIMESTAMP FROM DUAL;

END CDList;

END CD_package;

还有我的Delphi代码:

      With SP do
      begin
        Close;
        Connection := ADOConnection1;
  ProcedureName := 'CD_package.CDList';  
        Parameters.Clear;
        Parameters.CreateParameter('pCost', ftFloat, pdInput, 0, 2.2);
        Open;
        Last;
      end; // with

SP I a TADOStoredProc 和 ADOConnection1 是到我的 OracleDatabase 的有效连接。

根据几个站点的说法,您不应创建 OUT 过程。但在这里我遇到了 22.

如果我省略参数,则会出现有关缺少参数的错误:

如果我添加一个 Cursor 参数

...
    Parameters.CreateParameter('pList', ftCursor, pdOutput, -1, NULL);
...

我收到错误消息,指出参数声明不正确

显然应该远离 ADO,但这是不可能的,因为程序 ID 充满了对 _RecordSet

的引用

简而言之,如何使用 ADO 在 Oracle 中调用 SP?

唯一固定的东西是 Delphi 和 ADO。您可以自由地将 TADOStoredProc 更改为 TADOCommand 或查询。只要它在工作。

我使用 ODAC 找到了 "solution":

绝不是最佳选择。但由于我无法摆脱 ADO 驱动程序,这是我目前的解决方案:

uses
  System.Win.ComObj;

type
  TCustomADODataSetHelper = class helper for TCustomADODataSet
  public
    procedure AssignFrom(Source: TMemDataSet);
  end;

  { TCustomADODataSetHelper }

procedure TCustomADODataSetHelper.AssignFrom(Source: TMemDataSet);
var
  RS: Variant;
  Stream: TStringStream;
begin
  Stream := TStringStream.Create;
  try
    Source.SaveToXML(Stream);
    Stream.Position := 0;
    RS := CreateOleObject('ADODB.Recordset');
    RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
    Recordset := IUnknown(RS) as _Recordset;
  finally
    Stream.Free;
  end;
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
  with OraStoredProc1 do
  begin
    StoredProcName := 'DDK.GetSystemSettings';;
    Params.CreateParam(ftString, 'APrefix', TParamType.ptInput).Value := '';
    Params.CreateParam(ftCursor, 'ASettings', TParamType.ptOutput);
    Open;
  end;

  ADOStoredProc1.AssignFrom(OraStoredProc1);
  DataSource1.Dataset := ADOStoredProc1;
end;