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)を期待していました。またはhttp://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209にリストされているように数値を置き換える NUMBER : 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,0NUMERIC(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 に答える