ODAC Version: 11.2.4.
Delphi Version: RAD Studio 10.1 Berlin
Oracle Version 19c client and server
(But I don't think any of this is version specific)
The code below works as expected. qryParam shows 2 rows returned by the cursor.
Code: Select all
procedure TForm1.FormCreate(Sender: TObject);
var
  sess: TOraSession;
  qry: TOraSQL;
  qryParam: TOraQuery;
begin
  sess := TOraSession.Create(nil);
  sess.HomeName := 'OraClient19Home1_32bit';
  sess.Username := 'jdorlon';
  sess.Password := 'jdorlon';
  sess.Server := 'azure_19c_plug';
  sess.LoginPrompt := False;
  sess.connected := true;
  qry := TOraSQL.Create(nil);
  qry.Session := Sess;
  qry.sql.add('CREATE OR REPLACE PROCEDURE DUAL_REFCURS(cur OUT SYS_REFCURSOR) IS');
  qry.sql.add('BEGIN');
  qry.sql.add('  OPEN cur');
  qry.sql.add('  FOR');
  qry.sql.add('  select 1 as data from dual');
  qry.sql.add('  union all');
  qry.sql.add('  select 2 from dual;');
  qry.sql.add('END;');
  qry.Execute;
  qry.SQL.Clear;
  qry.sql.add('begin');
  qry.sql.add('  DUAL_REFCURS(:cur);');
  qry.sql.add('end;');
  qry.ParamByName('cur').dataType := ftCursor;
  qry.ParamByName('cur').paramType := ptOutput;
  qry.Execute;
  qryParam := TOraQuery.Create(nil);
  qryParam.Session := sess;
  qryParam.Cursor := qry.ParamByName('cur').AsCursor;
  qryParam.Open;
  if qryParam.eof then
    memo1.Lines.Add('qryParam returned no rows')
  else
    memo1.Lines.Add('qryParam returned ' + IntToStr(qryParam.RecordCount) + ' rows');
  qryParam.Free;
  qry.free;
  sess.free;
end;
How can I make the code above work with a TOraQuery?
Thank you
John