procedure "generique"

procedure "generique" - SQL/NoSQL - Programmation

Marsh Posté le 07-04-2005 à 23:36:52    

Bonsoir
j'ai un petit souci je voudrais créer une procédure "paramétrable"
c'est à dire que je puisse utiliser quelque soit la table (par contre la structure est connue d'avance)
voila le code (qui ne compile pas sous Oracle9i):
CREATE OR REPLACE PROCEDURE modif_table
(
 
 nom_table IN VARCHAR2,
 libelle_table IN VARCHAR2,
 old_libelle_table IN VARCHAR2,
 new_libelle_table IN VARCHAR2
 
)
IS
 BEGIN
 UPDATE nom_table
 SET libelle_table = new_libelle_table
 WHERE libelle_table = old_libelle_table;
 END;
 
Donc erreur car la table "nom_table" n'existe pas...
Je ne sais pas comment faire (mettre des "" ou ' ' mais fonctionne pas non plus)
Merci d'avance

Reply

Marsh Posté le 07-04-2005 à 23:36:52   

Reply

Marsh Posté le 08-04-2005 à 10:37:25    

Avec SQL Server, il y a une fonction "execute" dont voici la doc (pas très parlante, mais bon)
 

Citation :


 
 Référence de Transact-SQL  
 
 
EXECUTE
Exécute une fonction à valeurs scalaires définie par l'utilisateur, une procédure système, une procédure stockée personnalisée ou une procédure stockée étendue. Prend également en charge l'exécution d'une chaîne de caractères à l'intérieur d'un lot d'instructions Transact-SQL .  
 
Pour invoquer une fonction, utilisez la syntaxe décrite pour EXECUTE stored_procedure.
 
Syntaxe
Exécuter une procédure stockée :
 
[ [ EXEC [ UTE ] ]  
    {  
        [ @return_status = ]  
            { procedure_name [ ;number ] | @procedure_name_var  
    }  
    [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]  
        [ ,...n ]  
[ WITH RECOMPILE ]  
 
Exécuter une chaîne de caractères :
 
EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )  
 
Arguments
@return_status
 
Variable de type entier facultative qui stocke l'état de renvoi d'une procédure stockée. Cette variable doit être déclarée dans le lot d'instructions ou la procédure stockée avant d'être utilisée dans une instruction EXECUTE.
 
Lorsqu'elle est utilisée pour invoquer une fonction à valeurs scalaires définie par l'utilisateur, la variable @return_status peut être de n'importe quel type de données scalaires.
 
procedure_name
 
Nom entier ou partiel qualifié de la procédure stockée à appeler. Les noms des procédures doivent respecter les conventions se rapportant aux identificateurs. Pour plus d'informations, reportez-vous à Utilisation des identificateurs. Les noms des procédures stockées étendues respectent toujours la casse, quels que soient la page de code et l'ordre de tri du serveur.  
 
Une procédure créée dans une autre base de données peut tout de même être exécutée par un utilisateur propriétaire de la procédure ou accrédité pour l'exécuter dans la base de données en question. Une procédure peut être exécutée sur un autre serveur disposant de Microsoft® SQL Server™ si l'utilisateur est accrédité pour utiliser ce serveur (accès à distance) et pour exécuter cette procédure dans la base de données. Si un nom de serveur est précisé mais qu'aucun nom de base de données n'est spécifié, SQL Server recherche la procédure dans la base de données par défaut de l'utilisateur.
 
;number
 
Nombre entier facultatif utilisé pour regrouper les procédures de même nom afin qu'elles puissent être supprimées au moyen d'une seule instruction DROP PROCEDURE. Ce paramètre n'est pas utilisé pour les procédures stockées étendues.
 
Les procédures utilisées dans la même application sont souvent regroupées de cette manière. Les procédures utilisées avec l'opération de commandes peuvent par exemple être appelées orderproc;1, orderproc;2, etc. L'instruction DROP PROCEDURE orderproc abandonne le groupe tout entier. Une fois les procédures regroupées, elles ne peuvent pas être supprimées individuellement à l'intérieur du groupe. Par exemple, l'instruction DROP PROCEDURE orderproc;2 n'est pas autorisée. Pour plus d'informations sur les groupes de procédures, voir CREATE PROCEDURE.  
 
@procedure_name_var
 
Nom d'une variable définie localement qui représente un nom de procédure stockée.
 
@parameter
 
Paramètre de procédure, tel que défini dans l'instruction CREATE PROCEDURE. Les noms de paramètres doivent être précédés du symbole (@). Lorsque les constantes et les noms de paramètres sont utilisés sous la forme @parameter_name = value, il n'est pas nécessaire de les fournir dans l'ordre dans lequel ils sont définis dans l'instruction CREATE PROCEDURE. Toutefois, à partir du moment où la forme @parameter_name = value est utilisée pour un paramètre, elle doit l'être pour tous les paramètres suivants.
 
Par défaut, les paramètres peuvent accepter les valeurs NULL. Si une valeur de paramètre NULL est introduite et que ce paramètre est utilisé dans une instruction CREATE ou ALTER TABLE dans laquelle la colonne référencée n'autorise pas les valeurs NULL (par exemple, une insertion dans une colonne qui n'autorise pas les valeurs NULL), SQL Server génère un message d'erreur. Pour qu'il soit impossible d'introduire une valeur de paramètre NULL dans une colonne qui n'accepte pas les valeurs NULL, ajoutez la logique de programmation à la procédure ou utilisez une valeur par défaut (avec le mot clé DEFAULT de CREATE ou ALTER TABLE) dans la colonne.
 
