menu

arrow_back Sous-procédures utilisant la fonction table QSYS2.STACK_INFO?

par Actif
(360 points) 13 26
dans Programmation
0 votes

Bonjour, 

J'ai un petit souci avec l'utilisation de la fonction table QSYS2.STACK_INFO quand elle est embarqué dans un source sqlrpgle.

Apparemment, c'est compliqué de lui transmettre des variables hôtes. Quand j'essaie, j'ai un sqlcode = -443 et dans la log j'ai le message:

Un programme de déclenchement ou un programme externe a détecté une erreur.

Cause . . . . . : Un programme de déclenchement, une procédure externe ou une fonction externe a détecté et signalé une erreur à SQL. Si l'erreur s'est produite dans un programme de déclenchement, le déclencheur est dans la table QDBSSUDF2 du schéma QSYS. Si l'erreur s'est produite dans une procédure ou une fonction externe, le nom externe est QDBSSUDF2 dans le schéma QSYS.  Le texte associé est JOB 529445/QUSER/QZRCSRVS        NOT VALID.  Si l'erreur s'est produite dans un programme de déclench

ou

Un programme de déclenchement ou un programme externe a détecté une erreur.

Cause . . . . . : Un programme de déclenchement, une procédure externe ou une fonction externe a détecté et signalé une erreur à SQL. Si l'erreur s'est produite dans un programme de déclenchement, le déclencheur est dans la table QDBSSUDF2 du schéma QSYS. Si l'erreur s'est produite dans une procédure ou une fonction externe, le nom externe est QDBSSUDF2 dans le schéma QSYS.  Le texte associé est JOB *        NOT VALID.  Si l'erreur s'est produite dans un programme de déclench

Voici ci-dessous la sous-procédure concernée.

// --------------------------------------------------
// Procedure name: RetrieveFirstProgramNotRegexp
// Purpose:        Generated by Extract Procedure Wizard
// Returns:        Récupération dun nom du 1er programme qui ne vérifie pas l...
//                          e REGEXP
// Parameter:      pQualifiedJobName => Le travail dont nous souhaitons récup...
//                          érer les informations de la pile d'appels
// Parameter:      threadId => Thread id
// --------------------------------------------------
DCL-PROC RetrieveFirstProgramNotRegexp Export;
DCL-PI *N LIKE(r_NomObj);
  pQualifiedJobName CHAR(28) CONST;
  pNotVerifiedString Char(10) CONST;
  pthreadId INT(20) CONST OPTIONS(*NOPASS);
END-PI;

  // Local fields
  DCL-S StackInfo LIKE(r_NomObj);
  DCL-S lcallerProgram LIKE(r_NomObj);
  DCL-S lcallerProgramLevel Int(10);
  Dcl-s Regex varchar(100);

  // Calculation specifications
  Regex='(' + %Trim(pNotVerifiedString) + ')';

  lcallerProgram=stk_rtvCaller();

  Exec sql
    SELECT ordinal_position
      Into :lcallerProgramLevel
      FROM TABLE (qsys2.stack_info(:pQualifiedJobName)) a
     WHERE Program_name = :lcallerProgram
  ORDER BY ordinal_position DESC
   LIMIT 1;

  Exec sql
    SELECT program_name
      Into :StackInfo
      FROM TABLE (qsys2.stack_info(:pQualifiedJobName )) a
     WHERE Not REGEXP_LIKE( program_name, :Regex,'i')
       And ordinal_position < :lcallerProgramLevel
  ORDER BY ordinal_position DESC
   LIMIT 1;


  return StackInfo;
END-PROC;                              

Merci d'avance.

1 Réponse

par Actif
(360 points) 13 26
sélectionné par
 
Meilleure réponse
0 votes

re-Bonjour, 

Il faut supprimer les espaces du nom du travail qualifié comme suit:

