If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > Database Server Software > DB2 > HIGH-VALUE (COBOL) and DB2

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 12-18-09, 08:51
Yan302 Yan302 is offline
Registered User
 
Join Date: Feb 2009
Posts: 12
HIGH-VALUE (COBOL) and DB2

Hi everyone,

I'm working on a windows XP platform with a DB/2 database and I've got a problem when trying to insert (thru COBOL) a field that contains HIGH-VALUE.

Here is my problem illustrated with this little example :

My DB/2 table is created with :

Code:
CREATE TABLE PERS (
  RID INTEGER NOT NULL,
  "LAST_NAME"  VARCHAR(30),
  "FIRST_NAME"  VARCHAR(20),
  "AGE"  NUMERIC(3,0),
CONSTRAINT PERS_PK PRIMARY KEY (RID));
and my cobol program (before precompilation with DB2 precompiler) is :
Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID. INSER.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           EXEC SQL INCLUDE SQLCA END-EXEC.
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 WORK-VARS.
         05 HOST-RID PIC S9(9) COMP-5.
         05 HOST-LAST-NAME PIC X(30).
         05 HOST-FIRST-NAME PIC X(20).
         05 HOST-AGE PIC S9(4) COMP-5.
         EXEC SQL END DECLARE SECTION END-EXEC.
         EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLWARNING CONTINUE END-EXEC.

       PROCEDURE DIVISION.
           EXEC SQL
              CONNECT TO sample user db2admin using ******
           END-EXEC.
           MOVE 1 TO HOST-RID.
           MOVE HIGH-VALUES TO HOST-LAST-NAME.
           MOVE "Jean" TO HOST-FIRST-NAME.
           MOVE 33 TO HOST-AGE.
           EXEC SQL
      ****************************************
              INSERT INTO PERS
              (
                "RID", "LAST_NAME", "FIRST_NAME","AGE"
              )
              VALUES
              (
                :HOST-RID, :HOST-LAST-NAME, :HOST-FIRST-NAME, :HOST-AGE
              )
           
           END-EXEC.
           IF NOT SQLCODE = 0 THEN
             DISPLAY "ERROR : SQLCODE " SQLCODE UPON CONSOLE
           ELSE
             EXEC SQL COMMIT END-EXEC
           END-IF.
           STOP RUN.
The error returned is -302 :THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE

If I replace MOVE HIGH-VALUES TO HOST-LAST-NAME. by MOVE "Dupond" TO HOST-LAST-NAME. or MOVE HIGH-VALUE TO HOST-LAST-NAME(1:15).
the insertion goes well. So it seems that DB/2 interpret a COBOL PIC X(30) that contains HIGH-VALUES as a VARCHAR(60). Does someone knows why ? If it is possible to change that ? Does somebody got a explanation of that strage transformation at the DB/2 side ?

Thanks a lot in advance for your answers.

Best regards,

Yan302
Reply With Quote
  #2 (permalink)  
Old 12-18-09, 10:12
n_i n_i is offline
:-)
 
Join Date: Jun 2003
Location: Toronto, Canada
Posts: 4,449
If your database is defined as UNICODE (UTF-8), it is possible that 30 characters won't fit into 30 bytes.
Reply With Quote
  #3 (permalink)  
Old 12-18-09, 11:03
Lenny77 Lenny77 is offline
Registered User
 
Join Date: Jul 2009
Location: NY
Posts: 886
Exclamation COBOL also Language...

Quote:
Originally Posted by Yan302 View Post
Hi everyone,

I'm working on a windows XP platform with a DB/2 database and I've got a problem when trying to insert (thru COBOL) a field that contains HIGH-VALUE.

Here is my problem illustrated with this little example :

My DB/2 table is created with :

