ORACLE:如何使用in和out参数调用存储过程

ORACLE:如何使用in和out参数调用存储过程,oracle,delphi,Oracle,Delphi,我在Oracle中有一个StoredProcedure,其中有一个in参数和一个our参数游标 该程序定义如下: PROCEDURE GetAccessObjects2(ALotteryID IN VARCHAR2, AAccessObjects OUT CURSOR_TYPE) AS BEGIN OPEN AAccessObjects FOR SELECT AccessObjectID, AccessObjectName FROM AccessObjects; EN

我在Oracle中有一个StoredProcedure,其中有一个in参数和一个our参数游标

该程序定义如下:

PROCEDURE GetAccessObjects2(ALotteryID IN VARCHAR2, AAccessObjects OUT CURSOR_TYPE) AS
BEGIN
  OPEN AAccessObjects FOR
    SELECT  AccessObjectID, AccessObjectName
    FROM    AccessObjects;
END;
然后我试着从Delphi调用它:

procedure TForm7.Button1Click(Sender: TObject);
begin
  with ADOStoredProc1 do
  begin
    Connection := ADOConnection1;
    CursorType := ctOpenForwardOnly;
    MaxRecords := 5000;
    ProcedureName := 'DDK.GetAccessObjects2';
    with Parameters.AddParameter do
    begin
      Name := 'ALotteryID';
      DataType := ftString;
      Value := 'TEST';
    end;
  end;

  ADOStoredProc1.Open;
end;
但我有一个例外:

ORA-06550:第1行第7列:PLS-00306:错误的编号或类型 调用“GETACCESSOBJECTS2”ORA-06550的参数:第1行第7列: PL/SQL:忽略语句

PS:ADOConnection1是到数据库的有效连接

据介绍,没有必要为光标AAccessObjects定义参数,但oracle不这么认为

简而言之,如何使用ADO从Delphi调用SP

更新

我已尝试为游标ad提供一个参数:

  with ADOStoredProc1 do
  begin
    Connection := ADOConnection1;
    CursorType := ctOpenForwardOnly;
    MaxRecords := 5000;
    ProcedureName := 'DDK.GetAccessObjects2';
    Parameters.CreateParameter('ALotteryID', ftString, pdInput, 255, 'TEST');
    Parameters.CreateParameter('AAccessObjects', ftCursor, pdOutput, 0, null);
  end;

  ADOStoredProc1.Open;
但我在ADO内部得到一个异常:

参数对象定义不正确

试试这个:

ParamType := ptOutput

不确定Oracle中游标类型的数据类型。

您是否尝试在设置过程重命名后调用ADOStoredProc1.Parameters.Refresh,然后直接在不使用AddParameter的情况下设置ALotteryID参数值。.Refresh应返回服务器上准备使用的参数。否。稍后我会尝试。在哪里定义Access ObjistNord?这是数据库中一个表中要考虑的一个字段,游标可以是服务器端或客户端。如果参数为out,则表示服务器端游标,但ADO可能需要客户端游标。我不知道这是事实——这只是一个想法。如果是这种情况,我想cursor参数应该是in-out。不幸的是,我不知道Oracle中的cursor\u类型。但我知道有一个ptOutput参数类型。我曾在其他数据库中使用过它。我怀疑您的建议是将光标作为参数传递,但OP中的链接表明这是错误的。@Dsm如果这样做,我会在ADO驱动程序中遇到一个异常:参数对象定义不正确。我相信解决方案将切换到ODAC