Обнаружена ошибка времени компиляции при встраивании оператора sql в подпроцедуру. - PullRequest
0 голосов
/ 08 января 2020

Я уже встроил sql в подпроцедуры. Но этот просто не будет сотрудничать. Это дает мне ошибку времени компиляции. Ниже приведена урезанная версия кода. Если я изменю эту подпроцедуру myPro c на подпрограмму, она скомпилируется нормально. Но мне нужно, чтобы это было в подпроцедуре.

P myProc          B                                      
D                 pi                                     

   // calling stored procedure to get result set        
   exec sql call lrGetLoginResetEmailsSP(:sqlTotRow_RE); 

   // associate the RS and open cursor                   
   exec sql associate result set locator (:sqlRS_RE)     
            with procedure lrGetLoginResetEmailsSP;      
   exec sql allocate C1 cursor for result set :sqlRS_RE; 

   // fetch and close                                     
   exec sql fetch C1 into :sqlRcd_RE;                    
   exec sql close C1;                                    

P                 E                                          

Ниже приведены ошибки компиляции, которые я получаю

*RNF7030 30        096100  The name or indicator SQL_00000 is not defined.
*RNF7030 30        096100  The name or indicator SQL_00003 is not defined.
. . .   

Когда я смотрю на список компиляции, я заметил что компилятор автоматически сгенерировал эти переменные SQL_00 **. Но они превращаются в совершенно не связанную подпрограмму. Он должен был сгенерировать их в основном D spe c. Вот источник компиляции:

033100 P clrOtherPrfsSF...                                                                             
033200 P                 B                                                                             
033300 D                 pi                                                                            
033400                                                                                                 
033500   //clear the subfile                                                                           
096100 D                 DS                  STATIC                               CALL                 
096100 D  SQL_00000              1      2B 0 INZ(128)                             length of header     
096100 D  SQL_00001              3      4B 0 INZ(4)                               statement number     
096100 D  SQL_00002              5      8U 0 INZ(0)                               invocation mark      
096100 D  SQL_00003              9      9A   INZ('0') CCSID(*JOBRUNMIX)           data is okay         
096100 D  SQL_00004             10    128A   CCSID(*JOBRUNMIX)                    end of header        
096100 D  SQL_00005            129    132I 0                                      SQLTOTROW_RE         

Странно ...

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Для этого есть PTF: https://www-01.ibm.com/support/docview.wss?uid=nas3SI68275

Вот как я его нашел: я перешел на новую главную страницу RPG Cafe (https://ibm.biz/rpg_cafe) и поместите "crtsqlrpgi rnf7030" в общую панель поиска "Поддержка" в верхней части.

Это были первые 3 попадания. Я выбрал второй, и это был 7.3 PTF.

Resolving CRTSQLRPGI that fails with RNF7030,RNF7503 using RPGPPOPT(*LVL2)
SI68275 - SQL-CMPL-MSGRNF7030 CRTSQLRPGI FAILS WITH RNF7030 AS SQL PRE
SI68274 - SQL-CMPL-MSGRNF7030 CRTSQLRPGI FAILS WITH RNF7030 AS SQL PRE

Когда я изменил поиск, добавив «v7r3m0», сначала появился PTF SI68275, и APAR был секунда.

SI68275 - SQL-CMPL-MSGRNF7030 CRTSQLRPGI FAILS WITH RNF7030 AS SQL PRE
SE69905 - SQL-CMPL-MSGRNF7030 CRTSQLRPGI FAILS WITH RNF7030 AS SQL PRECOMPILER INSERTS RPG STATEMENTS INCORRECTLY
1 голос
/ 09 января 2020

exec SQL set option .... на самом деле является оператором времени компиляции, а не времени выполнения, и должен быть самым первым SQL оператором, встречающимся в источнике.

В модуле * SRVPGM я часто буду иметь следующее как самая первая процедура в модуле ...

   //-----------------------------------------------------------------------
   //  SetSqlOptions
   //
   // The SQL SET OPTION statement is a compile time statement
   //   It must be physically the first SQL statement the compiler sees
   //   during compilation.  the options are in effect for the entire module
   //
   //   Thus this dummy procedure that isn't ever called.
   //-----------------------------------------------------------------------
   dcl-proc SetSqlOptions;

      exec sql set option  naming =*sys, commit= *none, usrprf= *owner,
            dynusrprf= *owner,datfmt= *iso, timfmt = *iso,
            closqlcsr= *endactgrp, alwblk = *allread,
            alwcpydta = *optimize, dlyprp = *yes;
      return;
   end-proc;

Итак, в главном цикле * PGM убедитесь, что SET OPTION находится в самом начале C -спецификации.

В линейной сети вы можете сделать описанную выше процедуру самой первой в источнике.

Кроме того, какую версию и уровень PTF вы используете?

...