为啥 Oracle odbc 驱动程序没有为整数和数字类型提供 TYPE_NAME?

Posted

技术标签:

【中文标题】为啥 Oracle odbc 驱动程序没有为整数和数字类型提供 TYPE_NAME?【英文标题】:Why Oracle odbc driver gives no TYPE_NAME for integers and numeric types?为什么 Oracle odbc 驱动程序没有为整数和数字类型提供 TYPE_NAME? 【发布时间】:2012-07-24 16:18:22 【问题描述】:

我正在尝试使用 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、双精度、日期、VARCHAR2、NCHAR、NVARCHAR2、NCLOB

【问题讨论】:

你试过 SQL_ALL_TYPES 看看它支持什么? 根据 SQL_ALL_TYPES 输出似乎根本不支持 NUMBER 类型(我已经在上面编辑过) 尝试将 SQL_DECIMAL 传递给 SQLGetTypeInfo。请参阅the ODBC docs,特别是附录 D。分享和享受。 【参考方案1】:

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.

【讨论】:

感谢您的回答,但我的问题是关于 ODBC 驱动程序以及如何直接从 Oracle 驱动程序获得响应,查询标准 odbc 枚举 您无法通过 ODBC 调用来获取 NUMERIC 类型,因为 Oracle 驱动程序无法通过 ODBC 识别 NUMERIC 类型。我转换输出的方式是创建一个带有数字列的表,然后在该列上执行 SQLDescribeCol。 更不用说 SQL_NUMERIC,甚至 SQL_INTEGER 也无法识别,如果故意省略,在我看来是 Oracle 驱动程序中的一个巨大的互操作性漏洞。同时,我已将它们硬编码到我的“getTypeName”函数中,由驱动程序区分 DBMS 名称,但这远非理想的解决方案。

以上是关于为啥 Oracle odbc 驱动程序没有为整数和数字类型提供 TYPE_NAME?的主要内容,如果未能解决你的问题,请参考以下文章

oracle已经配置好odbc数据源为啥打开access还是无法连接oracle

ODBC数据源:没有ORACLE用户DSN,也没有驱动程序?

oracle数据库表中某个字段设置为NUMBER(10,2),为啥在页面只能输入6位整数,只有超过6位就报错

如何使用odbc驱动程序安装oracle 12c

如何使用 odbc 驱动程序安装 oracle 12c

访问 ODBC:为数字(整数)字段返回了错误的值