1

我正在尝试使用 odbc 动态创建一个表,我需要获取正确的类型字符串以在 create table 语句中使用。但是,似乎无法从 Oracle 驱动程序 (oracle-instantclient11.2-odbc-11.2.0.1.0-1.x86_64) 中获取任何 TYPE_NAME 字符串。使用以下类型调用 SQLGetTypeInfo(hStmt, sqlType) 总是返回一个空记录:

SQL_NUMERIC、SQL_INTEGER、SQL_BIGINT

我分别期待 NUMERIC、NUMERIC(10,0) 和 NUMERIC(19,0)。或 NUMBER 替换http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209中列出的数字:NUMBER(p,s)

相反,SQL_ALL_TYPES 列表显示根本不支持 NUMBER,而是有一个未记录的(对于上述链接)DECIMAL 类型。

知道为什么会出现这种行为以及如何在无需检查驱动程序连接 DBMS 名称的情况下获取正确的字符串吗?

PS:SQL_ALL_TYPES 返回:BLOB、LONG RAW、BFILE、RAW、CLOB、LONG、CHAR、DECIMAL、BINARY_FLOAT、BINARY_DOUBLE、DOUBLE PRECISION、DATE、VARCHAR2、NCHAR、NVARCHAR2、NCLOB

4

1 回答 1

0

Oracle 存储数值数据类型如下

NUMERIC:SQL_DECIMAL=3 大小 38,0
NUMERIC(10,0):SQL_DECIMAL=3 大小 10, 0
NUMERIC(19,0):SQL_DECIMAL=3 大小 19, 0

最后一位数字是比例,例如:-

NUMERIC(12,3) : SQL_DECIMAL=3 大小 12, 3

Easysoft等商业驱动程序确实支持 ODBC 中所需的数据类型:-

Full Connect(Default)

Env. Attr. SQL_ATTR_ODBC_VERSION set to SQL_OV_ODBC3

Successfully connected to DSN 'ESOracle32'.
SQLGetTypeInfo:
                In:             StatementHandle = 0x00DD7C58, DataType = SQL_INTEGER=4
                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"
"INTEGER", 4, 9, <Null>, <Null>, <Null>, 1, 0, 3, 0, 0, 0, "NUMBER(9)", <Null>, <Null>, 6, <Null>, 10, <Null>
1 row fetched from 19 columns.

SQLGetTypeInfo:
                In:             StatementHandle = 0x00DD7C58, DataType = SQL_NUMERIC=2
                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"
"NUMBER", 2, 38, <Null>, <Null>, "precision,scale", 1, 0, 3, 0, 0, 0, "NUMBER", <Null>, <Null>, 2, <Null>, 10, <Null>
1 row fetched from 19 columns.
于 2012-07-25T08:20:14.027 回答