[Résolu] B2 : Type binary dans json_object

RPG (3 et 4, free), CL, SQL, etc...
Répondre
aapra
Messages : 8
Enregistré le : mer. 17 août 2022, 17:08:48

[Résolu] B2 : Type binary dans json_object

Message par aapra »

Bonjour,

Je désire récupérer le contenu d'une *MSGQ sous forme de JSON. Pour cela, j'utilise :
- QSYS2.MESSAGE_QUEUE_INFO qui renvoi des champs en binary(4), https://www.ibm.com/docs/en/i/7.5?topic ... e-function
- json_object (et json_objectagg) pour adapter en json

La requête, exécutée avec Run SQL Scripts, avec ASSOCIATED_MESSAGE_KEY et MESSAGE_TOKENS en commentaire pour l'instant :

Code : Tout sélectionner

with liste_messages as (
  select *
  from table(QSYS2.MESSAGE_QUEUE_INFO(
    QUEUE_LIBRARY => 'QUSRSYS',
    QUEUE_NAME => 'TOTO')
  )
  order by MESSAGE_TIMESTAMP
  fetch first 100 row only
)
select
  json_objectagg(
    'MSG' value
    json_object(
      'MESSAGE_ID' value MESSAGE_ID,
      'MESSAGE_TYPE' value MESSAGE_TYPE,
      'MESSAGE_SUBTYPE' value MESSAGE_SUBTYPE,
      'MESSAGE_TEXT' value MESSAGE_TEXT,
      'SEVERITY' value SEVERITY,
      'MESSAGE_TIMESTAMP' value MESSAGE_TIMESTAMP,
      'MESSAGE_KEY' value MESSAGE_KEY,                              -- BINARY(4)
    --'ASSOCIATED_MESSAGE_KEY' value ASSOCIATED_MESSAGE_KEY,        -- BINARY(4)
      'FROM_USER' value FROM_USER,
      'FROM_JOB' value FROM_JOB,
      'FROM_PROGRAM' value FROM_PROGRAM,
      'MESSAGE_FILE_LIBRARY' value MESSAGE_FILE_LIBRARY,
      'MESSAGE_FILE_NAME' value MESSAGE_FILE_NAME,
    --'MESSAGE_TOKENS' value MESSAGE_TOKENS,                        -- VARCHAR(4096) FOR BIT DATA
      'MESSAGE_SECOND_LEVEL_TEXT' value MESSAGE_SECOND_LEVEL_TEXT
    )
  ) 
from liste_messages;
A l'exécution tel quel, j'ai ce message d'erreur :

Code : Tout sélectionner

Etat SQL: 22032
Code fournisseur: -16402
Message: [SQ16402] Données JSON non valides. Cause.....: Les données fournies par l'expression JSON ne contiennent pas de données JSON correctement formatées. L'erreur s'est produite au niveau du décalage 0 dans la chaîne d'expression. Que faire...: Spécifiez une expression qui contient des données JSON valides.

Si je tente un "cast(MESSAGE_KEY as varchar(50))", j'obtiens cet message d'erreur :

Code : Tout sélectionner

Etat SQL: 57017
Code fournisseur: -332
Message: [SQL0332] Conversion de caractères entre CCSID 65535 et CCSID 1208 incorrecte. Cause : Une conversion de caractères a été tentée pour des données alphanumériques incompatibles. Aucune conversion n'a été définie entre CCSID 65535 et CCSID 1208. Si un CCSID est 65535, l'autre CCSID est un CCSID graphique. Aucune conversion n'a été définie entre 65535 et un CCSID graphique. Dans la cas d'une instruction CONNECT, aucune conversion n'est définie entre le CCSID SBCS du demandeur d'application et le CCSID SBCS du serveur d'applications. Si le second CCSID est 8, le serveur d'applications n'a pas renvoyé sont CCSID SBCS par défaut. Il est possible qu'un serveur d'applications autre que DB2 for 18M i ne prenne pas en charge un CCSID de 65535. Que faire Assurez-vous que toutes les comparaisons, concaténations ou attributions de caractères ont été appliquées à des colonnes ou des variables hôte dont les valeurs CCSID sont compatibles. Dans le cas d'une instruction CONNECT, modifiez le CCSID SBCS du demandeur d'application ou du serveur d'applications de manière à permettre la conversion des valeurs de CCSID.

Le CCSID de mon job est 297.
Je manque de connaissances pour identifier d'où vient mon erreur :/ Avez-vous des solutions pour récupérer MESSAGE_KEY, ASSOCIATED_MESSAGE_KEY (même cas) et MESSAGE_TOKENS ?

Merci d'avance !
Modifié en dernier par aapra le jeu. 06 mars 2025, 18:10:06, modifié 1 fois.

nbonnet
Messages : 219
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: DB2 : Type binary dans json_object

Message par nbonnet »

Bonjour,

Le souci vient de la colonne MESSAGE_KEY qui est binaire.
Essayez avec :

Code : Tout sélectionner

      'MESSAGE_KEY' value hex(MESSAGE_KEY),                              -- BINARY(4)
au lieu de

Code : Tout sélectionner

      'MESSAGE_KEY' value MESSAGE_KEY,                              -- BINARY(4)
Nathanaël

aapra
Messages : 8
Enregistré le : mer. 17 août 2022, 17:08:48

Re: DB2 : Type binary dans json_object

Message par aapra »

Merci Nathanaël, c'est bien ça.

Répondre