Я какое-то время ковырял свой мозг, пытаясь понять это.
Проблема, с которой я столкнулся, заключается в том, что функция, которую я использую в Oracle, возвращает BLOB. Это список элементов, которые объединяются с использованием ||.
Из проведенного мною исследования
- В документах QSQLQuery говорится "Хранимые процедуры, использующие оператор return для возврата значений или возврат нескольких результатов". наборы, поддерживаются не полностью. Подробности c см. SQL Драйверы базы данных. " - что наводит меня на мысль, что мне может понадобиться переключиться на другую кодовую базу, если Qt пока не может справиться с этим.
- В документации для драйвера QOCI упоминается, что этот "двоичные большие объекты (BLOB) можно читать и записывать, но помните, что для этого процесса может потребоваться много памяти. Вам следует использовать запрос перенаправления только для выбора полей больших объектов (см. QSqlQuery :: setForwardOnly ()). "
Я установил
query.setForwardOnly(true);
До того, как подготовил или выполнил оператор.
Тем не менее, я все еще получаю эту ошибку
QSqlError("6502", "Unable to execute statement", "ORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 55\n")
Мне пришлось немного почистить код, я надеюсь, что это все еще полезно, чтобы дать контекст тому, что я пытаюсь contribli sh
temp_clob clob;
name varchar2(183) := ?;
start varchar2(16) := ?;
end varchar2(16) := ?;
count integer := ?;
return_val named_redacted_table_object; -- Sorry had to remove this, it's a table with more Date, Varchar, etc
begin
dbms_lob.createtemporary(temp_clob, true);
return_val := package_name.function_name (
set_name => name,
start_time => to_date(start, 'yyyy-mm-dd hh24:mi'),
end_time => to_date(end, 'yyyy-mm-dd hh24:mi'),
max_count => count);
-- In here was a loop that would break apart the removed table object and make it into strings along the following lines
-- '' || return_val(i).name || return_val(i).value || etc
-- and would store these into the CLOB / temp_clob
? := temp_clob;
end;
Я не мог заставить что-то столь простое работать
begin
? := 'test123';
end;
С предположением, что я мог бы по крайней мере прочитать эту строку в Qt.
Вот мой код для Qt
QString name = "test";
QSqlQuery query(db);
query.setForwardOnly(true);
query.prepare(sql);
QString test_sql_text = ui->comboBox_test_text->currentText();
qDebug() << name;
query.bindValue(0, name);
query.bindValue(1, "2003-03-14 00:00");
query.bindValue(2, "2005-03-14 23:00");
query.bindValue(3, 2);
query.bindValue(4, QString(""), QSql::Out);
bool query_executed_ok = query.exec();
qDebug() << "did it execute?" << query_executed_ok;
// qDebug() << query.executedQuery();
qDebug() << query.boundValues();
qDebug() << query.lastError();
QSqlRecord rec = query.record();
qDebug() << rec;
int record_count = rec.count();
qDebug() << "Records: " << record_count;
while (query.next()) {
for(int i=0;i<record_count;i++) {
qDebug() << query.isValid() << " - " << rec.fieldName(i) << " " << query.value(i).toString();
}
}