> DBD::Oracle currently sets $sth->{TYPE} to 9 (SQL_DATE) for DATE fields.
> Seems logical at first but Oracle DATE fields are really date+time fields.
> Oracle's own ODBC drivers return 11 (SQL_TIMESTAMP) for DATE fields and
> I'm planning to change DBD::Oracle to do likewise.
> 
> Tim.
> 
That's only part of the story!

- Up to version 8.1.7, Oracle supports only one temporal datatype:
  DATE, which has a granularity of second.
  The following datatypes are new for Oracle9i:
    TIMESTAMP
    TIMESTAMP WITH [LOCAL]TIME ZONE
    INTERVAL YEAR TO MONTH
    INTERVAL DAY TO SECOND

- DBI's statement handle returns: TYPE=9.
  This is SQL_DATETIME in ODBC and SQL/CLI.

- DBI's type_info returns: DATA_TYPE=11.
  This is SQL_TIMESTAMP in ODBC >= 3.0 and not defined in SQL/CLI.

- Oracle's ODBC driver 8.1.6 returns (SQLGetTypeInfo): DATA_TYPE=11,
  if SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC2.
  Same for SQLDescribeCol.

- Oracle's ODBC driver 8.1.6 returns (SQLGetTypeInfo): DATA_TYPE=93,
  if SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3.
  This is SQL_TYPE_TIMESTAMP in ODBC and SQL/CLI.
  Same for SQLDescribeCol.


Steffen
SQLGetTypeInfo:
        In:     StatementHandle = 0x00D31870, DataType = SQL_ALL_TYPES=0
        Return: SQL_SUCCESS=0

Get Data All:
"TYPE_NAME", "DATA_TYPE", "COLUMN_SIZE", "LITERAL_PREFIX", "LITERAL_SUFFIX", 
"CREATE_PARAMS", "NULLABLE", "CASE_SENSITIVE", "SEARCHABLE", "UNSIGNED_ATTRIBUTE", 
"FIXED_PREC_SCALE", "AUTO_UNIQUE_VALUE", "LOCAL_TYPE_NAME", "MINIMUM_SCALE", 
"MAXIMUM_SCALE", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "NUM_PREC_RADIX", 
"INTERVAL_PRECISION"
"BLOB", -4, 2147483647, "'", "'", <Null>, 1, 1, 0, <Null>, 0, <Null>, "BLOB", <Null>, 
<Null>, -4, <Null>, <Null>, <Null>
"LONG RAW", -4, 2147483647, "'", "'", <Null>, 1, 0, 0, <Null>, 0, <Null>, "LONG RAW", 
<Null>, <Null>, -4, <Null>, <Null>, <Null>
"BFILE", -4, 2147483647, "'", "'", <Null>, 1, 1, 0, <Null>, 0, <Null>, "BFILE", 
<Null>, <Null>, -4, <Null>, <Null>, <Null>
"RAW", -3, 2000, "'", "'", "max length", 1, 0, 3, <Null>, 0, <Null>, "RAW", <Null>, 
<Null>, -3, <Null>, <Null>, <Null>
"CLOB", -1, 2147483647, "'", "'", <Null>, 1, 1, 0, <Null>, 0, <Null>, "CLOB", <Null>, 
<Null>, -1, <Null>, <Null>, <Null>
"LONG", -1, 2147483647, "'", "'", <Null>, 1, 1, 0, <Null>, 0, <Null>, "LONG", <Null>, 
<Null>, -1, <Null>, <Null>, <Null>
"CHAR", 1, 2000, "'", "'", "max length", 1, 1, 3, <Null>, 0, 0, "CHAR", <Null>, 
<Null>, 1, <Null>, <Null>, <Null>
"DECIMAL", 3, 38, <Null>, <Null>, "precision,scale", 1, 0, 3, 0, 0, 0, "DECIMAL", 0, 
38, 3, <Null>, 10, <Null>
"DOUBLE PRECISION", 8, 15, <Null>, <Null>, <Null>, 1, 0, 3, 0, 0, 0, "DOUBLE 
PRECISION", <Null>, <Null>, 8, <Null>, 10, <Null>
"DATE", 93, 19, "'", "'", <Null>, 1, 0, 3, <Null>, 0, 0, "DATE", 0, 0, 9, 3, <Null>, 
<Null>
"VARCHAR2", 12, 4000, "'", "'", "max length", 1, 1, 3, <Null>, 0, 0, "VARCHAR2", 
<Null>, <Null>, 12, <Null>, <Null>, <Null>
11 rows fetched from 19 columns.


SQLDescribeCol:
        In:     StatementHandle = 0x00D31870, ColumnNumber = 10, 
                ColumnName = 0x0014F860, BufferLength = 300, NameLengthPtr = 
0x0014AF70, 
                DataTypePtr = 0x0014E960, ColumnSizePtr = 0x0014E978, DecimalDigits = 
0x0014E990, 
                NullablePtr = 0x0014E9A8
        Return: SQL_SUCCESS=0
        Out:    *ColumnName = "CDATE", *NameLengthPtr = 5, 
                *DataTypePtr = SQL_TYPE_TIMESTAMP=93, *ColumnSizePtr = 19, 
*DecimalDigits = 0, *NullablePtr = SQL_NULLABLE=1

Reply via email to