パスワード フィールドがユーザーの実際のパスワード長よりも長く定義されている場合、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 ERROR DETECTED: ORA-01017: 無効なユーザー名/パスワード。ログオンが拒否されました
しかし、パスワード フィールドの定義を 8 01 PASSWD PIC X(008) に変更すると、つまり、長さが実際のパスワード値と同じ長さ (length("mypasswd")=8) である場合、プログラムは Oracle に正常に接続できます。
私の状況では、ユーザーが独自のユーザー名とパスワードを提供できるようにする必要があるため、最初に、許容される最大長を維持するのに十分な長さのユーザー名とパスワード フィールドを定義する必要があります。ただし、前述のように、ユーザーが最大値よりも短いパスワードを選択すると、すべての接続要求が失敗します。
このプログラムは古いバージョンの Oracle 11.2.0.1.0 から移行されたもので、この問題は発生していません。プログラムは正常に動作し、接続操作は成功しました。しかし、Oracle 12.1.0.1.0 に移行した後に問題が発生しました。