Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел показывает, как вызвать хранимые процедуры, используя подготовленные операторы. Рекомендуется,
чтобы, прежде, чем работать через это, Вы сначала работали через предыдущее учебное руководство Раздел
22.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>
около вершины кода,
потому что векторы используются, чтобы хранить демонстрационные данные.
Скомпилируйте программу как описано в Разделе 22.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>
около вершины кода,
потому что векторы используются, чтобы хранить демонстрационные данные.
Скомпилируйте программу как описано в Разделе 22.4.7.1, "Предпосылки и Вводная информация".
Выполните программу:
shell> ./ps_scenario2
Connector/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());
Скомпилируйте программу как описано в Разделе 22.4.7.1, "Предпосылки и Вводная информация".
Выполните программу:
shell> ./ps_scenario3
Обратите внимание на сгенерированный вывод.
Код выполняет хранимую процедуру, используя a PreparedStatement
объект. Стандарт
do
/while
конструкция используется, чтобы
гарантировать, что все наборы результатов выбираются. Возвращенные значения выбираются от наборов результатов,
используя getInt
и getString
методы.