value
 
Valeur du paramètre pour la procédure. Si les noms de paramètres ne sont pas indiqués, les valeurs de paramètres doivent être fournies dans l'ordre défini dans l'instruction CREATE PROCEDURE.
 
Si la valeur d'un paramètre est un nom d'objet, une chaîne de caractères, ou qu'elle est déterminée par un nom de base de données ou de propriétaire, le nom entier doit être mis entre guillemets simples. Si la valeur d'un paramètre est un mot clé, ce mot clé doit être mis entre guillemets doubles.
 
Si une valeur par défaut est définie dans l'instruction CREATE PROCEDURE, l'utilisateur peut exécuter la procédure sans indiquer de paramètre. La valeur par défaut doit être une constante et peut comprendre les caractères génériques %, _, [ ] et [^] si la procédure utilise le nom du paramètre en association avec le mot clé LIKE.
 
La valeur par défaut peut également être NULL. La définition de la procédure indique généralement l'action qui doit être réalisée si la valeur d'un paramètre est NULL.
 
@variable
 
Variable qui stocke un paramètre ou un paramètre de renvoi.
 
OUTPUT
 
Indique que la procédure stockée renvoie un paramètre. Le paramètre correspondant dans la procédure stockée doit, lui aussi, avoir été créé à l'aide du mot clé OUTPUT. Utilisez ce mot clé lorsque parmi les paramètres se trouvent des variables de curseur.
 
