Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: HPUX-Oracle8: forcing fixed width 2-byte char string over SqlNet/Net8

Re: HPUX-Oracle8: forcing fixed width 2-byte char string over SqlNet/Net8

From: David Russell <dbruce_at_kreative.net>
Date: Tue, 18 May 1999 23:06:15 GMT
Message-ID: <3741f13c.16884548@news>

Marc,

You didn't really ask a question... simply stated what you were trying to do... and you also didn't state what problem you are having, other than you can't find documentation. Perhaps something in the following will help you understand what's going on...

Other than that, ASK A QUESTION!

Good luck!
David R.

Title:                 Fortran OCI Guidelines on HP MPE 

Creation Date:         10 May 1994 

Abstract:              This article shows how to use the Oracle Call 
                       Interfaces with Fortran 77/iX.  EQUIVALENCE 
                       forces alignment of INTEGER*2 variables on 
                       word boundaries.  All OCI routine parameters 
                       are required.  Source code of a sample Fortran 
                       OCI program is included. 
Keywords: HP;MPE;FORTRAN;ORACLE;CALL;INTERFACES;PROGRAMMING;LANGUAGE   
  
                       Fortran OCI Guidelines on HP MPE 
 
 

Problem: A Fortran OCI program on HP MPE aborts and dumps.



:run fsampbad
   

  ABORT: FSAMPBAD.OCI.CSUPPORT
  NM USER 370.00307abc ocirlo+$94
  NM PROG 5b9.00005fe4 main__+$2bc  

  Program terminated in an error state. (CIERR 976)
:
 

Discussion:



Using the Oracle Call Interfaces (OCI) on HP MPE systems requires some special preparation of the source code. This article outlines these measures and concludes with a sample Fortran OCI program based on the source code provided in the "Programmer's Guide to the Oracle Call Interfaces Version 1.5" (compatible with RDBMS Version 6.0.33.2.24). Note that several routines available in OCI Version 1.5 are obsolete or obsolescent in OCI Version 7.0.  

For backward compatibility and memory conservation, Fortran 77/iX aligns
INTEGER*2 arrays on half-word, or two-byte, boundaries. However, the C routines that comprise OCI expect all variables to be aligned on full-word, or four-byte, boundaries.  

Solution:



The EQUIVALENCE statement is used to force alignment of the Logon Data Area (LDA) and Cursor Data Area (CDA) by declaring equivalence of these arrays to dummy INTEGER*4 arrays of the same number of bytes. For example:  
      INTEGER*4         foo(16) 
      INTEGER*2         LDA(32) 
      EQUIVALENCE       (foo,LDA) 
 
      INTEGER*4         foo2(16,2) 
      INTEGER*2         CURS(32,2) 
      EQUIVALENCE       (foo2,CURS) 
 

Parameters to some OCI routines documented as optional in the Programmer's Guide are in fact required for OCI programs on HP MPE. The ODEFIN, ODSC, OBNDRV and OBNDRN routines require at least dummy variables for all parameters. Square brackets in the documentation indicate that the parameter is an address.  

C routines expect parameters to be passed by reference or by value. Fortran 77/iX passes all parameters by reference by default. HP provides two mechanisms for controlling the default: the $ALIAS compiler directive and the %REF/%VAL parameter modifiers. The sample uses the %REF/%VAL extensions as available on some other platforms. For example:  

      CALL OLON(LDA(1), %REF(UID), %VAL(UIDL), %REF(PSW), %VAL(PSWL),      1 %VAL(0))   In conclusion, Fortran OCI programs can be used on HP MPE systems once some platform-specific necessities are taken into account. The sample program, once prepared according to the above guidelines, runs correctly.  

:run fsampprg
   

  Logged on to ORACLE as user: SCOTT  

  Enter employee name (or 0 to QUIT) : Burdman  

  Enter employee job : Tech  

  Enter employee salary: 4321  

  Enter employee dept : 40    

  Burdman added to the OPERATIONS department as employee# 7954  

  Enter employee name (or 0 to QUIT) : 0   STOP End of the FORTRAN/ORACLE example program.  

  END OF PROGRAM
