Exécution des procédures stockées (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des commandes (FireDAC)

Utilisation de TFDStoredProc

En général, TFDStoredProc est défini à la conception et/ou à l'exécution. TFDStoredProc génère une commande SQL de façon transparente pour appeler une procédure stockée reposant sur les valeurs de la propriété TFDStoredProc. Avant l'exécution, FireDAC envoie les valeurs de paramètre à un SGBD, puis exécute une procédure stockée et reçoit les valeurs de paramètre de sortie.

Remarque : FireDAC ne supporte pas les paramètres avec les valeurs par défaut.


Définition de procédures stockées à la conception

Pour exécuter une procédure stockée, déposez un composant TFDStoredProc sur une fiche. TFDStoredProc.Connection sera automatiquement défini pour pointer vers un composant TFDConnection sur cette fiche, s'il en existe un.

Ensuite (en option), définissez les propriétés CatalogName, SchemaName et PackageName ou choisissez leurs valeurs dans une liste déroulante. Lorsque la propriété StoredProcName est définie et que fiMeta est inclus dans FetchOptions.Items, la collection Params est remplie automatiquement.

Pour unifier les noms de paramètre, définissez la propriété ResourceOptions.UnifyParams sur True. Par exemple, ceci exclut le préfixe '@' des noms de paramètre des procédures stockées SQL Server.


Définition de procédures stockées à l'exécution

Le processus de définition de procédures stockées à l'exécution et à la conception est similaire, il suffit simplement d'utiliser le code suivant :

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

L'appel de la méthode Prepare remplit la collection Params avec les métadonnées mkProcArgs, si fiMeta est inclus dans la propriété FetchOptions.Items.

Remarque :
  • L'interrogation de mkProcArgs peut prendre du temps.
  • Une fois que la collection Params est remplie, l'application ne peut pas modifier les définitions de paramètre. Par exemple, la définition des propriétés TADParam.AsXxxx définit implicitement le type de données de paramètre.

Pour éviter les problèmes décrits ci-dessus, excluez fiMeta de FetchOptions.Items, de sorte que la collection Params ne soit pas reconstruite automatiquement lors de l'appel de Prepare. Remplissez également la collection Params manuellement avant d'appeler Prepare ou ExecProc, à l'aide du code suivant :

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

Ou bien, utilisez :

 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;


Utilisation de procédures packagées

Pour utiliser une procédure packagée, l'application doit spécifier le nom du package. Pour cela, effectuez l'une des opérations suivantes :

  • Définissez PackageName -- le nom du package peut être spécifié au format [<nom_catalogue>.][<nom_schéma>.]<nom_package>.
  • Définissez StoredProcName -- le nom de la procédure stockée peut être spécifié au format [<nom_catalogue>.][<nom_schéma>.]<nom_package>.<nom procédure stockée>.

Pour choisir la procédure surchargée, l'application doit spécifier la propriété Overload. Par exemple, sur Oracle :

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


Exécution de la procédure stockée

Pour exécuter une procédure stockée ne renvoyant pas d'ensemble de résultats, utilisez la méthode ExecProc. Pour exécuter une fonction stockée, utilisez la méthode ExecProc ou ExecFunc, où ExecFunc renvoie la valeur de la fonction. Si une procédure stockée renvoie un ensemble de résultats, l'exception "[FireDAC][Phys][Oracl]-310. Impossible d'exécuter la commande retournant un ensemble de résultats" est déclenchée.

Remarque : Il existe plusieurs méthodes ExecProc et ExecFunc surchargées, qui vous évitent d'avoir à utiliser la propriété TFDStoredProc et de spécifier toutes les informations requises en tant qu'argument de la méthode. Par exemple :
 FDStoredProc1.StoredProcName := 'MY_PROC';
 FDStoredProc1.Prepare;
 FDStoredProc1.Params[0].Value := 100;
 FDStoredProc1.Params[1].Value := 'audi';
 FDStoredProc1.ExecProc;

Sous un format plus compact :

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

Pour exécuter une procédure stockée, renvoyer un ensemble de résultats et l'ouvrir, utilisez les méthodes Open. Si une procédure stockée ne renvoie aucun ensemble de résultats, l'exception "[FireDAC][Phys][Oracl]-308. Impossible d'ouvrir / définir la commande, qui ne retourne aucun ensemble de résultats" est déclenchée. Si la procédure stockée renvoie plusieurs ensembles de résultats, consultez la rubrique "Groupes de commandes" pour plus d'informations.


Remarque : Les procédures stockées peuvent être exécutées de manière asynchrone.

Utilisation de TFDQuery

La principale différence entre TFDStoredProc et TFDQuery est que TFDStoredProc génère automatiquement un appel de procédure stockée à l'aide des informations des paramètres. Le code SQL appelant une procédure stockée peut être exécuté directement à l'aide de n'importe quelle méthode FireDAC de l'exécution des commandes SQL. Par exemple, appelez une procédure packagée Oracle à l'aide de TFDQuery :

 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;


Utilisation de TFDCommand

Enfin, vous pouvez utiliser TFDCommand pour exécuter une procédure stockée. La plupart des spécifications ci-dessus peuvent également s'appliquer à TFDCommand.

Voir aussi

Exemples