Parameter für Stored Procedures verwenden

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Datenmengen vom Typ Stored Procedures


Stored Procedures verwenden die folgenden vier Parametertypen:

  • Eingabeparameter für die Übergabe von Werten an eine Stored Procedure zur Verarbeitung.
  • Ausgabeparameter, in denen die Stored Procedure Rückgabewerte an eine Anwendung liefert.
  • Eingabe-/Ausgabeparameter, die dazu dienen, Werte zur Verarbeitung an eine Stored Procedure zu übergeben, und die von dieser zur Rückgabe von Werten an die Anwendung verwendet werden.
  • Einen Ergebnisparameter, mit dem einige Stored Procedures einen Fehler- oder Statuswert an die Anwendung zurückgeben. Eine Stored Procedure kann immer nur einen Ergebnisparameter zurückgeben.

Ob eine Stored Procedure einen bestimmten Parametertyp verwendet, hängt sowohl von der allgemeinen Sprachimplementierung von Stored Procedure auf Ihrem Datenbank-Server als auch von der jeweiligen Instanz einer Stored Procedure ab. Einzelne Stored Procedures können auf allen Servern Eingabeparameter verwenden, dies ist aber nicht zwingend erforderlich. Andererseits sind einige Parameter auf bestimmte Server abgestimmt. So geben Stored Procedures von MS-SQL- und Sybase-Servern immer einen Ergebnisparameter zurück, die InterBase-Implementierung einer Stored Procedure hingegen nie.

Der Zugriff auf die Parameter einer Stored Procedure erfolgt über die Eigenschaft Params (für Objekte vom Typ TStoredProc, TSQLStoredProc, TIBStoredProc) bzw. über die Eigenschaft Parameters (für Objekte vom Typ TADOStoredProc). Wenn Sie der Eigenschaft StoredProcName (bzw. ProcedureName) einen Wert zuweisen, generiert die Datenmenge automatisch Objekte für alle Parameter der Stored Procedure. Wenn der Name der Stored Procedure erst zur Laufzeit zugewiesen wird, müssen bei einigen Datenmengentypen die Objekte für die einzelnen Parameter zu diesem Zeitpunkt im Programm generiert werden. Wenn Sie die Stored Procedure nicht angeben und die Objekte vom Typ TParam bzw. TParameter manuell erzeugen, kann eine einzelne Datenmenge zusammen mit einer beliebigen Anzahl verfügbarer Stored Procedures verwendet werden.

Anmerkung:  Einige Stored Procedures geben zusätzlich zu Ausgabe- und Ergebnisparametern eine Datenmenge zurück, die in den Anwendungen in datensensitiven Steuerelementen angezeigt werden kann. Diese Anwendungen müssen jedoch die Ausgabe- und Ergebnisparameter getrennt verarbeiten.

Parameter zur Entwurfszeit definieren

Sie können Werte für Parameter von Stored Procedures beim Entwurf der Anwendung über den Parameter-Editor angeben. Um diesen Editor zuzugreifen, klicken Sie im Objektinspektor auf die Ellipsen-Schaltfläche (...) für die Eigenschaft Params bzw. Parameters.

Warnung:  Sie können den Eingabeparametern Werte zuweisen, indem Sie diese im Parameter- Editor auswählen und im Objektinspektor die Eigenschaft Value setzen. Ändern Sie jedoch nicht die Namen oder Datentypen, die der Server für die Parameter vorgibt. Andernfalls wird bei der Ausführung der Stored Procedure eine Exception ausgelöst.

Einige Server geben keine Parameternamen oder Datentypen an. In diesen Fällen müssen Sie die Parameter manuell über den Parameter-Editor definieren. Klicken Sie mit der rechten Maustaste, und wählen Sie Hinzufügen, um die benötigten Parameter hinzuzufügen. Für jeden hinzuzufügenden Parameter müssen Sie vollständige Angaben machen. Auch wenn Sie keine Parameter hinzufügen müssen, ist es sinnvoll, die Eigenschaften der einzelnen Parameterobjekte zu überprüfen, um sicherzustellen, dass die richtigen Einstellungen verwendet werden.

Ist für die Datenmenge die Eigenschaft Params vorhanden (bei TParam-Objekten), müssen dafür die folgenden Eigenschaften korrekt angegeben werden:

  • Die Eigenschaft Name gibt den Namen des Parameters an, wie dieser von der Stored Procedure definiert wurde.
  • Die Eigenschaft DataType gibt den Datentyp für den Parameterwert an. Bei TSQLStoredProc-Objekten müssen Sie für einige Datentypen zusätzliche Angaben machen:
  • Über die Eigenschaft NumericScale wird die Anzahl der Dezimalstellen für numerische Parameter angegeben.
  • Über die Eigenschaft Precision wird die Gesamtzahl der Stellen für numerische Parameter angegeben.
  • Über die Eigenschaft Size wird die Anzahl der Zeichen in String-Parametern angegeben.
  • Die Eigenschaft ParamType gibt den Typ des gewählten Parameters an. Zulässig sind die Angaben ptInput (für Eingabeparameter), ptOutput (für Ausgabeparameter), ptInputOutput (für Eingabe-/Ausgabeparameter) und ptResult (für Ergebnisparameter).
  • Die Eigenschaft Value gibt den Wert für den gewählten Parameter an. Die Werte für Ausgabe- und Ergebnisparameter können nicht gesetzt werden. Diese Parametertypen haben Werte, die bei der Ausführung der Stored Procedure gesetzt werden. Für Eingabeparameter sowie für Eingabe-/Ausgabeparameter brauchen Sie bei Value nichts anzugeben, wenn die Anwendung die Parameterwerte zur Laufzeit zur Verfügung stellt.

