CICS中的Java - 类型2 JDBC连接,给出错误SQLCODE = -922,SQLSTATE = 42505,错误标记= PLAN ACCESS; 00F30034

时间:2017-02-03 10:46:19

标签: java jdbc db2 cics db2-zos

在尝试使用Type 2 Driver获取连接时使用Java代码。

 i DB2Conn                                                                     
 STATUS:  RESULTS - OVERTYPE TO MODIFY                                         
Db2conn        Accountrec( Txid )     ***Authid(          )  Authtype( Sign )***  Comauthid(          )   Comauthtype( Cuserid )  Comthreadlim( 0001 )   Comthreads(0000)  Connecterror( Abend )   Connectst( Connected )                                                      
Db2groupid(      )   ***Db2id( DB2  )***   Db2release(1010)  Drollback(Rollback)                                                         
Msgqueue1( CSMT )  Msgqueue2(      ) Msgqueue3(      ) Nontermrel( Norelease )                                                     
Plan( DEFAULT  )  Planexitname(          )  Priority( Equal )  Purgecyclem( 00 )                                                           
Purgecycles( 30 )        Resyncmember(              )   Reuselimit( 01000 )                                                         
***Signid( ABCDCICS )*** 

我收到以下错误。

  

com.ibm.db2.jcc.am.SqlSyntaxErrorException:[jcc] [50053] [12311] [3.69.56] T2zOS异常:[jcc] [T2zos] T2zosConnection.flowConnect:execConnect:1425:DB2引擎SQL错误,SQLCODE = -922,SQLSTATE = 42505,错误标记= PLAN ACCESS; 00F30034 ERRORCODE = -922,SQLSTATE = 42505

我的DB2Conn属性:

{{1}}

3 个答案:

答案 0 :(得分:1)

根据the manual,SQLCODE -922表示您无权使用资源(在您的特定情况下)PLAN ACCESS。至于决议,上述手册暗示了这一点(强调我的):

  

如果错误类型为' PLAN ACCESS',则与此连接关联的授权标识无权使用指定的计划名称,或者指定的计划名称不存在。 与系统管理员联系

答案 1 :(得分:0)

这是评论的答案(而不是原始问题):

感谢Bruce ....但是由于SignId是我所在地区的ID,是否可以要求访问,或者我是否需要担心 从安全角度来看?我是CICS的新手,仍然试图深入了解它。为什么JDBC连接需要访问计划(默认)

以上内容可以扩展为一个单独的问题。

Cobol / Cics / Db2

的说明

我的知识是10岁,基于Cobol-Cics,事情在平均时间发生了变化。我将尝试以非常简单的方式解释 Cics Cobol DB2 中的工作原理(可能存在轻微的不准确或更改)。希望这将提供一些背景信息

在Mainframe Cobol DB2 中,DataBase访问类似于java中的SQLJ。编译Cobol / DB2程序时,它会被拆分为2; Cobol部件和 SQL部件 DBRM )。 SQL部分 DBRM ),实习生经历 Bind 成为Package/Plan包/计划是特殊类型的Compiled SQL过程的精美名称。

 So

                      Calls                      Accesses DB
     Cobol-Program <-----------> Package/Plan  <----------------->   Data Base
                           (Special SQL Procedure)

在Cobol / DB2中,需要 数据库访问包/计划。 如果您允许用户访问某些程序(可能通过菜单系统),那么具有实际数据库访问权限的程序/计划就是这样。计划只能访问他们需要的内容。用户不需要(通常也没有)任何数据库访问。

爪哇

您的Java访问是基于现有的 Cobol 接口构建的。

猜测您的Java SQL正在传递给执行Dynamic DB2调用的计划(SQL过程)。 需要数据库访问的是计划(SQL过程)。

可能值得使用SQL过程进行数据库访问???

为什么Cobol / DB2以这种方式工作

这可能听起来很复杂,但是:

  • 在许多网站的Cobol中,它们都很自动化。通常都有 编译/绑定程序设置,一切都自动发生

  • 通常,对于Cobol-Plans,数据库访问路径是在Bind时制定的。 Cobol / DB2将继续使用相同的访问路径,直到下一个Bind。这使得系统稳定。

    我为一家从大型机Cobol / DB2迁移的公司工作 到Unix / Oracle包。在大型机上,大多数情况下,每件事情都顺利进行,而对于Oracle,每10分钟的程序运行6个小时就会导致混乱。

  • 如果您使用的是JDBC,那么DB2将在运行时评估访问路径

对于Cobol / DB2,它有真正的原因。它是一个 遗憾的是SQLJ没有进入导管。使用CICS比使用JDBC更好。

链接

一些可能有用的链接

答案 2 :(得分:0)

JDBC与从z / OS获取数据库信息的许多其他方法不同,因为它是动态,即查询未提前知道并在运行时进行解析和分析(尽管事情像PreparedStatement允许一些预编译发生,并且通常更安全。)

相比之下,大多数COBOL等SQL调用(以及SQLJ)都是 static 。程序已编译,同样,它们包含的SQL语句也作为 packages (将其命名为<collectionID>.*以将它们区分为不同的集合)绑定到数据库,然后在运行时通过ID引用。包被绑定到计划。,引用一组包的高级方式。在每个级别中,都可以进行大量自定义,以及可以应用的访问控制权限 - 正如您所知道的那样,因为这就是您遇到的问题。

您可能会认为静态方式是与z / OS上的DB2交互的“默认”方式。这意味着,即使您可能正在使用动态SQL(JDBC),它仍然实际上使用包和计划,但在这种情况下,包能够执行动态SQL。默认情况下,包的集合ID和计划名称均为NULLID。我怀疑你无权使用这个计划。

我建议您自己或与数据库管理员一起采取的步骤是:

  • 确保您的数据库已设置为启用JDBC使用。是否有人在该数据库上使用JDBC?检查JDBC包是否已存在,最有可能是集合ID为NULLID。如果没有,请按照instructions启用它们,特别是注意DB2Binder步骤。
  • 确保您有能力使用该计划。 “你”是指你的CICS区域正在运行请求的用户ID。可能是用户无权使用NULLID计划。
  • 如果一切都失败了,请做更深层次的问题诊断。查看请求是否记录在数据库的作业中,以及您是否可以查看请求的计划。 Java端的Set up tracing,以查看请求是如何进行的。