HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

RPG (3 et 4, free), CL, SQL, etc...
Répondre
Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Jean-Marie »

Bonjour,

La fonction suivante permet d'appeler une API_TEST :

Code : Tout sélectionner

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// API_TEST
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DCL-PROC API_TEST EXPORT;
  Dcl-PI API_TEST ;
    InClient_ID     Char(30)   CONST;
    InClient_Secret Char(50)   CONST;
    InDestinataires Char(100)  CONST;
    InMessage       Char(1000) CONST;
  End-PI;

  // Déclarations locales
  Dcl-S  Grant_Type      Char(50)      INZ('client_credentials') CCSID(1208);
  Dcl-S  L_Client_ID     Char(30)      INZ('')                   CCSID(1208);
  Dcl-S  L_Client_Secret Char(50)      INZ('')                   CCSID(1208);
  Dcl-S  L_Destinataires Char(100)     INZ('')                   CCSID(1208);
  Dcl-S  L_Message       Char(1000)    INZ('')                   CCSID(1208);
  Dcl-S  Body            VarChar(2000) INZ('')                   CCSID(1208);
  Dcl-S  $_Select        VarChar(2000) INZ('')                   CCSID(1208);
  Dcl-S  Retour          VarChar(2000) INZ('');
  Dcl-DS DS_Retour QUALIFIED;
    Donnees VarChar(2000) ;
    Message  VarChar(2000);
  End-DS;

  // Initialisations
  L_Client_ID     = %TRIM(InClient_ID);
  L_Client_Secret = %TRIM(InClient_Secret);
  
  // Construction du body
  L_Destinataires = %TRIM(InDestinataires);
  L_Message       = %TRIM(InMessage);
  Body            = '{"Destinataire":"' + %TRIM(L_Destinataires) + '", "Message":"' + %TRIM(L_Message) + '"}';

  // Appel de l'API API_TEST
  $_Select   = ' WITH Token_Table AS (';
  $_Select  += '   SELECT access_token as access_token FROM JSON_TABLE(';
  $_Select  += '     SYSTOOLS.HTTPPOSTCLOB(' + G_Quote + 'UrlAuthentification' + G_Quote + ', ';
  $_Select  += '       CAST(' + G_Quote + '<httpHeader><header name="content-type" value="application/x-www-form-urlencoded"/></httpHeader>' + G_Quote + ' AS CLOB(1K) ),';
  $_Select  +=                  G_Quote + 'grant_type='     + G_Quote + ' CONCAT SYSTOOLS.URLENCODE(' + G_Quote + %TRIM(Grant_Type)      + G_Quote + ', ' + G_Quote + '' + G_Quote + ') CONCAT ';
  $_Select  +=                  G_Quote + '&client_id='     + G_Quote + ' CONCAT SYSTOOLS.URLENCODE(' + G_Quote + %TRIM(L_Client_ID)     + G_Quote + ', ' + G_Quote + '' + G_Quote + ') CONCAT ';
  $_Select  +=                  G_Quote + '&client_secret=' + G_Quote + ' CONCAT SYSTOOLS.URLENCODE(' + G_Quote + %TRIM(L_Client_Secret) + G_Quote + ', ' + G_Quote + '' + G_Quote + ')';
  $_Select  += '     ),';
  $_Select  +=       G_Quote + '$' + G_Quote;
  $_Select  += '     Columns(';
  $_Select  += '       token_type   varchar(20)   PATH ' + G_Quote + '$.token_type'   + G_Quote + ',';
  $_Select  += '       access_token varchar(2000) PATH ' + G_Quote + '$.access_token' + G_Quote + ',';
  $_Select  += '       expires_in   decimal(9, 0) PATH ' + G_Quote + '$.expires_in'   + G_Quote;
  $_Select  += '     )) AS Token';
  $_Select  += ' ),';
  $_Select  += ' Call_WebAPI AS (';
  $_Select  += '  SELECT';
  $_Select  += '    (' +  G_Quote + '<httpHeader>';
  $_Select  += '                       <header name="content-type"  value="application/json"/>';
  $_Select  += '                       <header name="Authorization" value="Bearer ' + G_Quote + ' || TRIM(access_token) || ' + G_Quote + '"/>';
  $_Select  += '                     </httpHeader>' + G_Quote + ' ) AS Header,';
  $_Select  += '   CAST(' + G_Quote + %TRIM(Body) + G_Quote + ' AS VARCHAR(2000)) AS Body';
  $_Select  += '   FROM SYSIBM.SYSDUMMY1, Token_Table';
  $_Select  += ' )';
  $_Select  += ' SELECT CAST(SYSTOOLS.HTTPPOSTCLOB(' + G_Quote + 'URLDeMonAPI_TEST' + G_Quote;
  $_Select  += ', CAST(Header AS CLOB(10K)), body) AS VARCHAR(2000)) FROM Call_WebAPI';
  EXEC SQL PREPARE P_API_TEST FROM :$_Select;
  EXEC SQL DECLARE C_API_TEST CURSOR FOR P_API_TEST;
  EXEC SQL OPEN C_API_TEST;
  EXEC SQL FETCH NEXT FROM C_API_TEST INTO :Retour;
  IF SqlCode <> 0;

  ENDIF;
  EXEC SQL CLOSE C_API_TEST;
  
  DS_Retour = Retour;
END-PROC;                     
J'ai beau faire des cast dans tous les sens j'obtiens le SqlCode -332 :

Message . . . . : Conversion de caractères entre CCSID 65535 et CCSID 1200
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 1200.
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.