Si des paramètres OUTPUT sont utilisés et que vous souhaitez utiliser les valeurs de renvoi dans d'autres instructions à l'intérieur de la procédure ou du lot d'instructions d'appel, la valeur du paramètre doit être introduite comme une variable (c'est à dire @parameter = @variable). Vous ne pouvez pas exécuter une procédure précisant OUTPUT pour un paramètre qui n'est pas défini comme un paramètre OUTPUT dans l'instruction CREATE PROCEDURE. Il est impossible d'introduire des constantes dans des procédures stockées utilisant OUTPUT ; le paramètre de renvoi requiert un nom de variable. Le type de données de la variable doit être déclaré et une valeur doit être affectée avant l'exécution de la procédure. Les paramètres de renvoi peuvent appartenir à tout type de données, à l'exception des types texte et image.
 
DEFAULT
 
Fournit la valeur par défaut du paramètre telle qu'elle est définie dans la procédure. Une erreur se produit quand la procédure attend une valeur pour un paramètre qui n'a pas de valeur définie par défaut et qu'un paramètre est manquant ou que le mot clé DEFAULT n'est pas spécifié.
 
n
 
Emplacement réservé indiquant que l'élément précédent peut être répété n fois. EXECUTE peut, par exemple, indiquer un ou plusieurs éléments @parameter, value ou @variable.
 
WITH RECOMPILE
 
Oblige à composer une nouvelle organisation. Utilisez cette option si le paramètre que vous fournissez est atypique ou que les données ont changé de manière significative. L'organisation modifiée est utilisée dans les exécutions suivantes. Cette option n'est pas utilisée pour les procédures stockées étendues. Cette option doit être utilisée avec parcimonie car elle est coûteuse.
 
@string_variable
 
Nom d'une variable locale. @string_variable peut être formée de données de type char, varchar, nchar ou nvarchar avec une valeur maximale égale à la mémoire disponible sur le serveur. Si la chaîne contient plus de 4000 caractères, concaténez plusieurs variables locales à utiliser comme chaîne EXECUTE. Pour plus d'informations sur les types de données SQL Server fournies par le système, voir Types de données.  
 
[N]'tsql_string'
 
Chaîne constante. tsql_string peut être formée de données de type nvarchar ou varchar. Si le N est inclus, la chaîne est interprétée comme une donnée de type nvarchar avec une valeur maximale égale à la mémoire disponible sur le serveur. Si la chaîne contient plus de 4000 caractères, concaténez plusieurs variables locales à utiliser comme chaîne EXECUTE.
 
Notes
Si les trois premiers caractères du nom de la procédure sont sp_, SQL Server recherche la base de données master pour la procédure. Si aucun nom de procédure complet n'est fourni, SQL Server recherche la procédure comme si le nom du propriétaire était dbo. Pour transformer le nom de la procédure stockée en procédure stockée personnalisée avec le même nom qu'une procédure stockée par le système, entrez le nom complet de la procédure.  
 
Les paramètres peuvent être fournis en utilisant soit value soit @parameter_name = value. Les paramètres ne faisant pas partie des transactions, si vous modifiez l'un d'entre eux dans une transaction et que vous annulez ultérieurement cette dernière, le paramètre ne reprend pas sa valeur initiale. La valeur renvoyée à l'utilisateur qui appelle est toujours la valeur au moment du renvoi par la procédure.
 
Il y a imbrication lorsqu'une procédure stockée en appelle une autre. Le niveau d'imbrication augmente lorsque la procédure appelée commence à s'exécuter et diminue lorsque son exécution est terminée. Au-delà de 32 niveaux d'imbrication, toute la chaîne de procédures appelées échoue. Le niveau d'imbrication actuel est stocké dans la fonction @@NESTLEVEL.
 
SQL Server utilise actuellement des valeurs de renvoi allant de 0 à -14 pour indiquer le niveau d'exécution des procédures stockées. Les valeurs allant de -15 à -99 sont réservées à un usage futur. Pour plus d'informations sur la liste des valeurs réservées du niveau de renvoi, voir RETURN.  
 
Les procédures stockées distantes et les procédures stockées étendues ne faisant pas partie d'une transaction (à moins qu'elles proviennent d'une instruction BEGIN DISTRIBUTED TRANSACTION ou qu'elles soient utilisées avec des options de configuration diverses), il est impossible d'annuler les commandes exécutées en appelant ces procédures. Pour plus d'informations, voir Procédures stockées du système et BEGIN DISTRIBUTED TRANSACTION.  
 
Lorsque vous utilisez des variables de curseur, une erreur se produit si vous exécutez une procédure qui introduit une variable de curseur avec un curseur qui lui est alloué.  
 
Il est inutile d'indiquer le mot clé EXECUTE lorsque vous exécutez des procédures stockées si l'instruction est la première du lot d'instructions.  
 
