typedef int (*function);
Это не определение типа указателя на функцию. Это указатель на int. Указатель на функцию выглядит как-то так:
typedef int (*function)(void);
status = sqlite3_open_v2(TEMP_DB_PATH, &sql_db, SQLITE_OPEN_READONLY, NULL);
Это выглядит как обычное связывание. Потому что sqlite3_open_v2 выглядит как имя функции, а не указателя, полученного через GetProcAddress. Чтобы оно работало нужно правильное объявление функции sqlite3_open_v2 во время компиляции и нужно линковаться с implib sqlite3 во время линковки.
Но в чём смысл мешать в одном и том же коде такое связывание и LoadLibrary/GetProcAddress?
sqlite3_close(sql_db);
Если sqlite3_close принимает параметр, этот параметр должен быть и в typedef которым определён его тип. Например:
typedef sqlite3;
typedef int (*fn1) (sqlite3* db);