0

パスワード フィールドがユーザーの実際のパスワード長よりも長く定義されている場合、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 に移行した後に問題が発生しました。

4

2 に答える 2

1

参照変更を使用して、接続要求のユーザー名/パスワードの長さを調整してみましたか?

私はオラクルのような人ではありませんが、次のようなものがうまくいくかもしれません:

22             EXEC SQL
23              CONNECT :USERNAME(1:UNAMELEN) IDENTIFIED BY :PASSWD(1:PSSWDLEN) USING :DBSTRING
24             END-EXEC.

ここで、UNAMELEN と PSSWDLEN は、ユーザー名とパスワードの実際の長さを含む数値変数 (PIC S9(4) BINARY など) です。

UNAMELEN と PSSWDLEN の値を決定するには、次のように INSPECT 動詞を使用します。

INSPECT PASSWD TALLYING PSSWDLEN FOR ALL SPACE
COMPUTE PSSWDLEN = LENGTH OF PASSWD - PSSWDLEN 

これは、パスワードとユーザー名に内部空白が含まれていない場合に機能します。その場合、実際の長さを別の方法で計算する必要があります。

于 2014-04-11T19:32:31.943 に答える