Code:
CREATE TABLE PERS (
  RID INTEGER NOT NULL,
  "LAST_NAME"  VARCHAR(30),
  "FIRST_NAME"  VARCHAR(20),
  "AGE"  NUMERIC(3,0),
CONSTRAINT PERS_PK PRIMARY KEY (RID));
and my cobol program (before precompilation with DB2 precompiler) is :
Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID. INSER.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           EXEC SQL INCLUDE SQLCA END-EXEC.
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 WORK-VARS.
         05 HOST-RID PIC S9(9) COMP-5.
         05 HOST-LAST-NAME PIC X(30).
         05 HOST-FIRST-NAME PIC X(20).
         05 HOST-AGE PIC S9(4) COMP-5.
         EXEC SQL END DECLARE SECTION END-EXEC.
         EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLWARNING CONTINUE END-EXEC.

       PROCEDURE DIVISION.
           EXEC SQL
              CONNECT TO sample user db2admin using ******
           END-EXEC.
           MOVE 1 TO HOST-RID.
           MOVE HIGH-VALUES TO HOST-LAST-NAME.
           MOVE "Jean" TO HOST-FIRST-NAME.
           MOVE 33 TO HOST-AGE.
           EXEC SQL
      ****************************************
              INSERT INTO PERS
              (
                "RID", "LAST_NAME", "FIRST_NAME","AGE"
              )
              VALUES
              (
                :HOST-RID, :HOST-LAST-NAME, :HOST-FIRST-NAME, :HOST-AGE
              )
           
           END-EXEC.
           IF NOT SQLCODE = 0 THEN
             DISPLAY "ERROR : SQLCODE " SQLCODE UPON CONSOLE
           ELSE
             EXEC SQL COMMIT END-EXEC
           END-IF.
           STOP RUN.
The error returned is -302 :THE VALUE OF INPUT VARIABLE OR PARAMETER NUMBER position-number IS INVALID OR TOO LARGE FOR THE TARGET COLUMN OR THE TARGET VALUE

If I replace MOVE HIGH-VALUES TO HOST-LAST-NAME. by MOVE "Dupond" TO HOST-LAST-NAME. or MOVE HIGH-VALUE TO HOST-LAST-NAME(1:15).
the insertion goes well. So it seems that DB/2 interpret a COBOL PIC X(30) that contains HIGH-VALUES as a VARCHAR(60). Does someone knows why ? If it is possible to change that ? Does somebody got a explanation of that strage transformation at the DB/2 side ?

Thanks a lot in advance for your answers.

Best regards,

Yan302
Quote:
............................................
"LAST_NAME" VARCHAR(30)
"FIRST_NAME" VARCHAR(20)
........................................
05 HOST-LAST-NAME PIC X(30).
05 HOST-FIRST-NAME PIC X(20).
But, if you know COBOL, just a little bit, you have to use:

Code:
05 HOST-LAST-NAME.
 49 HOST-LAST-NAME-len pic s9(4) binary.
 49 HOST-LAST-NAME-txt pic x(30).

05 HOST-FIRST-NAME PIC X(20)
 49 HOST-FIRST-NAME-len pic s9(4) binary.
 49 HOST-FIRST-NAME-txt pic x(20).
When you move high-values X'FF' to your host variables you change the size of your fields (first 2 bytes) became negative binary(X'FF40') = -65....

So, you have to change you COBOL program:

Code:
MOVE HIGH-VALUES TO HOST-LAST-NAME-txt
Move 1           to  HOST-LAST-NAME-len
etc....

Lenny

Last edited by Lenny77; 12-18-09 at 11:42.
Reply With Quote
  #4 (permalink)  
Old 12-18-09, 12:02
Yan302 Yan302 is offline
Registered User
 
Join Date: Feb 2009
Posts: 12
Quote:
Originally Posted by n_i View Post
If your database is defined as UNICODE (UTF-8), it is possible that 30 characters won't fit into 30 bytes.
Thanks for your answer.

Yes, my database is in UTF-8. I've tested with a DB in IBM-1252 and it works
but there is no way to make it work with an UTF-8 DB ?
Reply With Quote
  #5 (permalink)  
Old 12-18-09, 12:07
n_i n_i is offline
:-)
 
Join Date: Jun 2003
Location: Toronto, Canada
Posts: 4,449
Well, you have few options:
- increase column size;
- make sure the strings you insert only contain ASCII characters;
Reply With Quote
  #6 (permalink)  
Old 12-18-09, 12:07
Yan302 Yan302 is offline
Registered User
 
Join Date: Feb 2009
Posts: 12
Quote:
Originally Posted by Lenny77 View Post
But, if you know COBOL, just a little bit, you have to use:

Code:
05 HOST-LAST-NAME.
 49 HOST-LAST-NAME-len pic s9(4) binary.
 49 HOST-LAST-NAME-txt pic x(30).

