OCCI: ORA-01455: преобразование целочисленного типа переполнения столбца
Таблица:
CREATE TABLE STU(ID INT PRIMARY KEY, NAME VARCHAR2(20), AGE INT)
INSERT INTO STU VALUES(1, 'ZJW', 24)
INSERT INTO STU VALUES(2, 'YGL', 25)
INSERT INTO STU VALUES(3, 'ZLY', 24)
INSERT INTO STU VALUES(4, 'LBZ', 22)
код cpp:
int nId;
string strName;
int nAge;
cout << "ID\t" << "NAME\t" << "AGE" << endl;
while (rs->next() == true)
{
// get values using the getXXX() methods of Resultset
nId = rs->getInt(1);
strName = rs->getString(2);
nAge = rs->getInt(3);
cout << nId << "\t" << strName << "\t" << nAge << endl;
}
Когда я использую Occi для запроса данных из Oracle, я получаю эту ошибку: ORA-01455: преобразование столбца переполнения целочисленный тип данных
моя система - это 64-битные сентосы, и я знаю, что int - это 2147483647, а для целого оракула - от -231) до (231) -1. так почему я получаю эту ошибку переполнения? ТКС.
1 ответ
Не имеет значения, является ли ваша система 64-битной. Если вы скомпилировали вашу программу как 32-битную, то она будет работать как 32-битная.getInt
Функция определяется как (32-битный OCCI 12):
virtual int getInt(unsigned int colIndex)=0;
Целочисленный размер в C/C++ может составлять от 2 до 8 байт, в зависимости от типа процессора, ОС, компилятора и того, является ли программа 32-битной или 64-битной. Может быть, в вашем случае getInt
использует 2 байта для целого числа, если программа 32-битная, и вы получаете эту ошибку.
Вы можете проверить размер int в вашей программе, добавив эту строку кода перед циклом while:
cout << "Int size: " << sizeof(int) << endl;
Странно, похоже что функции нет getLong
в ResultSet
учебный класс. Может быть, это будет работать:
unsigned long nAge=(unsigned long)rs->getNumber(3);