Spec-Zone .ru
спецификации, руководства, описания, API
|
This section shows how to call stored procedures using prepared statements. It is recommended that, before
working through it, you first work through the previous tutorial Section
22.4.7.2, "Calling Stored Procedures with Statement
Objects". That section
shows the stored procedures required by the applications in this section.
PreparedStatement
for a Stored
Procedure That Returns No ResultThis example shows how to call a stored procedure that returns no result set.
Make a copy of the tutorial framework code:
shell> cp framework.cpp
ps_scenario1.cpp
Add the following code to the try
block of the
tutorial framework:
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();}
Also, uncomment #include <vector>
near the top of the code,
because vectors are used to store sample data.
Compile the program as described in Section 22.4.7.1, "Prerequisites and Background Information".
Run the program:
shell> ./ps_scenario1
You can check whether the database has been updated correctly by using this query:
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 |+------+------------+---------------+
The code is relatively simple, as no processing is required to handle result sets. The procedure call, CALL add_country(?,?,?)
, is made using placeholders for input parameters denoted by
'?'
. These placeholders are replaced by the appropriate data values using the PreparedStatement
object's setString
method. The
for
loop is set up to iterate 3 times, as there are three data sets in this
example. The same PreparedStatement
is executed three times, each time with
different input parameters.
PreparedStatement
for a Stored
Procedure That Returns an Output ParameterThis example shows how to handle a stored procedure that returns an output parameter.
Make a copy of the tutorial framework code:
shell> cp framework.cpp
ps_scenario2.cpp
Add the following code to the try
block of the
tutorial framework:
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;}
Also, uncomment #include <vector>
near the top of the code,
because vectors are used to store sample data.
Compile the program as described in Section 22.4.7.1, "Prerequisites and Background Information".
Run the program:
shell> ./ps_scenario2
Connector/C++ tutorial framework...Population of Europe is 730074600Population of North America is 482993000Population of Oceania is 30401150Done.
In this scenario a PreparedStatement
object is created that calls the get_pop_continent
stored procedure. This procedure takes an input parameter, and also
returns an output parameter. The approach used is to create another statement that can be used to fetch the
output parameter using a SELECT
query. Note that when the PreparedStatement
is created, the input parameter to the stored procedure is denoted by '?'. Prior to execution of the prepared
statement, it is necessary to replace this placeholder by an actual value. This is done using the setString
method:
pstmt->setString(1,cont_vector[i]);
Although the query used to obtain the output parameter returns only a single row, it is important to use the
while
loop to catch more than one row, to avoid the possibility of the connection
becoming unstable.
PreparedStatement
for a Stored
Procedure That Returns a Result SetThis example shows how to handle result sets produced by a stored procedure.
This scenario requires MySQL 5.5.3 or higher. The client/server protocol does not support fetching multiple result sets from stored procedures prior to 5.5.3.
Make a copy of the tutorial framework code:
shell> cp framework.cpp
ps_scenario3.cpp
Add the following code to the try
block of the
tutorial framework:
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());
Compile the program as described in Section 22.4.7.1, "Prerequisites and Background Information".
Run the program:
shell> ./ps_scenario3
Make a note of the output generated.
The code executes the stored procedure using a PreparedStatement
object. The
standard do
/while
construct is used to ensure that all
result sets are fetched. The returned values are fetched from the result sets using the getInt
and getString
methods.