05 HOST-FIRST-NAME PIC X(20)
 49 HOST-FIRST-NAME-len pic s9(4) binary.
 49 HOST-FIRST-NAME-txt pic x(20).
When you move high-values X'FF' to your host variables you change the size of your fields (first 2 bytes) became negative binary(X'FF40') = -65....

So, you have to change you COBOL program:

Code:
MOVE HIGH-VALUES TO HOST-LAST-NAME-txt
Move 1           to  HOST-LAST-NAME-len
etc....

Lenny
Thanks for your answer Lenny.

Changing my cobol program to :
Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID. INSER.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           EXEC SQL INCLUDE SQLCA END-EXEC.
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 WORK-VARS.
         05 HOST-RID PIC S9(9) COMP-5.
         05 HOST-LAST-NAME.
            10 HOST-LAST-NAME-len pic s9(4) COMP-5.
            10 HOST-LAST-NAME-txt pic x(30).
         05 HOST-FIRST-NAME.
            10 HOST-FIRST-NAME-len pic s9(4) COMP-5.
            10 HOST-FIRST-NAME-txt pic x(20).
         05 HOST-AGE PIC S9(4) COMP-5.
         EXEC SQL END DECLARE SECTION END-EXEC.
         EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLWARNING CONTINUE END-EXEC.

       PROCEDURE DIVISION.
           EXEC SQL
              CONNECT TO sample user db2admin using *******
           END-EXEC.
           MOVE 1 TO HOST-RID.
           MOVE HIGH-VALUES TO HOST-LAST-NAME-txt.
           MOVE 1 TO HOST-LAST-NAME-len. 
           MOVE "Jean" TO HOST-FIRST-NAME-txt.
           MOVE 4 TO HOST-FIRST-NAME-len. 
           MOVE 33 TO HOST-AGE.
           EXEC SQL
      ****************************************
              INSERT INTO PERS
              (
                "RID", "LAST_NAME", "FIRST_NAME","AGE"
              )
              VALUES
              (
                :HOST-RID, :HOST-LAST-NAME, :HOST-FIRST-NAME, :HOST-AGE
              )
           
           END-EXEC.
           IF NOT SQLCODE = 0 THEN
             DISPLAY "ERROR : SQLCODE " SQLCODE UPON CONSOLE
           ELSE
             EXEC SQL COMMIT END-EXEC
           END-IF.
           STOP RUN.
When precompiling and binding got errors...
Code:
C:\DB2ORACLE_sample2>db2 prep INSER.sqb bindfile

LINE    MESSAGES FOR INSER.sqb
------  --------------------------------------------------------------------
        SQL0060W  The "COBOL" precompiler is in progress.
   35   SQL0117N  The number of values assigned is not the same as
                  the number of specified or implied columns or variables.
                  SQLSTATE=42802
        SQL0091W  Precompilation or binding was ended with "0"
                  errors and "1" warnings.

C:\DB2ORACLE_sample2>db2 bind INSER.bnd

LINE    MESSAGES FOR INSER.bnd
------  --------------------------------------------------------------------
        SQL0061W  The binder is in progress.
   35   SQL0117N  The number of values assigned is not the same as
                  the number of specified or implied columns or variables.
                  SQLSTATE=42802
        SQL0082C  An error has occurred which has terminated
                  processing.
        SQL0092N  No package was created because of previous errors.
        SQL0091N  Binding was ended with "3" errors and "0" warnings.
What's wrong ?

By the way, strange that my first syntax is accepted by oracle and also by db2 when the value of HOST-LAST-NAME is not HIGH-VALUE.

Best regards,
Reply With Quote
  #7 (permalink)  
Old 12-18-09, 14:06
Lenny77 Lenny77 is offline
Registered User
 
Join Date: Jul 2009
Location: NY
Posts: 886
Exclamation Fix your mistakes

Quote:
Originally Posted by Yan302 View Post
Thanks for your answer Lenny.

