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)

СРР-код:

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 для запроса данных из оракула, я получаю эту ошибку: ORA-01455: преобразование столбца переполняет целочисленный тип данных

моя система - 64-битная система Centos, и я знаю, что int - 2147483647, а ORACLE INTEGER - от -231) до (231)-1. так почему я получаю эту ошибку переполнения? спасибо


person Robin    schedule 24.09.2015    source источник


Ответы (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);
person BJovke    schedule 19.11.2015