:
 

Sample Fortran Source Code



The sample source code of this program follows.  
C ===================== start of Fortran source code 
 
$tables on 
      PROGRAM FSAMP 
 

C


C     FSAMP IS A SIMPLE EXAMPLE PROGRAM WHICH ADDS NEW EMPLOYEE 
C     ROWS TO THE PERSONNEL DATA BASE.  CHECKING 
C     IS DONE TO INSURE THE INTEGRITY OF THE DATA BASE. 
C     THE EMPLOYEE NUMBERS ARE AUTOMATICALLY SELECTED USING 
C     THE CURRENT MAXIMUM EMPLOYEE NUMBER AS THE START. 
C     IF ANY EMPLOYEE NUMBER IS A DUPLICATE, IT IS SKIPPED. 
C     THE PROGRAM QUERIES THE USER FOR DATA AS FOLLOWS: 
C 
C        Enter employee name  : 
C        Enter employee job   : 
C        Enter employee salary: 
C        Enter employee dept  : 
C 
C     IF "0" IS ENTERED FOR THE EMPLOYEE NAME, THEN THE PROGRAM 
C     TERMINATES. 
C 
C     IF THE ROW IS SUCCESSFULLY INSERTED, THE FOLLOWING 
C     IS PRINTED: 
C 
C     ENAME added to DNAME department as employee # NNNNN 
C 
C     THE MAXIMUM LENGTHS OF THE 'ENAME', 'JOB', AND 'DNAME' 
C     COLUMNS WILL BE DETERMINED BY THE ODSC CALL. 
C 
C     NOTE: VAX FORTRAN, BY DEFAULT, PASSES ALL CHARACTER STRING
VARIABLES 
C           (i.e. VARIABLES DECLARED AS CHARACTER*N) BY DESCRIPTOR.
SINCE OCI 
C           ADDRESS PARAMETERS MUST BE PASSED BY REFERENCE, ALL
CHARACTER 
C           STRING VARIABLES IN THE FOLLOWING PROGRAM ARE PASSED USING
THE 
C           VAX FORTRAN EXTENSION: %REF. 
C           TO COMPILE THIS PROGRAM ON OTHER PORTS, SIMPLY REMOVE THE 
C           REFERENCES TO %REF. 

C
 

      IMPLICIT INTEGER (A-Z)   C MPE/iX need these EQUIVALENCES to force Fortran to align the arrays to
C 4-byte boundary as expected C.

      INTEGER*4         foo(16) 
      INTEGER*2         LDA(32) 
      EQUIVALENCE       (foo,LDA) 
 
      INTEGER*4         foo2(16,2) 
      INTEGER*2         CURS(32,2) 
      EQUIVALENCE       (foo2,CURS) 
 
      CHARACTER*5       UID, PSW 
      INTEGER*4         UIDL, PSWL 
 

C character string vars to hold the SQL statements  

      CHARACTER*38      SMAX 
      CHARACTER*26      SEMP 
C      CHARACTER*89     INS 

C MPE/iX use more space here because of trailing blanks before continuation
char
      CHARACTER*92      INS 
      CHARACTER*38      SEL 
 

C (MPE/iX) These variables are needed for calls to ODEFIN, ODSC, OBNDRV and
C OBNDRN because they need pointers to valid addresses. Parameters are not
C optional. Square brackets in doc indicates the parameter is an address.

      INTEGER*2         INDP 
      INTEGER*2         RETL 
      INTEGER*2         RCODE 
      INTEGER*2         FSIZE 
      INTEGER*2         DBTYPE 
      CHARACTER*40      CBUF 
      INTEGER*2         CBUFL 
      INTEGER*2         DSIZE 
 

C integer vars to the length of the SQL statements  

      INTEGER*4 SMAXL, SEMPL, INSL, SELL   C program vars to be bound to SQL substitution vars and select-list fields  

      INTEGER*4         EMPNO, DEPTNO, SAL 
      CHARACTER*10      ENAME 
      CHARACTER*9       JOB 
      CHARACTER*14      DNAME 
 