Changing my cobol program to :
Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID. INSER.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           EXEC SQL INCLUDE SQLCA END-EXEC.
           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 WORK-VARS.
         05 HOST-RID PIC S9(9) COMP-5.
         05 HOST-LAST-NAME.
            10 HOST-LAST-NAME-len pic s9(4) COMP-5.
            10 HOST-LAST-NAME-txt pic x(30).
         05 HOST-FIRST-NAME.
            10 HOST-FIRST-NAME-len pic s9(4) COMP-5.
            10 HOST-FIRST-NAME-txt pic x(20).
         05 HOST-AGE PIC S9(4) COMP-5.
         EXEC SQL END DECLARE SECTION END-EXEC.
         EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
         EXEC SQL WHENEVER SQLWARNING CONTINUE END-EXEC.

       PROCEDURE DIVISION.
           EXEC SQL
              CONNECT TO sample user db2admin using *******
           END-EXEC.
           MOVE 1 TO HOST-RID.
           MOVE HIGH-VALUES TO HOST-LAST-NAME-txt.
           MOVE 1 TO HOST-LAST-NAME-len. 
           MOVE "Jean" TO HOST-FIRST-NAME-txt.
           MOVE 4 TO HOST-FIRST-NAME-len. 
           MOVE 33 TO HOST-AGE.
           EXEC SQL
      ****************************************
              INSERT INTO PERS
              (
                "RID", "LAST_NAME", "FIRST_NAME","AGE"
              )
              VALUES
              (
                :HOST-RID, :HOST-LAST-NAME, :HOST-FIRST-NAME, :HOST-AGE
              )
           
           END-EXEC.
           IF NOT SQLCODE = 0 THEN
             DISPLAY "ERROR : SQLCODE " SQLCODE UPON CONSOLE
           ELSE
             EXEC SQL COMMIT END-EXEC
           END-IF.
           STOP RUN.
When precompiling and binding got errors...
Code:
C:\DB2ORACLE_sample2>db2 prep INSER.sqb bindfile

LINE    MESSAGES FOR INSER.sqb
------  --------------------------------------------------------------------
        SQL0060W  The "COBOL" precompiler is in progress.
   35   SQL0117N  The number of values assigned is not the same as
                  the number of specified or implied columns or variables.
                  SQLSTATE=42802
        SQL0091W  Precompilation or binding was ended with "0"
                  errors and "1" warnings.

C:\DB2ORACLE_sample2>db2 bind INSER.bnd

LINE    MESSAGES FOR INSER.bnd
------  --------------------------------------------------------------------
        SQL0061W  The binder is in progress.
   35   SQL0117N  The number of values assigned is not the same as
                  the number of specified or implied columns or variables.
                  SQLSTATE=42802
        SQL0082C  An error has occurred which has terminated
                  processing.
        SQL0092N  No package was created because of previous errors.
        SQL0091N  Binding was ended with "3" errors and "0" warnings.
What's wrong ?

By the way, strange that my first syntax is accepted by oracle and also by db2 when the value of HOST-LAST-NAME is not HIGH-VALUE.

Best regards,
Why doen't work ? Because:

1. Level has to be 49, not 10: because DB2 doesn't accept STRUCTUREd Variables
2. Could be COMP, or BINARY but not COMP-5.


Change and enjoy.

Lenny
Reply With Quote
  #8 (permalink)  
Old 12-21-09, 04:24
Yan302 Yan302 is offline
Registered User
 
Join Date: Feb 2009
Posts: 12
Thanks Lenny for your help,

With level 49 it work's. But... the value of HOST-LAST-NAME-len should be 30 no ? Why do you said that is 1 ?

Best regards,
Reply With Quote
  #9 (permalink)  
Old 12-21-09, 09:51
Lenny77 Lenny77 is offline
Registered User
 
Join Date: Jul 2009
Location: NY
Posts: 886
Talking COBOL made Easy

Quote:
Originally Posted by Yan302 View Post
Thanks Lenny for your help,

With level 49 it work's. But... the value of HOST-LAST-NAME-len should be 30 no ? Why do you said that is 1 ?

Best regards,
Thanks for you !

You have a big number of good questions !

You
Code:
move 1 to HOST-LAST-NAME-len
because length of high-values is equal 1: high-values = X'FF', nothing else.

But this not good to use MOVE for initialize VARCHARs.
Much better to use STRING, instead (follow this example):

Code:
move 1                      to HOST-LAST-NAME-LEN

STRING  HIGH-VALUES
    DELIMITED    BY SIZE                
    INTO         HOST-LAST-NAME-TXT
    WITH POINTER HOST-LAST-NAME-LEN
END-STRING
Lenny

Last edited by Lenny77; 12-21-09 at 09:55.
Reply With Quote
Reply

Tags
-302, cobol, db2, error, high-value

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On