Warning, /sdk/codevis/thirdparty/soci/docs/queries.md is written in an unsupported language. File is not indexed.

0001 # Queries
0002 
0003 ## Simple SQL statements
0004 
0005 In many cases, the SQL query is intended to be executed only once, which means that statement parsing and execution can go together. The `session` class provides a special `once` member, which triggers parsing and execution of such one-time statements:
0006 
0007 ```cpp
0008 sql.once << "drop table persons";
0009 ```
0010 
0011 For shorter syntax, the following form is also allowed:
0012 
0013 ```cpp
0014 sql << "drop table persons";
0015 ```
0016 
0017 The IOStream-like interface is exactly what it looks like, so that the statement text can be composed of many parts, involving anything that is *streamable* (including custom classes, if they have appropriate `operator<<`):
0018 
0019 ```cpp
0020 string tableName = "persons";
0021 sql << "drop table " << tableName;
0022 
0023 int id = 123;
0024 sql << "delete from companies where id = " << id;
0025 ```
0026 
0027 ## Query transformation
0028 
0029 In SOCI 3.2.0, query transformation mechanism was introduced.
0030 
0031 Query transformation is specified as user-defined unary function or callable function object with input parameter of type `std::string` which returns object of type `std::string` as well.
0032 
0033 The query transformation function is registered for current database session using dedicated `session::set_query_transformation` method. Then, the transformation function is called with query string as argument just before the query is sent to database backend for execution or for preparation.
0034 
0035 For one-time statements, query transformation is performed before each execution of statement. For prepared statements, query is transformed only once, before preparation, regardless how many times it is executed.
0036 
0037 A few short examples how to use query transformation:
0038 
0039 * defined as free function:
0040 
0041 ```cpp
0042 std::string less_than_ten(std::string query)
0043 {
0044     return query + " WHERE price < 10";
0045 }
0046 
0047 session sql(postgresql, "dbname=mydb");
0048 sql.set_query_transformation(less_than_ten);
0049 sql << "DELETE FROM item";
0050 ```
0051 
0052 * defined as function object:
0053 
0054 ```cpp
0055 struct order
0056 {
0057     order(std::string const& by) : by_(by) {}
0058 
0059     std::string operator()(std::string const& query) const
0060     {
0061         return query + " ORDER BY " + by_;
0062     }
0063 
0064     std::string by_;
0065 };
0066 
0067 char const* query = "SELECT * FROM product";
0068 sql.set_query_transformation(order("price"));
0069 sql << query;
0070 sql.set_query_transformation(order("id"));
0071 sql << query;
0072 ```
0073 
0074 * defined as lambda function (since C++11):
0075 
0076 ```cpp
0077 std::string dep = "sales";
0078 sql.set_query_transformation(
0079     [&dep](std::string const& query) {
0080         return query + " WHERE department = '" + dep + "'";
0081 });
0082 sql << "SELECT * FROM employee";
0083 ```
0084 
0085 Query transformations enable users with simple mechanism to apply extra requirements to or interact with SQL statement being executed and that is without changing the SQL statement itself which may be passed from different
0086 parts of application.
0087 
0088 For example, the query transformation may be used to:
0089 
0090 * modify or add clauses of SQL statements (i.e. `WHERE` clause with new condition)
0091 * prefix table names with new schema to allow namespaces switch
0092 * validate SQL statements
0093 * perform sanitization checking for any unverified input
0094 * apply database-specific features like add optimization hints to SQL statements (i.e. `SELECT /*+RULE*/ A FROM C` in Oracle 9)