Nous passons à HANA et une société externe procède à la correction de notre code. Une partie est automatisée. Je vois où ce changement de code a été effectué:

*{   REPLACE        DEVK9A1ZZH
*  SELECT SINGLE maktx
*                INTO tab-maktx
*                FROM makt
*                WHERE matnr EQ strmatnr
*                AND   spras EQ sy-langu.
  SELECT maktx
    UP TO 1 ROWS
    INTO tab-maktx
    FROM makt
    WHERE matnr = strmatnr
    AND   spras = sy-langu ORDER BY maktx.
  ENDSELECT.

Je pensais que SELECT SINGLE était toujours préférable à SELECT...UP TO 1 ROWS...ENDSELECT. et que ORDER BY ne fait rien lorsqu'un seul enregistrement est obtenu. Il semble qu'ils remplacent chaque SELECT SINGLE dans notre code. Qu'est-ce qui dans le code d'origine de mon collègue n'est pas conforme à HANA?

0
gkubed 23 mai 2018 à 15:56

3 réponses

Meilleure réponse

La légende urbaine (et mon expérience, mais je ne peux pas le prouver) disent que les SGBD communs fournissent les lignes en utilisant la clé primaire, simplement parce que c'est ainsi qu'ils conservent les données. HANA trie par colonnes et non par lignes, donc lorsque vous ne demandez qu'une seule ligne, il vous revient avec la première ligne "elle" peut réussir à construire avec vos conditions.

Comme vous ne pouvez pas faire un SELECT SINGLE...ORDER BY, vous devez trouver un autre moyen:

  • recommandé: remplissez la clause WHERE avec suffisamment de conditions pour obtenir la ligne dont vous avez vraiment besoin
  • demander à HANA de simuler l'ancien comportement du SGBD en demandant "juste une seule ligne, recherche par clé primaire"

Si vous parvenez à toujours fournir une clause WHERE avec suffisamment de conditions, vous pouvez continuer avec la syntaxe SINGLE, mais je crains que certaines entreprises ne vous demandent de NE PAS le faire, car elles ont été confrontées aux résultats de codeurs paresseux qui se sont appuyés sur le ancien comportement DMBS :(

1
VXLozano 24 mai 2018 à 08:23

Parfois, il est nécessaire, généralement pas

Ce n'est généralement pas nécessaire, tout comme dans votre exemple.

Les SELECT SINGLE peuvent être classés en 3 groupes:

  • Recherches de clé primaire complètes
  • Contrôles d'existence
  • Autre

Recherches de clé primaire complètes

matnr et spras sont les champs de clé primaire de la table makt, donc la même ligne est déjà renvoyée, indépendamment de tout ordre.
Je suppose que l'outil tiers n'est pas assez sophistiqué pour vérifier les champs clés de la table sélectionnée.

Contrôles d'existence

Un grand nombre de SELECT SINGLE sont utilisés uniquement pour vérifier si une valeur existe dans la base de données.

SELECT SINGLE posnr
    FROM VBPA 
    WHERE vbeln = iv_vbeln

Nous ne nous soucions pas du numéro d'article retourné, juste s'il est supérieur à 0. La conversion ici est également inutile, la commande n'a pas d'importance.

Quand est-ce utile?

Seulement dans le troisième cas, lorsque nous n'avons pas la clé primaire complète, mais que nous nous soucions toujours de la commande. C'est assez rare.

La vérification de la clé primaire est difficile et il est carrément impossible de savoir si le programmeur d'origine avait besoin d'une commande spécifique à partir du code.

Cet outil vous donnera plus de faux positifs que de résultats utiles.

1
gkubed 23 mai 2018 à 16:55

Votre code est correct dans tous les cas (mais codé beaucoup plus efficacement dans la première version non corrigée), car vous émettez la clé primaire de MAKTX (MATNR + SPRAS), et donc un seul enregistrement peut être retourné et l'ordre n'est pas pertinent.

Les auto-remédiations HANA semblent généralement faire beaucoup de «correctifs» inutiles, mais celui-ci est particulièrement ennuyeux.

1
TallDave 5 nov. 2019 à 21:18