2010-09-06 13 views
2

Il existe des messages d'erreur paramétrés dans la base de données Oracle. Par exemple, il y a 01919, 00000, "le rôle '% s' n'existe pas" dans oraus.msg. Si un problème de non-sens GRANT ... TO ...% s est substitué par ce privilège inexistant. Il est possible de lever l'exception -1919 et de fournir une chaîne à% s?Mise en forme (ou transmission de chaîne) des messages d'exception dans Oracle

code:

produit seul message ORA-01919: role '' does not exist.

Répondre

3

Le but des exceptions définies par l'utilisateur est que nous pouvons piéger des exceptions spécifiques dans la section d'exception de notre programme PL/SQL et les traiter avec élégance. Par exemple, si l'on met un peu de chair autour de votre extrait de code ....

create or replace grant_priv 
    (p_priv in varchar2 
     , p_grantee in varchar2) 
is 
    not_system_privilege EXCEPTION; 
    PRAGMA EXCEPTION_INIT(not_system_privilege, -01919); 
begin 
    execute immediate 'grant '||p_priv||' to '||p_grantee; 
exception 
    when not_system_privilege then 
     raise_application_error(-20000, p_priv||' is not a real privilege', true); 
    when others then 
     raise; 

fin;

Nous pouvons mettre n'importe quoi dans la section EXCEPTIONS. Consignez l'erreur dans un tableau ou un fichier, déclenchez des alertes, peu importe. Il est recommandé de propager l'exception vers le haut: seule la couche supérieure de la pile d'appel - la couche faisant face à l'utilisateur - ne doit pas lancer d'exception.

+0

Merci pour la réponse, mais UTL_LMS semble mieux répondre à mes exigences. –

0

Une observation - il semble que vous pouvez utiliser utl_lms.format_message pour l'impression de style C - j'aurais aimé le savoir plus tôt (comme cela aurait sauvé l'écriture). Semble être Ora10 et ci-dessus seulement.

begin 
    dbms_output.put_line(
     utl_lms.format_message( 
     'A %s is here and a %s is there and a %s too','Giraffe','Lion','Spider')); 
end; 

Je ne vois aucun moyen de répondre à l'exigence OP - de lever une exception au niveau du système et de le remplacer par le bon paramètre.

Cependant, si vous pouvez vivre avec l'aide d'un autre numéro d'exception, vous pouvez écrire votre propre procédure de gestion des exceptions qui pourraient

a) prendre dans la série de l'exception requise b) utiliser utl_lms.get_message pour récupérer le texte c) utiliser format_message pour remplacer dans les paramètres d) déclenche une exception définie par l'utilisateur à l'aide du texte généré

le problème est que cela ne fonctionnerait pas si votre système d'appel attend un ORA-01919.