La requête fonctionne pourtant dans ACS.

Quelqu'un aurait une idée ?

Jean-Marie

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

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par nbonnet »

Bonjour,

Est-ce que cela fonctionne en exécutant le programme après avoir changé le CCSID du travail :

Code : Tout sélectionner

chgjob ccsid(1147)


A priori le travail est en CCSID 65535 (cad sans CCSID en réalité) et les conversions ne peuvent pas se faire.

Dans le travail SQL, quel est le CCSID ?
Nathanaël

Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Jean-Marie »

Bonjour,

Ca fonctionne en utilisant le chgjob ccsid(1147) merci !.

Du coup comment je peux faire utiliser ce ccsid pour l'appel de cette fonction ?

Comment voir le ccsid du travail SQL ?

Merci !

Hurri
Messages : 38
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Hurri »

Bonjour,

Je te répondrais que le mieux serait que ton système soit défini avec un CCSID (valeur système QCCSID) autre que 65535.
Le 1147 (France avec euro) est une bonne idée.

Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Jean-Marie »

Bonjour,

Merci pour votre réponse, ça semble être une bonne idée mais je connais pas les conséquences d'un tel changement, un peu trop risqué pour moi :) => https://www.ibm.com/support/pages/what- ... ther-ccsid

Est-ce qu'en passant par un QCMDEXEC qui forcerait le CCSID avant et après l'appel de la fonction serait suffisant ?

Est-ce qu'il y a une autre solution envisageable ?

Merci !

Hurri
Messages : 38
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Hurri »

Tu peux changer le CCSID dans le Job lui-même :

Code : Tout sélectionner

CHGJOB * CCSID(1147)
Si le job est soumis, tu peux le faire lors de la soumission :

Code : Tout sélectionner

SBMJOB ... CCSID(1147)
Mais franchement, à moins que ton système soit multilingue, ou que tu aies des postes codés en DBCS (chinois, japonais, etc...), changer le CCSID de ton système est une bonne idée.
Déjà çà te permettra d'utiliser correctement le serveur Web intégré, le réglage par défaut sans code page (65535 donc), posant de gros soucis à ce niveau.

SebastienB
Messages : 51
Enregistré le : ven. 22 janv. 2021, 10:21:13

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par SebastienB »

Bonjour,

Il est aussi possible de modifier le CCSID sur le(s) profil(s) utilisateur(s) afin de faire des tests avant changement au niveau de l'OS.

Code : Tout sélectionner

ID codé de jeu de caractères . . CCSID          1147       
Séb.

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

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par nbonnet »

IBM livre les systèmes en QCCSID(65535) et recommande de ne pas utiliser cette valeur.
C'est donc une bonne idée de la changer.
On a quelques impacts, qui sont plutôt des effets de bord des rustines mises en place par manque de gestion des conversions de caractères (remplacement du à en @ etc ...).

Si une seconde partition est disponible, ce serait une bonne idée de qualifier pendant quelques semaines.
Nathanaël

Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par Jean-Marie »

Bonjour,

Merci pour vos réponses !

Je vais me renseigner en interne pour voir s'il est possible pour nous de changer de CCSID, en attendant j'ai pris l'option de changer le CCSID via un CHGJOB lors de l'appel à la procédure....

Cdlt,
Jean-Marie

damz
Messages : 15
Enregistré le : mer. 27 nov. 2019, 16:16:58

Re: HTTPPOSTCLOB - SQL embarqué- Erreur CCSID

Message par damz »

Hello,
Dans mes procédures stockées - invoquées via JDBC très souvent - qui utilisent SYSTOOLS.HTTPPUTCLOB par exemple, je change le CCSID en début de proc, et je le restaure en fin de proc ou en cas d'exception.
Je ne sais pas si c'est la meilleure façon de faire ça, mais ça marche en tout cas.

DECLARE CURRENT_CCSID INTEGER; -- sauvegarde du CCSID du programme appelant
DECLARE LOCAL_CCSID INTEGER; -- CCSID pour la FRANCE (297)

-- on restaure le CCSID du job appelant en cas de problème
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
CALL QSYS2.QCMDEXC('CHGJOB CCSID('||CURRENT_CCSID||')');

-- on sauvegarde le CCSID du JOB appelant
SELECT CCSID INTO CURRENT_CCSID FROM TABLE(QSYS2.JOB_INFO()) A WHERE JOB_NAME = QSYS2.JOB_NAME;
-- on change le CCSID du travail courant avec celui de la FRANCE
SET LOCAL_CCSID = 297;
CALL QSYS2.QCMDEXC('CHGJOB CCSID('||LOCAL_CCSID||')');

... corps de la procédure

-- on restaure le CCSID du travail courant
CALL QSYS2.QCMDEXC('CHGJOB CCSID('||CURRENT_CCSID||')');

Georgesnott
Messages : 3
Enregistré le : lun. 05 févr. 2024, 21:53:16
Localisation : Russia
Contact :

Trucs et astuces pour améliorer la performance de votre système IBM i.

Message par Georgesnott »

Bonjour à tous les membres du forum ! Aujourd'hui, je voudrais aborder un sujet qui concerne la plupart d'entre nous : comment optimiser la performance de notre système IBM i. Que vous soyez un utilisateur expérimenté ou un novice, il est toujours utile d'échanger des trucs et astuces pour tirer le meilleur parti de notre système.
ограничители перенапряжения опн https://energy-21.ru/katalog/opn/catego ... niya-35-kv опн 110

Répondre