Поддерживает ли SQLite хранимые процедуры?
Если да, то как средствами Qt их вызвать?
Если нет, то какими способами этот недостаток можно обойти?
// база
wxSQLite3Database* pdb;
.....
// объявляем объект новой функции funcLog
SQLite3DBFunc funcLog(LogErrorCheck);
// (по сути, этот объект нигде не используется и нужен только для связи имени в запросе с функцией-обработчиком)
.....
// после открытия базы
pdb->CreateFunction(_T("LOG_ERROR_CHECK"),3,funcLog);
// в параметрах:
// имя функции для запроса, количество параметров и объект регистрируемой функции
....
// функция-обработчик
void LogErrorCheck(wxSQLite3FunctionContext& context)
{
// проверяем параметры функции
if(context.GetInt(/*[номер параметра]*/)==/*[какое-то значение]*/)
{
// например, возвращаем NULL
context.SetResultNull();
}
else
{
// например, возвращаем какое-то число
context.SetResult(/*[какое-то значение]*/);
}
}
// например, так:
select LOG_ERROR_CHECK(STATE,PLD_FUNCTION,PLD_VERSION) as ERROR from LOG
// тут STATE, PLD_FUNCTION,PLD_VERSION - поля таблицы, как обычно в запросах с функциями
#include <iostream>
#include <sqlite3.h>
using namespace std;
// вызываемая функция
void foo(sqlite3_context* context,int argc,sqlite3_value** argv)
{
if(argc!=1)
{
sqlite3_result_error_code(context,-1);
return;
}
switch( sqlite3_value_type(argv[0]) )
{
case SQLITE_INTEGER: {
long long int iVal = sqlite3_value_int64(argv[0]);
// пускай будет умножение на десять
iVal *= 10;
sqlite3_result_int64(context, iVal);
break;
}
default: {
sqlite3_result_null(context);
break;
}
}
}
int main()
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
// создали базу
rc = sqlite3_open("SQLiteTestDB",&db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
// создание тестовой таблицы
rc = sqlite3_exec(db,"create table TEST(id int)",0,0,&zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// создание функции
rc = sqlite3_create_function(db,"FOO",1,SQLITE_ANY,0, foo, 0,0);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: could not create function\n");
}
// положим в базу какие-то данные
rc = sqlite3_exec(db,"insert into TEST (id) values (1)",0,0,&zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
rc = sqlite3_exec(db,"insert into TEST (id) values (2)",0,0,&zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
// вычитаем данные
char **result;
int nrow,ncol;
rc = sqlite3_get_table(db,"select id,FOO(id) from TEST",
&result,&nrow,&ncol,&zErrMsg);
if( rc == SQLITE_OK ){
// заголовки
for(int i=0; i < ncol; ++i)
cout << result[i] << "\t";
cout << endl;
// данные
for(int i=1; i < nrow; ++i)
{
for(int j=0; j < ncol; ++j)
{
if(result[i*ncol+j] != 0)
{
cout << result[i*ncol+j] << "\t";
}
else
{
cout << "NULL" << "\t";
}
}
cout << endl;
}
}
sqlite3_free_table(result);
// закрыли базу
sqlite3_close(db);
return 0;
}