(PECL ibm_db2 >= 1.0.0)
db2_exec — Выполняет SQL-запрос напрямую
Выполняет SQL-запрос напрямую.
Если вы планируете интерполировать переменные PHP в SQL-запрос, имейте в виду, что это одна из наиболее распространённых уязвимостей безопасности. Рассмотрите возможность вызова db2_prepare() для подготовки SQL-запроса с маркерами параметров для входных значений. Затем вы можете вызвать db2_execute() , чтобы передать входные значения и избежать атак SQL-инъекций.
Если вы планируете многократно выполнять один и тот же SQL-запрос с разными параметрами, рассмотрите возможность вызова db2_prepare() и db2_execute() , чтобы сервер базы данных мог повторно использовать свой план доступа и повысить эффективность вашей базы данных.
connectionstatementoptions
Возвращает ресурс оператора, в случае успешного выполнения SQL-запроса
или false , если базе данных не удалось выполнить SQL-запрос.
Пример #1 Создание таблицы с помощью db2_exec()
В следующем примере db2_exec() используется для выполнения набора DDL-запросов в процессе создания таблицы.
<?php
$conn = db2_connect($database, $user, $password);
// Создание таблицы test
$create = 'CREATE TABLE animals (id INTEGER, breed VARCHAR(32),
name CHAR(16), weight DECIMAL(7,2))';
$result = db2_exec($conn, $create);
if ($result) {
print "Таблица создана.\n";
}
// Наполнение таблицы test
$animals = array(
array(0, 'cat', 'Pook', 3.2),
array(1, 'dog', 'Peaches', 12.3),
array(2, 'horse', 'Smarty', 350.0),
array(3, 'gold fish', 'Bubbles', 0.1),
array(4, 'budgerigar', 'Gizmo', 0.2),
array(5, 'goat', 'Rickety Ride', 9.7),
array(6, 'llama', 'Sweater', 150)
);
foreach ($animals as $animal) {
$rc = db2_exec($conn, "INSERT INTO animals (id, breed, name, weight)
VALUES ({$animal[0]}, '{$animal[1]}', '{$animal[2]}', {$animal[3]})");
if ($rc) {
print "Добавлена запись... ";
}
}
?>Результат выполнения приведённого примера:
Таблица создана. Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись...
Пример #2 Выполнение запроса SELECT с прокручиваемым курсором
В следующем примере показано, как запросить прокручиваемый курсор для SQL-запроса, выданного функцией db2_exec().
<?php
$conn = db2_connect($database, $user, $password);
$sql = "SELECT name FROM animals
WHERE weight < 10.0
ORDER BY name";
if ($conn) {
require_once 'prepare.inc';
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_array($stmt)) {
print "$row[0]\n";
}
}
?>Результат выполнения приведённого примера:
Bubbles Gizmo Pook Rickety Ride
Пример #3 Получение XML-данных как SQL ResultSet
В следующем примере показано, как работать с документами, хранящимися в столбце XML с помощью базы данных SAMPLE. Используя довольно простой SQL/XML, этот пример возвращает некоторые узлы в XML-документе в формате SQL ResultSet, с которым знакомо большинство пользователей.
<?php
$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");
$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = \'Kathy Smith\'
';
$stmt = db2_exec($conn, $query);
while($row = db2_fetch_object($stmt)){
printf("$row->CID$row->NAME$row->PHONE\n");
}
db2_close($conn);
?>Результат выполнения приведённого примера:
1000 Kathy Smith 416-555-1358 1001 Kathy Smith 905-555-7258
Пример #4 Выполнение "JOIN" с данными XML
Следующий пример работает с документами, хранящимися в 2 разных столбцах XML в базе данных SAMPLE. Он создаёт 2 временные таблицы из XML-документов из 2 разных столбца и возвращает SQL ResultSet с информацией о статусе доставки для клиента.
<?php
$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");
$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = \'Kathy Smith\'
';
$stmt = db2_exec($conn, $query);
while($row = db2_fetch_object($stmt)){
printf("$row->CID$row->NAME$row->PHONE$row->PONUM$row->STATUS\n");
}
db2_close($conn);
?>Результат выполнения приведённого примера:
1001 Kathy Smith 905-555-7258 5002 Shipped
Пример #5 Возврат SQL-данных как части большого XML-документа
Следующий пример работает с частью документов PRODUCT.DESCRIPTION в базе данных SAMPLE. Он создаёт XML-документ, содержащий описание продукта (данные XML) и информацию о ценах (данные SQL).
<?php
$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");
$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = \'100-100-01\'
';
$stmt = db2_exec($conn, $query);
while($row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
db2_close($conn);
?>Результат выполнения приведённого примера:
<promoList xmlns="http://posample.org"> <promoitem> <product pid="100-100-01"> <description> <name>Snow Shovel, Basic 22 inch</name> <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details> <price>9.99</price> <weight>1 kg</weight> </description> </product> <startdate>2004年11月19日</startdate> <enddate>2004年12月19日</enddate> <promoprice>7.25</promoprice> </promoitem> </promoList>
If you need to "emulate" offset/limit (as PEAR::DB puts it) for db2 queries, you will definitely need to add array('cursor' => DB2_SCROLLABLE) to your db2_exec() call. Otherwise, you will get nothing useful from db2_fetch_{whatever}() when you try to (see following hack for example):
<?php
$limit = 10;
$offset = 20;
for ($i = 0; $i < $limit && $row = db2_fetch_array($result, $offset + $i); $i++) {
// stuff goes here
}
?>
You can accomplish the same time of thing using sub-selects, "with" statements and other things new to me in the world of DB2, but the more dynamically generated the queries, the more difficult it gets to implement limit/offset behavior on the fly.