0

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

String jdbcUrl = "jdbc:default:connection";

Connection connection = DriverManager.getConnection(jdbcURL);

我收到以下错误。

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,错误标记 = 计划访问;00F30034 ERRORCODE=-922,SQLSTATE=42505

我的 DB2Conn 属性:

 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 )*** 
4

3 回答 3

1

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

如果 error-type 是“PLAN ACCESS”,则与此连接关联的授权 ID 无权使用指定的计划名称或指定的计划名称不存在。请咨询您的系统管理员

于 2017-02-03T11:59:56.720 回答
0

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

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

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

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

  • 确保您的数据库设置为启用 JDBC 使用。是否有人已经在该数据库上使用 JDBC?检查 JDBC 包是否已经存在,很可能是集合 ID 为NULLID. 如果没有,请按照说明启用它们,特别注意该DB2Binder步骤。
  • 确保您有能力使用该计划。“您”是指您的 CICS 区域运行请求的用户 ID。可能是用户无权使用该NULLID计划。
  • 如果所有其他方法都失败了,请进行更深入的问题诊断。查看请求是否记录在数据库的作业中,以及您是否可以查看请求是使用哪个计划发出的。在 Java 端设置跟踪,以查看请求是如何发出的。
于 2017-02-13T11:53:32.050 回答
0

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

谢谢布鲁斯....但是由于 SignId 是我所在地区的 ID,是否建议要求访问该 ID,或者我是否必须从安全角度担心任何事情?我是 CICS 的新手,但我仍在努力了解它。为什么 JDBC 连接需要访问计划(默认)

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

Cobol/Cics/Db2的解释

我的知识已有 10 年历史,并且基于 Cobol-Cics,同时情况发生了变化。我将尝试以一种非常简单的方式解释Cics Cobol DB2中的工作原理(可能存在细微的不准确或更改)。希望这将提供一些背景信息

在 Mainframe Cobol DB2中,数据库访问类似于java 中的SQLJ。当 Cobol/DB2 程序被编译时,它被分成 2 个;一个 Cobol 部分和一个SQL 部分( DBRM )。SQL 部分( DBRM )实习生经历Bind成为Package/Plan包/计划是一种特殊类型的CompiledSQL 过程的花哨名称。

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

在 Cobol/DB2 中,它是需要数据库访问Package/Plan。发生的情况是您允许用户访问某些程序(可能通过菜单系统),并且具有实际数据库访问权限的是程序/计划。这些计划只能访问他们需要的东西。用户不需要(并且通常不会被授予)任何数据库访问权限。


爪哇

您的 Java 访问建立在现有Cobol接口之上。

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

可能值得使用 SQL 过程进行 DB 访问???


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

这听起来可能令人费解,但是:

  • 在许多站点的 Cobol 中,这在很大程度上都是自动的。通常会设置编译/绑定程序,一切都会自动发生

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

    我在一家从大型机 Cobol/DB2 迁移到 Unix/Oracle 软件包的公司工作。在大型机上,大多数情况下一切都运行顺利,而使用 Oracle 时,一个 10 分钟的程序经常会运行 6 个小时并造成混乱。

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

对于 Cobol/DB2,它的工作原理是有真正的原因的。遗憾的是 SQLJ没有流行起来。与 JDBC 相比,它与 CICS 一起工作会更好。


链接

一些可能有用的链接

于 2017-02-04T00:06:24.407 回答