C actual lengths of columns  

      INTEGER*2 ENAMES, JOBS, DNAMES   C maximum lengths of program vars  

      INTEGER*4 ENAMEL, JOBL, DNAMEL, SALL, EMPNOL, DEPTL   C character strings for SQL substitution vars  

      CHARACTER*6       ENON 
      CHARACTER*6       ENAN 
      CHARACTER*4       JOBN 
      CHARACTER*4       SALN 
      CHARACTER*7       DEPTN 
 

C lengths of character strings for SQL substitution vars  

      INTEGER*4 ENONL, ENANL, JOBNL, SALNL, DEPTNL   C


C INITIALIZE VARIABLES
C


 
      SMAX = 'SELECT NVL(MAX(EMPNO),0) FROM EMP' 
      SMAXL = 33 
 
      SEMP = 'SELECT ENAME,JOB FROM EMP' 
      SEMPL = 26 
 
C      INS = 'INSERT INTO EMP(EMPNO,ENAME,JOB,SAL, 
C     1 DEPTNO) VALUES (:EMPNO,:ENAME,:JOB,:SAL,:DEPTNO)' 
C      INSL = 89 

C MPE/iX include trailing blanks (up to column 72) on the first line in the
C the string, making it longer.
      INS = 'INSERT INTO EMP(EMPNO,ENAME,JOB,SAL,DEPTNO) VALUES 
     1(:EMPNO,:ENAME,:JOB,:SAL,:DEPTNO)' 
      INSL = 92 
 
      SEL = 'SELECT DNAME FROM DEPT WHERE DEPTNO=:1' 
      SELL = 38 
 
      ENAMEL = 10 
      JOBL = 9 
      DNAMEL = 14 
      EMPNOL = 4 
      DEPTL = 4 
      SALL = 4 
 
      ENON = ':EMPNO' 
      ENAN = ':ENAME' 
      JOBN = ':JOB' 
      SALN = ':SAL' 
      DEPTN = ':DEPTNO' 
 
      ENONL = 6 
      ENANL = 6 
      JOBNL = 4 
      SALNL = 4 
      DEPTNL = 7 
 

C


C LOGON TO ORACLE
C


 
      UID = 'SCOTT' 
      UIDL = 5 
      PSW = 'TIGER' 
      PSWL = 5 
 

C Note: %REF is a VAXISM (see discussion at the beginning of the program)  

C MPE/iX Fortran pass parameters by reference, unless %VAL is used.

      CALL OLON(LDA(1), %REF(UID), %VAL(UIDL), %REF(PSW), %VAL(PSWL), 
     1 %VAL(0)) 
 
      IF (LDA(1).NE.0) THEN 
        CALL ERRLDA(LDA(1)) 
        GO TO 700 
      END IF 
 
      WRITE(*, 11) UID 

11 FORMAT(1X, 'Logged on to ORACLE as user: ', A5, /)  

C


C OPEN TWO CURSORS FOR THE PERSONNEL DATA BASE C


 

      CALL OOPEN(CURS(1,1), LDA)  

      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
      CALL OOPEN(CURS(1,2), LDA(1)) 
 
      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 

C


C TURN OFF AUTO-COMMIT. NOTE: THE DEFAULT IS OFF, SO THIS COULD BE OMITTED
C


 

      CALL OCOF(LDA(1))  

      IF (LDA(1).NE.0) THEN 
        CALL ERRLDA(LDA) 
        GO TO 700 
      END IF 
 

C


C RETRIEVE THE CURRENT MAXIMUM EMPLOYEE NUMBER C


 

C parse the SQL statement. Note that %REF is a VAXISM (see discussion at
C the beginning of the program).  

      CALL OSQL3(CURS(1,1), %REF(SMAX), %VAL(SMAXL))  

      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 

C define a buffer to receive the MAX(EMPNO) from ORACLE  

