Spec-Zone .ru
спецификации, руководства, описания, API

21.4.7.3. Вызов Хранимых процедур с PreparedStatementОбъекты

Этот раздел показывает, как вызвать хранимые процедуры, используя подготовленные операторы. Рекомендуется, чтобы, прежде, чем работать через это, Вы сначала работали через предыдущее учебное руководство Раздел 21.4.7.2, "Вызывая Хранимые процедуры с Statement Объекты". Тот раздел показывает хранимые процедуры, требуемые приложениями в этом разделе.

Сценарий 1: Используя a PreparedStatement для Хранимой процедуры, Которая Не Возвращает Результата

Этот пример показывает, как вызвать хранимую процедуру, которая не возвращает набора результатов.

  1. Сделайте копию учебного кода платформы:

    shell> cp framework.cpp
                        ps_scenario1.cpp
  2. Добавьте следующий код к 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> около вершины кода, потому что векторы используются, чтобы хранить демонстрационные данные.

  3. Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".

  4. Выполните программу:

    shell> ./ps_scenario1
  5. Можно проверить, была ли база данных обновлена правильно при использовании этого запроса:

    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 выполняется три раза, каждый раз с различными входными параметрами.

Сценарий 2: Используя a PreparedStatement для Хранимой процедуры, Которая Возвращает Выходной Параметр

Этот пример показывает, как обработать хранимую процедуру, которая возвращает выходной параметр.

  1. Сделайте копию учебного кода платформы:

    shell> cp framework.cpp
                        ps_scenario2.cpp
  2. Добавьте следующий код к 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> около вершины кода, потому что векторы используются, чтобы хранить демонстрационные данные.

  3. Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".

  4. Выполните программу:

    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 цикл, чтобы поймать больше чем одну строку, избежать возможности соединения, становящегося нестабильным.

Сценарий 3: Используя a PreparedStatement для Хранимой процедуры, Которая Возвращает Набор результатов

Этот пример показывает, как обработать наборы результатов, произведенные хранимой процедурой.

Отметить

Этот сценарий требует MySQL 5.5.3 или выше. Клиент-серверный протокол не поддерживает выбирающие многократные наборы результатов из хранимых процедур до 5.5.3.

  1. Сделайте копию учебного кода платформы:

    shell> cp framework.cpp
                        ps_scenario3.cpp
  2. Добавьте следующий код к 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());
  3. Скомпилируйте программу как описано в Разделе 21.4.7.1, "Предпосылки и Вводная информация".

  4. Выполните программу:

    shell> ./ps_scenario3
  5. Обратите внимание на сгенерированный вывод.

Код выполняет хранимую процедуру, используя a PreparedStatement объект. Стандарт do/while конструкция используется, чтобы гарантировать, что все наборы результатов выбираются. Возвращенные значения выбираются от наборов результатов, используя getInt и getString методы.