Let's continue with Oracle's ODBC driver!
It seems, that many column values are processed at the client
side. It's a pity, because in this way the SQL statement contains
less useful information.
REMARKS are omitted at all! (There is no join with ALL_COL_COMMENTS.)
COLUMN_DEFs are omitted! Maybe, because ALL_TAB_COLUMNS.DATA_DEFAULT
is a LONG?
CHAR_OCTET_LENGTHs are omitted!
The BUFFER_LENGTH for FLOATS looks dubious. How fit 8 bytes into
126 bits ... er ... vice versa: how fit 126 bits (the max. binary
precision of FLOATs) into an 8 byte buffer?
In addition to base tables, they provide the column information for
SYNONYMS too.
Steffen
Oracle ODBC 8.1.7:
==================
MS ODBC Test 2.60.0905
----------------------
Get Info All:
SQL_DBMS_NAME = 17, 6, "Oracle"
SQL_DBMS_VER = 18, 10, "08.01.0721"
SQL_DM_VER = 171, 15, "03.52.6019.0000"
SQL_DRIVER_NAME = 6, 11, "SQORA32.DLL"
SQL_DRIVER_ODBC_VER = 77, 5, "03.51"
SQL_DRIVER_VER = 7, 10, "08.01.0704"
SQL_ODBC_VER = 10, 10, "03.52.0000"
SQLColumns:
In:
StatementHandle = 0x008A1860
CatalogName = SQL_NULL_HANDLE, NameLength1 = 0
SchemaName = "TST" , NameLength2 = 3
TableName = "TYPETEST" , NameLength3 = 8
ColumnName = SQL_NULL_HANDLE, NameLength4 = 0
Return:
SQL_SUCCESS = 0
Get Data All:
TABLE TABLE TABLE COLUMN DATA TYPE COLUMN BUFFER DECIMAL NUM_PREC
NULLABLE REMARKS COLUMN SQL_DATA SQL_DATE CHAR_OCTET ORDINAL IS
CAT SCHEM NAME NAME TYPE NAME SIZE LENGTH DIGITS RADIX
DEF TYPE TIME_SUB LENGTH POSITION NULLABLE
----- ----- -------- --------------- ---- ------------ ------ ------ ------- --------
-------- ------- ------ -------- -------- ---------- -------- --------
"" TST TYPETEST CINTEGER 3 DECIMAL 38 40 0 10
0 "" "" 3 1 NO
"" TST TYPETEST CNUMBER 8 DOUBLE PRECISION 0 40 <Null> 10
1 "" "" 8 2 YES
"" TST TYPETEST CNUMBER_38_0 3 DECIMAL 38 40 0 10
1 "" "" 3 3 YES
"" TST TYPETEST CNUMBER_11_2 3 DECIMAL 11 13 2 10
1 "" "" 3 4 YES
"" TST TYPETEST CNUMBER_XX_2 3 DECIMAL 38 40 2 10
1 "" "" 3 5 YES
"" TST TYPETEST CFLOAT 8 DOUBLE PRECISION 38 8 <Null> 10
1 "" "" 8 6 YES
"" TST TYPETEST CFLOAT_11 8 DOUBLE PRECISION 4 8 <Null> 10
1 "" "" 8 7 YES
"" TST TYPETEST CREAL 8 DOUBLE PRECISION 19 8 <Null> 10
1 "" "" 8 8 YES
"" TST TYPETEST CDOUBLE_PRECISION 8 DOUBLE PRECISION 38 8 <Null> 10
1 "" "" 8 9 YES
"" TST TYPETEST CDATE 93 DATE 19 16 <Null> <Null>
1 "" "" 9 3 10 YES
"" TST TYPETEST CCHAR 1 CHAR 1 1 <Null> <Null>
1 "" "" 1 11 YES
"" TST TYPETEST CVARCHAR 12 VARCHAR2 7 7 <Null> <Null>
1 "" "" 12 12 YES
"" TST TYPETEST CVARCHAR2 12 VARCHAR2 7 7 <Null> <Null>
1 "" "" 12 13 YES
13 rows fetched from 18 columns.
SELECT /*+ RULE */
''
, owner
, table_name
, column_name
, 0
, data_type
, data_precision
, decode( data_type
,'DATE' , 16
,'FLOAT' , 8
,'LONG RAW', 2147483647
,'LONG' , 2147483647
,'CLOB' , 2147483647
,'BLOB' , 2147483647
,'BFILE' , 2147483647
,'NUMBER' , NVL( data_precision + 2, 40 )
, data_length
)
, data_scale
, 0
, decode( nullable, 'Y', 1, 'N', 0 )
, ''
, ''
, 0
, 0
, 0
, column_id
, decode( nullable, 'Y', 'YES', 'N', 'NO')
FROM all_tab_columns
WHERE TABLE_NAME LIKE 'TYPETES%'
AND OWNER = 'TST'
UNION
SELECT /*+ RULE */
''
, b.owner
, b.synonym_name
, a.column_name
, 0
, a.data_type
, a.data_precision
, a.data_length
, a.data_scale
, 0
, decode(a.nullable, 'Y', 1, 'N', 0)
, ''
, ''
, 0
, 0
, 0
, a.column_id
, decode(a.nullable, 'Y', 'YES', 'N', 'NO')
FROM all_tab_columns a
, all_synonyms b
WHERE a.table_name = b.table_name
and a.owner = b.table_owner
AND b.synonym_name LIKE 'TYPETES%'
AND b.OWNER = 'TST'
ORDER BY 2,3,17