QT访问带有返回值的Oracle存储过程
环境:win32, Qt 5.12.9, Orale 11g, 自行编译的QOCI驱动。
本想偷个懒百度一段代码应付差事,结果没找到特别解渴的东西,只好自己研究一下。
Qt联机文档关于bindValue说明是这样的:
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
Set the placeholder placeholder to be bound to value val in the prepared statement. Note that the placeholder mark (e.g :) must be included when specifying the placeholder name.
If paramType is QSql::Out or QSql::InOut, the placeholder will be overwritten with data from the database after the exec() call. In this case, sufficient space must be pre-allocated to store the result into.
bindValuer 的参数,如果不需要返回值,写两个就可以:一个参数名,一个参数值。
需要返回值的时候要写三个:一个名,一个值,一个说明。返回值的说明可能是QSql::Out或者 QSql::InOut。
对于有返回值的参数,最重要一点是留出足够的空间来容纳返回内容。如果是字串内容,可以申请一个足够大的字符数组,或者如果这个值不是太大,那就直接定义一个够大的QString,
示例代码片段如下:
QSqlQuery qr;
char charOut[32];
for(int i = 0; i < 32; i++){
charOut[i] = '0';
}
int intOut;
qr.prepare("call prc_test(:v1, :v2, :v3)");
qr.bindValue(":v1", "test");
qr.bindValue(":v2", charOut, QSql::Out);
qr.bindValue(":v3", intOut, QSql::Out);
qr.exec();
qDebug()<<qro->boundValue(":v1").toString()<<qro->boundValue(":v2").toString();
上面的charOut[32],也可以这么写:
QString charOut = "12345678901234567890123456789012";
结果都一样。
参数的 char 数组一定要初始化,否则返回结果不可靠。有时正常有时会被随机截断,造成返回结果错误。
bindValue还有一种写法,说明是这样的:
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
上面的代码如果用这个形式来写,对应部分应该这样:
qr.prepare("call prc_test(?, ?, ?)");
qr.bindValue(0, "test");
qr.bindValue(1, charOut, QSql::Out);
qr.bindValue(2, intOut, QSql::Out);
qDebug()<<qro->boundValue(1).toString()<<qro->boundValue(2).toString();