从 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;
我正在尝试使用 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;