在尝试使用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}}
答案 0 :(得分:1)
根据the manual,SQLCODE -922表示您无权使用资源(在您的特定情况下)PLAN ACCESS
。至于决议,上述手册暗示了这一点(强调我的):
如果错误类型为' PLAN ACCESS',则与此连接关联的授权标识无权使用指定的计划名称,或者指定的计划名称不存在。 与系统管理员联系。
答案 1 :(得分:0)
这是评论的答案(而不是原始问题):
感谢Bruce ....但是由于SignId是我所在地区的ID,是否可以要求访问,或者我是否需要担心 从安全角度来看?我是CICS的新手,仍然试图深入了解它。为什么JDBC连接需要访问计划(默认)
以上内容可以扩展为一个单独的问题。
我的知识是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中,它们都很自动化。通常都有 编译/绑定程序设置,一切都自动发生
通常,对于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
。我怀疑你无权使用这个计划。
我建议您自己或与数据库管理员一起采取的步骤是:
NULLID
。如果没有,请按照instructions启用它们,特别是注意DB2Binder
步骤。NULLID
计划。