2009-08-28 4 views
4

je fais de temps en temps quelque chose comme ....PLW-06002 code inaccessible lors de l'utilisation de NULL;

IF very-likely-condition THEN 
    NULL; 
ELSE 
    <<code to deal with the unlikely condition>> 
END IF; 

Ce qui donne un code injoignable PLW-06002 avertissement du compilateur PL/SQL sur la ligne NULL atfer la FI.

Maintenant, bien que je puisse clairement ignorer l'avertissement et/ou refactoriser l'instruction IF pour être un NON, je pense qu'il se lit mieux de cette façon.

Est-ce que quelqu'un sait qu'il y a une autre façon d'insérer une instruction vide afin que je n'obtienne pas l'avertissement du compilateur?

EDIT:

Je ne dis pas que je le fais souvent ... en fait, je le ferais très rarement. Mais parfois je pense que ça se lit mieux de cette façon.

EDIT 2:

Plus il y a d'autres scénarios où il peut être valable de le faire (par exemple en ignorant une erreur spécifique dans un bloc d'exception). J'ai seulement utilisé la FI comme un exemple simple pour illustrer le point.

+0

Quel niveau optimiseur pl/sql utilisez-vous? (sélectionnez le nom, la valeur de v $ parameter où name = 'plsql_optimize_level' pour vérifier) ​​ Oracle est probablement en train de refactoriser le code dans le format {NOT ...} pour vous – dpbradley

+0

Niveau 2. Cela pourrait bien être dans le cas de un IF, mais j'aimerais quand même savoir s'il existe une solution pour d'autres cas (par exemple ignorer certaines erreurs dans un bloc EXCEPTION) – cagcowboy

+0

Cela a une certaine odeur, mais vous pouvez créer une procédure NOP avec la valeur NULL et l'utiliser à la place de NULL dans le code parent - de cette façon, vous ne verrez que l'avertissement lorsque vous créez NOP - donnera à votre PL/SQL une sorte de langage d'assemblage sentir :) – dpbradley

Répondre

0

Pourquoi avez-vous une instruction vide? C'est une odeur de code. Il est généralement admis que c'est pas plus facile à lire avec un if bloc vide.

Changer votre if état à l'opposé de ce qu'il est actuellement.

IF NOT very-likely-condition THEN 
    <<code to deal with the unlikely condition>> 
END IF; 

Si vous avez besoin de faire quelque chose quand la condition est vraie, vous pouvez toujours ajouter ce bloc arrière dans blocs vides séparent la condition du bloc qui est exécuté lorsque la condition est vraie. Il semble également que vous aviez du code dans la section if, puis l'avez supprimé, mais vous étiez trop paresseux pour réécrire la condition if pour supprimer l'instruction vide. Subjectivement, si je lisais votre code et que je voyais le bloc vide if, je penserais que vous ne saviez pas ce que vous faisiez.

+0

J'ai déjà dit dans la question que je savais que je pouvais faire un NON. Je ne dis pas que c'est quelque chose que je fais souvent ... mais dans certains cas rares, je crois que c'est plus lisible. Avez-vous une réponse à la question? – cagcowboy

4

Pour récursive et Weblog:

les énoncés suivants sont pas équivalent:

IF :x = 0 THEN 
    NULL; 
ELSE 
    do_something; 
END IF; 

et

IF NOT :x = 0 THEN 
    do_something; 
END IF; 

Si :x IS NULL la procédure do_something sera appelée dans la premier cas seulement. C'est parce que l'expression NULL = 0 n'est ni VRAI ni FAUX dans Oracle, elle est "inconnue".

La bonne façon de réécrire la première déclaration serait:

IF :x != 0 OR :x IS NULL THEN 
    do_something; 
END IF; 

Je peux voir pourquoi dans certains cas, nous pourrions écrire des choses comme l'OP.

Questions connexes