Pour rappel, on a tendance à parler de la valeur null, mais null est l’état d’un champs pour justement dire que le champs ne possède pas de valeur. C’est cette absence de valeur qui nous oblige à gérer cet état de manière spécifique dans nos requêtes SQL.

Prenons deux tables

1 – Résultat d’un select

Si un champ récupéré dans une requête est dans l’état null, sans gestion particulière, la requête renverra l’erreur :

 

Si vous ne gérez pas l’état null dans votre programme, vous pouvez utiliser les fonctions coalesce ou ifnull pour attribuer une valeur par défaut à votre variable host :

Par contre si vous avez besoin de récupérer l’information, il faudra rajouter une variable indicateur.

Cette variable indicateur, est une zone numérique qui pourra prendre 3 valeurs :

  • 0 –> OK tout va bien la valorisation de Wrk_Collection s’est bien passée.
  • -1 –> le champ col est à l’état null
  • -2 –> impossible de valoriser la variable host. Ce sont les ‘++++’ dans strsql

Utilisation de la variable indicateur :

Dans le cas où le champ col est à l’état null :

  • Ind_col = -1
  • Wrk_Collection sera remis à blanc, mais seul le test de ind_col permet de déterminer l’état null de la variable.

Même si vous avez déclarer votre variable :Wrk_Collection comme « nullable », vous devez passer par une variable indicateur. Actuellement l’état null ne passe pas de SQL à une variable host.

Pour  récupérer l’état null dans Wrk_Collection, il faudra valoriser nullind en fonction de la variable indicateur ind_col.

2 – Jointure

Dans l’exemple de nos deux tables, article et prix, nous avons une clé composée  SOC/COL/ART
La société SOC02 ne gère pas de collection et ce champs est toujours à l’état null.

Si on fait une jointure classique, les enregistrements de la société SOC02 ne seront pas récupérés :

Il faudra gérer explicitement l’état null dans la jointure

3 – Clause Where

Nous avons vu en première partie la gestion de l’état null dans le résultat d’un select mais dans notre cas d’une clé composée, nous pouvons aussi avoir besoin de gérer l’état null dans une clause where.

Si vous ne gérez pas explicitement cet état, vous risquez :

  • De ne pas trouver votre enregistrement :

Récupération par un curseur des clés pour le select, avec la variable indicateur ind_col qui contient l’état null ou non de wrk_collection

Select sans gestion de la valeur null pour la champs Col

La variable indicateur pour col  est bien à -1 (NULL)

Les valeurs des variables host

Enregistrement non trouvé, SQLCOD = 100

  • Ou pire de trouver le « mauvais » enregistrement si la clé avec ‘ ‘ dans collection existe.

Pour cela rajoutons un enregistrement dans la table prix

En relançant le programme, on trouve l’enregistrement avec le prix de 51 au lieu de 28 pour l’enregistrement avec la collection Null, nous avons donc récupérer les informations d’un autre enregistrement que celui voulu.

Il faut donc gérer dans la clause where la possibilité de l’état null du champs collection.

On ne peut pas utiliser le même formalisme que récupérer l’état d’un champ Null : :Host:ind

Par ce formalisme, aucun enregistrement n’est  trouvé.

Il va falloir gérer l’état Null explicitement en testant l’état de la variable host et l’état du champ de la table.

Dans ce cas, on récupère bien le prix 28 de l’enregistrement avec la collection à l’état Null

Il nous a fallu dans la clause where traiter séparément le cas null (:ind_col = -1 and col isnull) du cas non null (:ind_col <> -1 and col = :Wrk_Collection).

Dans le cas d’utilisation de variable host, la gestion est un peu plus complexe que dans une jointure, mais le principe reste le même : test cas  null « or » test cas non null.