2008-11-13 9 views
1

J'ai une question rapide sur les valeurs par défaut dans les fonctions PL/SQL dans Oracle. Prenez ce programme comme exemple;Oracle Valeurs par défaut

create or replace 
FUNCTION testFunction 
(
    varNumber IN NUMBER DEFAULT 0 
) 
RETURN NUMBER 
AS 
BEGIN 
    dbms_output.put_line(varNumber); 
    RETURN varNumber; 
END; 

L'idée étant que si aucune valeur est spécifiée pour varNumber lorsque cette fonction est appelée, il prendra la valeur 0.

Maintenant, mon problème est que mes fonctions sont appelées à partir se une couche de services Web qui passera toujours en NULL comme valeur pour les paramètres pour lesquels elle n'a pas de valeur. Oracle interprète NULL comme une valeur, et n'initialise donc pas varNumber à sa valeur par défaut de 0.

Je peux voir pourquoi cette approche a du sens, mais je me demandais s'il y avait un moyen de contourner ce comportement, et de le faire ainsi que si une valeur NULL est transmise, Oracle attribue la valeur DEFAULT explicite spécifiée dans l'en-tête de la fonction?

J'ai envisagé la possibilité de faire une vérification manuelle ...

IF(varNumber IS NULL) THEN 
    varNumber := 0; 
END IF; 

Cependant, il y a des centaines de fonctions lorsque cela peut être un problème, sans parler du grand nombre de paramètres par fonction, etc. Je préférerais que je trouve une solution plus générale au problème.

Bravo pour tout aperçu que vous pouvez donner. Utilisez la NVL pour définir la valeur.

Répondre

2

Vous ne pouvez pas affecter de valeurs à un paramètre IN, mais vous pouvez les définir comme IN/OUT, puis les définir. Cela soulève un grand potentiel d'abus et de confusion, cependant. Donc, je pense que vous feriez mieux avec une variable locale. Mais vous pouvez le faire dans la déclaration. C'est-à-dire

create or replace 
FUNCTION testFunction 
(
    varNumber IN NUMBER DEFAULT 0 
) 
RETURN NUMBER 
AS 
    vFix number := nvl(varNumber,0); 
BEGIN 
    dbms_output.put_line(vFix); 
    RETURN vFix; 
END; 
4

NVL(value_in, replace_with) 
1

Votre vérification manuelle est la seule façon de faire ce que vous voulez en toute sécurité.

Vous pouvez écrire que dans une ligne comme celui-ci si:

varNumber = NVL(varNumber,0); 

Bonne chance!

Questions connexes