CONNECT 语句

CONNECT语句将应用程序进程连接到数据库服务器。 该服务器将成为当前进程的服务器Db2 for z/OS® 的CONNECT语句与 PDF文件图标 SQL参考资料中跨平台开发版本6中的 CONNECT(类型2) 等效。

有关连接、当前服务器、提交处理以及分布式和远程工作单元的更多信息,请参阅分布式关系数据库

调用 CONNECT

此语句只能嵌入应用程序中。 这是一个无法动态准备的可执行语句。 Java™中不能指定。

授权 CONNECT

必须授权流程的主授权ID或本声明中指定的授权ID才能连接到指定服务器。 服务器在执行语句时检查授权,并确定所需的特定授权。 更多信息,请参阅授权ID

语法 CONNECT

阅读语法图跳过可视化语法图CONNECT TO地点名称宿主变量授权RESET授权

授权:

阅读语法图跳过可视化语法图USER宿主变量USING宿主变量

描述 CONNECT

TO 位置名称 宿主变量
通过指定位置名称或主机变量中的位置名称来识别服务器。 如果指定了宿主变量:
  • 它必须是一个长度属性不超过16的CHAR或VARCHAR变量。 (一个以空格字符结尾的字符串最长可达17个字节。)
  • 其后不能跟指示变量。
  • 在宿主变量中,位置名称必须左对齐,且必须符合普通标识符的规则。
  • 如果地点名称的长度小于宿主变量的长度,则必须在右边用空格补齐。
  • 不能包含小写字母。
  • 如果与SQL过程语言应用程序一起使用,主机变量必须是合格的SQL变量名或合格的SQL参数名。

当执行CONNECT语句时:

  • 位置名称必须标识本地 Db2 子系统已知的服务器。 因此,位置名称必须是本地 Db2 子系统的位置名称,或者必须出现在 SYSIBM.LOCATIONS 表的“位置”列中。
  • 如果SQLRULES(STD)绑定选项生效,应用程序进程不得与指定服务器建立现有连接。
  • 如果交易涉及远程工作单元,则应用程序必须处于可连接状态。
已复位
CONNECT RESET相当于CONNECT TO x ,其中 x 是本地 Db2 子系统的位置名称。
  • 如果SQLRULES( DB2 )绑定选项生效,CONNECT RESET会将本地 Db2 子系统设置为当前SQL连接。
  • 如果 SQLRULES(STD) 绑定选项生效,则仅在连接不存在时,CONNECT RESET 才会将本地 Db2 子系统设置为当前 SQL 连接。
授权
指定一个授权ID和一个用于验证授权ID是否有权连接服务器的密码。 当连接类型为 IMS 或 CICS® 时,无法指定授权,用于连接到本地 Db2 子系统。 尝试这样做会导致SQL错误。
用户主机变量
标识用于连接服务器的授权名称。 宿主变量的值必须满足以下规则:
  • 该值必须是一个长度属性不超过128的CHAR或VARCHAR变量。
  • 该值必须在宿主变量中左对齐,且必须符合授权名称的规则。
  • 值后面不能跟指示变量。
  • 如果授权名称的长度小于宿主变量的长度,则必须在右侧用空格填充。

为了连接到本地 Db2 子系统,如果用户ID超过8个字符,将导致SQL错误。

使用宿主变量
用于连接服务器的授权名称的密码。 宿主变量的值必须满足以下规则:
  • 该值必须是一个长度属性不超过128的CHAR或VARCHAR变量。
  • 数值必须左对齐。
  • 该值不得包含指示变量。
  • 如果密码长度小于宿主变量的长度,则必须在右侧用空格补齐。
  • 该值不得包含小写字母。

更改开始与本地 Db2 子系统连接时,如果用户ID超过100个字符,将导致SQL错误。更改结束

更多信息,请参阅 “密码”或“短语”(指定用户密码或密码短语 )。

CONNECT USER/USING 相当于 CONNECT TO x USER/USING,其中 x 是本地 Db2 子系统的位置名称(具有 CONNECT RESET 的语义)。

无操作数的 CONNECT
这种形式的CONNECT语句在SQLCA的SQLERRP字段中返回当前服务器的信息。 如果应用程序处于未连接状态,SQLERRP将返回空值。

执行不带操作数的连接对连接状态没有影响。

在远程单元中,这种形式的连接不需要应用程序处于可连接状态。

备注 CONNECT

连接成功数

除了不带操作数的CONNECT语句外,如果CONNECT语句执行成功,则操作取决于工作单元类型:

分布式工作单元
分布式工作单元中会发生以下情况之一:
  • 如果位置名称无法识别应用程序进程已连接的服务器,则创建与服务器的 SQL 连接,并将其置于当前和保持状态。 之前存在的SQL连接(如果有)将进入休眠状态。
  • 如果服务器名称标识的应用程序进程已经连接到该服务器,则相关的SQL连接处于休眠状态,并且SQLRULES( DB2 )选项生效,SQL连接将保持当前状态。 之前存在的SQL连接(如果有)将进入休眠状态。
  • 如果服务器名称标识的应用程序进程已经连接到该服务器,且关联的 SQL 连接是当前有效的,并且 SQLRULES( DB2 )选项生效,应用程序进程的所有SQL连接的状态保持不变。
远程工作单元
以下操作在远程工作单元中发生:
  • 应用程序进程与指定服务器相连。
  • 应用程序进程的现有 SQL 连接已结束。 因此,SQL连接的所有游标都将被关闭,该连接的所有准备语句都将被销毁,等等。
  • 位置名称放在CURRENT SERVER特殊寄存器中。
  • 当使用CONNECT连接回本地 Db2 子系统时,如果指定了USER/USING子句,则CURRENT SQLID特殊寄存器将被重新初始化。
  • 服务器信息位于SQLCA的SQLERRP字段中。 如果服务器是 Db2 产品,信息格式为 pppvvrrm
    产品标识符(PRDID)值是一个8字节字符值,采用 pppvvrrm格式 ,其中: ppp 是3个字母的产品代码; vv 是版本;rr 是发行版; m 是修改级别。 Db2 12 for z/OS 中,修改级别表示一系列功能级别:
    • DSN12015适用于 V12R1M500 或更高版本。
    • DSN12010致 V12R1M100。
    更改开始更多信息,请参阅 Db2 for z/OS 中的产品标识符 (PRDID) 值更改结束
  • 关于连接的更多信息位于SQLCA的SQLERRMC字段中。 内容与产品有关。

    更改开始如果 Db2 for z/OS 请求者和数据服务器 Db2 12 或更高版本,SQLERRMC 字段包含完全限定函数级别 Db2 for z/OS 请求者所连接的数据服务器,格式为 V nn R n M nnn更改结束

    提示 :使用GET DIAGNOSTICS语句获取关于最近执行的SQL语句的详细诊断信息。
连接失败

除了没有操作数的CONNECT语句外,如果CONNECT语句执行失败:

分布式工作单元
在分布式工作单元中,除非授权检查失败,否则应用程序进程的连接状态及其SQL连接的状态不会改变。 如果是这种情况,连接状态为可连接和不可连接。
远程工作单元
在远程单元中,SQLCA的SQLERRP字段被设置为检测到错误的 Db2 请求者模块的名称。

如果由于应用程序进程不在可连接状态而导致CONNECT语句执行失败,则应用程序进程的连接状态保持不变。 如果执行CONNECT语句因任何其他原因失败,CURRENT SERVER将设置为空,应用程序进程将处于可连接和未连接状态。

授权

如果服务器是 Db2 子系统,则通过以下方式对用户进行身份验证:

  • Db2 通过RACROUTE宏调用 ,并使用REQUEST=VERIFY来验证密码。 RACF®
  • 如果密码验证通过, Db2 则通过 RACROUTE 宏再次调用 RACF ,并带有 REQUEST=AUTH,以检查授权 ID 是否被允许使用定义为 RACF 的 Db2 资源。
  • Db2 然后调用连接退出例程(如果已定义)。
  • 连接包含一个主授权ID、一个或多个辅助ID和一个SQL ID。

如果服务器是远程 Db2 子系统,请求者将生成身份验证令牌,并通过以下方式发送到远程站点:

  • SNA的 SYSIBM.LUNAMES 中的SECURITY_OUT列或TCP/IP的 SYSIBM.IPNAMES 中的SECURITY_OUT列必须具有以下值之一:
    • “A”(已验证)
    • “D”(用户ID和安全敏感数据加密;仅限TCP/IP)
    • 'E'(用户ID、密码和安全敏感数据加密;仅限TCP/IP)
    • “P”(密码)
    当值为“A”时,仍会发送在CONNECT上指定的用户ID和密码。
    当值为“D”、“E”或“P”时,请求者会对CONNECT for TCP/IP中指定的用户ID和密码进行加密。 然而,如果请求者未配置集成加密服务设施(ICSF),或者服务器不支持加密,则会发生以下情况之一:
    • 如果 SYSIBM.IPNAMES 中的SECURITY_OUT值为“D”或“E”,则当请求者未配置ICSF时,将返回SQLCODE -904;如果服务器不支持加密,则将返回SQLCODE -30082。
    • 如果 SYSIBM.IPNAMES 中SECURITY_OUT的值为“P”,则请求者不加密用户ID和密码,并以明文形式传输令牌。
  • 对于SNA, SYSIBM.SYSLUNAMES 中的ENCRYPTPSWDS列不能包含“Y”。
  • 授权ID和密码将在服务器上验证。
  • 在任何情况下, SYSIBM.USERNAMES 中指定的外向翻译都不会进行。