Utilisation d'EXECUTE avec une chaîne de caractères
Utilisez l'opérateur de concaténation de chaîne (+) pour créer des chaînes de grande taille en vue d'une exécution dynamique. Chaque expression de chaîne peut être un mélange de types de données Unicode et non-Unicode.
 
Bien que chaque [N]'tsql_string' ou @string_variable doive être inférieure à 8000 octets, la concaténation est réalisée de manière logique dans l'analyseur syntaxique SQL Server et n'est jamais matérialisée en mémoire. Par exemple, l'instruction suivante ne produit jamais la chaîne attendue de 16 000 caractères concaténés :
 
EXEC('name_of_8000_char_string' + 'another_name_of_8000_char_string')
 
La ou les instructions à l'intérieur de l'instruction EXECUTE ne sont pas compilées avant l'exécution de l'instruction EXECUTE.  
 
Les modifications du contexte de la base de données ne durent que jusqu'à la fin de l'instruction EXECUTE. Dans l'exemple suivant, le contexte de la base de données, après l'instruction EXEC, est master :
 
USE master EXEC ("USE pubs" ) SELECT * FROM authors
 
Autorisations
Les autorisations EXECUTE pour une procédure stockée reviennent par défaut au propriétaire de la procédure, qui peut les transmettre à d'autres utilisateurs. Les autorisations d'utilisation de la ou des procédures à l'intérieur de la chaîne EXECUTE sont vérifiées au moment où EXECUTE est rencontré, et ce même si l'instruction EXECUTE est comprise dans une procédure stockée. Lorsqu'une procédure stockée qui exécute une chaîne est lancée, les autorisations sont vérifiées dans le contexte non pas de l'utilisateur qui a créé la procédure, mais de celui qui exécute la procédure. Toutefois, si un utilisateur est propriétaire de deux procédures stockées et que la première appelle la seconde, l'autorisation EXECUTE n'est pas vérifiée pour la seconde procédure.
 
Exemple
A. Utilisation d'EXECUTE pour introduire un paramètre unique
La procédure stockée showind attend le paramètre @tabname, un nom de table. Dans les exemples suivants, la procédure stockée showind est exécutée avec comme valeur de paramètre titles.
 
 
 
Remarque  La procédure stockée showind n'est expliquée qu'à titre indicatif et n'existe pas dans la base de données pubs.
 
 
EXEC showind titles
 
La variable peut être désignée de manière explicite dans l'exécution :
 
EXEC showind @tabname = titles
 
S'il s'agit de la première exécution dans un lot d'instructions ou dans un script isql, EXEC n'est pas nécessaire :
 
showind titles
 
-ou-
 
showind @tabname = titles
 
B. Utilisation de paramètres multiples et d'un paramètre de sortie
L'exemple suivant montre l'exécution de la procédure stockée roy_check, qui introduit trois paramètres. Le troisième paramètre, @pc, est un paramètre OUTPUT. Après l'exécution de la procédure, la valeur de renvoi est disponible dans la variable @percent.
 
 
 
Remarque  La procédure stockée roy_check n'est expliquée qu'à titre indicatif et n'existe pas dans la base de données pubs.
 
 
DECLARE @percent int
EXECUTE roy_check 'BU1032', 1050, @pc = @percent OUTPUT
SET Percent = @percent
 
C. Utilisation d'EXECUTE 'tsql_string' avec une variable
L'exemple suivant montre comment EXECUTE manipule les chaînes construites de manière dynamique qui contiennent des variables . L'exemple montre comment créer le curseur tables_cursor pour obtenir la liste de toutes les tables définies par l'utilisateur (type = U).
 
 
 
Remarque  Cet exemple n'est donné qu'à titre indicatif.
 
 
DECLARE tables_cursor CURSOR
   FOR
   SELECT name FROM sysobjects WHERE type = 'U'
OPEN tables_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   /* A @@FETCH_STATUS of -2 means that the row has been deleted.
   There is no need to test for this because this loop drops all
   user-defined tables.   */.
   EXEC ('DROP TABLE ' + @tablename)
   FETCH NEXT FROM tables_cursor INTO @tablename
