(PECL ibm_db2 >= 1.0.0)
db2_exec — Ejecutar directamente una sentencia SQL
$connection
, string $statement
[, array $options
] )Ejecuta directamente una sentencia SQL.
Si se planea utilizar variables de PHP en una sentencia SQL, hay que considerar que este es uno de los risgos de seguridad más comunes. Hay que considerar el uso de db2_prepare() para agregar marcadores de parámetros a los valores de entrada que serán utilizados en una sentencia an SQL. Después se puede llamar a db2_execute() para pasar los valores de entrada ya marcados y evitar ataques por inyección SQL.
Si se planea ejecutar repetidamente la misma sentencia SQL pero con diferentes parámetros, hay que considerar el uso de db2_prepare() y db2_execute() para habilitar en el servidor la reutilización del plan de acceso e incrementar la eficiencia de los accesos a la base de datos.
connection
Una conexión válida a la base de datos devuelta por db2_connect() o db2_pconnect().
statement
Una sentencia SQL. La sentencia no puede contener ningún marcador de parámetros.
options
Un arreglo asociativo que contiene opciones para la sentencia. Se puede utilizar este parámetro para solicitar un cursor de tipo SCROLLABLE en una base de datos que soporte esta funcionalidad.
Para una descripción válida de las opciones para la sentencia está db2_set_option().
Devuelve un recurso de sentencia si la sentencia SQL fue ejecutada correctamente,
o FALSE
si hubo un error al ejecutar la sentencia SQL.
Ejemplo #1 Creando una tabla con db2_exec()
El siguiente ejemplo utiliza db2_exec() para ejecutar una serie de sentencias DDL.
<?php
$conn = db2_connect($database, $user, $password);
// Create the test table
$create = 'CREATE TABLE animals (id INTEGER, breed VARCHAR(32),
name CHAR(16), weight DECIMAL(7,2))';
$result = db2_exec($conn, $create);
if ($result) {
print "Successfully created the table.\n";
}
// Populate the test table
$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 "Insert... ";
}
}
?>
El resultado del ejemplo sería:
Successfully created the table. Insert... Insert... Insert... Insert... Insert... Insert... Insert...
Ejemplo #2 Ejecutando una sentencia SELECT con cursor de tipo SCROLLABLE
El siguiente ejemplo demuestra como solicitar un cursor de tipo SCROLLABLE para una sentencia SQL ejecutada por 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";
}
}
?>
El resultado del ejemplo sería:
Bubbles Gizmo Pook Rickety Ride
Ejemplo #3 Devolviendo datos XML como resultado
El siguiente ejemplo demuestra como trabajar con documentos almacenados en una columna XML utilizando la base de datos SAMPLE. Utilizando SQL/XML, este ejemplo devuelve algunos nodos en un documento XML en un formato claro para la mayoría de los usuarios.
<?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);
?>
El resultado del ejemplo sería:
1000 Kathy Smith 416-555-1358 1001 Kathy Smith 905-555-7258
Ejemplo #4 Ejecutando un JOIN con datos XML
El siguiente ejemplo trabaja con documentos almacenados en dos diferentes columnas XML en la base de datos SAMPLE. Se crean dos tablas temporales de los documentos XML y devuelve un resultado SQL con información acerca del estatus de envío a los clientes.
<?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);
?>
El resultado del ejemplo sería:
1001 Kathy Smith 905-555-7258 5002 Shipped
Ejemplo #5 Devolviendo datos SQL como parte de un documento XML extenso
El siguiente ejemplo trabaja con una porción de los documentos PRODUCT.DESCRIPTION en la base de datos SAMPLE. Se crea un documento XML que contiene descripciones de productos (datos XML) y precios (datos 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);
?>
El resultado del ejemplo sería:
<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>