增加oracle 11g x86版 instantclient
diff --git a/sdk/include/orl.h b/sdk/include/orl.h
new file mode 100755
index 0000000..5aa3d88
--- /dev/null
+++ b/sdk/include/orl.h
@@ -0,0 +1,3633 @@
+/* Copyright (c) 1993, 2006, Oracle. All rights reserved.  */
+
+/*
+  Author:             Srinath Krishnaswamy
+  Date:               11/24/93
+  Source documents:   "Functional Specification for C Language Mapping of
+                      OTS Types, Object Management Subsystem", "Oracle C
+                      Coding Standards version 2.2", and the header file
+                      template
+  Rule sets:          the generic and .h file rule sets
+  Quality status:     not exited
+  Identification tag: [ one or more letters to identify the .h file ]
+  Revision code:      11/24/93
+ 
+  NAME
+
+    ORL - ORacle's external C Language interface to primitive OTS types
+ 
+  DESCRIPTION
+
+    This header file contains C langauge interface to the OTS primitive
+    types. The interface includes C mapping of OTS primitive types and
+    the prototype of the pre-defined operations on the primitive types.
+ 
+    ***********************************************************************
+    *** NOTE: The OCI functions for objects requires the                ***
+    ***       application to be running in OBJECT mode. That is, during ***
+    ***       process initialization OCIInitialize(), the mode          ***
+    ***       specified should be OBJECT mode.                          ***
+    **                OCIInitialize(OCI_OBJECT, ..);                    ***
+    ***********************************************************************
+
+  RELATED DOCUMENTS
+
+    [1] Krishnaswamy, Srinath and Nguyen, Tin A., "Functional Specification
+        for C Language Mapping of OTS Types, Object Management Subsystem",
+        March 1994.
+    [2] Nguyen, Tin A., "The Open Type System", Oracle Corporation,
+        February 1994.
+    [3] Klein, Jonathan D., "Large Field Management", Oracle Corporation,
+        October 1993.
+ 
+  PUBLIC FUNCTIONS
+ 
+    OCI - OCI functions to manipulate Oracle Number, float and decimal
+      ARITHMETIC
+        OCINumberInc - OCINumber INCrement (optimized)
+        OCINumberDec - OCINumber DECrement (optimized)
+        OCINumberAdd - OCINumber ADD numbers
+        OCINumberSub - OCINumber SUBtract numbers
+        OCINumberMul - OCINumber MULtiply numbers
+        OCINumberDiv - OCINumber DIVide numbers
+        OCINumberMod - OCINumber MODulo division
+        OCINumberIntPower - OCINumber integer PoWeR
+        OCINumberShift - OCINumber decimal ShiFT number
+        OCINumberNeg - OCINumber NEGate number
+        OCINumberAbs - OCINumber ABSolute value
+        OCINumberCeil - OCINumber CEiling of number
+        OCINumberFloor - OCINumber FLooR of number
+        OCINumberSqrt - OCINumber SQuare Root of number
+        OCINumberSign - OCINumber get SIGN of number
+      NATIVE TYPE CONVERSION
+        OCINumberToInt  - OCINumber convert number TO machine-format Integer
+        OCINumberFromInt - OCINumber convert machine-format Integer TO Number
+        OCINumberToReal  - OCINumber convert number TO machine-format Real
+        OCINumberToRealArray  - OCINumber convert array of numbers TO
+                                machine-format Real
+        OCINumberFromReal - OCINumber convert machine-format Real TO Number
+      TEXT STRING CONVERSION
+        OCINumberToText  - OCINumber convert number TO String
+        OCINumberFromText - OCINumber convert String TO Number
+      COMPARISON
+        OCINumberCmp - OCINumber CoMPare numbers
+        OCINumberIsZero - OCINumber comparison with ZERo
+        OCINumberIsInt - OCINumber Is an Integer
+      ASSIGNMENT
+        OCINumberAssign - OCINumber ASsiGn number
+        OCINumberSetZero - OCINumber Set number to Zero value
+        OCINumberSetPi - OCINumber Set number to Pi
+      ROUNDING
+        OCINumberTrunc - OCINumber TRUncate an Oracle number
+        OCINumberRound - OCINumber ROUnd number
+        OCINumberPrec - OCINumber round to Precision digits
+      TRANSCENDENTAL
+        OCINumberSin - OCINumber SINe
+        OCINumberArcSin - OCINumber Arc SINe
+        OCINumberHypSin - OCINumber SiNe Hyperbolic
+        OCINumberCos - OCINumber COSine
+        OCINumberArcCos - OCINumber Arc COSine
+        OCINumberHypCos - OCINumber CoSine Hyperbolic
+        OCINumberTan - OCINumber TANgent
+        OCINumberArcTan - OCINumber Arc TANgent
+        OCINumberArcTan2 - OCINumber Arc TaNgent 2
+        OCINumberHypTan - OCINumber TaNgent Hyperbolic
+        OCINumberPower - OCINumber arbitrary Base EXponentiation
+        OCINumberExp - OCINumber EXPonentiation to base e
+        OCINumberLn  - OCINumber Logarithm Natural
+        OCINumberLog - OCINumber LOGarithm to arbitrary base
+
+    OCIDate - OCI functions to manipulate OCI Date
+      OCIDateToExternal - OCIDate convert date to external form
+      OCIDateFromExternal - OCIDate convert external form of date into OCIDate
+      OCIDateAssign - OCIDate Assignment
+      OCIDateToText  - OCIDate convert date TO String
+      OCIDateFromText - OCIDate convert String TO Date
+      OCIDateZoneToZone - OCIDate convert date from one time 
+                        Zone TO another Zone
+      OCIDateCompare - OCIDate CoMPare dates
+      OCIDateAddMonths - OCIDate ADd or subtract Months
+      OCIDateAddDays - OCIDate ADd or subtract Days
+      OCIDateLastDay - OCIDate get date of LaST day of month
+      OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+      OCIDateNextDay - OCIDate get date of Next DaY
+      OCIDateCheck - OCIDate CHecK if the given date is valid
+      OCIDateSysDate - OCIDate get current SYStem date and time
+
+    OCIString - OCI String functions to manipulate Variable-length string
+      OCIStringAssign - OCIString Assign string to string
+      OCIStringAssignText - OCIString Assign Text string to string
+      OCIStringResize - OCIString ReSiZe string
+      OCIStringSize - OCIString get String Size
+      OCIStringPtr - OCIString get String PoinTeR
+      OCIStringAllocSize - OCIString get Allocated SiZe
+ 
+    OCIRaw - OCI Raw functions to manipulate variable-length raW
+      OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to raw
+                        (of type OCIRaw*)
+      OCIRawResize - OCIRaw Resize raw
+      OCIRawSize - OCIRaw get Raw Size
+      OCIRawPtr  - OCIRaw get Raw data Pointer
+      OCIRawAllocSize - OCIRaw get Allocated Size
+
+    OCIColl - OCI Collection generic functions. These functions can be 
+                used to manipulate both variable-length array (varray) and 
+                nested table.
+      OCICollSize  - OCIColl return current SIZe of the given collection
+                (in number of elements)
+      OCICollMax  - OCIColl return the MAXimum number of elements in the
+                collection (i.e. upper-bound)
+      OCICollGetElem  - OCIColl GET pointer to the element at the given 
+                position
+      OCICollAssignElem  - OCIColl assign to element at given index
+      OCICollAssign  - OCIColl ASsiGn collection; perform deep-copy of source 
+                collection to target collection
+      OCICollAppend  - OCIColl aPPend the given element to the end of the
+                collection
+      OCICollTrim  - OCIColl trim (delete) the given number of elements 
+                from the end of the collection
+      OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+      OCIIterCreate  - OCIColl Create an ITerator to scan the collection 
+                elements
+      OCIIterDelete  - OCIColl Delete ITerator
+      OCIIterInit  - OCIColl Initialize ITerator to scan the given collection
+      OCIIterGetCurrent - OCIColl Iterator based, get CURrent 
+                collection element
+      OCIIterNext - OCIColl Iterator based, get NeXT collection element
+      OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+ 
+      OCITable - OCI functions to manipulate nested Table. The OCIColl*() and 
+                OCITable*() functions can be used to manipulate nested table
+      OCITableDelete(i) - OCITable if element(i) exists then the element is 
+                marked as deleted else the function returns false. So 
+                delete's create "holes".
+      OCITableExists(i) - OCITable return true iff an element at
+                position i EXIsts
+      OCITableFirst  - OCITable return the smallest value of i for which
+                exists(i) is true.
+      OCITableLast  - OCITable return the largest value of i for which 
+                exists(i) is true.
+      OCITableNext(i) - OCITable return pointer to the smallest position j, 
+                greater than i, such that OCITableExists(j) is true
+      OCITablePrev(i) - OCITable return pointer to the largest position j,
+                less than i, such that OCITableExists(j) is true
+      OCITableSize - OCITable return current SIZe of the given nested table not
+                including deleted elements
+
+    OCIRef - OCI functions to manipulate object Reference
+      OCIRefClear  - OCIRef CLeaR or nullify a ref
+      OCIRefAssign  - OCIRef ASsiGn a ref to another
+      OCIRefIsEqual  - OCIRef compare two refs for EQUality
+      OCIRefIsNull  - OCIRef test if a ref is NULl 
+      OCIRefFromHex  - OCIRef convert a Hexadecimal string TO a Ref
+      OCIRefToHex   - OCIRef convert a ref to a Hexadecimal string
+      OCIRefHexSize  - OCIRef get size of buffer in bytes to store hexadecimal
+                string
+
+  OBSOLETE: to be replaced by functions from oci.h:
+
+    ORLL - ORL functions to manipulate lob Locators
+      orllasg   - ORLL AsiGn one locator to another
+      orllequ   - ORLL compare two locators for EQUality
+      orlliini  - ORLL Is the locator INItialized?
+      orllgsz   - ORLL Get locator SiZe
+      orllgcid  - ORLL Get Character set ID
+
+      NOTE: The following are specific to FILE lobs:
+
+      orllsnm - ORLL Set directory alias and file NaMe in the locator
+      orllgnm - ORLL Get directory alias and file NaMe from the locator
+ 
+  EXAMPLES
+
+    Examples are given in the description of each function where
+    relevant.
+ 
+  NOTES
+
+    This file has been subsetted to contain ONLY the routines that will
+    be in the first release.
+ 
+  QUESTIONS
+     
+  MODIFIED
+    bkhaladk   08/01/05 - add defn for OCIBinXmlReposCtx 
+    dmukhin    06/29/05 - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/12/03 - convert oci public api to ansi
+    rpingte    11/21/02 - Add OCICollGetElemArray and OCINumberToRealArray
+    aahluwal   06/03/02 - bug 2360115
+    gayyappa   02/01/02 - fix 2210776 : change Dom to DOM 
+    whe        09/25/01 - add OCIXMLType & OCIDomDocument opaque types
+    bpalaval   02/09/01   - Change text to oratext.
+    rkasamse   09/20/99 -   lint changes
+    whe        09/01/99 -   976457:check __cplusplus for C++ code
+    hsbedi     08/11/99 -   Add macro
+    rxgovind   10/14/98 -  make non exposed calls (OCIRowType etc) private
+    rxgovind   06/09/98 -  update OCIRowTypeCreate
+    nmantrav   05/11/98 -  add OCIRowTypeGetCount
+    rxgovind   03/29/98 -  add OCIRowType and OCIRowData interfaces
+    jwijaya    05/06/98  - add OCICollIsLocator                                
+    rxgovind   03/18/98 -  opaque types: move to kolo.h
+    etucker    02/02/98 -  add comments for Dec and Inc
+    etucker    01/29/98 -  Finish core5 integration
+    rxgovind   11/11/97 -  opaque types
+    etucker    10/28/97 -  add ORLN functions for SDK
+    cxcheng    07/28/97 -  remove OCILobLocator #define
+    skmishra   05/13/97 -  stdcc compatibility changes
+    skrishna   04/25/97 -  rename OCINumber*(): Exp Power TanHyp Zero Init
+                           TanToArc Sqr Truncate and Compare 
+    skotsovo   03/31/97 -  remove OCILobLocatorSize
+    skrishna   03/25/97 -  remove orld2i and orldi2d
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    skrishna   01/06/97 -  update OCITableSize() comments
+    skrishna   12/27/96 -  fix OCIDateGet/OCIDateSet
+    skrishna   12/12/96 -  update OCICollGelElem comments
+    skrishna   11/07/96 -  OCICollGetElem: interface change
+    skrishna   11/05/96 -  add OCIDate Get/Set and OCIDateAssign
+    cxcheng    10/31/96 -  change OCINumberTanHyp to OCINumberHypTan
+    cxcheng    10/30/96 -  #define orll short names to long names
+    dchatter   10/26/96 -  fix some OCI file long names
+    cxcheng    10/24/96 -  remove unnecessary comment in front
+    cxcheng    10/14/96 -  disable long name mapping for LOB functions
+    skrishna   10/13/96 -  continue beautification
+    skotsovo   10/16/96 -  update ocilob names
+    cxcheng    10/09/96 -  add structure members in #define for date/time
+    cxcheng    10/09/96 -  more lint fixes
+    skrishna   10/09/96 -  continue beautification
+    cxcheng    10/09/96 -  more fixes
+    skrishna   10/09/96 -  change fixed-char rep. to orlvstr*
+    jwijaya    10/08/96 -  continue beautification
+    jwijaya    10/07/96 -  beautify
+    cxcheng    10/07/96 -  more changes
+    cxcheng    10/04/96 -  replace short names with long names
+    skrishna   10/01/96 -  orlcsiz, orltsiz: change prototype to take errhdl
+    skrishna   09/23/96 -  fix lint errors
+    skotsovo   09/23/96 -  remove orllmkcur().
+    jwijaya    09/17/96 -  comments on null ref
+    skrishna   09/19/96 -  change orlraw format
+    skotsovo   09/19/96 -  add orlliini and remove orllnul
+    skrishna   08/14/96 -  orlvstr: change format to ub4 followed by text
+    jboonleu   08/06/96 -  update comment
+    skotsovo   08/08/96 -  revert to locators instead of descriptors as input t
+    jboonleu   07/23/96 -  remove orlrcur
+    skrishna   07/06/96 -  add orltsiz
+    skrishna   07/05/96 -  add orld2i and orldi2d
+    jwijaya    07/03/96 -  add ANSI prototypes
+    skrishna   06/27/96 -  document default string format in orlds2d & orld2s
+    skrishna   06/25/96 -  change max date value
+    skrishna   06/18/96 -  modify orld2s() comments
+    skotsovo   06/13/96 -  orll functions take lob descriptors instead of locat
+    rxgovind   06/05/96 -  change prototype of orlrcur to take ocienvh
+    skrishna   05/30/96 -  support collection trimming
+    skrishna   05/30/96 -  remove orlralo/fre and orllalo/fre instead use 
+                           orionew/fre
+    skrishna   05/28/96 -  add orlt*() and modify orla*()
+    skotsovo   05/23/96 -  add orlbl typedefs for pro*c
+    jboonleu   05/14/96 -  add orlrcur
+    rxgovind   05/08/96 -  changes for 3gl callbacks
+    skotsovo   05/01/96 -  in orllasg, no need to alloc orlbl*
+    skrishna   04/21/96 -  merge changes from 960418 object branch into big
+    skrishna   04/17/96 -  rename orlrcpy to orlrasg
+    skrishna   04/12/96 -  add orlr2h and orlrh2r functions
+    skotsovo   04/15/96 -  add fnt to make the lob locator current
+    skrishna   04/08/96 -  change orl*() to take ocienvh* and ocierrh* instead
+                           of oroenv*
+    skotsovo   03/22/96 -  add locator functions
+    skotsovo   03/22/96 -  add locator functions
+    skrishna   02/27/96 -  remove mlslabel interface
+    skotsovo   02/20/96 -  remove orlbty and use dty type instead.
+    skotsovo   02/14/96 -  add text file lobs.
+    skrishna   01/31/96 -  update comments of orln2r, orldchk, orlds2d & orld2s
+    skrishna   01/31/96 -  change orld2s() and orln2s() to return string length
+    skrishna   01/21/96 -  remove old raw interface 
+    skrishna   12/14/95 -  add raw interface
+    skotsovo   01/03/96 -  change LOB offsets and lengths from ub4 to ubig_ora
+                           to support 64 bit machines.
+    skotsovo   10/30/95 -  add orlblsiz() to get lob locator size
+    skrishna   10/24/95 -  move ref functions from ori and update the ref
+                           functions to support variable-length ref
+    cxcheng    10/20/95 -  add more comments on number versions
+    cxcheng    10/13/95 -  add more number functions
+    cxcheng    08/29/95 -  Support for segmented varrays
+    cxcheng    08/18/95 -  modifiy orlmls structure
+    skrishna   06/06/95 -  rename orln, orld, orlvs and orlva to orlnum,
+                           orldat, orlvstr and orlvary respectively 
+    skrishna   11/15/94 -  remove orlnget() function 
+    skrishna   09/20/94 -  modify orldbtw() to return number of days only 
+    skrishna   08/24/94 -  change format string length type from ub4 to ub1 
+    skrishna   07/19/94 -  Rename orln2c & orlnc2n to orln2s & orlns2n 
+    skrishna   06/29/94 -  Add blob interface; add examples 
+    skrishna   06/23/94 -  Update comments and format 
+    skrishna   05/19/94 -  update varray append comments 
+    skrishna    05/05/94 -  Subsetting 
+    skrishna    11/24/93 -  Creation
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORL_ORACLE
+#define ORL_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIArray                        orlvary
+#define OCIColl                         orlcol
+#define OCICollAppend                   orlcapp
+#define OCICollAssign                   orlcasg
+#define OCICollAssignElem               orlcase
+#define OCICollGetElem                  orlcget
+#define OCICollGetElemArray             orlcgeta
+#define OCICollMax                      orlcmax
+#define OCICollSize                     orlcsiz
+#define OCICollTrim                     orlctrm
+#define OCICollIsLocator                orlcilc
+#define OCIDate                         orldat
+#define OCIDateAddDays                  orldadd
+#define OCIDateAddMonths                orldadm
+#define OCIDateCheck                    orldchk
+#define OCIDateCompare                  orldcmp
+#define OCIDateDD                       day_orldat
+#define OCIDateDaysBetween              orldbtw
+#define OCIDateFromText                 orlds2d
+#define OCIDateLastDay                  orldlst
+#define OCIDateMM                       mon_orldat
+#define OCIDateNextDay                  orldndy
+#define OCIDateSysDate                  orldsys
+#define OCIDateTime                     time_orldat
+#define OCIDateYYYY                     gye_orldat
+#define OCIDateZoneToZone               orldz2z
+#define OCIIter                         orlcitr
+#define OCIIterCreate                   orlccit
+#define OCIIterDelete                   orlcdit
+#define OCIIterGetCurrent               orlcicur
+#define OCIIterInit                     orlciit
+#define OCIIterNext                     orlcinxt
+#define OCIIterPrev                     orlciprv
+#define OCINumber                       orlnum
+#define OCINumberAbs                    orlnabs
+#define OCINumberAdd                    orlnadd
+#define OCINumberArcCos                 orlnacos
+#define OCINumberArcSin                 orlnasin
+#define OCINumberArcTan                 orlnatan
+#define OCINumberAssign                 orlnasg
+#define OCINumberCeil                   orlncel
+#define OCINumberCos                    orlncos
+#define OCINumberDiv                    orlndiv
+#define OCINumberPower                  orlnbex
+#define OCINumberFloor                  orlnflr
+#define OCINumberFromInt                orlni2n
+#define OCINumberFromReal               orlnr2n
+#define OCINumberFromText               orlns2n
+#define OCINumberHypCos                 orlncsh
+#define OCINumberHypSin                 orlnsnh
+#define OCINumberSetZero                orlnini
+#define OCINumberSetPi                  orlnspi
+#define OCINumberInc                    orlninc
+#define OCINumberDec                    orlndec
+#define OCINumberIntPower               orlnpwr
+#define OCINumberLn                     orlnln
+#define OCINumberLog                    orlnlog
+#define OCINumberMod                    orlnmod
+#define OCINumberMul                    orlnmul
+#define OCINumberNeg                    orlnneg
+#define OCINumberPart                   orlnpart
+#define OCINumberExp                    orlnexp
+#define OCINumberRound                  orlnrou
+#define OCINumberPrec                   orlnpre
+#define OCINumberShift                  orlnsft
+#define OCINumberSign                   orlnsgn
+#define OCINumberSin                    orlnsin
+#define OCINumberSqrt                   orlnsqr
+#define OCINumberSub                    orlnsub
+#define OCINumberTan                    orlntan
+#define OCINumberHypTan                 orlntnh
+#define OCINumberArcTan2                orlnatn2
+#define OCINumberToInt                  orln2i
+#define OCINumberToReal                 orln2r
+#define OCINumberToRealArray            orln2ra
+#define OCINumberToText                 orln2s
+#define OCINumberTrunc                  orlntru
+#define OCINumberCmp                    orlncmp
+#define OCINumberIsZero                 orlnzer
+#define OCINumberIsInt                  orlnint
+#define OCIRaw                          orlraw
+#define OCIRawAllocSize                 orlwasz
+#define OCIRawAssignBytes               orlwabr
+#define OCIRawAssignRaw                 orlwarr
+#define OCIRawPtr                       orlwgrp
+#define OCIRawResize                    orlwrsz
+#define OCIRawSize                      orlwgsz
+#define OCIRefAssign                    orlrasg
+#define OCIRefClear                     orlrclr
+#define OCIRefFromHex                   orlrh2r
+#define OCIRefHexSize                   orlrhsz
+#define OCIRefIsEqual                   orlrequ
+#define OCIRefIsNull                    orlrnul
+#define OCIRefToHex                     orlr2h
+#define OCIString                       orlvstr
+#define OCIStringAllocSize              orlvasz
+#define OCIStringAssign                 orlvass
+#define OCIStringAssignText             orlvats
+#define OCIStringPtr                    orlvgsp
+#define OCIStringResize                 orlvrsz
+#define OCIStringSize                   orlvgsz
+#define OCITable                        orltbl
+#define OCITableDelete                  orltdel
+#define OCITableExists                  orltexi
+#define OCITableFirst                   orltfst
+#define OCITableLast                    orltlst
+#define OCITableNext                    orltnxt
+#define OCITablePrev                    orltprv
+#define OCITableSize                    orltsiz
+#define OCITime                         orldtm
+#define OCITimeHH                       orldtmhh
+#define OCITimeMI                       orldtmmm
+#define OCITimeSS                       orldtmss
+#define OCI_LOBMODE_READONLY            ORLBMORO
+#define OCI_LOBMODE_READWRITE           ORLBMORW
+
+#endif                                                        /* SLSHORTNAME */
+
+/*****************************************************************************/
+/*                         NUMBER/FLOAT/DECIMAL TYPE                         */
+/*****************************************************************************/
+
+#define OCI_NUMBER_SIZE 22
+struct OCINumber
+{
+  ub1 OCINumberPart[OCI_NUMBER_SIZE];
+};
+typedef struct OCINumber OCINumber;
+
+/* 
+ * OCINumber - OCI Number mapping in c
+ *
+ * The OTS types: NUMBER, NUMERIC, INT, SHORTINT, REAL, DOUBLE PRECISION,
+ * FLOAT and DECIMAL are represented by OCINumber.
+ * The contents of OCINumber is opaque to clients. 
+ *
+ * For binding variables of type OCINumber in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_VNU.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle number.
+  
+     struct person
+     {
+       OCINumber sal;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person* joe;
+     person* tom;
+     person* debbie;
+     OCINumber  *joesal;
+     OCINumber  *tomsal;
+     OCINumber *debsal;
+     sword   status;
+     int     inum;
+     double  dnum;
+     OCINumber ornum;
+     char    buffer[21];
+     ub4     buflen;
+     sword   result;
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe, tom and debbie person objects in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe, tom and debbie are pointing to pinned objects.
+      o/
+     joesal = &joe->sal;
+     tomsal = &tom->sal;
+     debsal = &debbie->sal;
+
+     /o initialize joe's salary to be $12,000 o/
+     inum = 12000;
+     status = OCINumberFromInt(err, &inum, sizeof(inum), OCI_NUMBER_SIGNED,
+                               joesal);
+     if (status != OCI_SUCCESS)
+                              /o goto to handle error from OCINumberFromInt o/;
+
+     /o initialize tom's salary to be same as joe o/
+     OCINumberAssign(err, joesal, tomsal);
+
+     /o initialize debbie's salary to be 20% more than joe's o/
+     dnum = 1.2;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, joesal, &ornum, debsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o give tom a 50% raise o/
+     dnum = 1.5;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, tomsal, &ornum, tomsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o double joe's salary o/
+     status = OCINumberAdd(err, joesal, joesal, joesal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberAdd o/;
+
+     /o get joe's salary in integer o/
+     status = OCINumberToInt(err, joesal, sizeof(inum), OCI_NUMBER_SIGNED,
+                             &inum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToInt o/;
+     /o inum is set to 24000 o/
+
+     /o get debbie's salary in double o/
+     status = OCINumberToReal(err, debsal, sizeof(dnum), &dnum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToReal o/;
+     /o dnum is set to 14400 o/
+
+     /o print tom's salary as DEM0001`8000.00 o/
+     buflen = sizeof(buffer);
+     status = OCINumberToText(err, tomsal, "C0999G9999D99", 13, 
+                 "NLS_NUMERIC_CHARACTERS='.`' NLS_ISO_CURRENCY='Germany'", 54,
+                 &buflen, buffer);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToText o/;
+     printf("tom's salary = %s\n", buffer);
+
+     /o compare joe and tom's salary o/
+     status = OCINumberCmp(err, joesal, tomsal, &result);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberCmp o/;
+     /o result is positive o/
+
+     /o read debbie's new salary from string o/
+     status = OCINumberFromText(err, "48`000.00", 9, "99G999D99", 9,
+                      "NLS_NUMERIC_CHARACTERS='.`'", 27, debsal);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromText o/;
+     /o debbie's salary is now 48000.00 o/
+
+*/
+
+/*----------------------------- OCINumberInc --------------------------------*/
+
+sword OCINumberInc(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberInc - OCINumber INCrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) a positive Oracle number to be incremented
+   DESCRIPTION:
+        Increment Oracle number in place. It is assumed that the input is
+        an integer between 0 and 100^21-2. If the is input too large, it will
+        be treated as 0 - the result will be an Oracle number 1. If the input
+        is not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDec --------------------------------*/
+
+sword OCINumberDec(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberDec - OCINumber DECrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) - a positive Oracle number to be decremented
+   DESCRIPTION:
+        Decrement Oracle number in place. It is assumed that the input is an
+        integer between 1 and 100^21-2. If the input is too large, it will be
+        treated as 1 - the result will be an Oracle number 0. If the input is
+        not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberSetZero -------------------------------*/
+
+void OCINumberSetZero(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetZero - OCINumber Set number to Zero value
+   PARAMETERS:
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value 0.
+ */
+
+/*--------------------------- OCINumberSetPi --------------------------------*/
+
+void OCINumberSetPi(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetPi - OCINumber Set number to Pi
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value Pi.
+ */
+
+/*----------------------------- OCINumberAdd --------------------------------*/
+
+sword OCINumberAdd(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberAdd - OCINumber ADD numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be added
+        result (OUT) - result of adding 'number1' with 'number2'
+   DESCRIPTION:
+        Add 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSub --------------------------------*/
+
+sword OCINumberSub(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberSub - OCINumber SUBtract numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - 'number2' subtracted from 'number1'
+        result (OUT) - subtraction result
+   DESCRIPTION:
+        Subtract 'number2' from 'number1' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberMul --------------------------------*/
+
+sword OCINumberMul(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMul - OCINumber MULtiply numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be multiplied
+        result (OUT) - multiplication result
+   DESCRIPTION:
+        Multiply 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDiv --------------------------------*/
+
+sword OCINumberDiv(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberDiv - OCINumber DIVide numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - division result
+   DESCRIPTION:
+        Divide 'number1' by 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          underflow errorr
+          overflow errorr
+          divide by zero errorr
+ */
+
+/*----------------------------- OCINumberMod --------------------------------*/
+
+sword OCINumberMod(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMod - OCINumber MODulous
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - remainder of the result
+   DESCRIPTION:
+        Finds the remainder of the division of two Oracle numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          divide by zero errorr
+ */
+
+/*------------------------ OCINumberIntPower --------------------------------*/
+
+sword OCINumberIntPower(    OCIError *err, const OCINumber *base,
+                            const sword exp, OCINumber *result    );
+/*
+   NAME: OCINumberIntPower - OCINumber takes an arbitary base to an arbitary
+                             integer PoWeR
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        exp (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary integer power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberShift ---------------------------------*/
+
+sword OCINumberShift(    OCIError *err, const OCINumber *number,
+                            const sword nDig, OCINumber *result    );
+/*
+   NAME: OCINumberShift - OCINumber multiplies by a power of 10.
+
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle Number to be shifted.
+        nDig   (IN) - number of decimal places to shift.
+        result (OUT) - shift result.
+   DESCRIPTION:
+        Multiplies number by 10^NDig and sets product to the result.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberNeg --------------------------------*/
+
+sword OCINumberNeg(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberNeg - OCINumber NEGate number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be negated
+        result (OUT) - will contain negated value of 'number'
+   DESCRIPTION:
+        Negates an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------- OCINumberToText ---------------------------------*/
+
+sword OCINumberToText(    OCIError *err, const OCINumber *number, 
+                          const oratext *fmt, ub4 fmt_length,
+                          const oratext *nls_params, ub4 nls_p_length,
+                          ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCINumberToText - OCINumber convert number TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle number to be converted
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer must be passed as input by
+                the caller, this function will return the length of the 
+                resulting string in bytes via this parameter. The length 
+                does not include the terminating null ('\0').
+        buf (OUT) - buffer into which the converted string is placed. The
+                resulting string is null terminated.
+   DESCRIPTION:
+        Converts the given number to a character string 
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+        The converted number string is stored in the buffer 'buf', up to 
+        a max of '*buf_size' bytes. Length of the resulting string is
+        returned via 'buf_size'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'buf' is null
+          buffer too small
+          invalid format
+          invalid nls format
+          number to text translation for the given format causes overflow
+ */
+
+/*-------------------------- OCINumberFromText ------------------------------*/
+
+sword OCINumberFromText(    OCIError *err, const oratext *str, 
+                          ub4 str_length, const oratext *fmt, ub4 fmt_length, 
+                          const oratext *nls_params, ub4 nls_p_length, 
+                          OCINumber *number    );
+/*
+   NAME: OCINumberFromText - OCINumber convert String TO Number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        str (IN) - input string to be converted to Oracle number
+        str_length (IN) - size of the input string
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        number (OUT) - given string converted to number
+   DESCRIPTION:
+        Converts the given string to a number
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'str' is null
+          'str_length' is 0
+          invalid format
+          invalid nls format
+          invalid input string
+ */
+
+/*-------------------------- OCINumberToInt ---------------------------------*/
+
+#define OCI_NUMBER_UNSIGNED 0                        /* Unsigned type -- ubX */
+#define OCI_NUMBER_SIGNED   2                          /* Signed type -- sbX */
+
+sword OCINumberToInt(    OCIError *err, const OCINumber *number,
+                         uword rsl_length, uword rsl_flag, void  *rsl    );
+/*
+   NAME: OCINumberToInt - OCINumber convert number TO Integer
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - size of the desired result
+        rsl_s_flag (IN) - flag denoting the desired sign of the output; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        rsl (OUT) - pointer to space for the result
+   DESCRIPTION:
+        Native type conversion function.
+        Converts the given Oracle number into an xbx (e.g. ub2, ub4, sb2 etc.)
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          integer value of 'number' is too big -- overflow
+          integer value of 'number' is too small -- underflow
+          invalid sign flag value ('rsl_s_flag')
+ */
+
+/*--------------------------- OCINumberFromInt ------------------------------*/
+
+sword OCINumberFromInt(    OCIError *err, const void  *inum, uword inum_length,
+                         uword inum_s_flag, OCINumber *number    );
+/*
+   NAME: OCINumberFromInt - OCINumber convert Integer TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        inum (IN) - pointer to the integer to be converted
+        inum_length (IN) - size of the integer
+        inum_s_flag (IN) - flag that designates the sign of the integer; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        number (OUT) - given integer converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts any Oracle standard
+        machine-native integer type (xbx) to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'inum' is null
+          integer too BIG -- the number is too large to fit into an Oracle
+                number
+          invalid sign flag value ('inum_s_flag')
+ */
+
+/*------------------------- OCINumberToReal ---------------------------------*/
+
+sword OCINumberToReal(    OCIError *err, const OCINumber *number,
+                          uword rsl_length, void  *rsl    );
+/*
+   NAME: OCINumberToReal - OCINumber convert number TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - is the size of the desired result, 
+                sizeof( float | double | long double)
+        rsl (OUT) - pointer to space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*------------------------- OCINumberToRealArray ----------------------------*/
+
+sword OCINumberToRealArray(  OCIError *err, const OCINumber **number,
+                             uword elems, uword rsl_length, void  *rsl    );
+/*
+   NAME: OCINumberToRealArray - OCINumber convert array of numbers TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Pointer to array of number to be converted
+        elems (IN) - Upper bound of number array
+        rsl_length (IN) - is the size of the desired result,
+                                          sizeof( float | double | long double)
+        rsl (OUT) - pointer to array of space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*-------------------------- OCINumberFromReal ------------------------------*/
+
+sword OCINumberFromReal(    OCIError *err, const void  *rnum,
+                            uword rnum_length, OCINumber *number    );
+/*
+   NAME: OCINumberFromReal - OCINumber convert Real TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rnum (IN) - pointer to the floating point number to be converted
+        rnum_length (IN) - size of the desired result, i.e.
+                sizeof({float | double | long double})
+        number (OUT) - given float converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts a machine-native floating
+        point type to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rnum' is null
+          'rnum_length' is 0
+ */
+
+/*----------------------------- OCINumberCmp --------------------------------*/
+
+sword OCINumberCmp(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, sword *result    );
+/*
+   NAME: OCINumberCmp - OCINumber CoMPare numbers 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be compared
+        result (OUT) - 0 if equal, negative if number1 < number2, 
+                positive if number1 > number2 
+   DESCRIPTION:
+        The function OCINumberCmp compares two numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number1' or 'number2' or 'result' is null 
+ */
+
+/*---------------------------- OCINumberSign --------------------------------*/
+
+sword OCINumberSign(    OCIError *err, const OCINumber *number,
+                        sword *result    );
+/*
+   NAME: OCINumberSign - OCINumber obtains SiGN of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number whose sign is returned
+        result (OUT) - 0 if number == 0, -1 if number < 0, 
+                1 if number > 0 
+   DESCRIPTION:
+        Obtains sign of an Oracle number
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsZero ------------------------------*/
+
+sword OCINumberIsZero(    OCIError *err, const OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsZero - OCINumber comparison with ZERo
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - numbers to be compared
+        result (OUT) - set to TRUE if equal to zero else FALSE
+   DESCRIPTION:
+        Test if the given number is equal to zero.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsInt -------------------------------*/
+
+sword OCINumberIsInt(    OCIError *err, const OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsInt - OCINumber Is Integer value.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be tested
+        result (OUT) - set to TRUE if integer value else FALSE
+   DESCRIPTION:
+        Test if the given number is an integer value.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*-------------------------- OCINumberAssign --------------------------------*/
+ 
+sword OCINumberAssign(    OCIError *err, const OCINumber *from,
+                          OCINumber *to    );
+/*
+   NAME: OCINumberAssign - OCINumber ASsiGn number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - number to be assigned
+        to (OUT) - number copied into
+   DESCRIPTION:
+        Assign number 'from' to 'to'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'from' or 'to' is null
+ */
+
+/*----------------------------- OCINumberAbs --------------------------------*/
+
+sword OCINumberAbs(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberAbs - OCINumber compute ABSolute value
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the absolue value of the
+                input number
+   DESCRIPTION:
+        Computes the absolute value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*---------------------------- OCINumberCeil --------------------------------*/
+
+sword OCINumberCeil(    OCIError *err, const OCINumber *number,
+                        OCINumber *result    );
+/*
+   NAME: OCINumberCeil - OCINumber compute the CEiL value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the ceil value of the
+                input number
+   DESCRIPTION:
+        Computes the ceil value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberFloor --------------------------------*/
+
+sword OCINumberFloor(    OCIError *err, const OCINumber *number, 
+                         OCINumber *result    );
+/*
+   NAME: OCINumberFloor - OCINumber compute the FLooR value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the floor value of the
+                input number
+   DESCRIPTION:
+        Computes the floor value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSqrt -------------------------------*/
+
+sword OCINumberSqrt(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSqrt - OCINumber compute the SQuare Root of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the square root of the
+                input number
+   DESCRIPTION:
+        Computes the square root of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is negative
+ */
+
+/*--------------------------- OCINumberTrunc --------------------------------*/
+
+sword OCINumberTrunc(    OCIError *err, const OCINumber *number, 
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberTrunc - OCINumber TRUncate an Oracle number at a 
+                          specified decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to truncate at. Negative values are allowed.
+        result (OUT) - output of truncation
+   DESCRIPTION:
+        Truncate an Oracle number at a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberPower ------------------------------*/
+
+sword OCINumberPower(    OCIError *err, const OCINumber *base, 
+                         const OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberPower - OCINumber takes an arbitary Base to an 
+                          arbitary Power
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        number (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberRound --------------------------------*/
+
+sword OCINumberRound(    OCIError *err, const OCINumber *number,
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberRound - OCINumber ROUnds an Oracle number to a specified 
+                  decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - round this number and return result in 'result'
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to round to. Negative values are allowed.
+        result (OUT) - output of rounding
+   DESCRIPTION:
+        Rounds an Oracle number to a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberPrec ---------------------------------*/
+
+sword OCINumberPrec(    OCIError *err, const OCINumber *number,
+                         sword nDigs, OCINumber *result    );
+/*
+   NAME: OCINumberPrec - Rounds an Oracle number to a specified number of
+                         decimal digits.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number for which to set precision.
+        nDig   (IN) - number of decimal digits desired in the result.
+        result (OUT) - result.
+   DESCRIPTION:
+        Performs a floating point round with respect to the number
+        of digits.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSin --------------------------------*/
+
+sword OCINumberSin(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSin - OCINumber takes the SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine in radians
+        result (OUT) - result of the sine
+   DESCRIPTION:
+        Takes the sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcSin --------------------------------*/
+
+sword OCINumberArcSin(    OCIError *err, const OCINumber *number,
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcSin - OCINumber takes the Arc SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc sine
+        result (OUT) - result of the arc sine in radians
+   DESCRIPTION:
+        Takes the arc sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypSin --------------------------------*/
+
+sword OCINumberHypSin(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypSin - OCINumber takes the SiNe Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine hyperbolic
+        result (OUT) - result of the sine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic sine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberCos --------------------------------*/
+
+sword OCINumberCos(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberCos - OCINumber takes the COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine in radians
+        result (OUT) - result of the cosine
+   DESCRIPTION:
+        Takes the cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcCos --------------------------------*/
+
+sword OCINumberArcCos(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcCos - OCINumber takes the Arc COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc cosine
+        result (OUT) - result of the arc cosine in radians
+   DESCRIPTION:
+        Takes the arc cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypCos --------------------------------*/
+
+sword OCINumberHypCos(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypCos - OCINumber takes the CoSine Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine hyperbolic
+        result (OUT) - result of the cosine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic cosine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberTan --------------------------------*/
+
+sword OCINumberTan(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberTan - OCINumber takes the TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent in radians
+        result (OUT) - result of the tangent
+   DESCRIPTION:
+        Takes the tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcTan --------------------------------*/
+
+sword OCINumberArcTan(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcTan - OCINumber takes the Arc TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc tangent
+        result (OUT) - result of the arc tangent in radians
+   DESCRIPTION:
+        Takes the arc tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------ OCINumberArcTan2 ---------------------------------*/
+
+sword OCINumberArcTan2(    OCIError *err, const OCINumber *number1, 
+                           const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberArcTan2 - OCINumber takes the ATan2 of 2 Oracle numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - first argument of atan2(y,x) function which 
+                corresponds to 'y' parameter in the function
+        number2 (IN) - second argument of atan2(y,x) function which 
+                corresponds to 'x' parameter in the function
+        result (OUT) - result of the atan2() in radians
+   DESCRIPTION:
+        Takes the atan2(number1, number2).
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number2' is 0
+ */
+
+/*----------------------------- OCINumberHypTan -----------------------------*/
+
+sword OCINumberHypTan(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypTan - OCINumber takes the TaNgent Hyperbolic of an Oracle
+                           number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent hyperbolic
+        result (OUT) - result of the tangent hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic tangent of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*--------------------------- OCINumberExp ----------------------------------*/
+
+sword OCINumberExp(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberExp - OCINumber EXPonential
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - e raised to this Oracle number power
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Raises e to the specified Oracle number power
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberLn ---------------------------------*/
+
+sword OCINumberLn(    OCIError *err, const OCINumber *number, 
+                      OCINumber *result    );
+/*
+   NAME: OCINumberLn - OCINumber Logarithm Natural
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - logarithm of this number is computed
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm of the given Oracle number with respect
+        to the given base.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+ */
+
+/*----------------------------- OCINumberLog --------------------------------*/
+
+sword OCINumberLog(    OCIError *err, const OCINumber *base, 
+                       const OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberLog - OCINumber LOGarithm any base
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the logarithm
+        number (IN) - opearnd
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm with the specified base of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+          'base' is <= 0
+ */
+
+/*****************************************************************************/
+/*                             ORACLE DATE TYPE                              */
+/*****************************************************************************/
+ 
+struct OCITime
+{
+  ub1 OCITimeHH;                          /* hours; range is 0 <= hours <=23 */
+  ub1 OCITimeMI;                     /* minutes; range is 0 <= minutes <= 59 */
+  ub1 OCITimeSS;                     /* seconds; range is 0 <= seconds <= 59 */
+};
+typedef struct OCITime OCITime;
+
+/* 
+ * OCITime - OCI TiMe portion of date
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetTime/OCIDateSetTime 
+ * to manipulate time portion of OCIDate.
+ */
+
+struct OCIDate
+{
+  sb2 OCIDateYYYY;         /* gregorian year; range is -4712 <= year <= 9999 */
+  ub1 OCIDateMM;                          /* month; range is 1 <= month < 12 */
+  ub1 OCIDateDD;                             /* day; range is 1 <= day <= 31 */
+  OCITime OCIDateTime;                                               /* time */
+};
+typedef struct OCIDate OCIDate;
+
+/* 
+ * OCIDate - OCI oracle Date representation in C
+ *
+ * OCIDate represents the C mapping of Oracle date.
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetDate/OCIDateSetDate
+ * to access/initialize OCIDate.
+ *
+ * For binding variables of type OCIDate in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_ODT.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle date.
+  
+     #define FMT "Month dd, YYYY, HH:MI A.M."
+     #define LANG "American"
+
+     struct person
+     {
+       OCIDate start_date;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person *joe;
+     sword status;                                           /o error status o/
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe person object in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe is pointing to the pinned object.
+      o/
+
+     /o set the start date of joe o/
+     OCIDateSetTime(&joe->start_date, 8, 0, 0);
+     OCIDateSetDate(&joe->start_date, 1990, 10, 5); 
+
+     /o check if the date is valid o/
+     uword invalid;
+     if (OCIDateCheck(err, &joe->start_date, &invalid) != OCI_SUCCESS)
+       /o error handling code o/
+     if (invalid)
+       /o error handling code o/
+
+     /o convert date for display purposes o/
+     char str[100];
+     ub4 strlen = sizeof(str);
+     if (OCIDateToText(err, &joe->start_date, FMT, sizeof(FMT)-1, LANG,
+                sizeof(LANG)-1, &strlen, str) != OCI_SUCCESS)
+       /o error handling code o/
+
+ */
+
+/*--------------------------- OCIDateGetTime --------------------------------*/
+/* void OCIDateGetTime(/o_ const OCIDate *date, ub1 *hour, ub1 *min, 
+                           ub1 *sec _o/); */
+#define OCIDateGetTime(date, hour, min, sec) \
+  { \
+     *hour = (date)->OCIDateTime.OCITimeHH; \
+     *min = (date)->OCIDateTime.OCITimeMI; \
+     *sec = (date)->OCIDateTime.OCITimeSS; \
+  }
+/*
+   NAME: OCIDateGetTime - OCIDate Get Time portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose time data is retrieved
+        hour (OUT) - hour value returned
+        min (OUT) - minute value returned
+        sec (OUT) - second value returned
+   DESCRIPTION:
+        Return time inforamtion stored in the given date. The time
+        information returned is: hour, minute and seconds.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateGetDate --------------------------------*/
+/* void OCIDateGetDate(/o_ const OCIDate *date, sb2 *year, ub1 *month, 
+                           ub1 *day _o/); */
+#define OCIDateGetDate(date, year, month, day) \
+  { \
+     *year = (date)->OCIDateYYYY; \
+     *month = (date)->OCIDateMM; \
+     *day = (date)->OCIDateDD; \
+  }
+/*
+   NAME: OCIDateGetDate - OCIDate Get Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is retrieved
+        year (OUT) - year value returned
+        month (OUT) - month value returned
+        day (OUT) - day value returned
+   DESCRIPTION:
+        Return year, month, day inforamtion stored in the given date.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetTime --------------------------------*/
+/* void OCIDateSetTime(/o_ OCIDate *date, ub1 hour, ub1 min, 
+                           ub1 sec _o/); */
+#define OCIDateSetTime(date, hour, min, sec) \
+  { \
+     (date)->OCIDateTime.OCITimeHH = hour; \
+     (date)->OCIDateTime.OCITimeMI = min; \
+     (date)->OCIDateTime.OCITimeSS = sec; \
+  }
+/*
+   NAME: OCIDateSetTime - OCIDate Set Time portion of date
+   PARAMETERS:
+        date (OUT) - Oracle date whose time data is set
+        hour (IN) - hour value to be set 
+        min (IN) - minute value to be set
+        sec (IN) - second value to be set
+   DESCRIPTION:
+        Set the date with the given time inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetDate --------------------------------*/
+/* void OCIDateSetDate(/o_ OCIDate *date, sb2 year, ub1 month, ub1 day _o/); */
+#define OCIDateSetDate(date, year, month, day) \
+  { \
+     (date)->OCIDateYYYY = year; \
+     (date)->OCIDateMM = month; \
+     (date)->OCIDateDD = day; \
+  }
+/*
+   NAME: OCIDateSetDate - OCIDate Set Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is set
+        year (OUT) - year value to be set
+        month (OUT) - month value to be set
+        day (OUT) - day value to be set
+   DESCRIPTION:
+        Set the date with the given year, month, day inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateAssign ---------------------------------*/
+
+sword OCIDateAssign(    OCIError *err, const OCIDate *from, 
+                        OCIDate *to    );
+/*
+   NAME: OCIDateAssign - OCIDate Assignment
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - date to be assigned
+        to (OUT) - lhs of assignment
+   DESCRIPTION:
+        Performs date assignment.
+   RETURNS:
+        OCI_SUCCESS
+ */
+
+/*--------------------------- OCIDateToText ---------------------------------*/
+
+sword OCIDateToText(    OCIError *err, const OCIDate *date, 
+                        const oratext *fmt, ub1 fmt_length, 
+                        const oratext *lang_name, ub4 lang_length, 
+                        ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCIDateToText - OCIDate convert date TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - Oracle date to be converted
+        fmt (IN) - conversion format, if null string pointer (oratext*)0, then
+                the date is converted to a character string in the
+                date format "DD-MON-YY".
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - specifies the language in which the names and 
+                abbreviations of months and days are returned;
+                default language of session is used if 'lang_name' 
+                is null i.e. (oratext *)0
+        lang_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+        buf (OUT) - buffer into which the converted string is placed
+   DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+ 
+        An error is reported upon overflow, e.g. trying to convert a number
+        of value 10 using format '9' causes an overflow.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          buffer too small
+          invalid format
+          unknown language
+          overflow error
+ */
+
+/*---------------------------- OCIDateFromText ------------------------------*/
+
+sword OCIDateFromText(    OCIError *err, const oratext *date_str, 
+                        ub4 d_str_length, const oratext *fmt, ub1 fmt_length, 
+                        const oratext *lang_name, ub4 lang_length, 
+                        OCIDate *date    );
+/*
+   NAME: OCIDateFromText - OCIDate convert String TO Date
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date_str (IN) - input string to be converted to Oracle date
+        d_str_length (IN) - size of the input string, if the length is -1
+                then 'date_str' is treated as a null terminated  string
+        fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in 'DD-MON-YY' format.
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - language in which the names and abbreviations of
+                days and months are specified, if null i.e. (oratext *)0,
+                the default language of session is used, 
+        lang_length (IN) - length of the 'lang_name' parameter
+        date (OUT) - given string converted to date
+   DESCRIPTION:
+        Converts the given string to Oracle date
+        according to the specified format. Refer to "TO_DATE" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid format
+          unknown language
+          invalid input string
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCompare ------------------------------*/
+
+sword OCIDateCompare(    OCIError *err, const OCIDate *date1, 
+                     const OCIDate *date2, sword *result    );
+/*
+   NAME: OCIDateCompare - OCIDate CoMPare dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - dates to be compared
+        result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+                1 if date1 > date2
+   DESCRIPTION:
+        The function OCIDateCompare compares two dates. It returns -1 if date1 
+        is smaller than date2, 0 if they are equal, and 1 if date1 is greater 
+        than date2.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------- OCIDateAddMonths --------------------------------*/
+
+sword OCIDateAddMonths(    OCIError *err, const OCIDate *date, sb4 num_months,
+                           OCIDate *result    );
+/*
+   NAME: OCIDateAddMonths - OCIDate ADd or subtract Months
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_months' added or subtracted from 'date'
+        num_months (IN) - number of months to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_months from the 
+        date 'date'.
+          If the input 'date' is the last day of a month, then 
+        appropriate adjustments are made to ensure that the output date is 
+        also the last day of the month. For example, Feb. 28 + 1 month =
+        March 31, and November 30 - 3 months = August 31. Otherwise the
+        'result' date has the same day component as 'date'. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateAddDays --------------------------------*/
+
+sword OCIDateAddDays(    OCIError *err, const OCIDate *date, sb4 num_days,
+                         OCIDate *result    );
+/*
+   NAME: OCIDateAddDays - OCIDate ADd or subtract Days
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_days' added or subtracted from 'date'
+        num_days (IN) - number of days to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_days from the 
+        date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateLastDay --------------------------------*/
+
+sword OCIDateLastDay(    OCIError *err, const OCIDate *date, 
+                         OCIDate *last_day    );
+/*
+   NAME: OCIDateLastDay - OCIDate get date of the LaST day of the month
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - input date
+        last_day (OUT) - last day of the month in date 'date'
+   DESCRIPTION:
+        The function OCIDateLastDay returns the date of the last day of the
+        month in date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*----------------------- OCIDateDaysBetween --------------------------------*/
+
+sword OCIDateDaysBetween(    OCIError *err, const OCIDate *date1, 
+                             const OCIDate *date2, sb4 *num_days    );
+/*
+   NAME: OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - input dates
+        num_days (OUT) - number of days between date1 and date2
+   DESCRIPTION:
+        The function OCIDateDaysBetween returns the number of days between 
+        date1 and date2. The time is ignored in this computation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------ OCIDateZoneToZone --------------------------------*/
+
+sword OCIDateZoneToZone(    OCIError *err, const OCIDate *date1,
+                            const oratext *zon1,
+                            ub4 zon1_length, const oratext *zon2, 
+                            ub4 zon2_length, OCIDate *date2    );
+/*
+   NAME: OCIDateZoneToZone - OCIDate convert date from one Zone TO another Zone
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1 (IN) - date to be converted
+        zon1 (IN) - zone of input date
+        zon1_length (IN) - length in bytes of string 'zon1'
+        zon2 (IN) - zone to be converted to
+        zon2_length (IN) - length in bytes of string 'zon2'
+        date2 (OUT) - converted date (in 'zon2')
+   DESCRIPTION:
+        Converts date from one time zone to another. Given date 'date1' 
+        in time zone 'zon1' returns date 'date2' in time zone 'zon2'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invlid date
+          invald input time zone
+          invald output time zone
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateNextDay --------------------------------*/
+
+sword OCIDateNextDay(    OCIError *err, const OCIDate *date, 
+                         const oratext *day_p, ub4 day_length, 
+                         OCIDate *next_day    );
+/*
+   NAME: OCIDateNextDay - OCIDate get date of Next DaY
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - returned date should be later than this date
+        day (IN) - first day of week named by this is returned
+        day_length (IN) - length in bytes of string 'day'
+        next_day (OUT) - first day of the week named by 'day' later than 'date'
+   DESCRIPTION:
+        Returns the date of the first day of the
+        week named by 'day' that is later than date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          invalid day
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCheck --------------------------------*/
+
+/* Listing of error bits used by OCIDateCheck() */
+#define OCI_DATE_INVALID_DAY            0x1                       /* Bad DAy */
+#define OCI_DATE_DAY_BELOW_VALID        0x2   /* Bad DAy Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MONTH          0x4                     /* Bad MOnth */
+#define OCI_DATE_MONTH_BELOW_VALID      0x8 /* Bad MOnth Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_YEAR           0x10                     /* Bad YeaR */
+#define OCI_DATE_YEAR_BELOW_VALID       0x20 /* Bad YeaR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_HOUR           0x40                     /* Bad HouR */
+#define OCI_DATE_HOUR_BELOW_VALID       0x80 /* Bad HouR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MINUTE         0x100                  /* Bad MiNute */
+#define OCI_DATE_MINUTE_BELOW_VALID     0x200
+                                           /* Bad MiNute Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_SECOND         0x400                  /* Bad SeCond */
+#define OCI_DATE_SECOND_BELOW_VALID     0x800
+                                           /* bad second Low/high bit (1=low)*/
+#define OCI_DATE_DAY_MISSING_FROM_1582  0x1000
+                                  /* Day is one of those "missing" from 1582 */
+#define OCI_DATE_YEAR_ZERO              0x2000    /* Year may not equal zero */
+#define OCI_DATE_INVALID_FORMAT         0x8000      /* Bad date format input */
+
+sword OCIDateCheck(    OCIError *err, const OCIDate *date, uword *valid    );
+/*
+   NAME: OCIDateCheck - OCIDate CHecK if the given date is valid
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - date to be checked
+        valid (OUT) -  returns zero for a valid date, otherwise 
+                the ORed combination of all error bits specified below:
+  
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID  0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+  
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the erroor returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+   DESCRIPTION:
+        Check if the given date is valid.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'date' and 'valid' pointers are NULL pointers
+ */
+
+/*--------------------------- OCIDateSysDate --------------------------------*/
+
+sword OCIDateSysDate(    OCIError *err, OCIDate *sys_date    );
+/*
+   NAME: OCIDateSysDate - OCIDate get current SYStem date and time
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        sys_date (OUT) - current system date and time
+   DESCRIPTION:
+        Returns the current system date and time.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          <to be discovered>
+ */
+
+/*****************************************************************************/
+/*                  FIXED-LENGTH STRING - CHAR (N)                           */
+/*****************************************************************************/
+
+/*
+ * An ADT attribute declared as "x CHAR(n)" is mapped to "OCIString *x;".
+ * The representation of OCIString * is shown below.
+ */
+
+/*****************************************************************************/
+/*                  VARIABLE-LENGTH STRING                                   */
+/*****************************************************************************/
+
+/*
+ * The variable-length string is represented in C as a pointer to OCIString
+ * structure. The OCIString structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length string.
+ *     
+ * A variable-length string can be declared as:
+ *
+ * OCIString *vstr;
+ *
+ * For binding variables of type OCIString* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_VST.
+ */
+typedef struct OCIString OCIString;
+
+/*-------------------------- OCIStringAssign --------------------------------*/
+ 
+sword OCIStringAssign(    OCIEnv *env, OCIError *err, const OCIString *rhs, 
+                          OCIString **lhs    );
+/*
+   NAME: OCIStringAssign - OCIString Assign String to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIString
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*---------------------- OCIStringAssignText --------------------------------*/
+ 
+sword OCIStringAssignText(    OCIEnv *env, OCIError *err, const oratext *rhs, 
+                              ub4 rhs_len, OCIString **lhs    );
+/*
+   NAME: OCIStringAssignText - OCIString Assign Text string to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is a text string
+        rhs_len (IN) - length of the 'rhs' string
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*-------------------------- OCIStringResize --------------------------------*/
+
+sword OCIStringResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                          OCIString **str    );
+/*
+   NAME: OCIStringResize - OCIString ReSiZe string memory
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new memory size of the string in bytes
+        str (IN/OUT) - allocated memory for the string is freed from the 
+                OOCI heap
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length string in
+        the object cache. The contents of the string are NOT preserved.
+        This function may allocate the string in a new memory region in
+        which case the original memory occupied by the given string will
+        be freed. If the input string is null (str == NULL), then this
+        function will allocate memory for the string.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'str' and a null pointer value is returned.
+ 
+        NOTE: The caller must compute 'new_size' taking into account space
+        for the null character ('\0').
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIStringSize --------------------------------*/
+
+ub4 OCIStringSize(    OCIEnv *env, const OCIString *vs    );
+/*
+   NAME: OCIStringSize - OCIString Get String siZe
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - string whose size is returned
+   DESCRIPTION:
+        Return the size of the given string.
+   RETURNS:
+        size of the string in bytes is returned
+ */
+
+/*----------------------------- OCIStringPtr --------------------------------*/
+
+oratext *OCIStringPtr(    OCIEnv *env, const OCIString *vs    );
+/*
+   NAME: OCIStringPtr - OCIString Get String Pointer
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - pointer to the text of this string is returned
+   DESCRIPTION:
+        Return the pointer to the text of the given string.
+   RETURNS:
+        pointer to the text of the string is returned
+ */
+
+/*----------------------- OCIStringAllocSize --------------------------------*/
+ 
+sword OCIStringAllocSize(    OCIEnv *env, OCIError *err, const OCIString *vs, 
+                             ub4 *allocsize    );
+/*
+   NAME: OCIStringAllocSize - OCIString get Allocated SiZe of string memory 
+                              in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        vs (IN) - string whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of string memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the string memory in bytes. The
+        allocated size is >= actual string size.
+   REQUIRES:
+        vs is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR on error
+ */
+
+/*****************************************************************************/
+/*                       VARIABLE-LENGTH RAW                                 */
+/*****************************************************************************/
+
+/*
+ * The variable-length raw is represented in C as a pointer to OCIRaw
+ * structure. The OCIRaw structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length raw.
+ *     
+ * A variable-length raw can be declared as:
+ *
+ * OCIRaw *raw;
+ *
+ * For binding variables of type OCIRaw* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_LVB.
+ */
+typedef struct OCIRaw OCIRaw;
+
+/*-------------------------- OCIRawAssignRaw --------------------------------*/
+ 
+sword OCIRawAssignRaw(    OCIEnv *env, OCIError *err, const OCIRaw *rhs, 
+                          OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to
+                   Raw (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIRaw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*------------------------ OCIRawAssignBytes --------------------------------*/
+ 
+sword OCIRawAssignBytes(    OCIEnv *env, OCIError *err, const ub1 *rhs, 
+                            ub4 rhs_len, OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignBytes - OCIRaw Assign raw Bytes (of type ub1*) to Raw 
+                   (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is ub1 *
+        rhs_len (IN) - length of the 'rhs' raw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIRawResize ---------------------------------*/
+ 
+sword OCIRawResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                       OCIRaw **raw    );
+/*
+   NAME: OCIRawResize - OCIRaw ReSiZe memory of variable-length raw
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new size of the raw data in bytes
+        raw (IN) - variable-length raw pointer; the raw is
+                resized to 'new_size'
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length raw in
+        the object cache. 
+        The previous contents of the raw are NOT preserved.
+        This function may allocate the raw in a new memory region in
+        which case the original memory occupied by the given raw will
+        be freed. If the input raw is null (raw == NULL), then this
+        function will allocate memory for the raw data.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'raw' and a null pointer value is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*------------------------------- OCIRawSize --------------------------------*/
+
+ub4 OCIRawSize(    OCIEnv * env, const OCIRaw *raw    );
+/*
+   NAME: OCIRawSize - OCIRaw Get Raw siZe
+   PARAMETERS:
+        env (IN)  - pointer to OCI environment handle
+        raw (INT) - raw whose size is returned
+   DESCRIPTION:
+        Return the size of the given raw.
+   RETURNS:
+        size of the raw in bytes is returned
+ */
+
+/*--------------------------------- OCIRawPtr -------------------------------*/
+ub1 *OCIRawPtr(    OCIEnv * env, const OCIRaw *raw    );
+/*
+   NAME: OCIRawPtr - OCIRaw Get Raw data Pointer
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        raw (IN) - pointer to the data of this raw is returned
+   DESCRIPTION:
+        Return the pointer to the data of the given raw.
+   RETURNS:
+        pointer to the data of the raw is returned
+ */
+
+/*------------------------------ OCIRawAllocSize ----------------------------*/
+ 
+sword OCIRawAllocSize(    OCIEnv *env, OCIError *err, const OCIRaw *raw,
+                          ub4 *allocsize    );
+/*
+   NAME: OCIRawAllocSize - OCIRaw get Allocated SiZe of raw memory in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        raw (IN) - raw whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of raw memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the raw memory in bytes. The
+        allocated size is >= actual raw size.
+   REQUIRES:
+        raw is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR upon error
+ */
+
+/*****************************************************************************/
+/*                     OBJECT REFERENCE OPERATIONS                           */
+/*****************************************************************************/
+
+/* 
+ * See the definition of OCIRef in oro.h.
+ *
+ * For binding variables of type OCIRef* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the code SQLT_REF.
+ * 
+ */
+
+/*---------------------------- OCIRefClear ----------------------------------*/
+void OCIRefClear(    OCIEnv *env, OCIRef *ref    );
+/*
+   NAME: OCIRefClear - OCIRef CLeaR or nullify a ref
+   PARAMETERS:
+        env (IN)     - pointer to OCI environment handle
+        ref (IN/OUT) - ref to clear
+   DESCRIPTION:
+        Clear or nullify the given ref. A ref is considered to be a null ref
+        if it does not contain a valid OID (and thus doesn't point to an
+        object). Logically, a null ref is a dangling ref.
+
+        Note that a null ref is still a valid SQL value and is not SQL-ly null.
+        It can be used as a valid non-null constant ref value for NOT NULL
+        column or attribute of a row in a table.
+        
+        If a null pointer value is passed as a ref,
+        then this function is a no-op.
+ */
+
+/*--------------------------- OCIRefAssign ----------------------------------*/
+sword OCIRefAssign(    OCIEnv *env, OCIError *err, const OCIRef *source, 
+                       OCIRef **target    );
+/*
+   NAME: OCIRefAssign - OCIRef CoPY a ref to another
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        source (IN) - ref to copy from
+        target (IN/OUT) - ref to copy to
+   DESCRIPTION:
+        Copy 'source' ref to 'target' ref; both then reference the same
+        object. If the target ref pointer is null (i.e. *target == NULL)
+        then the copy function will allocate memory for the target ref
+        in OOCI heap prior to the copy.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          1) out of memory
+ */
+
+/*-------------------------- OCIRefIsEqual ----------------------------------*/
+boolean OCIRefIsEqual(    OCIEnv *env, const OCIRef *x, const OCIRef *y    );
+/*
+   NAME: OCIRefIsEqual - OCIRef compare two refs for EQUality
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        x (IN)   - ref to compare
+        y (IN)   - ref to compare
+   DESCRIPTION:
+        Compare the given refs for equality.
+        Two refs are equal if and only if:
+          - they are both referencing the same persistent object, or
+          - they are both referencing the same transient object.
+
+        NOTE THAT TWO NULL REFS ARE CONSIDERED NOT EQUAL BY THIS FUNCTION.
+   RETURNS:
+        TRUE if the two refs are equal
+        FALSE if the two refs are not equal, or X is NULL, or Y is NULL
+ */
+
+/*--------------------------- OCIRefIsNull ----------------------------------*/
+boolean OCIRefIsNull(    OCIEnv *env, const OCIRef *ref    );
+/*
+   NAME: OCIRefIsNull - OCIRef test if a ref is NULl
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref to test for null
+   DESCRIPTION:
+        Return TRUE if the given ref is null; otherwise, return FALSE.
+        A ref is null if and only if:
+        - it is supposed to be referencing a persistent object, but
+          its OID is null, or
+        - it is supposed to be referencing a transient object, but it is
+          currently not pointing to an object.
+        A ref is a dangling ref if the object that it points to does not
+        exist.
+   RETURNS:
+        TRUE if the given ref is NULL
+        FALSE if the given ref is not NULL
+ */
+
+/*-------------------------- OCIRefHexSize ----------------------------------*/
+ub4 OCIRefHexSize(    OCIEnv *env, const OCIRef *ref    );
+/*
+   NAME: OCIRefHexSize - OCIRef Hexadecimal buffer SiZe in bytes
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref whose size in hexadecimal representation in bytes is
+                returned
+   DESCRIPTION:
+        Return the size of the buffer in bytes required for the hexadecimal
+        representation of the ref. A buffer of at-least this size must be
+        passed to ref-to-hex (OCIRefToHex) conversion function.
+   RETURNS:
+        size of hexadecimal representation of ref
+ */
+
+/*-------------------------- OCIRefFromHex ---------------------------------*/
+sword OCIRefFromHex(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                        const oratext *hex, ub4 length, OCIRef **ref    );
+/*
+   NAME:
+        OCIRefFromHex - OCIRef convert a Hexadecimal string TO a Ref
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        svc (IN) - OCI service context handle; if the resulting ref is
+                initialized with this service context
+        hex (IN) - hexadecimal string (that was produced by 'OCIRefToHex()"
+                previously) to be convert into a ref
+        length (IN) - length of the hexadecimal string
+        ref (IN/OUT) - ref is initialized with the given value ('hex').
+                If *ref is null, then space for the ref is allocated in the
+                object cache, otherwise the memory occupied by the given ref
+                is re-used.
+   DESCRIPTION:
+        Convert the given hexadecimal string into a ref. This function
+        ensures that the resulting ref is well formed. It does NOT ensure
+        that the object pointed to by the resulting ref exists or not.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+ */
+
+/*--------------------------- OCIRefToHex -----------------------------------*/
+sword OCIRefToHex(    OCIEnv *env, OCIError *err, const OCIRef *ref, 
+                      oratext *hex, ub4 *hex_length    );
+/*
+   NAME:
+        OCIRefToHex - OCIRef convert ref to a Hexadecimal string
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        ref (IN) - ref to be converted into a hexadecimal string; if the
+                ref is a null ref (i.e. OCIRefIsNull(ref) == TRUE) then
+                a zero hex_length value is returned
+        hex (OUT) - buffer that is large enough to contain the resulting
+                hexadecimal string; the contents of the string is opaque
+                to the caller
+        hex_length (IN/OUT) - on input specifies the size of the 'hex' buffer,
+                on output specifies the actual size of the hexadecimal
+                string being returned in 'hex'
+   DESCRIPTION:
+        Convert the given ref into a hexadecimal string, and return the length
+        of the string. The resulting string is opaque to the caller.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          the given buffer is not big enough to hold the resulting string
+ */
+
+
+/*****************************************************************************/
+/*                          COLLECTION FUNCTIONS                             */
+/*****************************************************************************/
+
+/* 
+   The generic collection is represented by the type 'OCIColl'. The following
+   operations OCIColl*() are provided on a generic collection:
+     - get current size of collection
+     - get upper bound of collection
+     - get pointer to an element given its index
+     - set element at given index (assign element)
+     - append an element 
+     - trim the given number of elements from the end of the collection
+     - collection assignment
+
+   The following iterator based scanning functions are also provided on a
+   generic collection. These functions make use of an iterator which is
+   defined to be of type OCIIter.
+
+     - create an iterator for scanning collection
+     - destroy iterator
+     - reset iterator to the beginning of collection
+     - get pointer to current element pointed by iterator
+     - get pointer to next element
+     - get pointer to previous element
+
+   The collections variable-length array (varray) and nested table
+   are sub-types of generic collection. This means that the OCIColl*() 
+   functions can also be used to manipulate varray and nested table.
+
+   The varray is represented by OCIArray type and nested table by OCITable.
+   Besides OCIColl*() functions no additional functions are provided for
+   manipulating varrays. The OCIColl*() functions are a complete set of 
+   functions to manipulate varrays.
+
+   Besides OCIColl*() functions, the following functions OCITable*() can be 
+   used to manipulate nested table. The OCITable*() functions operate on 
+   nested tables only and should not be used on a varray.
+
+     - delete an element at index i. Note that the position
+       ordinals of the remaining elements of the table is not changed by the
+       delete operation. So delete creates "holes" in the table.
+     - check if an element exists at the given index i
+     - return the smallest value of i for which exists(i) is true
+     - return the largest value of i for which exists(i) is true
+     - return pointer to the smallest position j, greater than i, such that 
+       OCITableExists(j) is true
+     - return pointer to the largest position j, less than i, such that 
+       OCITableExists(j) is true
+
+   For binding variables of type OCIColl* or OCITable* in OCI calls
+   (OCIBindByName(), OCIBindByPos() and OCIDefineByPos()) use the external
+   type code SQLT_NTY.
+ */
+
+/* OCIColl - generic collection type */
+typedef struct OCIColl OCIColl;
+
+/* OCIArray - varray collection type */
+typedef OCIColl OCIArray;
+
+/* OCITable - nested table collection type */
+typedef OCIColl OCITable;
+
+/* OCIIter - collection iterator */
+typedef struct OCIIter OCIIter;
+
+/*----------------------------- OCICollSize ---------------------------------*/
+
+sword OCICollSize( OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                   sb4 *size );
+/*
+   NAME: OCICollSize - OCIColl return current SIZe of the given collection
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection whose number of elements is returned
+        size (OUT) - current number of elements in the collection
+   DESCRIPTION:
+          Returns the current number of elements in the given collection.
+
+          For collections of type nested table wherein 'delete element'
+          operation is allowed, the count returned by OCICollSize() will
+          NOT be decremented upon deleting elements. For example:
+
+            OCICollSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCICollSize(...);
+            // 'size' returned will still be 5
+
+          To get the count minus the deleted elements use OCITableSize(). 
+          Continuing the above example,
+
+            OCITableSize(...)
+            // 'size' returned will be equal to 4
+
+          Note, a trim operation (OCICollTrim) will decrement the count 
+          by the number of trimmed elements. Continuing the above example,
+
+            OCICollTrim(..,1..); // trim one element
+            OCICollSize(...);
+            // 'size' returned will be equal to 4
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of collection into object cache
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCICollMax ---------------------------------*/
+
+sb4 OCICollMax(    OCIEnv *env, const OCIColl *coll    );
+/*
+   NAME: OCICollMax - OCIColl return MAXimum size (upper-bound) of the
+                   given collection (in number of elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        coll (IN) - collection whose upper-bound in number of elements 
+                is returned
+   DESCRIPTION:
+        Returns the max number of elements that the given collection can hold.
+        A value 0 indicates that the collection has no upper-bound.
+   REQUIRES:
+        coll must point to a valid collection descriptor
+   RETURNS:
+        upper-bound of the given collection
+ */
+
+/*-------------------------- OCICollGetElem ---------------------------------*/
+
+sword OCICollGetElem(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                         sb4 index, boolean *exists, void  **elem, 
+                         void  **elemind    );
+/*
+   NAME: OCICollGetElem - OCIColl GET pointer to the element at the given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointer to the element in this collection is returned
+        index (IN) - index of the element whose pointer is returned
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired element is returned
+        elemind (OUT) [optional] - address of the null indicator information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+   DESCRIPTION:
+        Get the address of the element at the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, const OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, const OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------- OCICollGetElemArray -----------------------------*/
+
+sword OCICollGetElemArray(  OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                            sb4 index, boolean *exists, void  **elem, 
+                            void  **elemind, uword *nelems);
+/*
+   NAME: OCICollGetElemArray - OCIColl GET pointers to elements from given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointers to the elements in this collection is returned
+        index (IN) - starting index of the element
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired elements is returned
+        elemind (OUT) [optional] - address of the null indicators information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+        nelems(IN/OUT) - Upper bound of elem and/or elemind array
+   DESCRIPTION:
+        Get the address of the elements from the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, const OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, const OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*----------------------- OCICollAssignElem ---------------------------------*/
+
+sword OCICollAssignElem(    OCIEnv *env, OCIError *err, sb4 index, 
+                            const void  *elem, 
+                            const void  *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAssignElem - OCIColl ASsign Element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element whose is assigned to
+        elem (IN) - element which is assigned from (source element)
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the assigned element will be set to non-null.
+        coll (IN/OUT) - collection to be updated
+   DESCRIPTION:
+        Assign the given element value 'elem' to the element at coll[index].
+        If the collection is of type nested table, the element at the given 
+        index may not exist (i.e. may have been deleted). In this case, the 
+        given element is inserted at index 'index'.
+        Otherwise, the element at index 'index' is updated with the value
+        of 'elem'.
+  
+        Note that the given element is deep-copied and 
+        'elem' is strictly an input parameter.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          given index is out of bounds of the given collection
+ */
+
+/*--------------------------- OCICollAssign ---------------------------------*/
+
+sword OCICollAssign(    OCIEnv *env, OCIError *err, const OCIColl *rhs, 
+                        OCIColl *lhs    );
+/*
+   NAME: OCICollAssign - OCIColl ASsiGn collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - collection to be assigned from
+        lhs (OUT) - collection to be assigned to
+   DESCRIPTION:
+        Assign 'rhs' to 'lhs'. The 'lhs' collection may be decreased or 
+        increased depending upon the size of 'rhs'. If the 'lhs' contains 
+        any elements then the elements will be deleted prior to the 
+        assignment. This function performs a deep-copy. The memory for the 
+        elements comes from the object cache.
+ 
+        An error is returned if the element types of the lhs and rhs 
+        collections do not match. Also, an error is returned if the 
+        upper-bound of the lhs collection is less than the current number of 
+        elements in the rhs collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          type mis-match of lhs and rhs collections
+          upper-bound of lhs collection is less than the current number of 
+          elements in the rhs collection
+ */
+
+/*--------------------------- OCICollAppend ---------------------------------*/
+
+sword OCICollAppend(    OCIEnv *env, OCIError *err, const void  *elem, 
+                        const void  *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAppend - OCIColl APPend collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the element which is appended to the end
+                of the given collection
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the appended element will be set to non-null.
+        coll (IN/OUT) - updated collection
+   DESCRIPTION:
+        Append the given element to the end of the given collection. 
+        Appending an element is equivalent to:
+          - increasing the size of the collection by 1 element
+          - updating (deep-copying) the last element's data with the given 
+            element's data
+  
+        Note that the pointer to the given element 'elem' will not be saved 
+        by this function. So 'elem' is strictly an input parameter.
+        An error is returned if the current size of the collection
+        is equal to the max size (upper-bound) of the collection prior to 
+        appending the element.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          current size of collection == max size of the collection
+ */
+
+/*----------------------------- OCICollTrim ---------------------------------*/
+
+sword OCICollTrim(    OCIEnv *env, OCIError *err, sb4 trim_num, 
+                      OCIColl *coll    );
+/*
+   NAME: OCICollTrim - OCIColl Trim elements from the end of the collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        trim_num (IN) - number of elements to trim
+        coll (IN/OUT) - 'trim_num' of elements are removed (freed) from the
+                end of the collection
+   DESCRIPTION:
+        Trim the collection by the given number of elements. The elements are 
+        removed from the end of the collection.
+  
+        An error is returned if the 'trim_num' is greater than the current 
+        size of the collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          'trim_num' is greater than the current size of the collection.
+ */
+
+/*--------------------------- OCICollIsLocator ------------------------------*/
+
+sword OCICollIsLocator(OCIEnv *env, OCIError *err, const OCIColl *coll,
+                       boolean *result );
+/*
+Name: OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+Parameters:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection item.
+        result (OUT) - TRUE if the collection item is a locator, FALSE
+                       otherwise
+Description:
+        Returns TRUE in the result OUT parameter if the collection item is a
+        locator, otherwise returns FALSE.
+Returns:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+*/
+
+/*---------------------------- OCIIterCreate --------------------------------*/
+
+sword OCIIterCreate(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                        OCIIter **itr    );
+/*
+   NAME: OCIIterCreate - OCIColl Create an ITerator to scan the collection
+                      elements
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (OUT) - address to the allocated collection iterator is
+                returned by this function
+   DESCRIPTION:
+        Create an iterator to scan the elements of the collection. The
+        iterator is created in the object cache. The iterator is initialized
+        to point to the beginning of the collection.
+  
+        If the next function (OCIIterNext) is called immediately 
+        after creating the iterator then the first element of the collection 
+        is returned. 
+        If the previous function (OCIIterPrev) is called immediately after 
+        creating the iterator then "at beginning of collection" error is 
+        returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+ */
+
+/*----------------------------- OCIIterDelete ------------------------------*/
+
+sword OCIIterDelete(    OCIEnv *env, OCIError *err, OCIIter **itr    );
+/*
+   NAME: OCIIterDelete - OCIColl Delete ITerator
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - the allocated collection iterator is destroyed and
+                the 'itr' is set to NULL prior to returning
+   DESCRIPTION:
+        Delete the iterator which was previously created by a call to 
+        OCIIterCreate.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          to be discovered
+ */
+
+/*----------------------------- OCIIterInit ---------------------------------*/
+
+sword OCIIterInit(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                      OCIIter *itr    );
+/*
+   NAME: OCIIterInit - OCIColl Initialize ITerator to scan the given 
+                   collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (IN/OUT) - pointer to an allocated  collection iterator
+   DESCRIPTION:
+        Initializes the given iterator to point to the beginning of the 
+        given collection. This function can be used to:
+  
+        a. reset an iterator to point back to the beginning of the collection 
+        b. reuse an allocated iterator to scan a different collection
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------ OCIIterGetCurrent --------------------------------*/
+
+sword OCIIterGetCurrent(    OCIEnv *env, OCIError *err, const OCIIter *itr, 
+                            void  **elem, void  **elemind    );
+/*
+   NAME: OCIIterGetCurrent - OCIColl Iterator based, get CURrent collection
+                    element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN) - iterator which points to the current element
+        elem (OUT) - address of the element pointed by the iterator is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+   DESCRIPTION:
+        Returns pointer to the current element and its corresponding null
+        information.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterNext --------------------------------*/
+
+sword OCIIterNext(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      void  **elem, void  **elemind, boolean *eoc    );
+/*
+   NAME: OCIIterNext - OCIColl Iterator based, get NeXT collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the next element
+        elem (OUT) - after updating the iterator to point to the next element,
+                address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        eoc (OUT) - TRUE if iterator is at End Of Collection (i.e. next
+                element does not exist) else FALSE
+   DESCRIPTION:
+        Returns pointer to the next element and its corresponding null
+        information. The iterator is updated to point to the next element.
+  
+        If the iterator is pointing to the last element of the collection
+        prior to executing this function, then calling this function will 
+        set eoc flag to TRUE. The iterator will be left unchanged in this
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterPrev --------------------------------*/
+
+sword OCIIterPrev(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      void  **elem, void  **elemind, boolean *boc    );
+/*
+   NAME: OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the previous 
+                element
+        elem (OUT) - after updating the iterator to point to the previous 
+                element, address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        boc (OUT) - TRUE if iterator is at Beginning Of Collection (i.e.
+                previous element does not exist) else FALSE.
+   DESCRIPTION:
+        Returns pointer to the previous element and its corresponding null
+        information. The iterator is updated to point to the previous element.
+  
+        If the iterator is pointing to the first element of the collection
+        prior to executing this function, then calling this function will 
+        set 'boc' to TRUE. The iterator will be left unchanged in this 
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*****************************************************************************/
+/*           FUNCTIONS WHICH OPERATE ONLY ON NESTED TABLE OCITable*()        */
+/*****************************************************************************/
+
+/*---------------------------- OCITableSize ---------------------------------*/
+
+sword OCITableSize( OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                    sb4 *size);
+/*
+   NAME: OCITableSize - OCITable return current SIZe of the given 
+                   nested table (not including deleted elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - nested table whose number of elements is returned
+        size (OUT) - current number of elements in the nested table. The count
+                does not include deleted elements.
+   DESCRIPTION:
+        Returns the count of elements in the given nested table. 
+
+        The count returned by OCITableSize() will be decremented upon 
+        deleting elements from the nested table. So, this count DOES NOT 
+        includes any "holes" created by deleting elements. 
+        For example:
+
+            OCITableSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCITableSize(...);
+            // 'size' returned will be equal to 4
+
+        To get the count plus the count of deleted elements use 
+        OCICollSize(). Continuing the above example,
+
+            OCICollSize(...)
+            // 'size' returned will still be equal to 5
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of nested table into object cache
+          any of the input parameters is null
+ */
+
+/*---------------------- OCITableExists ---------------------------------*/
+
+sword OCITableExists(    OCIEnv *env, OCIError *err, const OCITable *tbl,
+                             sb4 index, boolean *exists    );
+/*
+   NAME: OCITableExists - OCITable test whether element at the given index
+                    EXIsts
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table in which the given index is checked
+        index (IN) - index of the element which is checked for existence
+        exists (OUT) - set to TRUE if element at given 'index' exists
+                else set to FALSE
+   DESCRIPTION:
+        Test whether an element exists at the given 'index'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*--------------------------- OCITableDelete -------------------------------*/
+
+sword OCITableDelete(    OCIEnv *env, OCIError *err, sb4 index, 
+                      OCITable *tbl    );
+/*
+   NAME: OCITableDelete - OCITable DELete element at the specified index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element which must be deleted
+        tbl (IN) - table whose element is deleted
+   DESCRIPTION:
+        Delete the element at the given 'index'. Note that the position
+        ordinals of the remaining elements of the table is not changed by the
+        delete operation. So delete creates "holes" in the table.
+
+        An error is returned if the element at the specified 'index' has
+        been previously deleted.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          given index is not valid
+ */
+
+/*--------------------------- OCITableFirst ---------------------------------*/
+
+sword OCITableFirst(    OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                        sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return FirST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - first index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the first index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableLast ---------------------------------*/
+
+sword OCITableLast(    OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                       sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return LaST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - last index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the last index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableNext ---------------------------------*/
+
+sword OCITableNext(    OCIEnv *env, OCIError *err, sb4 index, 
+                       const OCITable *tbl, sb4 *next_index,
+                       boolean *exists    );
+/*
+   NAME: OCITableNext - OCITable return NeXT available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the next element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        next_index (OUT) - index of the next element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the smallest position j, greater than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no next index available
+ */
+
+/*---------------------------- OCITablePrev ---------------------------------*/
+
+sword OCITablePrev(    OCIEnv *env, OCIError *err, sb4 index, 
+                       const OCITable *tbl, sb4 *prev_index,
+                       boolean *exists    );
+/*
+   NAME: OCITablePrev - OCITable return PReVious available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the previous element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        prev_index (OUT) - index of the previous element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the largest position j, less than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no previous index available
+ */
+
+/*------------------------ OCINumberToLnx -----------------------------------*/
+/* void OCINumberToLnx(/o_ OCINumber *num _o/); */
+
+#define OCINumberToLnx(num) ((lnxnum_t *)num)
+
+/* 
+   NAME:   OCINumberToLnx
+   PARAMETERS:
+           num (IN) - OCINumber to convert ;
+   DESCRIPTION: 
+           Converts OCINumber to its internal lnx format 
+           This is not to be used in Public interfaces , but
+           has been provided due to special requirements from 
+           SQLPLUS development group as they require to call 
+           Core funtions directly . 
+*/
+
+/* OCI representation of XMLType */
+typedef struct OCIXMLType OCIXMLType;
+
+/* OCI representation of OCIDomDocument */
+typedef struct OCIDOMDocument OCIDOMDocument;
+
+/* OCI representation for the Binary XML repository context */
+typedef struct OCIBinXmlReposCtx OCIBinXmlReposCtx;
+
+#endif /* ORL_ORACLE */