/ --------------------------------------------------
// Procedure name: RetrieveFirstProgramNotRegexp
// Purpose:        Generated by Extract Procedure Wizard
// Returns:        Récupération dun nom du 1er programme qui ne vérifie pas l...
//                          e REGEXP
// Parameter:      pQualifiedJobName => Le travail dont nous souhaitons récup...
//                          érer les informations de la pile d'appels
// Parameter:      threadId => Thread id
// --------------------------------------------------
DCL-PROC RetrieveFirstProgramNotRegexp Export;
DCL-PI *N LIKE(r_NomObj);
  pQualifiedJobName CHAR(28) CONST;
  pNotVerifiedString Char(10) CONST;
  pthreadId INT(20) CONST OPTIONS(*NOPASS);
END-PI;

  // Local fields
  DCL-S StackInfo LIKE(r_NomObj);
  DCL-S lcallerProgram LIKE(r_NomObj);
  DCL-S lcallerProgramLevel Int(10);
  Dcl-s Regex varchar(100);

  // Calculation specifications
  Regex='(' + %Trim(pNotVerifiedString) + ')';

  lcallerProgram=stk_rtvCaller();

  Exec sql
    SELECT ordinal_position
      Into :lcallerProgramLevel
      FROM TABLE (qsys2.stack_info( trim(:pQualifiedJobName))) a
     WHERE Program_name = :lcallerProgram
  ORDER BY ordinal_position DESC
   LIMIT 1;

  Exec sql
    SELECT program_name
      Into :StackInfo
      FROM TABLE (qsys2.stack_info( trim(:pQualifiedJobName))) a
     WHERE Not REGEXP_LIKE( program_name, :Regex,'i')
       And ordinal_position < :lcallerProgramLevel
  ORDER BY ordinal_position DESC
   LIMIT 1;


  return StackInfo;
END-PROC;             

Je pense qu'il doit être possible de déclarer le paramètre pQualifiedJobName en type Varchar au lieu d'utiliser la fonction Trim.

Cordialement,

Questions liées

0 votes
1 réponse 195 vues
Comment initialiser plusieurs indicateurs à la fois?Bonjour,&nbsp; Comment fait-on pour initialiser des indicateurs "en masse"? Comme en "colonné": C MOVE '0010010' IN(01) Cordialement,&nbsp; ...
par ibmiiste Confirmé
(1.4k points)
10-Janvier-2020 posée dans Programmation
0 votes
1 réponse 507 vues
J'ai une erreur SQL0314: Position 13 Nom de la variable VRF_TSMCRT déjà utilisé. Qu'est-ce que cela veut dire?Bonjour,&nbsp; A la précompilationn j'ai l'erreur "SQL0314: Position 13 Nom de la variable VRF_TSMCRT déjà utilisé." Je&nbsp;ne la comprend pas. Ci-dessous la requête. ...
par ibmiiste Confirmé
(1.4k points)
19-Novembre-2019 posée dans Programmation
0 votes
1 réponse 183 vues
Comment initialiser une variables de type timestamp lors de la déclaration?Bonjour, Comment initialiser une variables de type timestamp lors de la déclaration? Car moi, j'ai une erreur. &nbsp; Dcl-s Ref_Tsmcrt Timestamp Inz('2019-11-15 17: ...
par Olivier Actif
(360 points)
18-Novembre-2019 posée dans Programmation
0 votes
1 réponse 41 vues
Peut-on utiliser des booléens RPG comme variable hôte sur du SQL embarqué?Bonjour,&nbsp; Je souhaite faire une requête SQL d'existence d'enregistrement et mettre directement dans une variable hôte la valeur On. Peut-on le faire? Si oui, comme ...
par Olivier Actif
(360 points)
25-Janvier posée dans Programmation
0 votes
1 réponse 106 vues
Comment convertir une valeur en seconde en hh:mm en RPG ile?Bonjour, J'ai une valeur en seconde stockée dans du &quot;packé&quot; 10:0 et je souhaite le convertir en heure et minutes sous ce masque hh:00 et en alphanumérique. Ave ...
par ibmiiste Confirmé
(1.4k points)
28-Octobre-2020 posée dans Programmation