Вызов Oracle SP из ADO - PullRequest
       14

Вызов Oracle SP из ADO

0 голосов
/ 21 декабря 2018

Я пытаюсь вызвать хранимую процедуру с параметрами входа и выхода из 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 TADOStoredProc и ADOConnection1 является действительным соединением с моей базой данных Oracle.

В соответствии с сайтами seval вы НЕ должны создавать процедуру OUT.Но здесь я попадаю в ловушку 22.

Если я опускаю параметр, я выдаю ошибку об отсутствующем параметре: enter image description here

Если я добавлю параметр Cursor

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

Я получаю сообщение об ошибке, что параметры не объявлены правильно enter image description here

Очевидное было бы далеко от ADO, но это невозможнопоскольку идентификатор программы заполнен ссылками на _RecordSet

Итак, вкратце, как мне вызвать SP в Oracle с использованием ADO?

Единственными фиксированными вещами являются Delphi и ADO.Вы можете изменить TADOStoredProc на TADOCommand или запрос.Пока это работает.

1 Ответ

0 голосов
/ 21 декабря 2018

Я нашел «решение» с использованием ODAC:

Отнюдь не оптимально.Но так как я не могу избавиться от драйвера 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;
...