Utilisation de paramètres avec les procédures stockées
Remonter à Utilisation d'ensembles de données de type procédure stockée
Il existe quatre types de paramètres pouvant être associés aux procédures stockées :
- Paramètres d'entrée, utilisés pour transmettre des valeurs à une procédure stockée pour leur traitement.
- Paramètres de sortie, utilisés par une procédure stockée pour transmettre en retour des valeurs à une application.
- Paramètres d'entrée/sortie, utilisés pour transmettre des valeurs à une procédure stockée pour leur traitement, et utilisés par la procédure stockée pour transmettre en retour des valeurs à une application.
- Un paramètre de résultat, utilisé par certaines procédures stockées pour renvoyer à l'application une erreur ou une valeur d'état. Une procédure stockée ne peut renvoyer qu'un seul paramètre de résultat.
Le type de paramètres utilisé par une procédure stockée dépend de l'implémentation générale propre au langage des procédures stockées sur votre serveur de base de données et de l'instance spécifique de la procédure stockée. Quel que soit le serveur, certaines procédures stockées peuvent utiliser ou ne pas utiliser les paramètres d'entrée. Au contraire, certaines utilisations des paramètres sont spécifiques au serveur. Par exemple, sur MS-SQL Server et Sybase, les procédures stockées renvoient toujours un paramètre de résultat, mais l'implémentation InterBase d'une procédure stockée ne renvoie jamais de paramètre de résultat.
L'accès aux paramètres des procédures stockées est fourni par la propriété Params (dans TStoredProc, TSQLStoredProc, TIBStoredProc) ou par la propriété Parameters (dans TADOStoredProc). Quand vous affectez une valeur à la propriété StoredProcName (ou ProcedureName), l'ensemble de données génère automatiquement un objet pour chaque paramètre de la procédure stockée. Pour certains ensembles de données, si le nom de la procédure stockée n'est pas spécifié jusqu'au moment de l'exécution, les objets correspondants à chaque paramètre doivent être créés par programme à ce moment-là. Ne pas spécifier la procédure stockée et créer manuellement les objets TParam ou TParameter permet à un ensemble de données seul d'être utilisé avec un nombre quelconque de procédures stockées.
Remarque : Certaines procédures stockées renvoient un ensemble de données en plus des paramètres de sortie et de résultat. Les applications peuvent afficher les enregistrements des ensembles de données dans des contrôles orientés données, mais doivent traiter séparément les paramètres de sortie et les paramètres de résultat.
Définition des paramètres pendant la conception
Vous pouvez attribuer des valeurs aux paramètres des procédures stockées au moment de la conception en utilisant l'éditeur de collection de paramètres. Pour afficher l'éditeur de collection de paramètres, cliquez sur le bouton points de suspension de la propriété Params ou Parameters dans l'inspecteur d'objets.
Avertissement : Vous pouvez donner des valeurs aux paramètres d'entrée en les sélectionnant dans l'éditeur de collection de paramètres et en utilisant l'inspecteur d'objets pour définir la propriété Value. Mais, vous ne devez modifier ni les noms ni les types de données des paramètres d'entrée indiqués par le serveur. Si vous le faites, une exception se produit lorsque vous exécutez la procédure stockée.
Certains serveurs n'indiquent pas les noms ni les types de données des paramètres. En ce cas, vous devez définir les paramètres manuellement en utilisant l'éditeur de collection de paramètres. Cliquez avec le bouton droit et choisissez Ajouter pour ajouter des paramètres. Vous devez décrire entièrement chaque paramètre que vous ajoutez. Même si vous n'avez pas besoin d'ajouter des paramètres, vous devez vérifier que les objets paramètre individuels sont corrects.
Si l'ensemble de données a une propriété Params (objets TParam), les propriétés suivantes doivent être correctement spécifiées :
- La propriété Name indique le nom du paramètre tel qu'il est défini par la procédure stockée.
- La propriété DataType indique le type de données de la valeur du paramètre. Lorsque vous utilisez TSQLStoredProc, certains types de données requièrent des informations supplémentaires :
- La propriété NumericScale indique le nombre de décimales des paramètres numériques.
- La propriété Precision indique le nombre total de chiffres des paramètres numériques.
- La propriété Size indique le nombre de caractères des paramètres chaîne.
- La propriété ParamType indique le type du paramètre sélectionné. Ce peut être ptInput (pour les paramètres d'entrée), ptOutput (pour les paramètres de sortie), ptInputOutput (pour les paramètres d'entrée/sortie) ou ptResult (pour les paramètres de résultat).
- La propriété Value spécifie la valeur du paramètre sélectionné. Vous ne pouvez pas définir la valeur des paramètres de sortie ou des paramètres de résultat. C'est l'exécution de la procédure stockée qui définit ces types de paramètres. Pour les paramètres d'entrée ou d'entrée/sortie, vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramètres au cours de l'exécution.
Si l'ensemble de données utilise une propriété Parameters (objets TParameter), les propriétés suivantes doivent être correctement spécifiées :
- La propriété Name indique le nom du paramètre tel qu'il est défini par la procédure stockée.
- La propriété DataType indique le type de données de la valeur du paramètre. Pour certains types de données, vous devez ajouter d'autres informations :
- La propriété NumericScale indique le nombre de décimales des paramètres numériques.
- La propriété Precision indique le nombre total de chiffres des paramètres numériques.
- La propriété Size indique le nombre de caractères des paramètres chaîne.
- La propriété Direction indique le type du paramètre sélectionné. Ce peut être pdInput (pour les paramètres d'entrée), pdOutput (pour les paramètres de sortie), pdInputOutput (pour les paramètres d'entrée/sortie) ou pdReturnValue (pour les paramètres de résultat).
- La propriété Attributes indique le type des valeurs que le paramètre acceptera. Attributes peut être défini par une combinaison de psSigned, psNullable et psLong.
- La propriété Value spécifie la valeur du paramètre sélectionné. Ne définissez pas la valeur des paramètres de sortie ou des paramètres de résultat. Pour les paramètres d'entrée ou d'entrée/sortie, vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramètres au cours de l'exécution.
Utilisation des paramètres pendant l'exécution
Pour certains ensembles de données, si le nom de la procédure stockée n'est pas spécifié jusqu'au moment de l'exécution, aucun objet TParam ne sera créé automatiquement et ils devront être créés par programme. Cela peut être effectué à l'aide de la méthode TParam.Create ou TParams.AddParam :
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;
}
Même si vous n'avez pas besoin d'ajouter les objets paramètre individuels à l'exécution, vous pouvez accéder à chacun d'eux en affectant des valeurs aux paramètres d'entrée et en récupérant les valeurs des paramètres de sortie. Vous pouvez utiliser la méthode ParamByName de l'ensemble de données, pour accéder aux paramètres individuels par leur nom. Par exemple, le code suivant définit la valeur d'un paramètre d'entrée/sortie, exécute la procédure stockée et récupère la valeur renvoyée :
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;