C (MPE/iX) These parameters must be provided.

      CALL ODEFIN(CURS(1,1), %VAL(1), EMPNO, %VAL(EMPNOL), %VAL(3), 
     1 0, INDP, 0, 0, 0, RETL, RCODE) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
 

C execute the SQL statement  

      CALL OEXEC(CURS(1,1))  

      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C     fetch the data from ORACLE into the defined buffer 
 
      CALL OFETCH(CURS(1,1)) 
 
      IF (CURS(1,1).EQ.0) GO TO 50 
      IF (CURS(7,1).NE.1403) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C     a cursor return code of 1403 means that no row satisfied the
query, 
C     so generate the first empno 
 
      EMPNO=10 

50 CONTINUE   C
C     DETERMINE THE MAX LENGTH OF THE EMPLOYEE NAME AND JOB TITLE. 
C       PARSE THE SQL STATEMENT - IT WILL NOT BE EXECUTED 
C       DESCRIBE THE TWO FIELDS SPECIFIED IN THE SQL STATEMENT 
C
 

C Note: %REF is a VAXISM (see discussion at the beginning of the program).  

      CALL OSQL3(CURS(1,1), %REF(SEMP), %VAL(SEMPL))  

      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CBUFL = 40 
      CALL ODSC(CURS(1,1), %VAL(1), ENAMES, FSIZE, RCODE, DBTYPE, 
     1 %REF(CBUF), CBUFL, DSIZE) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
      IF (ENAMES .GT. ENAMEL) THEN 
        WRITE(*, 21) 
21      FORMAT('ENAME too large for buffer.') 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CBUFL = 40 
      CALL ODSC(CURS(1,1), %VAL(2), JOBS, FSIZE, RCODE, DBTYPE, 
     1 %REF(CBUF), CBUFL, DSIZE) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
      IF (JOBS .GT. JOBL) THEN 
        WRITE(*, 31) 
31      FORMAT('JOB too large for buffer.') 
        GO TO 700 
      END IF 
 

C


C PARSE THE INSERT AND SELECT STATEMENTS C


 