Ist für die Datenmenge die Eigenschaft Parameters vorhanden (TParameter-Objekte), müssen die folgenden Eigenschaften korrekt angegeben werden:

  • Die Eigenschaft Name gibt den Namen des Parameters an, wie dieser von der Stored Procedure definiert wurde.
  • Die Eigenschaft DataType gibt den Datentyp für den Parameterwert an. Bei einigen Datenmengen müssen Sie weitere Angaben machen:
  • Über die Eigenschaft NumericScale wird die Anzahl der Dezimalstellen für numerische Parameter angegeben.
  • Über die Eigenschaft Precision wird die Gesamtzahl der Stellen für numerische Parameter angegeben.
  • Über die Eigenschaft Size wird die Anzahl der Zeichen in String-Parametern angegeben.
  • Die Eigenschaft Direction gibt den Typ des gewählten Parameters an. Zulässig sind die Angaben pdInput (für Eingabeparameter), pdOutput (für Ausgabeparameter), pdInputOutput (für Eingabe-/Ausgabeparameter) und pdReturnValue (für Ergebnisparameter).
  • Über die Eigenschaft Attributes wird gesteuert, welche Wertetypen der Parameter akzeptiert. Für Attributes kann eine Kombination von psSigned, psNullable und psLong angegeben werden.
  • Die Eigenschaft Value gibt den Wert für den gewählten Parameter an. Für Ausgabe- und Ergebnisparameter können grundsätzlich keine Werte definiert werden, denn deren Werte werden durch das Ausführen der Stored Procedure definiert. Für Eingabeparameter sowie für Eingabe-/Ausgabeparameter brauchen Sie bei Value nichts anzugeben, wenn die Anwendung die Parameterwerte zur Laufzeit zur Verfügung stellt.

Parameter zur Laufzeit verwenden

Wenn bei einigen Datenmengentypen der Name der Stored Procedure erst zur Laufzeit festgelegt wird, werden keine TParam-Objekte automatisch für die Parameter erzeugt, sondern müssen zur Laufzeit vom Programm erstellt werden. Hierzu können die Methoden TParam.Create und TParams.AddParam benutzt werden:

var
  P1, P2: TParam;
begin
  ...
  with StoredProc1 do begin
    StoredProcName := 'GET_EMP_PROJ';
    Params.Clear;
    P1 := TParam.Create(Params, ptInput);
    P2 := TParam.Create(Params, ptOutput);
    try
      Params[0].Name := 'EMP_NO';
      Params[1].Name := 'PROJ_ID';
      ParamByname('EMP_NO').AsSmallInt := 52;
      ExecProc;
      Edit1.Text := ParamByname('PROJ_ID').AsString;
    finally
      P1.Free;
      P2.Free;
    end;
  end;
  ...
end;
TParam *P1, *P2;
StoredProc1->StoredProcName = "GET_EMP_PROJ";
StoredProc1->Params->Clear();
P1 = new TParam(StoredProc1->Params, ptInput);
P2 = new TParam(StoredProc1->Params, ptOutput);
try
{
  StoredProc1->Params->Items[0]->Name = "EMP_NO";
  StoredProc1->Params->Items[1]->Name = "PROJ_ID";
  StoredProc1->ParamByName("EMP_NO")->AsSmallInt = 52;
  StoredProc1->ExecProc();
  Edit1->Text = StoredProc1->ParamByName("PROJ_ID")->AsString;
}
__finally
{
  delete P1;
  delete P2;
}

Selbst wenn Sie zur Laufzeit die Parameterobjekte nicht hinzufügen müssen, ist es unter Umständen sinnvoll, auf einzelne Parameterobjekte zuzugreifen, um Eingabeparametern Werte zuzuweisen und Werte aus Ausgabeparametern abzurufen. Mit der Methode ParamByName der Datenmenge kann über deren Namen auf die einzelnen Parameter zugegriffen werden. Mit dem folgenden Quelltext wird einem Eingabe-/Ausgabeparameter ein Wert zugewiesen, dann wird die Stored Procedure ausgeführt und der zurückgegebene Wert abgerufen:

with SQLStoredProc1 do
begin
  ParamByName('IN_OUTVAR').AsInteger := 103;
  ExecProc;
  IntegerVar := ParamByName('IN_OUTVAR').AsInteger;
end;
SQLDataSet1->ParamByName("IN_OUTVAR")->AsInteger = 103;
SQLDataSet1->ExecSQL();
int Result = SQLDataSet1->ParamByName("IN_OUTVAR")->AsInteger;


Siehe auch