PHP Conference Nagoya 2025

db2_exec

(PECL ibm_db2 >= 1.0.0)

db2_exec Ejecutar directamente una sentencia SQL

Descripción

db2_exec(resource $connection, string $statement, array $options = ?): resource

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.

Parámetros

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().

Valores devueltos

Devuelve un recurso de sentencia si la sentencia SQL fue ejecutada correctamente, o false si hubo un error al ejecutar la sentencia SQL.

Ejemplos

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>

Ver también

add a note

User Contributed Notes 1 note

up
1
shawn at frozen-o dot com
18 years ago
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.
To Top