分布式工作单元

总的来说,以下说法是正确的:

  • 只有在当前不存在与指定服务器的连接或休眠连接时,才能执行带有TO子句和USER/USING子句的CONNECT语句。 但是,如果指定的服务器是本地 Db2 子系统,并且CONNECT语句是 Db2 线程创建后执行的第一个SQL语句,则CONNECT语句会成功执行。
  • 只有当当前不存在与本地 Db2 子系统的连接或连接处于休眠状态时,才能执行不带TO子句但带有USER/USING子句的CONNECT语句。 然而,如果CONNECT语句是 Db2 线程创建后执行的第一个SQL语句,则CONNECT语句会成功执行。
远程工作单元
如果授权检查失败,连接状态将变为“可连接”和“未连接”。
预编译器选项

无论程序是否使用CONNECT(1)或CONNECT(2)选项进行预编译, Db2 for z/OS 都会在连接过程中与远程服务器协商,以确定如何执行提交。 如果远程服务器不支持两阶段提交协议, Db2 将降级为执行单阶段提交。

包含使用不同CONNECT预编译器选项预编译的CONNECT语句的程序无法作为同一应用程序进程的一部分执行。 当尝试执行无效的CONNECT语句时,会发生错误。

主变量

如果CONNECT语句包含宿主变量,则宿主变量的内容应采用绑定包含该语句的程序包或计划时ENCODING参数中指定的编码方案。

处理出错

即使尚未建立物理连接,CONNECT语句也可以返回并指示执行成功。 Db2 尽可能延迟物理连接过程,以减少发送到服务器的消息数量。 因此,CONNECT语句处理中的错误可能会在下一个可执行的SQL语句之后报告,而不是在CONNECT语句之后立即报告。

数组类型和数组变量的限制

在除CALL语句以外的任何SQL语句中,在远程服务器建立连接后,不得引用数组类型和数组变量。 此限制包括在远程服务器上执行的 SQL 语句,该语句由解析为远程服务器上对象的三个部分名称或别名组成。 一个例外是,即使语句在远程服务器上执行,数组元素也可以是SQL程序中FETCH、SELECT INTO、SET 赋值语句或VALUES INTO语句的目标。

例子 CONNECT

示例1:将应用程序连接到数据库管理系统
位置名称在字符串变量 LOCNAME 中,授权标识符在字符串变量 AUTHID 中,密码在字符串变量 PASSWORD 中。
  EXEC SQL CONNECT TO :LOCNAME USER :AUTHID USING :PASSWORD;
示例2:获取当前服务器的信息
  EXEC SQL CONNECT;
示例3:在分布式工作单元中执行SQL语句
第一条CONNECT语句用于建立与EASTDB服务器的连接。 第二个CONNECT语句创建与WESTDB服务器的连接,并将与EASTDB的SQL连接置于休眠状态。
  EXEC SQL CONNECT TO EASTDB;
    -- execute statements referencing objects at EASTDB
  EXEC SQL CONNECT TO WESTDB;
    -- execute statements referencing objects at WESTDB
示例4:使用字符串变量AUTHID中的授权标识符和字符串变量PASSWORD中的密码,将应用程序连接到其位置标识符位于字符串变量LOC中的数据库管理系统。 为用户执行工作,然后断开连接,使用不同的用户ID和密码重新连接。
  EXEC SQL CONNECT TO :LOC USER :AUTHID USING :PASSWORD;
    -- execute SQL statements accessing data on the server
  RELEASE :LOC;    
  EXEC SQL COMMIT;
    -- set AUTHID and PASSWORD to new values
  EXEC SQL CONNECT TO :LOC USER :AUTHID USING :PASSWORD;
    -- execute SQL statements accessing data on the server
示例5:更改远程工作单元中的服务器。
假设应用程序连接到远程 Db2 服务器,打开光标并从光标的结果表中获取行。 稍后,为了连接到本地 Db2 子系统,应用程序执行以下语句:
  EXEC SQL COMMIT WORK;
  EXEC SQL CONNECT RESET;

更改开始需要COMMIT是因为打开光标导致应用程序进入无法连接和已连接状态。 不可连接状态是指连接已启动事务处理,在事务处理完成之前无法连接到其他服务器。 发布COMMIT语句后,交易结束。 使用“重置”选项发布连接状态声明,可将应用程序重新连接到本地服务器,并使应用程序恢复到无法连接和已连接状态。 更改结束

如果光标是用 WITH HOLD 子句声明的,并且没有用 CLOSE 语句关闭,那么即使在执行了 COMMIT 语句后,它仍然处于打开状态。 然而,它将在执行CONNECT语句时关闭。