Ausführen von gespeicherten Prozeduren (FireDAC)
Nach oben zu Arbeiten mit Anweisungen (FireDAC)
Inhaltsverzeichnis
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
- FireDAC Oracle Stored Procedures (Beispiel)