END
PRINT 'All user-defined tables have been dropped from the database.'
DEALLOCATE tables_cursor
 
D. Utilisation d'EXECUTE avec une procédure stockée distante
Cet exemple exécute la procédure stockée checkcontract sur le serveur distant SQLSERVER1 et stocke le statut de renvoi indiquant le succès ou l'échec dans @retstat.
 
DECLARE @retstat int
EXECUTE @retstat = SQLSERVER1.pubs.dbo.checkcontract '409-56-4008'
 
E. Utilisation de EXECUTE avec une procédure stockée étendue
Dans l'exemple suivant, la procédure stockée étendue xp_cmdshell est utilisée pour afficher un répertoire de tous les fichiers dont le nom porte l'extension .exe.
 
USE master
EXECUTE xp_cmdshell 'dir *.exe'
 
F. Utilisation d'EXECUTE avec une variable de procédure stockée
Dans l'exemple suivant, une variable représentant un nom de procédure stockée est créée.
 
DECLARE @proc_name varchar(30)
SET @proc_name = 'sp_who'
EXEC @proc_name
 
G. Utilisation d'EXECUTE avec DEFAULT
Cet exemple crée une procédure stockée avec des valeurs par défaut pour les premier et troisième paramètres. Quand la procédure est exécutée, ces valeurs par défaut sont introduites pour les premier et troisième paramètres si aucune valeur n'est introduite dans l'appel ou si la valeur par défaut est spécifiée. Notez les différentes façons d'utiliser le mot clé DEFAULT.  
 
USE pubs
IF EXISTS (SELECT name FROM sysobjects  
      WHERE name = 'proc_calculate_taxes' AND type = 'P')
   DROP PROCEDURE proc_calculate_taxes
GO
-- Create the stored procedure.
CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1),  
      @p3 varchar(8) = 'CAR')
    AS  
   SELECT *  
   FROM mytable
 
L'exécution de la procédure stockée proc_calculate_taxes peut s'effectuer selon plusieurs combinaisons :  
 
EXECUTE proc_calculate_taxes @p2 = 'A'
EXECUTE proc_calculate_taxes 69, 'B'
EXECUTE proc_calculate_taxes 69, 'C', 'House'
EXECUTE proc_calculate_taxes @p1 = DEFAULT, @p2 = 'D'
EXECUTE proc_calculate_taxes DEFAULT, @p3 = 'Local', @p2 = 'E'
EXECUTE proc_calculate_taxes 69, 'F', @p3 = DEFAULT
EXECUTE proc_calculate_taxes 95, 'G', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'H', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'I', @p3 = DEFAULT
 
 
Voir aussi
 
+ (Concaténation de chaînes)
 
[] (Caractères génériques à faire correspondre)
 
@@NESTLEVEL
 
ALTER PROCEDURE
 
DECLARE @local_variable
 
DROP PROCEDURE
 
Fonctions
 
sp_depends  
 
sp_helptext  
 
©1988-2000 Microsoft Corporation. Tous droits réservés.


 
Exemple d'utilisation :
 

Code :
  1. declare @cmd2 varchar(3000)
  2. declare @champ varchar(50)
  3. declare @table varchar(50)
  4. set @champ = 'toto'
  5. set @table = 'titi'
  6. select @cmd2 = 'select ' + @champ + ' from ' + @table
  7. exec (@cmd2)

Reply

Marsh Posté le 08-04-2005 à 10:37:50    

Il doit y avoir un équivalent sous Oracle, très certainement avec un nom et un fonctionnement similaire.

Reply

Marsh Posté le 09-04-2005 à 09:14:38    

Sous Oracle, tu peux utiliser EXECUTE IMMEDIATE.
 
Exemples ici :
 
http://www.dbasupport.com/oracle/o [...] iate.shtml


Message édité par Beegee le 09-04-2005 à 09:17:32
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed