Как исправить DB2 sqlcode =-805 в сценарии мэйнфрейма REXX с помощью execsql prepare

#db2 #mainframe #rexx

#db2 #мэйнфрейм #rexx

Вопрос:

Когда я запускаю сценарий REXX :

 /* REXX */                                               
CALL CONNIN /* CONNECTION */                             
ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR FOR S1"       
IF SQLCODE = 0 THEN DO                                  
   ERRMSG = "EXECSQL DECLARE"                             
   CALL SQLCA                                             
END                                                      
TTABLE = "ibmuser.dept"                        
SQLSMT = "SELECT * FROM :TTABLE"                         
ADDRESS DSNREXX "EXECSQL PREPARE S1 FROM :SQLSMT"        
IF SQLCODE = 0 THEN DO                                  
   ERRMSG = "EXECSQL PREPARE"                             
   CALL SQLCA                                             
END                                                      
CALL CLOSING /*CLOSING ALL*/                             
EXIT 0                                                   
/*ROUTINES CALLED*/                                      
/*INITIAL CONNECTION*/                                   
CONNIN:
SSID = "DBCG"                                            
ADDRESS TSO "SUBCOM DSNREXX"                             
IF RC THEN S_RC = RXSUBCOM("ADD","DSNREXX","DSNREXX")    
ADDRESS DSNREXX "CONNECT" SSID                           
IF SQLCODE = 0 THEN DO                                  
   ERRMSG = "CONNECT TO" SSID "FAILED."                   
   CALL SQLCA                                             
END                                                      
RETURN                                                   
/* ERROR HANDLING ROUTINE */                             
SQLCA:                                                   
SAY " ERROR MSG=  >"ERRMSG"<"                            
SAY " SQLCODE  =  >"SQLCODE"<"                           
SAY " SQLSTATE =  >"SQLSTATE"<"                          
SAY " SQLERRMC =  >"SQLERRMC"<"                          
SAY " SQLERRP  =  >"SQLERRP"<"                           
SAY " SQLERRD.1=  >"SQLERRD.1"<"                         
SAY " SQLERRD.2=  >"SQLERRD.2"<"                         
SAY " SQLERRD.3=  >"SQLERRD.3"<"
SAY " SQLERRD.4=  >"SQLERRD.4"<"                 
SAY " SQLERRD.5=  >"SQLERRD.5"<"                 
SAY " SQLERRD.6=  >"SQLERRD.6"<"                 
EXIT 8                                           
RETURN                                           
/* CLOSING */                                    
CLOSING:
ADDRESS DSNREXX "DISCONNECT"                     
S_RC = RXSUBCOM("DELETE","DSNREXX","DSNREXX") 
RETURN
  

После запуска я получаю сообщения об ошибках :

 ERROR MSG=  >EXECSQL PREPARE<                             
SQLCODE  =  >-805<                                        
SQLSTATE =  >51002<                                       
SQLERRMC =  >DALLASC..DSNREXX.1AB2405808DB7F29:DSNREXX:03<
SQLERRP  =  >DSNXEPM <                                    
SQLERRD.1=  >-251<                                        
SQLERRD.2=  >0<                                           
SQLERRD.3=  >0<                                           
SQLERRD.4=  >-1<                                          
SQLERRD.5=  >0<                                           
SQLERRD.6=  >0<                                           
  

Ошибка возникает из: АДРЕС DSNREXX «EXECSQL ПОДГОТАВЛИВАЕТ S1 ИЗ: SQLSMT»
С помощью SPUFI (утилита db2) Я могу перечислить таблицу IBMUSER.ОТДЕЛ с помощью select * из ibmuser.dept;
Как я могу исправить эту проблему?
Спасибо

Комментарии:

1. -805 всегда означает, что план привязан неправильно или содержащиеся в нем пакеты имеют неправильную версию (например, не обновлены). Поскольку в вашем случае речь идет о DSNREXX-пакете, который должен поддерживаться вашими системами -ребята, вам следует связаться с ними и попросить их исправить проблему,

Ответ №1:

Я бы попробовал

 TTABLE = "ibmuser.dept"                        
SQLSMT = "SELECT * FROM" TTABLE  
  

Ошибка -805

 -805   DBRM OR PACKAGE NAME location-name.collection-id.dbrm-name.consistency-token NOT FOUND IN PLAN plan-name. REASON 
  

Полное сообщение сообщит вам, что DB2 не может найти. Если вы не можете его найти, попробуйте посмотреть в выходных данных задания TSO

Комментарии:

1. Я попробовал ваше предложение, но все та же ошибка. В соответствии со списком таблиц SQLSTATE с sqlstate = 51002 ошибка заключается в том, что «Пакет, соответствующий запросу выполнения инструкции SQL, не найден. -805». Для меня объясненная ошибка не имеет ничего общего с именем таблицы, скорее с действием ПОДГОТОВКИ и его версией пакета, что вы думаете?

2. Возможно, у вас нет доступа к пакету по умолчанию или он может быть не настроен. Узнайте, как называется пакет, и поговорите с администратором базы данных

Ответ №2:

Спасибо @piet.t и @bruce-martin за предложения. Проблема заключалась в том, что DSNREXX не был включен для общедоступного использования.