crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> SQLite и хранимые процедуры, Поддерживает ли SQLite хранимые процедуры
legat
  опции профиля:
сообщение 9.8.2010, 17:03
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 8.8.2010
Пользователь №: 1940

Спасибо сказали: 0 раз(а)




Репутация:   0  


Поддерживает ли SQLite хранимые процедуры?
Если да, то как средствами Qt их вызвать?
Если нет, то какими способами этот недостаток можно обойти?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 10.8.2010, 11:40
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Ради эксперимента написала тестовую реализацию только через стандартный sqlite3 интерфейс.
Если кому интересно, то вот:

Раскрывающийся текст
#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;
}


Сообщение отредактировал Iron Bug - 10.8.2010, 11:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 2:04