|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел показывает, как вызвать хранимые процедуры, используя подготовленные операторы. Рекомендуется,
чтобы, прежде, чем работать через это, Вы сначала работали через предыдущее учебное руководство Раздел
21.4.7.2, "Вызывая Хранимые процедуры с Statement Объекты". Тот
раздел показывает хранимые процедуры, требуемые приложениями в этом разделе.
PreparedStatement для Хранимой
процедуры, Которая Не Возвращает РезультатаЭтот пример показывает, как вызвать хранимую процедуру, которая не возвращает набора результатов.
Сделайте копию учебного кода платформы:
shell> cp framework.cpp
ps_scenario1.cpp
Добавьте следующий код к try блок учебной платформы:
vector<string> code_vector;code_vector.push_back("SLD");code_vector.push_back("DSN");code_vector.push_back("ATL");vector<string> name_vector;name_vector.push_back("Sealand");name_vector.push_back("Disneyland");name_vector.push_back("Atlantis");vector<string> cont_vector;cont_vector.push_back("Europe");cont_vector.push_back("North America");cont_vector.push_back("Oceania");sql::Driver * driver = get_driver_instance();std::auto_ptr< sql::Connection > con(driver->connect(url, user, pass));con->setSchema(database);std::auto_ptr< sql::PreparedStatement > pstmt;pstmt.reset(con->prepareStatement("CALL add_country(?,?,?)"));for (int i=0; i<3; i++){ pstmt->setString(1,code_vector[i]); pstmt->setString(2,name_vector[i]); pstmt->setString(3,cont_vector[i]); pstmt->execute();}
Кроме того, некомментарий #include <vector> около вершины кода,
потому что векторы используются, чтобы хранить демонстрационные данные.
Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".
Выполните программу:
shell> ./ps_scenario1
Можно проверить, была ли база данных обновлена правильно при использовании этого запроса:
mysql>SELECT Code, Name, Continent FROM Country->WHERE Code IN('DSN','ATL','SLD');+------+------------+---------------+| Code | Name | Continent |+------+------------+---------------+| ATL | Atlantis | Oceania || DSN | Disneyland | North America || SLD | Sealand | Europe |+------+------------+---------------+
Код относительно прост, поскольку никакая обработка не обязана обрабатывать наборы результатов. Вызов процедуры,
CALL add_country(?,?,?), делается использованием заполнителей для входных
параметров, обозначенных '?'. Эти заполнители заменяются соответствующими
значениями данных, используя PreparedStatement объект setString
метод. for цикл устанавливается, чтобы выполнить итерации 3 раза, поскольку есть
три набора данных в этом примере. То же самое PreparedStatement выполняется три
раза, каждый раз с различными входными параметрами.
PreparedStatement для Хранимой
процедуры, Которая Возвращает Выходной ПараметрЭтот пример показывает, как обработать хранимую процедуру, которая возвращает выходной параметр.
Сделайте копию учебного кода платформы:
shell> cp framework.cpp
ps_scenario2.cpp
Добавьте следующий код к try блок учебной платформы:
vector<string> cont_vector;cont_vector.push_back("Europe");cont_vector.push_back("North America");cont_vector.push_back("Oceania");sql::Driver * driver = get_driver_instance();std::auto_ptr< sql::Connection > con(driver->connect(url, user, pass));con->setSchema(database);std::auto_ptr< sql::Statement > stmt(con->createStatement());std::auto_ptr< sql::PreparedStatement > pstmt;std::auto_ptr< sql::ResultSet > res;pstmt.reset(con->prepareStatement("CALL get_pop_continent(?,@pop)"));for (int i=0; i<3; i++){ pstmt->setString(1,cont_vector[i]); pstmt->execute(); res.reset(stmt->executeQuery("SELECT @pop AS _population")); while (res->next()) cout << "Population of " << cont_vector[i] << " is " << res->getString("_population") << endl;}
Кроме того, некомментарий #include <vector> около вершины кода,
потому что векторы используются, чтобы хранить демонстрационные данные.
Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".
Выполните программу:
shell> ./ps_scenario2Connector/C++ tutorial framework...Population of Europe is 730074600Population of North America is 482993000Population of Oceania is 30401150Done.
В этом сценарии a PreparedStatement объект создается что вызовы get_pop_continent хранимая процедура. Эта процедура берет входной параметр, и также
возвращает выходной параметр. Используемый подход должен создать другой оператор, который может использоваться,
чтобы выбрать выходной параметр, используя a SELECT запрос. Отметьте это когда
PreparedStatement создается, входной параметр к хранимой процедуре обозначается'?'.
До выполнения готового оператора необходимо заменить этого заполнителя фактическим значением. Это делается,
используя setString метод:
pstmt->setString(1,cont_vector[i]);
Хотя запрос, используемый, чтобы получить выходной параметр, возвращает только единственную строку, важно
использовать while цикл, чтобы поймать больше чем одну строку, избежать возможности
соединения, становящегося нестабильным.
PreparedStatement для Хранимой
процедуры, Которая Возвращает Набор результатовЭтот пример показывает, как обработать наборы результатов, произведенные хранимой процедурой.
Этот сценарий требует MySQL 5.5.3 или выше. Клиент-серверный протокол не поддерживает выбирающие многократные наборы результатов из хранимых процедур до 5.5.3.
Сделайте копию учебного кода платформы:
shell> cp framework.cpp
ps_scenario3.cpp
Добавьте следующий код к try блок учебной платформы:
sql::Driver * driver = get_driver_instance();std::auto_ptr< sql::Connection > con(driver->connect(url, user, pass));con->setSchema(database);std::auto_ptr< sql::PreparedStatement > pstmt;std::auto_ptr< sql::ResultSet > res;pstmt.reset(con->prepareStatement("CALL get_data()"));res.reset(pstmt->executeQuery());do { res.reset(pstmt->getResultSet()); while (res->next()) { cout << "Name: " << res->getString("Name") << " Population: " << res->getInt("Population") << endl; }} while (pstmt->getMoreResults());
Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".
Выполните программу:
shell> ./ps_scenario3
Обратите внимание на сгенерированный вывод.
Код выполняет хранимую процедуру, используя a PreparedStatement объект. Стандарт
do/while конструкция используется, чтобы
гарантировать, что все наборы результатов выбираются. Возвращенные значения выбираются от наборов результатов,
используя getInt и getString методы.