Tester le type de colonne dans une vue ou une table (Oracle / Php)
0Lorsque vous utilisez beaucoup les vues et que celles ci sont très utilisées pour l’édition de rapport par dérrière (reporting, décisionnel, marketing, etc.), souvent le type de variable peut poser problème car incompatible. Dans ce cas si la colonne d’une vue est amenée à évoluer en terme ‘d’alimentation’ de donnée vous pouvez générer des erreurs non pas au sein de la vue (pas sur la couche base de données) mais au niveau applicatif (outils dépendant et/ou utilisant ces vues ).
Dans mon exemple ma vue a un champ de type ‘nombre’ (number), son alimentation est issue d’une table qui elle est de type ‘caractère’ (varchar). Il suffirait donc de tester dans le corps de la vue ce champs précis et d’isoler un champs lorsque celui ci ne correspond pas au type ‘nombre’ (number). La façon de procéder est très simple avec l’utilisation d’une petite fonction ou une procédure que vous pourrez ajouter dans un package.
CREATE OR REPLACE FUNCTION IS_NUMBER (LC$A_TESTER VARCHAR2) RETURN number IS dummy NUMBER; INVALID_NUMBER EXCEPTION; PRAGMA EXCEPTION_INIT(INVALID_NUMBER, -6502); BEGIN dummy := TO_NUMBER(LC$A_TESTER); RETURN 1; EXCEPTION WHEN INVALID_NUMBER THEN RETURN 0; END; /
Pourquoi utiliser une fonction plutôt qu’une procédure ? Car son utilisation dans la vue par la suite en dépend, et aussi si vous désirez mutualiser son utilisation pour des packages àvenir ou dans d’autres bloc PL/SQL. Ceci dit, vous pouvez très facilement en faire une procédure en retournant directement la colonne ou null dans le cas contraire.
CREATE OR REPLACE PROCEDURE IS_NUMBER (LC$A_TESTER VARCHAR2) RETURN number IS dummy NUMBER; INVALID_NUMBER EXCEPTION; PRAGMA EXCEPTION_INIT(INVALID_NUMBER, -6502); BEGIN dummy := TO_NUMBER(LC$A_TESTER); RETURN LC$A_TESTER; EXCEPTION WHEN INVALID_NUMBER THEN RETURN NULL; END; /
Et pour son utilisation dans une vue vous procéderez donc de cette façon :
SELECT decode(is_number('1'),1,to_number(id_salarie_att),'') FROM DUAL
Je l’utilise ici dans un decode, mais libre à vous de l’utiliser dans un bloc PL/SQL, avec un case, etc.