当密码字段定义的长度超过用户的实际密码长度时,我的 COBOL 程序无法连接到 oracle。即如果密码值为'mypasswd',保存密码的宿主变量必须定义为“PIC X(8)”,否则连接失败;例如:
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. SAMPLE.
3 ENVIRONMENT DIVISION.
4 DATA DIVISION.
5 WORKING-STORAGE SECTION.
6 EXEC SQL BEGIN DECLARE SECTION END-EXEC.
7 01 USERNAME PIC X(010).
8 01 PASSWD PIC X(010).
9 01 DBSTRING PIC X(020).
10 EXEC SQL END DECLARE SECTION END-EXEC.
11 EXEC SQL INCLUDE SQLCA END-EXEC.
12
13 PROCEDURE DIVISION.
14 BEGIN-PGM.
15 EXEC SQL WHENEVER SQLERROR
16 DO PERFORM SQL-ERROR
17 END-EXEC.
18 LOGON.
19 MOVE "myuser" TO USERNAME.
20 MOVE "mypasswd" TO PASSWD.
21 MOVE "mydb" TO DBSTRING.
22 EXEC SQL
23 CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :DBSTRING
24 END-EXEC.
25 LOGOUT.
26 DISPLAY "HAVE A GOOD DAY.".
27 EXEC SQL COMMIT WORK RELEASE END-EXEC.
28 STOP RUN.
29 SQL-ERROR.
30 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
31 DISPLAY "ORACLE ERROR DETECTED:".
32 DISPLAY SQLERRMC.
33 EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
34 STOP RUN.
我必须遇到连接失败:检测到 ORACLE 错误:ORA-01017:用户名/密码无效;登录被拒绝
但是当我将密码字段定义更改为:8 01 PASSWD PIC X(008)。即长度与真实密码值的长度相同(length("mypasswd")=8),程序可以连接Oracle成功。
我的情况是我们需要用户能够提供自己的用户名和密码,所以我们必须首先定义一个足够长的用户名和密码字段,以保持我们允许的最大长度。但是,如上所述,如果用户选择的密码短于最大值,则所有连接请求都将失败。
该程序是从旧版本的 Oracle 11.2.0.1.0 迁移而来的,我们没有这个问题,程序运行正常,连接操作成功。但是问题出现在我们迁移到Oracle 12.1.0.1.0之后。