Ausführen von gespeicherten Prozeduren (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)

Verwenden von TFDStoredProc

Im Allgemeinen kann TFDStoredProc zur Entwurfszeit und/oder zur Laufzeit konfiguriert werden. TFDStoredProc generiert transparent eine SQL-Anweisung, um eine gespeicherte Prozedur auf Basis der TFDStoredProc-Eigenschaftswerte aufzurufen. Vor der Ausführung sendet FireDAC die Parameterwerte an ein DBMS, führt dann eine gespeicherte Prozedur aus und erhält die Ausgabeparameterwerte.

Hinweis: FireDAC unterstützt keine Parameter mit Vorgabewerten.


Festlegen von gespeicherten Prozeduren zur Entwurfszeit

Ziehen Sie eine TFDStoredProc-Komponente auf ein Formular, um eine gespeicherte Prozedur auszuführen. TFDStoredProc.Connection wird automatisch so gesetzt, dass es auf eine TFDConnection-Komponente in diesem Formular zeigt, falls eine vorhanden ist.

Legen Sie dann optional die Eigenschaften CatalogName, SchemaName und PackageName fest, oder wählen Sie deren Werte aus einer Dropdown-Liste aus. Nach dem Festlegen von StoredProcName und wenn fiMeta in FetchOptions.Items enthalten ist, wird die Params-Sammlung automatisch gefüllt.

Setzen Sie ResourceOptions.UnifyParams auf True, um Parameternamen zu vereinheitlichen. Beispielsweise wird dadurch auch das Präfix "@" der Parameternamen aus gespeicherten Prozeduren von SQL Server ausgeschlossen.


Festlegen von gespeicherten Prozeduren zur Laufzeit

Dies entspricht weitgehend dem Vorgehen zur Entwurfszeit, Sie müssen nur den folgenden Code verwenden:

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.Prepare;
// now the Params collection is filled in

Durch den Aufruf von Prepare wird die Params-Sammlung unter Verwendung der mkProcArgs-Metadaten gefüllt, wenn fiMeta in FetchOptions.Items enthalten ist.

Hinweis:
  • Das Abfragen von mkProcArgs kann sehr zeitintensiv sein.
  • Die Anwendung kann die Parameterdefinitionen nicht ändern, nach dem Params gefüllt wurde. Beispielsweise setzt die Zuweisung zu den TADParam.AsXxxx-Eigenschaften implizit den Parameterdatentyp.

Um die oben erläuterten Probleme zu vermeiden, schließen Sie fiMeta aus FetchOptions.Items aus, damit die Params-Sammlung beim Aufruf von Prepare nicht automatisch neu erstellt wird. Füllen Sie außerdem die Params-Sammlung manuell vor dem Aufruf von Prepare oder ExecProc, indem Sie den folgenden Code verwenden:

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
FDStoredProc1.Command.FillParams(FDStoredProc1.Params);

Oder verwenden Sie dazu den folgenden Code:

FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
with FDStorecProc1.Params do begin
  Clear;
  with Add do begin
    Name := 'Par1';
    ParamType := ptInput;
    DataType := ftString;
    Size := 50;
  end;
  with Add do begin
    Name := 'Par2';
    ParamType := ptOutput;
    DataType := ftInteger;
  end;
end;


Verwenden von gepackten Prozeduren

Damit eine gepackte Prozedur verwendet werden kann, muss in der Anwendung der Package-Name angegeben werden. Führen Sie dazu einen der folgenden Schritte aus:

  • Legen Sie PackageName fest – der Package-Name kann im Format [<Katalogname>.][<Schemaname>.]<Package-Name> angegeben werden.
  • Legen Sie StoredProcName fest – der Name der gespeicherten Prozedur kann im Format [<Katalogname>.][<Schemaname>.]<Package-Name>.<Name der gespeicherten Prozedur> angegeben werden.

Zur Auswahl der überladenen Prozedur muss in der Anwendung die Eigenschaft Overload angegeben werden. Beispiel für Oracle:

FDStoredProc1.PackageName := 'SYS.DBMS_SQL';
FDStoredProc1.Overload := 1;
FDStoredProc1.StoredProcName := 'BIND_VARIABLE';


Ausführen der gespeicherten Prozedur

Mit der Methode ExecProc führen Sie eine gespeicherte Prozedur aus, die keine Ergebnismenge zurückgibt. Verwenden Sie zum Ausführen einer gespeicherten Funktion die Methoden ExecProc oder ExecFunc, wobei ExecFunc den Funktionswert zurückgibt. Wenn eine gespeicherte Prozedur eine Ergebnismenge zurückgibt, wird die Exception "[FireDAC][Phys][Oracl]-310. Anweisung, die Ergebnismengen zurückgibt, kann nicht ausgeführt werden" ausgelöst.

Hinweis: Es gibt mehrere überladene ExecProc- und ExecFunc-Methoden, mit denen Sie die Verwendung der Eigenschaft TFDStoredProc vermeiden und alle erforderlichen Informationen als Methodenargumente angeben können. Zum Beispiel:
FDStoredProc1.StoredProcName := 'MY_PROC';
FDStoredProc1.Prepare;
FDStoredProc1.Params[0].Value := 100;
FDStoredProc1.Params[1].Value := 'audi';
FDStoredProc1.ExecProc;

Oder kompakter:

FDStoredProc1.ExecProc('MY_PROC', [100, 'audi']);

Mit den Open-Methoden führen Sie eine gespeicherte Prozedur aus, die eine Ergebnismenge zurückgibt, und öffnen diese Ergebnismenge. Wenn eine gespeicherte Prozedur keine Ergebnismengen zurückgibt, wird die Exception "[FireDAC][Phys][Oracl]-308. Anweisung, die keine Ergebnismengen zurückgibt, kann nicht geöffnet/definiert werden" ausgelöst. Wenn die gespeicherte Prozedur mehrere Ergebnismengen zurückgibt, finden Sie unter Anweisungsstapel Einzelheiten.


Hinweis: Gespeicherte Prozeduren können asynchron ausgeführt werden.

Verwenden von TFDQuery

Der Hauptunterschied zwischen TFDStoredProc und TFDQuery ist, dass TFDStoredProc automatisch einen Aufruf einer gespeicherten Prozedur anhand der Parameterinformationen generiert. Der SQL-Code, mit dem eine gespeicherte Prozedur aufgerufen wird, kann direkt mit einer der FireDAC-Methoden der SQL-Anweisungsausführung ausgeführt werden. Rufen Sie zum Beispiel eine gepackte Oracle-Prozedur mit TFDQuery auf:

with FDQuery1.SQL do begin
  Clear;
  Add('begin');
  Add('  sys.dbms_sql.bind_variable(:c, :name, :value');
  Add('end;');
end;
FDQuery1.Params[0].AsInteger := 1;
FDQuery1.Params[1].AsString := 'p1';
FDQuery1.Params[2].AsInteger := 100;
FDQuery1.ExecSQL;


Verwenden von TFDCommand

Schließlich können Sie auch TFDCommand zum Ausführen einer gespeicherten Prozedur verwenden. Die meisten der obigen Spezifikationen betreffen auch TFDCommand.

Siehe auch

Beispiele