PHP 8.5.0 Alpha 1 available for testing

db2_exec

(PECL ibm_db2 >= 1.0.0)

db2_exec Ejecuta una consulta SQL directamente

Descripción

db2_exec(resource $connection, string $statement, array $options = []): resource|false

Ejecuta una consulta SQL directamente.

Si se prevé insertar variables PHP en la consulta SQL, debe entenderse que esto es una de las fallas de seguridad más comunes. Se recomienda llamar a la función db2_prepare() para preparar una consulta SQL que contenga marcadores para variables de entrada. Posteriormente, puede llamarse a la función db2_execute() para pasar los valores de entrada y así evitar ataques por inyección SQL.

Si se prevé llamar repetidamente a la misma consulta SQL con diferentes parámetros, se recomienda utilizar las funciones db2_prepare() y db2_execute() para permitir que el servidor de base de datos reutilice su plan de acceso y así mejorar la eficiencia del acceso a la base de datos.

Parámetros

connection

Una variable de tipo resource de conexión válida devuelta por db2_connect() o db2_pconnect().

statement

Una consulta SQL. La consulta no puede contener marcadores.

options

Un array asociativo que contiene las opciones de la consulta. Este parámetro puede utilizarse para solicitar un cursor flotante en los servidores de base de datos que soportan esta funcionalidad.

Para obtener una descripción de las opciones válidas, consulte la función db2_set_option().

Valores devueltos

Devuelve una variable de tipo resource si la consulta SQL fue enviada correctamente o false si la base de datos no pudo ejecutar la consulta SQL.

Ejemplos

Ejemplo #1 Creación de una tabla con db2_exec()

El siguiente ejemplo utiliza la función db2_exec() para enviar un conjunto de consultas DDL con el fin de crear una tabla.

<?php
$conn
= db2_connect($database, $user, $password);

// Crear la tabla de prueba
$create = 'CREATE TABLE animales (id INTEGER, raza VARCHAR(32),
nombre CHAR(16), peso DECIMAL(7,2))'
;
$result = db2_exec($conn, $create);
if (
$result) {
print
"La tabla se ha creado correctamente.\n";
}

// Rellenar la tabla de prueba
$animales = array(
array(
0, 'gato', 'Pook', 3.2),
array(
1, 'perro', 'Peaches', 12.3),
array(
2, 'caballo', 'Smarty', 350.0),
array(
3, 'pez dorado', 'Bubbles', 0.1),
array(
4, 'periquito', 'Gizmo', 0.2),
array(
5, 'cabra', 'Rickety Ride', 9.7),
array(
6, 'llama', 'Sweater', 150)
);

foreach (
$animales as $animal) {
$rc = db2_exec($conn, "INSERT INTO animales (id, raza, nombre, peso)
VALUES (
{$animal[0]}, '{$animal[1]}', '{$animal[2]}', {$animal[3]})");
if (
$rc) {
print
"Inserción... ";
}
}
?>

El resultado del ejemplo sería:

La tabla se ha creado correctamente.
Inserción... Inserción... Inserción... Inserción... Inserción... Inserción... Inserción...

Ejemplo #2 Ejecución de una consulta SELECT con un cursor flotante

El siguiente ejemplo muestra cómo solicitar un cursor flotante para una consulta SQL enviada con la función db2_exec().

<?php
$conn
= db2_connect($database, $user, $password);
$sql = "SELECT nombre FROM animales
WHERE peso < 10.0
ORDER BY nombre"
;
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 Devuelve datos XML como ResultSet SQL

El siguiente ejemplo demuestra cómo utilizar documentos almacenados en una columna XML utilizando la base de datos SAMPLE. Mediante un simple SQL/XML, este ejemplo devuelve algunos nodos en un documento XML en un formato ResultSet SQL con el que la mayoría de los usuarios están familiarizados.

<?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 Ejecutar un "JOIN" con datos XML

El siguiente ejemplo trabaja con documentos almacenados en dos columnas diferentes en la base de datos SAMPLE. Esto crea dos tablas temporales provenientes de los documentos XML de dos columnas XML diferentes y devuelve un ResultSet SQL con la información que contiene el estado de envío para un cliente.

<?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 Devuelve datos SQL que forman parte de un documento XML grande

El siguiente ejemplo utiliza una porción de los documentos de PRODUCT.DESCRIPTION en la base de datos SAMPLE. Esto crea un documento XML que contiene la descripción del producto (datos XML) y la información sobre el precio (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
19 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