C Note: %REF is a VAXISM (see discussion at the beginning of the program  

      CALL OSQL3(CURS(1,1), %REF(INS), %VAL(INSL))  

      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 

C Note: %REF is a VAXISM (see discussion at the beginning of the program  

      CALL OSQL3(CURS(1,2), %REF(SEL), %VAL(SELL))  

      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 

C


C     BIND ALL SQL SUBSTITUTION VARIABLES. 
C     Note: %REF is a VAXISM (see discussion at the beginning of the
program).
C
 

C (MPE/iX) These parameters must be provided.

      CALL OBNDRV(CURS(1,1), %REF(ENON), %VAL(ENONL), EMPNO, 
     1 %VAL(EMPNOL), %VAL(3), 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CALL OBNDRV(CURS(1,1), %REF(ENAN), %VAL(ENANL), %REF(ENAME), 
     1 %VAL(ENAMEL), %VAL(1), 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CALL OBNDRV(CURS(1,1), %REF(JOBN), %VAL(JOBNL), %REF(JOB), 
     1 %VAL(JOBL), %VAL(1), 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CALL OBNDRV(CURS(1,1), %REF(SALN), %VAL(SALNL) ,%REF(SAL), 
     1 %VAL(SALL), %VAL(3), 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
C (MPE/iX) These parameters must be provided. 
      CALL OBNDRV(CURS(1,1), %REF(DEPTN), %VAL(DEPTNL), DEPTNO, 
     1 %VAL(DEPTL), %VAL(3), 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,1).NE.0) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 

C


C BIND THE DEPTNO VARIABLE
C


 

C (MPE/iX) These parameters must be provided.

      CALL OBNDRN(CURS(1,2), %VAL(1), DEPTNO, %VAL(DEPTL), %VAL(3), 
     1 0, INDP, 0, 0, 0) 
 
      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 

C


C DESCRIBE THE 'DNAME' COLUMN - ONLY THE LENGTH IS OF CONCERN C


 

C (MPE/iX) These parameters must be provided.

      CBUFL = 40 
      CALL ODSC(CURS(1,2), %VAL(1), DNAMES, FSIZE, RCODE, DBTYPE, 
     1 %REF(CBUF), CBUFL, DSIZE) 
 
      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 
      IF (DNAMES .GT. DNAMEL) THEN 
        WRITE(*, 32) 
32      FORMAT('DNAME too large for buffer.') 
        GO TO 700 
      END IF 
 

C


C DEFINE THE BUFFER TO RECEIVE 'DNAME' C


 

C Note: %REF is a VAXISM (see discussion at the beginning of the program).  

C (MPE/iX) These parameters must be provided.

      CALL ODEFIN(CURS(1,2), %VAL(1), %REF(DNAME), %VAL(DNAMEL), 
     1 %VAL(1), 0, INDP, 0, 0, 0, RETL, RCODE) 
 
      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 

C


C READ THE USER'S INPUT
C


 

100 CONTINUE
      WRITE (*, 120)
120 FORMAT('$Enter employee name (or 0 to QUIT) : ')

      READ (*, 130) ENAME
130 FORMAT(A10)

      IF (ENAME .EQ. '0') GO TO 700 
      WRITE (*, 140) 
140   FORMAT('$Enter employee job   : ') 
      READ (*, 145) JOB 
145   FORMAT(A9) 
      WRITE (*,155) 
155   FORMAT('$Enter employee salary: ') 
      READ (*, 160) SAL 

160 FORMAT(I6)
300 CONTINUE
      WRITE (*, 165)
165 FORMAT('$Enter employee dept : ')

      READ (*, 168) DEPTNO
168 FORMAT(I4)   C


C CHECK FOR A VALID DEPARTMENT# BY EXECUTING THE SELECT STATEMENT C


 

      CALL OEXEC(CURS(1,2))  

      IF (CURS(1,2).NE.0) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 

C


C FETCH THE ROWS - DEPTNO IS A PRIMARY KEY, SO A MAX OF ONE ROW WILL BE

C     FETCHED 
C     IF CURSOR RETURN CODE IS 1403 THEN NO SUCH DEPARTMENT EXISTS. 
C
 

      CALL OFETCH(CURS(1,2))  

      IF (CURS(1,2).EQ.0) GO TO 500 
      IF (CURS(7,2).NE.1403) THEN 
        CALL ERRRPT(CURS(1,2), 2) 
        GO TO 700 
      END IF 
 
      WRITE (6,400) 
400   FORMAT(1X, 'No such department number') 
      GO TO 300 
 

C


C     INCREMENT EMPNO BY 10 
C     EXECUTE THE INSERT STATEMENT 

C
 

500 EMPNO = EMPNO + 10

      CALL OEXEC(CURS(1,1)) 
      IF (CURS(1,1).EQ.0) GO TO 600 
 

C


C     IF THE CALL RETURNS CODE 1 (DUPLICATE VALUE IN INDEX), THEN 
C     GENERATE THE NEXT POSSIBLE EMPLOYEE NUMBER 
C
 
      IF (CURS(7,1).NE.1) THEN 
        CALL ERRRPT(CURS(1,1), 1) 
        GO TO 700 
      END IF 
 
      EMPNO=EMPNO+10 
      GO TO 500 

600 WRITE (*, 610) ENAME, DNAME, EMPNO 610 FORMAT(/, 1X, A10, ' added to the ', A14,

     1 ' department as employee# ', I4, /)  

C


C THE ROW HAS BEEN ADDED - COMMIT THIS TRANSACTION. C


 

      CALL OCOM(LDA(1))    

      IF (LDA(1).NE.0) THEN 
        CALL ERRLDA(LDA(1)) 
        GO TO 700 
      END IF 
 
      GO TO 100 
 

C


C EITHER A FATAL ERROR HAS OCCURRED OR THE USER TYPED "0" FOR THE ENAME.
C REPORT IT TO THE OPERATOR AND EXIT. C


 

700 CONTINUE   C


C CLOSE THE CURSORS
C


 
      CALL OCLOSE(CURS(1,1)) 
      IF (CURS(1,1).NE.0) CALL ERRRPT(CURS(1,1), 1) 
      CALL OCLOSE(CURS(1,2)) 
      IF (CURS(1,2).NE.0) CALL ERRRPT(CURS(1,2), 2) 
 

C


C LOGOFF FROM ORACLE
C


 
      CALL OLOGOF(LDA(1)) 
      IF (LDA(1).NE.0) CALL ERRLDA(LDA(1)) 
      STOP 'End of the FORTRAN/ORACLE example program.' 
      END 
 
 
      SUBROUTINE ERRRPT(CURS, N) 
 

C


C     ERRRPT PRINTS THE CURSOR NUMBER, THE ERROR CODE, AND THE 
C     ORACLE FUNCTION CODE. 
C 
C     CURS IS A CURSOR 
C     N IS THE CURSOR NUMBER 

C
 
      INTEGER*2 CURS(32) 
      CHARACTER*70 ERRMSG 
 

300 WRITE (*, 400) N, CURS(7), CURS(6) 400 FORMAT(1X, 'ORACLE error on cursor ', I1,

     1 ': code is ',I5,', op is ',I5)  

C Note: %REF is a VAXISM (see discussion at the beginning of the program).  

      CALL OERMSG(%VAL(CURS(7)), %REF(ERRMSG)) 
      WRITE (*, 20) ERRMSG 

C MPE/iX screen output is limited to 80 chars, besides, the error message
C is at most 70 chars long.
20 FORMAT(1X, 'ERMSG: ', A70)   500 RETURN
      END           SUBROUTINE ERRLDA(LDA)   C

C ERRLDA PRINTS THE ERROR CODE, AND THE ORACLE FUNCTION CODE. C


 
      INTEGER*2 LDA(32) 
      CHARACTER*70 ERRMSG 
 
      WRITE (*, 10) LDA(7) 

10 FORMAT(1X, 'Logon error: ', I5)  

C Note: %REF is a VAXISM (see note at the beginning of the program).  

      CALL OERMSG(%VAL(LDA(7)), %REF(ERRMSG)) 
      WRITE (*, 20) ERRMSG 

C MPE/iX screen output is limited to 80 chars, besides, the error message
C is at most 70 chars long.
20 FORMAT(1X, 'ERMSG: ', A70)   599 RETURN
      END
C ===================== End of Fortran source code 
 

References:



Programmer's Guide to the ORACLE Call Interfaces Version 1.5 (Oracle) Programmer's Guide to the ORACLE Call Interfaces Version 7.0 (Oracle) HP Fortran 77/iX Programmer's Reference (HP) HP Fortran 77/iX Technical Reference (HP)     
                                            Oracle WorldWide Customer
Support   

On Wed, 5 May 1999 16:41:11 -0400, <coopman_at_ix.netcom.com> wrote:

>Hi,
>
>I am trying to configure a client and server environment to communicate
>using fixed width 2 byte character strings over an OCI connection.
>
>The client runs on HPUX 11.0 as well as the server, but not necessarily on
>the same host.
>The server is Oracle 8.0.4, but the client may be 7.3.x
>
>The database characterset is WE8DEC and the client's NLS_LANG is
>America_American.WE8DEC.
>
>I believe that that use of the 2-byte representation is due to some
>configuration or compilation option of the client program, which takes
>advantage of HP's wchar_t (wide character, 16-bit) implementation, when the
>client and server are on similar HP platforms.
>
>Note: This is not a simple NLS questions, but a lower-level OCI protocol
>issue (possibly realted to SqlNet/Net8 data type negotiation/conversion).
>
>I have been through numerous docs, trial-and-error configurations, and
>scanned related usenet groups, but have not found much. Any help would be
>appreciated.
>
>Marc
>
>
>

Received on Tue May 18 1999 - 18:06:15 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US