Используя пользовательские оболочки C ++ OCI, я могу успешно зарегистрировать CQN C ++, основанную на обратном вызове, но похоже, что подписка сразу же отбрасывается, за моей спиной. Я не перезваниваю на простых DML. Если я пытаюсь отменить регистрацию той подписки, для которой register () работала просто отлично, я получаю ORA-29970: указанный идентификатор регистрации не существует.
Я запускаю этот тест на Win7 (64-битной) коробке, на которой запущен локальный сервер Oracle 11.2.0.1.0, и я подключаюсь к клиентскому приложению C ++, созданному для InstantClient-11.2.0.2.0, который работает на той же машине ,
У меня заканчиваются идеи по этому вопросу, и я был бы признателен за некоторые идеи о том, что еще я мог бы попробовать или проверить.
Я начинаю задаваться вопросом, должен ли CQN быть активированный как-то. Мои навыки администратора практически отсутствуют, это стандартная установка 11gR1 на Windows с использованием установщика, без каких-либо специальных настроек или настроек.
Спасибо, —DD
Обновление № 1
Коллега успешно выполнил тот же тест, и он запустил его, используя предоставленный сервером файл oci.dll. Я попытался это (я строю с использованием InstantClient, но принудительно PATH во время выполнения: Path=D:\oracle\product\11.2.0\dbhome_1\BIN;$(Path)
в VS Property Page> Отладка> Окружающая среда), и действительно, тест CQN работает! Мы до сих пор не выяснили, небольшая разница в версии между клиентом и сервером, или используя InstantClient ( Свет Вариант, кстати) против полного клиента против установки сервера является реальным виновником.
Но это плохие новости более новый InstantClient не поддерживает CQN …
Обновление № 2
Я перепробовал все 6 комбинаций InstantClient Свет (65 МБ) или Нормальный (150 МБ) в версиях 12.2.0. (1 | 2 | 3) .0 на Win64, и ни одна из них не работала. Мы еще не тестировали Full Client, и мы еще не тестировали Linux.
Environment_var cqn_env = Environment::create(OCI_EVENTS + OCI_OBJECT);
Connection_var cqn_conn = Connection::logon2(...);
Subscription sub(cqn_conn, "cqn_test", OCI_SUBSCR_NAMESPACE_DBCHANGE);
sub.set<attr::SUBSCR_CALLBACK>( &cqn_callback_func );
sub.set<attr::SUBSCR_CQ_QOSFLAGS>( OCI_SUBSCR_CQ_QOS_QUERY );
try {
sub.register_self();
} catch (const OracleException& ex) {
BOOST_REQUIRE(ex.error_code && *ex.error_code == 29972);
cerr << "\nSKIPPED: test requires CHANGE NOTIFICATION privilege" << endl;
return;
}
Задача ещё не решена.
Других решений пока нет …