101
IBM DB2 10.5 para Linux, UNIX y Windows Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails Actualizado en octubre de 2014 SC11-8358-01

Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

IBM DB2 10.5para Linux, UNIX y Windows

Desarrollo de aplicaciones Perl, PHP,Python y Ruby on RailsActualizado en octubre de 2014

SC11-8358-01

���

Page 2: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,
Page 3: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

IBM DB2 10.5para Linux, UNIX y Windows

Desarrollo de aplicaciones Perl, PHP,Python y Ruby on RailsActualizado en octubre de 2014

SC11-8358-01

���

Page 4: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

NotaAntes de utilizar esta información y el producto al que da soporte, lea la información general contenida en el apartadoApéndice B, “Avisos”, en la página 83.

Nota de edición

Este documento contiene información propiedad de IBM. Se proporciona según un acuerdo de licencia y estáprotegido por la ley de la propiedad intelectual. La información contenida en esta publicación no incluye ningunagarantía de producto, por lo que ninguna declaración proporcionada en este manual deberá interpretarse como tal.

Puede realizar pedidos de publicaciones de IBM en línea o a través del representante de IBM de su localidad.v Para solicitar publicaciones en línea, vaya a IBM Publications Center en http://www.ibm.com/shop/

publications/order

v Para encontrar al representante local de IBM que le corresponde, vaya a la sección Worlwide Contacts de IBMDirectory en http://www.ibm.com/planetwide/

Para realizar pedidos de publicaciones de DB2 desde DB2 Marketing and Sales, en los EE.UU. o en Canadá, llameal 1-800-IBM-4YOU (426-4968).

Cuando envía información a IBM, está otorgando a IBM el derecho no exclusivo de utilizar o distribuir lainformación de cualquier forma que considere adecuada sin incurrir por ello a ninguna obligación para con usted.

© Copyright IBM Corporation 2006, 2014.

Page 5: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Contenido

Capítulo 1. Desarrollo de aplicacionesNode.jsl . . . . . . . . . . . . . . . 1Controlador node-ibm_db para aplicaciones Node.js 1

Recursos para el controlador node-ibm_db . . . 1Instalación del controlador node-ibm_db ensistemas Linux y UNIX . . . . . . . . . . 2Verificación de la instalación del controladornode-ibm_db . . . . . . . . . . . . . 2

Capítulo 2. Desarrollo de aplicacionesPerl . . . . . . . . . . . . . . . . 5Consideraciones sobre la programación en Perl . . . 5

Descargas y recursos relacionados de Perl . . . 5Conexiones de bases de datos en Perl . . . . . 5Captación de resultados en Perl . . . . . . . 7Marcadores de parámetro en Perl . . . . . . 8Variables SQLSTATE y SQLCODE en Perl . . . 8Restricciones de Perl . . . . . . . . . . . 9pureXML y Perl . . . . . . . . . . . . 9Ejecución de programas de ejemplo de Perl. . . 11Ejecución de rutinas desde aplicaciones Perl . . 12

Capítulo 3. Desarrollo de aplicacionesPHP . . . . . . . . . . . . . . . . 15Desarrollo de aplicaciones PHP para servidores debase de datos de IBM . . . . . . . . . . . 15

Descargas y recursos relacionados de PHP . . . 15Configuración del entorno PHP para losproductos de servidores de datos de IBM . . . 16Desarrollo de aplicaciones en PHP (ibm_db2) . . 20Desarrollo de aplicaciones en PHP (PDO) . . . 38

Capítulo 4. Desarrollo de aplicacionesPython. . . . . . . . . . . . . . . 51Desarrollo de aplicaciones Python, SQLAlchemy yDjango Framework para servidores de base de datosde IBM . . . . . . . . . . . . . . . . 51

Descargas y recursos relacionados de Python . . 51Configuración del entorno Python paraservidores de base de datos de IBM . . . . . 52Verificación de la instalación del controladorPython, el adaptador SQLAlchemy y eladaptador Django . . . . . . . . . . . 54Desarrollo de aplicaciones en Python con ibm_db 56

Capítulo 5. Desarrollo de aplicacionesRuby on Rails. . . . . . . . . . . . 69Controlador IBM_DB Ruby y adaptador Rails . . . 69

Iniciación a Ruby on Rails . . . . . . . . 69Instalación del controlador IBM_DB Ruby y eladaptador Rails como una gema Ruby . . . . 70Configuración de conexiones de aplicaciones deservidores de datos de IBM . . . . . . . . 73Controlador IBM Ruby y contextos fiables . . . 73Dependencias y consecuencias del adaptadorIBM_DB Rails . . . . . . . . . . . . 74El controlador IBM_DB y el adaptador Rails noestán soportados en JRuby . . . . . . . . 75Consideraciones acerca del tamaño dealmacenamiento dinámico con DB2 en Rails . . 75

Apéndice A. Información técnica DB2 77Biblioteca técnica de DB2 en copia impresa o enformato PDF . . . . . . . . . . . . . . 78Visualización de la ayuda para estados de SQLdesde el procesador de línea de mandatos . . . . 80Acceso a la documentación en línea de DB2 paradistintas versiones de DB2 . . . . . . . . . 80Términos y condiciones . . . . . . . . . . 81

Apéndice B. Avisos . . . . . . . . . 83

Índice . . . . . . . . . . . . . . . 87

© Copyright IBM Corp. 2006, 2014 iii

Page 6: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

iv Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 7: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Capítulo 1. Desarrollo de aplicaciones Node.jsl

Controlador node-ibm_db para aplicaciones Node.jsPuede utilizar el controlador node-ibm_db en las aplicaciones Node.js para accedera los servidores de bases de datos IBM®.

Node.js es una plataforma de software compilada en JavaScript. Node.jsproporciona una solución de aplicación, rápida, escalable y ligera para aplicacionesen tiempo real de uso intensivo de datos.

El controlador node-ibm_db es un enlace Node.js para servidores de bases de datosIBM. El controlador node-ibm_db contiene interfaces síncronas y asíncronas.

Puede instalar el controlador node-ibm_db con los siguientes productos de IBMData Server Client:v Todas las versiones, releases y fixpacks soportados del producto IBM Data

Server Driver Packagev Todos los productos de IBM Data Server Versión 10.5 Fixpack 4 o posterior

Recursos para el controlador node-ibm_dbUna lista de URL para el controlador node-ibm_db.

La tabla 1 lista los recursos relacionados con el controlador node-ibm_db y losproductos de IBM Data Server necesarios.

Tabla 1. Recursos para el controlador node-ibm_db y los productos de IBM Data Servernecesarios

Descripción URL

Información más reciente acerca delcontrolador node-ibm_db de IBM. El enlaceno apunta a un sitio de IBM.

https://www.npmjs.org/package/ibm_db1

Código de ejemplo. El enlace no apunta a unsitio de IBM.

https://github.com/ibmdb/node-ibm_db/1

Lista de los requisitos de instalación paraproductos de la base de datos DB2.

http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.qb.server.doc/doc/r0025127.html

Lista de los requisitos de instalación para elservidor IBM Informix.

http://www-01.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.expr.doc/ids_in_004x.htm

Sitio de descargas del software de IBM DataServer Driver Package

http://www.ibm.com/software/data/support/data-server-clients/index.html

Foro del controlador node-ibm_db de IBM.El enlace no apunta a un sitio de IBM.

https://groups.google.com/forum/#!forum/node-ibm_db1

1. Las referencias a sitios web que no son de IBM se facilitan únicamente por comodidad y de ninguna manera sirven comoaprobación de esos sitios web. El contenido disponible en esos sitios web que no son de IBM no es parte de los materialesrelacionados con los productos de IBM descritos aquí. El uso de cualquiera de los sitios web que no son de IBM queda bajo suresponsabilidad.

© Copyright IBM Corp. 2006, 2014 1

Page 8: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 1. Recursos para el controlador node-ibm_db y los productos de IBM Data Servernecesarios (continuación)

Descripción URL

Problemas notificados. El enlace no apunta aun sitio de IBM.

https://github.com/ibmdb/node-ibm_db/issues1

Instalación del controlador node-ibm_db en sistemas Linux yUNIX

Puede instalar el controlador node-ibm_db en sistemas Linux y UNIX parautilizarlo con aplicaciones Node.js.

Antes de empezar

Debe instalar uno de los productos de IBM Data Server listados en el sistemadonde está instalando o ejecutando la aplicación Node.js:v Todas las versiones, releases y fixpacks soportados del producto IBM Data

Server Driver Packagev Todos los productos de IBM Data Server Versión 10.5 Fixpack 4 o posterior

Procedimiento

Para instale el controlador node-ibm_db:1. Establezca la variable de entorno IBM_DB_HOME para el directorio de instalación

del producto IBM Data Server emitiendo el siguiente mandato:export IBM_DB_HOME=DB2HOME

donde DB2HOME es el directorio donde está instalado el producto del servidorde datos de IBM. En un entorno IBM Data Server Driver Package, DB2HOMEes el directorio en el que está instalado el paquete de cliente. Por ejemplo, si elpaquete de cliente está instalado en el directorio /home/db2inst1/dsdriver,emita el siguiente mandato:export IBM_DB_HOME=/home/db2inst1/dsdriver

2. Emita el mandato npm install:npm install ibm_db

Qué hacer a continuación

Antes de ejecutar ninguna aplicación Node.js que se conecta a un servidor de basede datos IBM, debe asegurarse de que el controlador node-ibm_db puede accederal controlador CLI obteniendo el script db2profile. El script está en el directorio deinstalación del producto IBM Data Server. Para obtener el script, emita el siguientemandato:source DB2HOME/db2profile

Verificación de la instalación del controlador node-ibm_dbPuede probar el controlador node-ibm_db con una aplicación de ejemplo Node.js.

Procedimiento

Para verificar la instalación de controlador node-ibm_db:

2 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 9: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

1. Cree una aplicación Node.js de muestra para probar la conexión a una base dedatos de muestra. Copie el siguiente código de ejemplo en un archivo yguárdelo como test1.js.//test1.jsvar ibmdb = require(’ibm_db’);

ibmdb.open("DRIVER={DB2};DATABASE=sample;HOSTNAME=<hostname>;UID=<user_id>;PWD=<password>;PORT=<port>;PROTOCOL=TCPIP", function (err,conn) {

if (err) return console.log(err);

conn.query(’select * from staff where id = ?’, [10], function (err, data) {if (err) console.log(err);

console.log(data);

conn.close(function () {console.log(’done’);

});});

});

donde:v <hostname>es el nombre de host completo del servidor de bases de datos

IBM.v <user_id> y <password> son el ID de usuario válido y la contraseña para

conectarse a la base de datos de ejemplo.v <port> es el puerto de escucha del servidor de bases de datos IBM.

2. Ejecute la aplicación test1.js emitiendo el mandato node test1.js:C:\Users\IBM_ADMIN>node test1.js

El mandato node test1.js da como resultado la siguiente salida.[ { ID: 10,

NAME: ’Sanders’,DEPT: 20,JOB: ’Mgr ’,YEARS: 7,SALARY: 98357.5,COMM: 1.5537297e-317 } ]

done

Capítulo 1. Desarrollo de aplicaciones Node.jsl 3

Page 10: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

4 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 11: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Capítulo 2. Desarrollo de aplicaciones Perl

Consideraciones sobre la programación en PerlLa DBI (Database Interface) de Perl es una interfaz de programación deaplicaciones (API) estándar abierta que proporciona acceso a base de datos para lasaplicaciones cliente que están grabadas en Perl. La DBI de Perl define un conjuntode funciones, variables y convenciones que ofrecen una interfaz de base de datosindependiente de la plataforma.

Puede utilizar el controlador de base de datos DB2 de IBM para la DBI de Perl (elcontrolador DBD::DB2) disponible en http://search.cpan.org/~ibmtordb2/, juntocon el módulo DBI de Perl disponible en http://search.cpan.org/~timb/ para crearuna aplicación de Perl que acceda al servidor de base de datos de IBM.

Dado que Perl es un lenguaje interpretado y que el módulo DBI de Perl utilizaSQL dinámico, Perl constituye el lenguaje idóneo para crear y revisar con rapidezlos prototipos de aplicaciones de DB2. El módulo DBI de Perl utiliza una interfazque es similar a las interfaces CLI y JDBC, que permite trasladar fácilmente losprototipos Perl a CLI y JDBC.

Para obtener información sobre los servidores de base de datos soportados,instrucciones de instalación y requisitos previos, consulte http://search.cpan.org/~ibmtordb2/

Descargas y recursos relacionados de PerlExisten diversos recursos disponibles para ayudarle a desarrollar aplicaciones Perlque accedan a servidores de base de datos de IBM.

Tabla 2. Descargas y recursos relacionados de Perl

Descargas Recursos relacionados

Módulo Perl Database Interface (DBI) http://search.cpan.org/~timb/

Controlador DBD::DB2 http://search.cpan.org/~ibmtordb2/

IBM Data Server Driver Package(controlador DS)

http://www.ibm.com/software/data/support/data-server-clients/index.html

Documentación de la API de DBI http://search.cpan.org/~timb/DBI/DBI.pm

Nota técnica de DB2 Perl Database Interfacefor para Linux, UNIX y Windows, queincluye el archivo léame y las instruccionesde instalación

http://www.ibm.com/software/data/db2/perl

Sistema de notificación de errores decontrolador de Perl

http://rt.cpan.org/

Notificación de errores al equipo de códigoabierto de IBM

[email protected]

Conexiones de bases de datos en PerlEl controlador DBD::DB2 proporciona soporte para las funciones de conexión debase de datos estándar definidas por la API de DBI.

© Copyright IBM Corp. 2006, 2014 5

Page 12: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Para permitir que Perl cargue el módulo DBI, debe incluir la línea use DBI; en laaplicación:

El módulo DBI carga automáticamente el controlador DBD::DB2 cuando se crea undescriptor de contexto de base de datos utilizando la sentencia DBI->connect con lasintaxis indicada:

my $dbhandle = DBI->connect(’dbi:DB2:dsn’, $userID, $password);

donde:

$dbhandlerepresenta el descriptor de contexto de base de datos devuelto por lasentencia de conexión

dsn

para las conexiones locales, representa un alias de DB2 catalogado en sudirectorio de bases de datos DB2

para las conexiones remotas, representa una serie de conexión completaque incluye el nombre del sistema principal, el número de puerto, elprotocolo, el ID de usuario y la contraseña para conectar con el sistemaprincipal remoto

$userIDrepresenta el ID de usuario utilizado para conectar con la base de datos

$passwordrepresenta la contraseña para el ID de usuario utilizado para conectar conla base de datos

Para obtener más información sobre la API de DBI, consulte http://search.cpan.org/~timb/DBI/DBI.pmhttp://search.cpan.org/~timb/DBI/DBI.pm.

Ejemplo

Ejemplo 1: Conectar con una base de datos en el sistema principal local (el cliente yel servidor se encuentran en la misma estación de trabajo)use DBI;

$DATABASE = ’dbname’;$USERID = ’username’;$PASSWORD = ’password’;

my $dbh = DBI->connect("dbi:DB2:$DATABASE", $USERID, $PASSWORD, {PrintError => 0})or die "Couldn’t connect to database: " . DBI->errstr;

$dbh->disconnect;

Ejemplo 2: Conectar con una base de datos en el sistema principal remoto (el clientey el servidor se encuentran en distintas estaciones de trabajo)use DBI;

$DSN="DATABASE=sample; HOSTNAME=host; PORT=60000; PROTOCOL=TCPIP; UID=username;PWD=password";

my $dbh = DBI->connect("dbi:DB2:$DSN", $USERID, $PASSWORD, {PrintError => 0})or die "Couldn’t connect to database: " . DBI->errstr;

$dbh->disconnect;

6 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 13: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Captación de resultados en PerlEl módulo DBI de Perl ofrece métodos para la conexión con una base de datos, lapreparación y emisión de sentencias de SQL y la captación de filas de resultados.

Acerca de esta tarea

Este procedimiento capta los resultados de una consulta de SQL.

Restricciones

Puesto que el módulo DBI de Perl sólo soporta SQL dinámico, no se puedenutilizar variables del lenguaje principal en las aplicaciones DB2 en Perl.

Procedimiento

Para captar los resultados:1. Cree un descriptor de contexto de base de datos estableciendo conexión con la

base de datos con la sentencia DBI->connect.2. Cree un descriptor de contexto de sentencia a partir del descriptor de contexto

de base de datos. Por ejemplo, puede devolver el descriptor de contexto desentencia $sth del descriptor de contexto de base de datos llamando al métodoprepare y pasando una sentencia de SQL como argumento de serie, tal como semuestra en el ejemplo de sentencia de Perl:

my $sth = $dbhandle->prepare(’SELECT firstnme, lastname

FROM employee ’);

3. Emita la sentencia de SQL llamando al método execute en el descriptor decontexto de sentencia. Una llamada satisfactoria al método execute asocia unconjunto de resultados al descriptor de contexto de sentencia. Por ejemplo,puede ejecutar la sentencia PREPARED en la sentencia de Perl anteriorutilizando el ejemplo indicado:

#Nota: $rc representa el código de retorno de la llamada a executemy $rc = $sth->execute();

4. Capte una fila del conjunto de resultados asociado al descriptor de contexto desentencia mediante una llamada al método fetchrow. El DBI de Perl devuelveuna fila en forma de matriz con un valor por columna. Por ejemplo, puededevolver todas las filas del descriptor de contexto de sentencia del ejemploanterior utilizando la sentencia de Perl indicada:

while (($firstnme, $lastname) = $sth->fetchrow()) {print "$firstnme $lastname\n";

}

Ejemplo

El ejemplo muestra cómo conectar con una base de datos y emitir una sentenciaSELECT desde una aplicación escrita en Perl.

#!/usr/bin/perluse DBI;

my $database=’dbi:DB2:sample’;my $user=’’;my $password=’’;

my $dbh = DBI->connect($database, $user, $password)or die "Can’t connect to $database: $DBI::errstr";

Capítulo 2. Desarrollo de aplicaciones Perl 7

Page 14: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

my $sth = $dbh->prepare(q{ SELECT firstnme, lastname

FROM employee })or die "Can’t prepare statement: $DBI::errstr";

my $rc = $sth->executeor die "Can’t execute statement: $DBI::errstr";

print "Query will return $sth->{NUM_OF_FIELDS} fields.\n\n";print "$sth->{NAME}->[0]: $sth->{NAME}->[1]\n";

while (($firstnme, $lastname) = $sth->fetchrow()) {print "$firstnme: $lastname\n";

}

# comprobar si hay problemas que puedan haber cancelado antes la captaciónwarn $DBI::errstr if $DBI::err;

$sth->finish;$dbh->disconnect;

Marcadores de parámetro en PerlEl módulo DBI de Perl soporta la ejecución de una sentencia preparada queincluye marcadores de parámetro para la entrada de variables. Para incluir unmarcador de parámetro en una sentencia de SQL, utilice un signo de interrogación(?) o un carácter de dos puntos seguido de un nombre (:name).

El ejemplo de código Perl crea un descriptor de contexto de sentencia que aceptaun marcador de parámetro para la cláusula WHERE de una sentencia SELECT. Acontinuación, el código ejecuta la sentencia dos veces, utilizando los valores deentrada 25000 y 35000 para sustituir el marcador de parámetro.

my $sth = $dbhandle->prepare(’SELECT firstnme, lastname

FROM employeeWHERE salary > ?’

);

my $rc = $sth->execute(25000);

•••

my $rc = $sth->execute(35000);

Variables SQLSTATE y SQLCODE en PerlEl módulo DBI de Perl proporciona métodos para devolver el SQLSTATE y elSQLCODE asociados con un descriptor de contexto de sentencia o de base dedatos del DBI de Perl.

Para devolver el SQLSTATE asociado a un descriptor de contexto de base de datosdel DBI de Perl o a un descriptor de contexto de sentencia, llame al método state.Por ejemplo, para devolver el SQLSTATE asociado al descriptor de contexto debase de datos $dbhandle, incluya la sentencia de Perl my $sqlstate =$dbhandle->state; en la aplicación:

Para devolver el SQLCODE asociado a un descriptor de contexto de base de datosdel DBI de Perl o a un descriptor de contexto de sentencia, llame al método err.

8 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 15: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Para devolver el mensaje para un SQLCODE asociado a un descriptor de contextode base de datos del DBI de Perl o a un descriptor de contexto de sentencia, llameal método errstr. Por ejemplo, para devolver el SQLCODE asociado al descriptorde contexto de base de datos $dbhandle, incluya la sentencia de Perl my $sqlcode= $dbhandle->err; en la aplicación:

Restricciones de PerlSe aplican algunas restricciones al soporte que está disponible para el desarrollo deaplicaciones en Perl.

El módulo DBI de Perl sólo soporta SQL dinámico. Cuando tenga que ejecutar unasentencia varias veces, se puede mejorar el rendimiento de las aplicaciones Perlemitiendo una llamada prepare para preparar la sentencia.

Para obtener información actualizada acerca de las restricciones en la instalación deuna versión específica del controlador DBD::DB2, consulte el archivo CAVEATS enel paquete del controlador DBD::DB2.

pureXML y PerlEl controlador DBD::DB2 da soporte a DB2 pureXML. El soporte para pureXMLofrece un acceso más directo a los datos a través del controlador DBD::DB2 yayuda a reducir la lógica de aplicación ofreciendo una comunicación mástransparente entre la aplicación y la base de datos.

Con el soporte de pureXML, puede insertar directamente documentos XML en labase de datos DB2. La aplicación ya no necesita analizar los documentos XMLporque el analizador de pureXML se ejecuta automáticamente al insertar los datosXML en la base de datos. La posibilidad de gestionar el análisis de los documentosdesde el exterior de la aplicación mejora el rendimiento de la aplicación y reducelos esfuerzos de mantenimiento. También resulta fácil la recuperación de datosXML almacenados con el controlador DBD::DB2; puede acceder a los datosutilizando un BLOB o registro.

Para obtener información sobre DB2 Perl Database Interface y sobre cómodescargar el controlador DBD::DB2 más reciente, consulte http://www.ibm.com/software/data/db2/perl.

Ejemplo

El ejemplo es un programa Perl que emplea pureXML:#!/usr/bin/perluse DBI;use strict ;

# Utilizar módulo DBD:DB2:# para crear una sola tabla DB2 con una columna XML# Añadir una fila de datos# recuperar los datos XML como un registro o un LOB (basado en $datatype).

# NOTA: la base de datos DB2 SAMPLE debe existir ya.

my $database=’dbi:DB2:sample’;my $user=’’;my $password=’’;

my $datatype = "record" ;# $datatype = "LOB" ;

Capítulo 2. Desarrollo de aplicaciones Perl 9

Page 16: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

my $dbh = DBI->connect($database, $user, $password)or die "Can’t connect to $database: $DBI::errstr";

# Para el tipo de datos LOB, LongReadLen = 0 -- en la captura inicial# no se recuperan datos$dbh->{LongReadLen} = 0 if $datatype eq "LOB" ;

# SQL CREATE TABLE para crear la tabla de pruebamy $stmt = "CREATE TABLE xmlTest (id INTEGER, data XML)";my $sth = $dbh->prepare($stmt);$sth->execute();

#insertar una fila de datos en la tablainsertData() ;

# La sentencia de SQL SELECT devuelve el elemento de teléfono# de casa de los datos XML$stmt = qq(SELECT XMLQUERY (’\$d/*:customerinfo/*:phone[\@type = "home"] ’passing data as "d")FROM xmlTest) ;

# preparar y ejecutar una sentencia SELECT$sth = $dbh->prepare($stmt);$sth->execute();

# Imprimir los datos devueltos de la sentencia selectif($datatype eq "LOB") {

printLOB() ;}else {printRecord() ;}

# Eliminar tabla$stmt = "DROP TABLE xmlTest" ;$sth = $dbh->prepare($stmt);$sth->execute();

warn $DBI::errstr if $DBI::err;

$sth->finish;$dbh->disconnect;

##############

sub printRecord {print "output data as as record\n" ;

while( my @row = $sth->fetchrow ){print $row[0] . "\n";}

warn $DBI::errstr if $DBI::err;}

sub printLOB {print "output as Blob data\n" ;

my $offset = 0;

10 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 17: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

my $buff="";$sth->fetch();while( $buff = $sth->blob_read(1,$offset,1000000)) {print $buff;$offset+=length($buff);$buff="";}warn $DBI::errstr if $DBI::err;}

sub insertData {

# insertar una fila de datosmy $xmlInfo = qq(\’<customerinfo xmlns="http://posample.org" Cid="1011">

<name>Bill Jones</name><addr country="Canada">

<street>5 Redwood</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M6W 1E9</pcode-zip>

</addr><phone type="work">416-555-9911</phone><phone type="home">416-555-1212</phone>

</customerinfo>\’) ;

my $catID = 1011 ;

# Sentencia de SQL para insertar datos.my $Sql = qq(INSERT INTO xmlTest (id, data)

VALUES($catID, $xmlInfo ));

$sth = $dbh->prepare( $Sql )or die "Can’t prepare statement: $DBI::errstr";

my $rc = $sth->executeor die "Can’t execute statement: $DBI::errstr";

# comprobar si hay problemaswarn $DBI::errstr if $DBI::err;}

Ejecución de programas de ejemplo de PerlLos programas de ejemplo de Perl demuestran cómo conectar y ejecutaroperaciones de base de datos con el servidor de base de datos de IBM..

Antes de empezar

Antes de ejecutar los programas de ejemplo de Perl, debe instalar el controladorDBD::DB2 más reciente para la DBI de Perl. Para conocer más información sobrecómo obtener el controlador más reciente, consulte http://search.cpan.org/~ibmtordb2/.

Acerca de esta tarea

Los programas de ejemplo de Perl para bases de datos DB2 están disponibles en eldirectorio sqllib/samples/perl.

Capítulo 2. Desarrollo de aplicaciones Perl 11

Page 18: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Procedimiento

Para ejecutar un programa de ejemplo de Perl mediante el intérprete Perl:

Entre el nombre del intérprete y el nombre del programa (incluyendo la extensióndel archivo):v Si está conectando localmente en el servidor:

perl dbauth.pl

v Si está conectando desde un cliente remoto:perl dbauth.pl sample <IDusuario> <contraseña>

Para algunos programas de ejemplo, tendrá que ejecutar archivos de soporte. Porejemplo, el programa de ejemplo tbsel requiere varias tablas creadas por el scripttbselcreate.db2 del CLP. El script tbselinit (UNIX) o el archivo de proceso porlotes tbselinit.bat (Windows), en primer lugar llama a tbseldrop.db2 paraeliminar las tablas, en caso de que existan, y luego llama a tbselcreate.db2 paracrearlas. Por consiguiente, para ejecutar el programa de ejemplo tbsel, emita losmandatos indicados:v Si está conectando localmente en el servidor:

tbselinitperl tbsel.pl

v Si está conectando desde un cliente remoto:tbselinitperl tbsel.pl sample <IDusuario> <contraseña>

Nota: Para un cliente remoto debe modificar la sentencia de conexión en losarchivos tbselinit o tbselinit.bat para codificar el ID de usuario y lacontraseña: db2 connect to sample user <IDusuario> using <contraseña>

Ejecución de rutinas desde aplicaciones PerlLas aplicaciones cliente de DB2 pueden acceder a rutinas (procedimientosalmacenados y funciones definidas por el usuario) creadas mediante lenguajes delsistema principal soportados o mediante procedimientos de SQL. Por ejemplo, elprograma de ejemplo spclient.pl puede acceder a la biblioteca compartida de losprocedimientos de SQL spserver, en caso de que exista en la base de datos.

Antes de empezar

Para crear una rutina de lenguaje del sistema principal debe tener configurado elcompilador apropiado en el servidor. Los procedimientos de SQL no necesitancompilador. La biblioteca compartida sólo se puede crear en el servidor, y no desdeun cliente remoto.

Procedimiento

Para crear procedimientos de SQL en una biblioteca compartida y, a continuación,accesos a los procedimientos desde una aplicación Perl:1. Cree y catalogue los procedimientos de SQL de la biblioteca. Por ejemplo, vaya

al directorio samples/sqlpl del servidor y ejecute los mandatos indicados paracrear y catalogar los procedimientos de SQL en la biblioteca spserver:

db2 connect to sampledb2 -td@ -vf spserver.db2

12 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 19: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

2. Vuelva al directorio de muestras perl (puede estar en una estación de trabajocliente remota) y ejecute el intérprete de Perl en el programa cliente paraacceder a la biblioteca compartida spserver:v Si está conectando localmente en el servidor:

perl spclient

v Si está conectando desde un cliente remoto:perl spclient sample <IDusuario> <contraseña>

Capítulo 2. Desarrollo de aplicaciones Perl 13

Page 20: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

14 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 21: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Capítulo 3. Desarrollo de aplicaciones PHP

Desarrollo de aplicaciones PHP para servidores de base de datos deIBM

PHP: Hypertext Preprocessor (PHP) es un lenguaje de programación interpretadoque se utiliza habitualmente para el desarrollo de aplicaciones web. PHP es unlenguaje popular en el desarrollo web porque es fácil de aprender a utilizar, secentra en soluciones prácticas y da soporte a las funciones más utilizadas enaplicaciones web.

PHP es un lenguaje modular que le permite personalizar la funcionalidaddisponible mediante el uso de extensiones. Esas extensiones pueden simplificartareas como la lectura, escritura y manipulación de XML, la creación de clientes yservidores SOAP y el cifrado de comunicaciones entre servidor y navegador. Sinembargo, las extensiones más utilizadas para PHP proporcionan acceso de lecturay escritura a bases de datos, por lo que puede crear fácilmente un sitio webdinámico destinado a bases de datos.

IBM proporciona las siguientes extensiones PHP para acceder a los servidores debase de datos de IBM:

ibm_db2Una interfaz de programación de aplicaciones (API) de procedimientos queofrece, además de las operaciones de base de datos de creación, lectura,actualización y grabación normales, un amplio acceso a los metadatos de labase de datos. Puede compilar la extensión ibm_db2 con PHP 4 o con PHP5.

pdo_ibmUn controlador para la extensión de objetos de datos de PHP (PDO) queofrece acceso a los servidores de base de datos de IBM mediante la interfazde base de datos orientada a objetos estándar incorporada en PHP 5.1.

Las versiones más recientes de las extensiones ibm_db2 y pdo_ibm también estándisponibles en la PHP Extension Community Library (PECL), enhttp://pecl.php.net/.

Descargas y recursos relacionados de PHPExisten diversos recursos disponibles para ayudarle a desarrollar aplicaciones PHPpara servidores de base de datos de IBM.

Tabla 3. Descargas y recursos relacionados de PHP

Descargas

Código fuente de PHP completo 1 http://www.php.net/downloads.php

La extensión ibm_db2 desde la PHPExtension Community Library (PECL)

http://pecl.php.net/package/ibm_db2

La extensión pdo_ibm desde la PHPExtension Community Library

http://pecl.php.net/package/pdo_ibm

Extensión ibm_db2 compilada paraWindows

http://windows.php.net/downloads/pecl/releases/ibm_db2/

© Copyright IBM Corp. 2006, 2014 15

Page 22: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 3. Descargas y recursos relacionados de PHP (continuación)

Descargas

Extensión pdo_ibm compilada paraWindows

http://windows.php.net/downloads/pecl/releases/pdo_ibm/

IBM Data Server Driver Package(controlador DS)

http://www.ibm.com/software/data/support/data-server-clients/index.html

Zend Server http://www.zend.com/en/products/server/downloads

Manual de PHP http://www.php.net/docs.php

Documentación de la API ibm_db2 http://www.php.net/ibm_db2

Documentación de la API de PDO http://php.net/manual/en/book.pdo.php

Sitio web de PHP http://www.php.net/

1. Incluye los archivos binarios de Windows. La mayoría de las distribucionesLinux incorporan PHP previamente compilado.

Configuración del entorno PHP para los productos deservidores de datos de IBM

Puede configurar el entorno PHP en los sistemas operativos Linux, UNIX oWindows, instalando una versión binaria precompilada de PHP y habilitando elsoporte para los productos de servidores de datos de IBM.

Acerca de esta tarea

Para facilitar la instalación y configuración en los sistemas operativos Linux, UNIXo Windows, puede descargar e instalar Zend Server para utilizarlo en sistemas deproducción en http://www.zend.com/en/products/server/downloads. Enhttp://www.zend.com/en/products/server/editions encontrará información sobreel paquete.

En Windows, las versiones binarias precompiladas de PHP están disponibles parasu descarga en http://www.php.net/downloads.php. La mayoría de lasdistribuciones Linux incluyen una versión precompilada de PHP. En sistemasoperativos UNIX que no incluyen una versión precompilada de PHP, puedecompilar su propia versión de PHP.

Para obtener más información sobre la instalación y configuración de PHP, consultehttp://www.php.net/manual/en/install.php.

Configuración del entorno PHP para los productos IBM DataServer en WindowsAntes de poder conectarse a un servidor de base de datos de IBM y ejecutarsentencias SQL, debe configurar el entorno PHP.

Antes de empezar

Debe tener el siguiente software necesario instalado en su sistema:v PHP versión 5 o posteriorv Si la aplicación PHP se va a conectar a una base de datos de IBM remota, se

requiere uno de los siguientes productos en el sistema donde se ejecutará laaplicación:– El producto IBM Data Server Client

16 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 23: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

– El producto IBM Data Server Runtime Client– El producto IBM Data Server Driver Package– El producto IBM Data Server Driver para ODBC y CLI

Si la aplicación PHP se conecta a un servidor de base de datos de IBM en elsistema local, no se necesita ningún producto de servidor de datos adicional deIBM.

Procedimiento

Para instalar las extensiones PHP ibm_db2 y pdo_ibm:1. Copie los archivos de extensión ibm_db2 y pdo_ibm en el subdirectorio \ext\

del directorio de instalación de PHP. Los archivos de extensión ibm_db2 ypdo_ibm pueden obtenerse de los orígenes siguientes:v Vía de acceso de instalación del producto IBM Data Serverv PHP Extension Community Library (PECL)

– Para el archivo de extensión ibm_db2, consulte http://windows.php.net/downloads/pecl/releases/ibm_db2/

– Para el archivo de extensión pdo_ibm, consulte http://windows.php.net/downloads/pecl/releases/pdo_ibm/

Nota: Si ha instalado el software de IBM Data Server Driver para ODBC yCLI, debe obtener los archivos de extensión ibm_db2 y pdo_ibm de formaseparada desde la PHP Extension Community Library (PECL).v Si tiene un entorno PHP de enhebramiento seguro, copie los siguientes

archivos de extensión desde la vía de acceso de instalación del producto IBMData Server en el subdirectorio \ext\ del directorio de instalación de PHP:– php_ibm_db2_X_X_XXX_ts.dll

– php_pdo_ibm_X_X_XXX_ts.dll

v Si tiene un entorno PHP sin enhebramiento seguro, copie los siguientesarchivos de extensión desde la vía de acceso de instalación del producto IBMData Server en el subdirectorio \ext\ en el directorio de instalación de PHP:– php_ibm_db2_X_X_XXX_nts.dll

– php_pdo_ibm_X_X_XXX_nts.dll

2. Abra el archivo php.ini en un editor de su elección. Edite la entrada de laextensión en el archivo php.ini, en el directorio de instalación de PHP, paraque haga referencia al controlador PHP.v Para el entorno PHP de enhebramiento seguro:

extension=php_pdo.dllextension=php_ibm_db2_X_X_XXX_ts.dllextension=php_pdo_ibm_X_X_XXX_ts.dll

v Para el entorno PHP sin enhebramiento seguro:extension=php_pdo.dllextension=php_ibm_db2_X_X_XXX_nts.dllextension=php_pdo_ibm_X_X_XXX_nts.dll

3. Opcional: Si la aplicación PHP que se está conectando a un servidor de base dedatos de IBM se ejecuta en el entorno del servidor HTTP, reinicie el servidorHTTP para que los nuevos valores de configuración entren en vigor.

Configuración del entorno PHP para los productos IBM DataServer en Linux o UNIXAntes de poder conectarse a un servidor de base de datos de IBM y ejecutarsentencias SQL, debe configurar el entorno PHP.

Capítulo 3. Desarrollo de aplicaciones PHP 17

Page 24: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Antes de empezar

Debe tener el siguiente software necesario instalado en su sistema:v PHP versión 5 o posteriorv Si la aplicación PHP se conecta a una base de datos de IBM remota, el sistema

que ejecuta la aplicación PHP requiere uno de los siguientes productos:– El producto IBM Data Server Client– El producto IBM Data Server Runtime Client– El producto IBM Data Server Driver Package– El producto IBM Data Server Driver para ODBC y CLI

Si la aplicación PHP se conecta a un servidor de base de datos de IBM en elsistema local, no se necesita ningún producto de servidor de datos adicional deIBM.

Procedimiento

Para instalar las extensiones ibm_db2 y pdo_ibm php:1. Utilizando el mandato de exportación, establezca la variable de entorno

IBM_DB_HOME.$export IBM_DB_HOME=DB2HOME

DB2HOME es el directorio donde está instalado el producto IBM Data Server.Por ejemplo:$ export IBM_DB_HOME=/home/db2inst1/sqllib

2. Utilizando uno de los tres métodos siguientes, instale las extensiones ibm_db ypdo_ibm.v Utilice el mandato pecl install incluido en la PHP Extension Community

Library (PECL).– Para instalar la extensión ibm_db2:

$ pecl install ibm_db2

– Para instalar la extensión pdo_ibm:$ pecl install pdo_ibm

v Utilice los comandos incluidos en el código fuente:a. Extraiga el archivo de origen.b. Ejecute los siguientes mandatos desde el directorio extraído:

$ phpize --clean$ phpize$ ./configure$ make$ make install

c. Si va a instalar la extensión pdo_ibm, debe ejecutar el siguiente mandatode configuración:$./configure --with-PDO_IBM=DB2HOME

La variable DB2HOME es el directorio donde está instalado el productode IBM Data Server.

v Utilice las extensiones compiladas incluidas con los productos de IBM DataServer:a. Debe determinar si el entorno PHP es de enhebramiento seguro o no,

emitiendo el mandato siguiente:$ php -info| grep "Thread Safe"

18 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 25: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

b. El cliente de IBM Data Server y el software de IBM Data Server DriverPackage se entregan con dos tipos de controladores PHP:– Enhebramiento seguro: ibm_db2_XX_ts.so y pdo_ibm_XX_ts.so

– Enhebramiento no seguro: ibm_db2_XX_nts.so y pdo_ibm_XX_nts.so

Utilizando el mandato cp, copie los archivos de la biblioteca compartidadel controlador PHP apropiado en el directorio de extensión PHPinstalado como archivos ibm_db2.so y pdo_ibm.so.Para un controlador PHP de 32 bits:$ cp DB2HOME/php/php32/ibm_db2_XX_[ts/nts].so <local_php_directory>/php/lib/php/extensions/ibm_db2.so$ cp DB2HOME/php/php32/pdo_ibm_XX_[ts/nts].so <local_php_directory>/php/lib/php/extensions/pdo_ibm.so

Para un controlador PHP de 64 bits:$ cp DB2HOME/php/php64/ibm_db2_XX_[ts/nts].so <local_php_directory>/php/lib/php/extensions/ibm_db2.so$ cp DB2HOME/php/php64/pdo_ibm_XX_[ts/nts].so <local_php_directory>/php/lib/php/extensions/pdo_ibm.so

La variable DB2HOME es el directorio donde está instalado el productode IBM Data Server.

3. Abra el archivo php.ini en un editor de su elección. Edite la entrada de laextensión en el archivo php.ini, en el directorio <local_php_directory>/php/lib, para que haga referencia al controlador PHP:extension=pdo.soextension=ibm_db2.soextension=pdo_ibm.so

4. Asegúrese de que el controlador PHP pueda acceder al archivo libdb2.so delcontrolador CLI estableciendo la variable LD_LIBRARY_PATH para los sistemasoperativos Linux y UNIX, diferente que la del sistema operativo AIX. Para elsistema operativo AIX, debe establecer la variable LIBPATH.v Para los sistemas operativos Linux y UNIX de 32 bits distintos al sistema

operativo AIX, utilice el mandato export para establecer el directorioIBM_DB_HOME/lib32 en la variable LD_LIBRARY_PATH.export LD_LIBRARY_PATH=DB2HOME/lib32

v Para un sistema operativo AIX de 32 bits, utilice el mandato export paraestablecer el directorio IBM_DB_HOME/lib32 en la variable LIBPATH.export LIBPATH=DB2HOME/lib32

v Para los sistemas operativos Linux y UNIX de 64 bits distintos al sistemaoperativo AIX, utilice el mandato export para establecer la variableLD_LIBRARY_PATH en el directorio IBM_DB_HOME/lib64.export LD_LIBRARY_PATH=DB2HOME/lib64

v Para un sistema operativo AIX de 64 bits, utilice el mandato export paraestablecer la variable LD_LIBRARY_PATH en el directorioIBM_DB_HOME/lib64.export LIBPATH=DB2HOME/lib64

5. Opcional: Si la aplicación PHP que se conecta a un servidor de base de datosde IBM se ejecuta en el entorno del servidor HTTP:a. Añada la variable LD_LIBRARY_PATH al archivo httpd.conf. Para una

arquitectura de 32 bits, establezca LD_LIBRARY_PATH en el directorioDB2HOME\lib32. Para una arquitectura de 64 bits, establezcaLD_LIBRARY_PATH en el directorio DB2HOME\lib64.

b. Reinicie el servidor HTTP para que los nuevos valores de configuraciónentren en vigor.

Capítulo 3. Desarrollo de aplicaciones PHP 19

Page 26: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Desarrollo de aplicaciones en PHP (ibm_db2)La extensión ibm_db2 proporciona una serie de útiles funciones de PHP paraacceder a los datos y manipularlos en una base de datos de IBM Data Server. Laextensión incluye funciones para conectarse a una base de datos, ejecutar ypreparar sentencias de SQL, recuperar filas de conjuntos de resultados, llamar aprocedimientos almacenados, gestionar errores y recuperar metadatos.

Conexión a una base de datos de IBM Data Server en PHP(ibm_db2)Antes de poder emitir sentencias de SQL para crear, actualizar, suprimir orecuperar datos, debe conectarse a una base de datos de la aplicación PHP.

Puede utilizar la API ibm_db2 para conectar con una base de datos de IBM DataServer mediante una conexión catalogada o una conexión TCP/IP directa.

Para mejorar el rendimiento, también puede crear una conexión persistente.

Antes de empezar

Antes de conectar con una base de datos de IBM Data Server mediante laextensión ibm_db2, debe configurar el entorno de PHP en el sistema y habilitar laextensión ibm_db2.

Procedimiento

Para devolver un recurso de conexión que puede utilizar para llamar a sentenciasde SQL, llame a una de las funciones de conexión listadas:

Tabla 4. Funciones de conexión de ibm_db2

Función Descripción

db2_connect Crea una conexión no persistente.

db2_pconnect Crea una conexión persistente. Permaneceabierta una conexión persistente entrepeticiones de PHP, lo que permite que laspeticiones de script de PHP posterioresreutilicen la conexión si tienen un conjuntode credenciales idéntico.

Los valores de base de datos que proporcione como argumentos para estasfunciones pueden especificar un nombre de base de datos catalogado o una seriede conexión de base de datos completa para una conexión TCP/IP directa. Puedeespecificar argumentos opcionales que controlen cuándo se confirman lastransacciones, las mayúsculas/minúsculas de los nombres de columna que sedevuelven y el tipo de cursor.Si el intento de conexión falla, puede recuperar información de diagnósticollamando a la función db2_conn_error o db2_stmt_errormsg.Al crear una conexión llamando a la función db2_connect, PHP cierra la conexióncon la base de datos cuando se produce uno de los sucesos listados:v Llama a la función db2_close para la conexiónv Establece el recurso de conexión en NULLv Finaliza el script de PHP

Cuando crea una conexión llamando a la función db2_pconnect, PHP ignoracualquier llamada a la función db2_close para el recurso de conexión especificadoy mantiene abierta la conexión con la base de datos para los scripts de PHP

20 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 27: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

posteriores.Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Conectar con una base de datos catalogada.<?php$database = "sample";$user = "db2inst1";$password = "";

$conn = db2_connect($database, $user, $password);

if($conn) {echo "Connection succeeded.";db2_close($conn);}else {echo "Connection failed.";}?>

Qué hacer a continuación

Si el intento de conexión se realiza correctamente, puede utilizar el recurso deconexión al llamar a funciones de ibm_db2 que ejecutan sentencias de SQL. Acontinuación, prepare y ejecute las sentencias de SQL.

Contextos fiables en aplicaciones PHP (ibm_db2):

A partir de la Versión 9.5 Fixpack 3 (o posterior), la extensión de ibm_db2 admitecontextos fiables mediante el uso de palabras clave de serie de conexión.

Los contextos fiables proporcionan un método para crear aplicaciones de tresniveles más seguras y con mayor rapidez. La identidad del usuario siempre semantiene para operaciones de auditoría y seguridad. Cuando se necesitanconexiones seguras, los contextos fiables mejoran el rendimiento ya que no esnecesario obtener conexiones nuevas.

Ejemplo

Habilitar contextos fiables, alternar usuarios y obtener el ID de usuario actual.<?php

$database = "SAMPLE";$hostname = "localhost";$port = 50000;$authID = "db2inst1";$auth_pass = "ibmdb2";

$tc_user = "tcuser";$tc_pass = "tcpassword";

$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$authID;PWD=$auth_pass;";$options = array ("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);

$tc_conn = db2_connect($dsn, "", "", $options);if($tc_conn) {echo "Explicit Trusted Connection succeeded.\n";

if(db2_get_option($tc_conn, "trustedcontext")) {$userBefore = db2_get_option($tc_conn, "trusted_user");

//Realizar algún trabajo como usuario 1.

//Cambiando a usuario de confianza.

Capítulo 3. Desarrollo de aplicaciones PHP 21

Page 28: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

$parameters = array("trusted_user" => $tc_user, "trusted_password" => $tcuser_pass);$res = db2_set_option ($tc_conn, $parameters, 1);

$userAfter = db2_get_option($tc_conn, "trusted_user");//Realizar más trabajo como usuario de confianza.

if($userBefore != $userAfter) {echo "User has been switched." . "\n";}}

db2_close($tc_conn);}else {echo "Explicit Trusted Connection failed.\n";}

?>

Ejecución de sentencias de SQL en PHP (ibm_db2)Después de conectarse a una base de datos, utilice las funciones disponibles en laAPI ibm_db2 para preparar y ejecutar sentencias de SQL. Las sentencias de SQLpueden contener texto estático, expresiones XQuery o marcadores de parámetrosque representan la entrada de variables.

Ejecución de una única sentencia de SQL en PHP (ibm_db2):

Para preparar y ejecutar una única sentencia de SQL que no acepta parámetros deentrada, utilice la función db2_exec. Un uso típico de la función db2_exec esestablecer el esquema por omisión para la aplicación en un archivo de inclusióncomún o clase base.

Antes de empezar

Para evitar amenazas a la seguridad por ataques de inyección de SQL, utilice lafunción db2_exec sólo para ejecutar sentencias de SQL compuestas de seriesestáticas. La interpolación de variables de PHP que representan la entrada delusuario en la sentencia de SQL puede exponer la aplicación a ataques de inyecciónde SQL.

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db2. Consulte “Conexión a una base de datos de IBM Data Server enPHP (ibm_db2)” en la página 20.

Procedimiento

Para preparar y ejecutar una única sentencia de SQL, llame a la función db2_exec,proporcionando los argumentos listados:

conexiónUn recurso de conexión de base de datos válido que devuelve la funcióndb2_connect o db2_pconnect.

sentenciaUna serie que contiene la sentencia de SQL. Esta serie puede incluir unaexpresión XQuery a la que llama la función XMLQUERY.

opcionesOpcional: Una matriz asociativa que especifica las opciones de sentencias:

DB2_ATTR_CASEPara conseguir compatibilidad con sistemas de bases de datos que no siganel estándar SQL, esta opción establece el caso en los que los nombres decolumna se devolverán a la aplicación. Por omisión, el caso demayúsculas/minúsculas está establecido en DB2_CASE_NATURAL, lo que

22 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 29: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

devuelve nombres de columna tal y como los devuelve la base de datos.Puede establecer este parámetro en DB2_CASE_LOWER para obligar a quelos nombres de columna estén en minúsculas, o en DB2_CASE_UPPERpara obligar a que los nombres de columna estén en mayúsculas.

DB2_ATTR_CURSOREsta opción establece el tipo de cursor que ibm_db2 devuelve para losconjuntos de resultados. Por omisión, ibm_db2 devuelve un cursor de sóloavance (DB2_FORWARD_ONLY) que devuelve la fila siguiente de unconjunto de resultados para cada llamada a db2_fetch_array,db2_fetch_assoc, db2_fetch_both, db2_fetch_object o db2_fetch_row. Puedeestablecer este parámetro en DB2_SCROLLABLE para solicitar un cursordesplazable de forma que las funciones de captación de ibm_db2 aceptenun segundo argumento especificando la posición absoluta de la fila a laque desea acceder en el conjunto de resultados.

Si la llamada de función tiene éxito, devuelve un recurso de sentencia que puedeutilizar en llamadas de función posteriores relacionadas con esta consulta.Si la llamada de función falla (devuelve False), puede utilizar la funcióndb2_stmt_error o db2_stmt_errormsg para recuperar información de diagnósticosobre el error.Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Ejemplo 1: Ejecución de una única sentencia de SQL.<?php$conn = db2_connect("sample", "db2inst1", "");$sql = "SELECT * FROM DEPT";$stmt = db2_exec($conn, $sql);db2_close($conn);?>

Ejemplo 2: Ejecución de una expresión XQuery.<?php$xquery = ’$doc/customerinfo/phone’;$stmt = db2_exec($conn, "select xmlquery(’$xquery’PASSING INFO AS \"doc\") from customer");?>

Qué hacer a continuación

Si la sentencia de SQL ha seleccionado filas utilizando un cursor desplazable, o hainsertado, actualizado o suprimido filas, puede llamar a la función db2_num_rowspara devolver el número de filas que la sentencia ha devuelto o a las que haafectado. Si la sentencia de SQL ha devuelto un conjunto de resultados, puedeempezar a captar filas.

Preparación y ejecución de sentencias de SQL con entrada de variables en PHP(ibm_db2):

Para preparar y ejecutar una sentencia de SQL que incluya la entrada de variables,utilice las funciones db2_prepare, db2_bind_param y db2_execute. Preparar unasentencia mejora el rendimiento porque el servidor de bases de datos crea un plande acceso optimizado para la recuperación de datos que puede reutilizar si sevuelve a ejecutar la sentencia.

Capítulo 3. Desarrollo de aplicaciones PHP 23

Page 30: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db2. Consulte “Conexión a una base de datos de IBM Data Server enPHP (ibm_db2)” en la página 20.

Procedimiento

Para preparar y ejecutar una sentencia de SQL que incluye marcadores deparámetro:1. Llame a la función db2_prepare, pasando los argumentos listados:

conexiónUn recurso de conexión de base de datos válido que devuelve la funcióndb2_connect o db2_pconnect.

sentenciaUna serie que contiene la sentencia de SQL, incluidos los signos deinterrogación (?), como marcadores de parámetro para cualquier valor decolumna o predicado que requiera entrada de variables. Esta serie puedeincluir una expresión XQuery a la que llama la función XMLQUERY. Sólopuede utilizar marcadores de parámetro como lugar reservado para losvalores de columna o predicado. El compilador de SQL no puede crear unplan de acceso para una sentencia que usa marcadores de parámetro enlugar de nombres de columna, nombres de tabla u otros identificadores deSQL.

opcionesOpcional: Una matriz asociativa que especifica las opciones de sentencias:

DB2_ATTR_CASEPara conseguir compatibilidad con sistemas de bases de datos que nosigan el estándar SQL, esta opción establece el caso en los que losnombres de columna se devolverán a la aplicación. Por omisión, el casode mayúsculas/minúsculas está establecido en DB2_CASE_NATURAL,lo que devuelve nombres de columna tal y como los devuelve la basede datos. Puede establecer este parámetro en DB2_CASE_LOWER paraobligar a que los nombres de columna estén en minúsculas, o enDB2_CASE_UPPER para obligar a que los nombres de columna esténen mayúsculas.

DB2_ATTR_CURSOREsta opción establece el tipo de cursor que ibm_db2 devuelve para losconjuntos de resultados. Por omisión, ibm_db2 devuelve un cursor desólo avance (DB2_FORWARD_ONLY) que devuelve la fila siguiente deun conjunto de resultados para cada llamada a db2_fetch_array,db2_fetch_assoc, db2_fetch_both, db2_fetch_object o db2_fetch_row.Puede establecer este parámetro en DB2_SCROLLABLE para solicitarun cursor desplazable de forma que las funciones de captación deibm_db2 acepten un segundo argumento especificando la posiciónabsoluta de la fila a la que desea acceder en el conjunto de resultados.

Si la llamada a la función tiene éxito, devuelve un recurso de descriptor decontexto de sentencia que puede utilizar en posteriores llamadas a funciónrelacionadas con esta consulta.Si la llamada de función falla (devuelve False), puede utilizar la funcióndb2_stmt_error o db2_stmt_errormsg para recuperar información dediagnóstico sobre el error.

24 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 31: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

2. Opcional: Por cada marcador de parámetro en la serie de SQL, llame a lafunción db2_bind_param, proporcionando los argumentos listados. Vincularvalores de entrada a marcadores de parámetros garantiza que cada valor deentrada se trate como un único parámetro, evitando ataques de inyección deSQL contra la aplicación.

sentenciaUna sentencia preparada que devuelve la llamada a la funcióndb2_prepare.

número_parámetroUn entero que representa la posición del marcador de parámetro en lasentencia de SQL.

nombre-variableUna serie que especifica el nombre de la variable PHP que se vinculará alparámetro especificado en número_parámetro.

3. Llame a la función db2_execute, pasando los argumentos listados:

sentenciaUna sentencia preparada que devuelve la función db2_prepare.

parámetrosOpcional: Una matriz que contiene los valores que se deben utilizar enlugar de los marcadores de parámetro, en orden.

Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Preparar y ejecutar una sentencia que incluye entrada de variables.$sql = "SELECT firstnme, lastname FROM employee WHERE bonus > ? AND bonus < ?";$stmt = db2_prepare($conn, $sql);if (!$stmt) {

// Manejar los errores}

// Vincular explícitamente los parámetrosdb2_bind_param($stmt, 1, $_POST[’lower’]);db2_bind_param($stmt, 2, $_POST[’upper’]);

db2_execute($stmt);// Procesar los resultados

// Invocar de nuevo sentencia preparada usando parámetros vinculados dinámicamentedb2_execute($stmt, array($_POST[’lower’], $_POST[’upper’]));

Qué hacer a continuación

Si la sentencia de SQL devuelve uno o varios conjuntos de resultados, puedeempezar a captar filas del recurso de sentencia.

Inserción de objetos grandes en PHP (ibm_db2):

Cuando inserta un objeto grande en la base de datos, en lugar de cargar todos losdatos del objeto grande en una serie de PHP y entonces pasarlos a la base de datosde IBM Data Server mediante una sentencia INSERT, puede insertar los objetosgrandes directamente desde un archivo en el servidor PHP.

Capítulo 3. Desarrollo de aplicaciones PHP 25

Page 32: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db2.

Procedimiento

Para insertar un objeto grande en la base de datos directamente desde un archivo:1. Llame a la función db2_prepare para preparar una sentencia INSERT con un

marcador de parámetro que represente la columna del objeto grande.2. Establezca el valor de una variable de PHP en la vía de acceso y el nombre del

archivo que contenga los datos del objeto grande. La vía de acceso puede serrelativa o absoluta y está sujeta a los permisos de acceso del archivo ejecutablede PHP.

3. Llame a la función db2_bind_param para vincular el marcador de parámetro ala variable. El tercer argumento de esta función es una serie que representa elnombre de la variable de PHP que conserva el nombre y la vía de acceso delarchivo. El cuarto argumento es DB2_PARAM_FILE, que indica a la extensiónibm_db2 que recupere los datos de un archivo.

4. Llame a la función db2_execute para emitir la sentencia INSERT.

Ejemplo

Insertar un objeto grande en la base de datos.$stmt = db2_prepare($conn, "INSERT INTO animal_pictures(picture) VALUES (?)");

$picture = "/opt/albums/spook/grooming.jpg";$rc = db2_bind_param($stmt, 1, "picture", DB2_PARAM_FILE);$rc = db2_execute($stmt);

Lectura de conjuntos de resultados de consultas

Captación de columnas o columnas de conjuntos de resultados en PHP(ibm_db2):

Al ejecutar una sentencia que devuelva uno o más conjuntos de resultados, utiliceuna de las funciones disponibles en la extensión ibm_db2 para iterar por las filasdevueltas de cada conjunto de resultados.

Si el conjunto de resultados incluye columnas que contienen datos de gran tamaño,puede recuperar los datos de columna en columna para evitar que se utilicedemasiada memoria.

Antes de empezar

Debe tener un recurso de sentencia que haya devuelto la función db2_exec odb2_execute que tenga uno o varios conjuntos de resultados asociados.

Procedimiento

Para captar datos de un conjunto de resultados:1. Capte los datos de un conjunto de resultados llamando a una de las funciones

de captación.

26 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 33: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 5. Funciones de captación de ibm_db2

Función Descripción

db2_fetch_array Devuelve una matriz, indexada por posiciónde columna, que representa una fila en unconjunto de resultados. Las columnas estánindexadas en 0.

db2_fetch_assoc Devuelve una matriz, indexada por nombrede columna, que representa una fila en unconjunto de resultados.

db2_fetch_both Devuelve una matriz, indexada tanto pornombre de columna como por posición, querepresenta una fila en un conjunto deresultados.

db2_fetch_row Establece el puntero del conjunto deresultados en la siguiente fila o la filasolicitada. Utilice esta función para iterarpor un conjunto de resultados.

db2_fetch_object Devuelve un objeto con propiedades querepresenta las columnas de la fila captada.Las propiedades del objeto se correlacionancon los nombres de las columnas delconjunto de resultados.

Estas funciones aceptan los argumentos listados:

sentenciaUn recurso de sentencia válido.

número_filaEl número de la fila que desea recuperar del conjunto de resultados. Lanumeración de las filas empieza por 1. Especifique un valor para esteparámetro opcional si ha solicitado un cursor desplazable al llamar a lafunción db2_exec o db2_prepare. Con el cursor de sólo avance por omisión,cada llamada a un método de captación devuelve la fila siguiente delconjunto de resultados.

2. Opcional: Si ha llamado a la función db2_fetch_row, para cada iteración en elconjunto de resultados, recupere un valor de la columna especificada llamandoa la función db2_result. Puede especificar la columna pasando un entero querepresente la posición de la columna en la fila (empezando por 0), o una serieque represente el nombre de la columna.

3. Continúe captando filas hasta que la función de captación devuelva False, loque indicará que habrá llegado al final del conjunto de resultados.Para obtener más información sobre la extensión ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Ejemplo 1: Captación de filas de un conjunto de resultados llamando a la funcióndb2_fetch_object<?php$conn = db2_connect("sample", "db2inst1", "password");$sql = ’SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO = ?’;$stmt = db2_prepare($conn, $sql);db2_execute($stmt, array(’000010’));while ($row = db2_fetch_object($stmt)) {

print "Name:

Capítulo 3. Desarrollo de aplicaciones PHP 27

Page 34: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

{$row->FIRSTNME} {$row->LASTNAME}

";}

db2_close($conn);?>

Ejemplo 2: Captación de filas de un conjunto de resultados llamando a la funcióndb2_fetch_row<?php$conn = db2_connect("sample", "db2inst1", "password");$sql = ’SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO = ?’;$stmt = db2_prepare($conn, $sql);db2_execute($stmt, array(’000010’));while (db2_fetch_row($stmt)) {

$fname = db2_result($stmt, 0);$lname = db2_result($stmt, ’LASTNAME’);print "Name: $fname $lname

";}

db2_close($conn);?>

Ejemplo 3: Captación de filas de un conjunto de resultados llamando a la funcióndb2_fetch_both<?php$conn = db2_connect("sample", "db2inst1", "password");$sql = ’SELECT FIRSTNME, LASTNAME FROM EMPLOYEE WHERE EMPNO = ?’;$stmt = db2_prepare($conn, $sql);db2_execute($stmt, array(’000010’));while ($row = db2_fetch_both($stmt)) {

print "NAME: $row[0] $row[1]

";print "NAME: " . $row[’FIRSTNME’] . " " . $row[’LASTNAME’] . "

";}

db2_close($conn);?>

Qué hacer a continuación

Cuando esté listo para cerrar la conexión con la base de datos, llame a la funcióndb2_close. Si intenta cerrar una conexión persistente creada con db2_pconnect, lapetición de cierre devuelve TRUE, y la conexión del cliente de servidor de datos deIBM permanecerá disponible para el siguiente interlocutor.

Captación de objetos grandes en PHP (ibm_db2):

Al captar un objeto grande desde un conjunto de resultados, en lugar de tratar elobjeto grande como una serie de PHP, puede guardar los recursos del sistemamediante la captación de objetos grandes directamente en un archivo de suservidor PHP.

28 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 35: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db2.

Procedimiento

Para captar un objeto grande desde la base de datos directamente en un archivo:1. Cree una variable PHP que represente una corriente. Por ejemplo, asigne a una

variable el valor de retorno de una llamada a la función fopen.2. Cree una sentencia SELECT llamando a la función db2_prepare.3. Vincule la columna de salida del objeto grande a la variable de PHP que

representa a la secuencia llamando a la función db2_bind_param. El tercerargumento de esta función es una serie que representa el nombre de la variablede PHP que conserva el nombre y la vía de acceso del archivo. El cuartoargumento es DB2_PARAM_FILE, que indica a la extensión ibm_db2 que grabelos datos en un archivo.

4. Emita la sentencia de SQL llamando a la función db2_execute.5. Recupere la fila siguiente del conjunto de resultados llamando a una función de

captación de ibm_db2 (por ejemplo, db2_fetch_object).Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Captar un objeto grande de la base de datos.$stmt = db2_prepare($conn, "SELECT name, picture FROM animal_pictures");$picture = fopen("/opt/albums/spook/grooming.jpg", "wb");$rc = db2_bind_param($stmt, 1, "nickname", DB2_CHAR, 32);$rc = db2_bind_param($stmt, 2, "picture", DB2_PARAM_FILE);$rc = db2_execute($stmt);$rc = db2_fetch_object($stmt);

Invocación de procedimientos almacenados en PHP (ibm_db2)Para llamar a un procedimiento almacenado desde una aplicación PHP, prepare yejecute una sentencia de SQL CALL. El procedimiento que invoca puede incluirparámetros de entrada (IN), parámetro de salida (OUT) y parámetros de entrada ysalida.

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db2. Consulte “Conexión a una base de datos de IBM Data Server enPHP (ibm_db2)” en la página 20.

Procedimiento

Para llamar a un procedimiento almacenado:1. Llame a la función db2_prepare, pasando los argumentos listados:

conexiónUn recurso de conexión de base de datos válido que devuelve db2_connecto db2_pconnect.

Capítulo 3. Desarrollo de aplicaciones PHP 29

Page 36: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

sentenciaUna serie que contiene la sentencia de SQL CALL, incluidos los marcadoresde parámetro (?), para los parámetros de entrada o salida

opcionesOpcional: Una matriz asociativa que especifica el tipo de cursor que debedevolverse para conjuntos de resultados. Puede utilizar este parámetro parasolicitar un cursor desplazable en los servidores de bases de datos queadmitan este tipo de cursor. Por omisión, se devuelve un cursor de sóloavance.

2. Por cada marcador de parámetro en la sentencia CALL, llame a la funcióndb2_bind_param, proporcionando los argumentos listados:

sentenciaLa sentencia preparada que devuelve la llamada a la función db2_prepare.

número_parámetroUn entero que representa la posición del marcador de parámetro en lasentencia de SQL.

nombre-variableEl nombre de la variable PHP que se vinculará al parámetro especificado ennúmero_parámetro.

tipo_parámetroUna constante que especifica si se vinculará la variable PHP al parámetrode SQL como un parámetro de entrada (DB2_PARAM_INPUT), unparámetro de salida (DB2_PARAM_OUTPUT) o un parámetro que aceptauna entrada y devuelve una salida (DB2_PARAM_INPUT_OUTPUT).

Este paso vincula cada marcador de parámetro al nombre de una variable PHPque contendrá la salida.

3. Llame a la función db2_execute, pasando la sentencia preparada como unargumento.Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Prepare y ejecute una sentencia de SQL CALL.$sql = ’CALL match_animal(?, ?)’;$stmt = db2_prepare($conn, $sql);

$second_name = "Rickety Ride";$weight = 0;

db2_bind_param($stmt, 1, "second_name", DB2_PARAM_INOUT);db2_bind_param($stmt, 2, "weight", DB2_PARAM_OUT);

print "Values of bound parameters _before_ CALL:\n";print " 1: {$second_name} 2: {$weight}\n";

db2_execute($stmt);

print "Values of bound parameters _after_ CALL:\n";print " 1: {$second_name} 2: {$weight}\n";

Qué hacer a continuación

Si la llamada al procedimiento devuelve uno o varios conjuntos de resultados,puede empezar a captar filas del recurso de sentencia.

30 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 37: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Recuperación de varios conjuntos de resultados de un procedimientoalmacenado en PHP (ibm_db2):

Cuando una única llamada a un procedimiento almacenado devuelve más de unconjunto de resultados, puede utilizar la función db2_next_result de la APIibm_db2 para recuperar los conjuntos de resultados.

Antes de empezar

Debe tener un recurso de sentencia que haya devuelto la función db2_exec odb2_execute que tenga varios conjuntos de resultados.

Procedimiento

Para recuperar varios conjuntos de resultados:1. Capte filas del primer conjunto de resultados devuelto por el procedimiento

mediante la llamada a una de las funciones de captación ibm_db2,proporcionando el recurso de sentencia como argumento. (El primer conjuntode resultados que se devuelve del procedimiento está asociado con el recursode sentencia).

Tabla 6. Funciones de captación de ibm_db2

Función Descripción

db2_fetch_array Devuelve una matriz, indexada por posiciónde columna, que representa una fila en unconjunto de resultados. Las columnas estánindexadas en 0.

db2_fetch_assoc Devuelve una matriz, indexada por nombrede columna, que representa una fila en unconjunto de resultados.

db2_fetch_both Devuelve una matriz, indexada tanto pornombre de columna como por posición, querepresenta una fila en un conjunto deresultados.

db2_fetch_row Establece el puntero del conjunto deresultados en la siguiente fila o la filasolicitada. Utilice esta función para iterarpor un conjunto de resultados.

db2_fetch_object Devuelve un objeto con propiedades querepresenta las columnas de la fila captada.Las propiedades del objeto se correlacionancon los nombres de las columnas delconjunto de resultados.

2. Recupere los conjuntos de resultados siguientes proporcionando el recurso desentencia original como primer argumento a la función db2_next_result. Puedecaptar filas del recurso de sentencia hasta que no haya disponibles más filas enel conjunto de resultados.La función db2_next_result devuelve False cuando no hay más conjuntos deresultados disponibles o el procedimiento no ha devuelto ningún conjunto deresultados.Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Capítulo 3. Desarrollo de aplicaciones PHP 31

Page 38: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Ejemplo

Recuperar varios conjuntos de resultados de un procedimiento almacenado.$stmt = db2_exec($conn, ’CALL multiResults()’);

print "Fetching first result set\n";while ($row = db2_fetch_array($stmt)) {

// Trabajar con fila}

print "\nFetching second result set\n";$result_2 = db2_next_result($stmt);if ($result_2) {

while ($row = db2_fetch_array($result_2)) {// Trabajar con fila

}}

print "\nFetching third result set\n";$result_3 = db2_next_result($stmt);if ($result_3) {

while ($row = db2_fetch_array($result_3)) {// Trabajar con fila

}}

Qué hacer a continuación

Cuando esté listo para cerrar la conexión con la base de datos, llame a la funcióndb2_close. Si intenta cerrar una conexión persistente creada con db2_pconnect, lapetición de cierre devuelve TRUE, y la conexión persistente del cliente de servidorde datos de IBM permanecerá disponible para el siguiente interlocutor.

Modalidades de confirmación en aplicaciones PHP (ibm_db2)Puede controlar cómo se confirman los grupos de sentencias de SQL especificandouna modalidad de confirmación para un recurso de conexión. La extensiónibm_db2 admite dos modalidades de confirmación: la confirmación automática y laconfirmación manual.

Debe utilizar un recurso de conexión regular devuelto por la función db2_connectpara controlar las transacciones de base de datos en PHP. Las conexionespersistentes siempre utilizan la modalidad Autocommit.

Modalidad de confirmación automáticaEn modalidad de confirmación automática, cada sentencia de SQL es unatransacción completa, que se confirma automáticamente. La modalidadAutocommit le ayuda a evitar problemas de escalas de bloqueo quepuedan obstaculizar el rendimiento de aplicaciones Web muy escalables.Por omisión, la extensión ibm_db2 abre cada conexión en modalidadAutocommit.

Puede activar la modalidad de confirmación automática tras inhabilitarlallamando a db2_autocommit($con, DB2_AUTOCOMMIT_ON), donde con es unrecurso de conexión válido.

Llamar a la función db2_autocommit puede afectar al rendimiento de susscripts de PHP, porque requiere comunicación adicional entre PHP y elsistema de gestión de bases de datos.

Modalidad de confirmación manualEn modalidad de confirmación manual, la transacción finaliza al llamar a

32 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 39: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

la función db2_commit o db2_rollback. Esto significa que todas lassentencias ejecutadas en la misma conexión entre el inicio de unatransacción y la llamada a la función de confirmación o retrotracción setratan como una única transacción.

La modalidad de confirmación manual es útil si se necesita retrotraer unatransacción que contiene una o varias sentencias de SQL. Si emitesentencias de SQL en una transacción y el script finaliza sin confirmar oretrotraer explícitamente la transacción, la extensión ibm_db2 retrotraeautomáticamente cualquier trabajo realizado en la transacción.

Puede inhabilitar la modalidad de confirmación automática al crear unaconexión de base de datos utilizando la configuración "AUTOCOMMIT" =>DB2_AUTOCOMMIT_OFF en la matriz de opciones db2_connect. Tambiénpuede desactivar la modalidad de confirmación automática para unrecurso de conexión existente llamando a db2_autocommit($con,DB2_AUTOCOMMIT_OFF), donde con es un recurso de conexión válido.

Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Finalizar la transacción cuando se llama a db2_commit o db2_rollback.$conn = db2_connect(’SAMPLE’, ’db2inst1’, ’ibmdb2’, array(

’AUTOCOMMIT’ => DB2_AUTOCOMMIT_ON));

// Emitir una o más sentencias SQL en la transacción$result = db2_exec($conn, ’DELETE FROM TABLE employee’);if ($result === FALSE) {

print ’<p>No se ha podido completar la transacción</p>’;db2_rollback($conn);

}else {

print ’<p>Successfully completed transaction!</p>’;db2_commit($conn);

}

Funciones de manejo de errores en aplicaciones PHP (ibm_db2)En ocasiones se producen problemas al intentar conectarse a una base de datos oemitir una sentencia de SQL. El nombre de usuario o la contraseña pueden serincorrectos, puede haberse escrito mal un nombre de tabla o columna o lasentencia de SQL puede no ser válida.

La API ibm_db2 proporciona funciones de manejo de errores para ayudarle arecuperarse sin problemas de las situaciones de error.

Errores de conexión

Utilice una de las funciones listadas para recuperar información de diagnóstico sifalla un intento de conexión.

Tabla 7. Funciones de ibm_db2 para manejar errores de conexión

Función Descripción

db2_conn_error Recupera el SQLSTATE devuelto por elúltimo intento de conexión.

Capítulo 3. Desarrollo de aplicaciones PHP 33

Page 40: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 7. Funciones de ibm_db2 para manejar errores de conexión (continuación)

Función Descripción

db2_conn_errormsg Recupera un mensaje de error descriptivoadecuado a la anotación cronológica deerrores de la aplicación

Errores de SQL

Utilice una de las funciones listadas para recuperar información de diagnóstico sifalla un intento de preparar o ejecutar una sentencia de SQL o de captar unresultado de un conjunto de resultados.

Tabla 8. Funciones de ibm_db2 para manejar errores de SQL

Función Descripción

db2_stmt_error Recupera el SQLSTATE devuelto por elúltimo intento de preparar o ejecutar unasentencia de SQL o de captar un resultadode un conjunto de resultados.

db2_stmt_errormsg Recupera un mensaje de error descriptivoadecuado a la anotación cronológica deerrores de la aplicación

Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Consejo: Para evitar las vulneraciones de la seguridad que podrían derivar de lavisualización directa del SQLSTATE en bruto devuelto por la base de datos yofrecer una mejor experiencia general del usuario en la aplicación web, utilice unaestructura de conmutación para recuperar de los estados de errores conocidos odevolver mensajes de errores personalizados. Por ejemplo:switch($this->state):

case ’22001’:// Más datos de los permitidos para la columna definida$message = "Ha entrado demasiados caracteres para este valor.";break;

Ejemplo

Ejemplo 1: Manejo de errores de conexión$connection = db2_connect($database, $user, $password);if (!$connection) {

$this->state = db2_conn_error();return false;

}

Ejemplo 2: Manejo de errores de SQL$stmt = db2_prepare($connection, "DELETE FROM employeeWHERE firstnme = ?");if (!$stmt) {

$this->state = db2_stmt_error();return false;

}

Ejemplo 3: Manejo de errores de SQL que derivan de la ejecución de sentenciaspreparadas

34 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 41: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

$success = db2_execute($stmt, array(’Dan’);if (!$success) {

$this->state = db2_stmt_error($stmt);return $false;

}

Funciones de recuperación de metadatos de base de datos enPHP (ibm_db2)Puede usar las funciones de la API ibm_db2 para recuperar metadatos de las basesde datos atendidas por DB2 para Linux, UNIX y Windows, IBM Cloudscape y, através de DB2 Connect, DB2 para z/OS y DB2 para i.

Algunas clases de aplicaciones como, por ejemplo, las interfaces de administración,deben reflejar de forma dinámica la estructura y los objetos SQL contenidos enbases de datos arbitrarias. Un enfoque para recuperar metadatos sobre una base dedatos consiste en emitir sentencias SELECT directamente contra las tablas decatálogos del sistema; sin embargo, el esquema de las tablas de catálogos delsistema podría variar entre versiones de DB2 o el esquema de las tablas decatálogos del sistema en DB2 para Linux, UNIX y Windows puede diferir delesquema de las tablas de catálogos del sistema en DB2 para z/OS. En lugar deconservar estas diferencias en el código de su aplicación, lo que conlleva unesfuerzo considerable, puede utilizar las funciones de PHP disponibles en laextensión ibm_db2 para recuperar metadatos de la base de datos.

Antes de llamar a estas funciones, debe instalar el entorno PHP y tener un recursode conexión que haya devuelto la función db2_connect o db2_pconnect.

Importante: La llamada a funciones de metadatos utiliza una cantidad de espacioconsiderable. Si es posible, modifique los resultados de las llamadas para su uso enllamadas posteriores.

Tabla 9. Funciones de recuperación de metadatos de ibm_db2

Función Descripción

db2_client_info Devuelve un objeto de sólo lectura coninformación acerca del cliente de servidor dedatos de IBM.

db2_column_privileges Devuelve un conjunto de resultados queenumera las columnas y los privilegiosasociados para una tabla

db2_columns Devuelve un conjunto de resultados queenumera las columnas y los metadatosasociados para una tabla

db2_foreign_keys Devuelve un conjunto de resultados queenumera las claves foráneas para una tabla

db2_primary_keys Devuelve un conjunto de resultados queenumera las claves primarias para una tabla

db2_procedure_columns Devuelve un conjunto de resultados queenumera los parámetros para uno o variosprocedimientos almacenados

db2_procedures Devuelve una lista de resultados queenumera los procedimientos almacenadosregistrados en la base de datos

Capítulo 3. Desarrollo de aplicaciones PHP 35

Page 42: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 9. Funciones de recuperación de metadatos de ibm_db2 (continuación)

Función Descripción

db2_server_info Devuelve un objeto de sólo lectura coninformación sobre la configuración y elsoftware del sistema de gestión de bases dedatos

db2_special_columns Devuelve un conjunto de resultados queenumera los identificadores de filaexclusivos para una tabla

db2_statistics Devuelve un conjunto de resultados queenumera los índices y las estadísticas parauna tabla

db2_table_privileges Devuelve un conjunto de resultados queenumera las tablas y los privilegiosasociados en una base de datos

La mayoría de las funciones de recuperación de metadatos de base de datos queofrece ibm_db2 devuelven conjuntos de resultados con columnas definidas paracada función. Para recuperar filas de los conjuntos de resultados, utilice lasfunciones de ibm_db2 disponibles para tal fin.

Las funciones db2_client_info y db2_server_info devuelven directamente un únicoobjeto con propiedades de sólo lectura. Las propiedades de estos objetos puedenutilizarse para crear una aplicación que tenga un comportamiento distinto enfunción del sistema de gestión de bases de datos al que se conecte. Por ejemplo, enlugar de codificar un límite del denominador común inferior para todos lossistemas de gestión de bases de datos posibles, una aplicación de administraciónde bases de datos basada en Web creada en la extensión ibm_db2 podría utilizar lapropiedad db2_server_info()->MAX_COL_NAME_LEN para visualizar de formadinámica los campos de texto para denominar las columnas con longitudesmáximas que se correspondan con la longitud máxima de los nombres de columnaen el sistema de gestión de bases de datos al que está conectado.

Para obtener más información sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

Ejemplo

Ejemplo 1: Visualizar una lista de las columnas y los privilegios asociados para unatabla<?php$conn = db2_connect(’sample’, ’db2inst1’, ’ibmdb2’);

if($conn) {$stmt = db2_column_privileges($conn, NULL, NULL, ’DEPARTMENT’);$row = db2_fetch_array($stmt);print $row[2] . "\n";print $row[3] . "\n";print $row[7];db2_close($conn);}else {echo db2_conn_errormsg();printf("Connection failed\n\n");}?>

36 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 43: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Ejemplo 2: Visualizar una lista de las claves primarias para una tabla<?php$conn = db2_connect(’sample’, ’db2inst1’, ’ibmdb2’);

if($conn) {$stmt = db2_primary_keys($conn, NULL, NULL, ’DEPARTMENT’);while ($row = db2_fetch_array($stmt)) {echo "TABLE_NAME:\t" . $row[2] . "\n";echo "COLUMN_NAME:\t" . $row[3] . "\n";echo "KEY_SEQ:\t" . $row[4] . "\n";}

db2_close($conn);}else {echo db2_conn_errormsg();printf("Connection failed\n\n");}?>

Ejemplo 3: Visualizar una lista de parámetros para uno o varios procedimientosalmacenados<?php$conn = db2_connect(’sample’, ’db2inst1’, ’ibmdb2’);

if($conn) {$stmt = db2_procedures($conn, NULL, ’SYS%’, ’%%’);

$row = db2_fetch_assoc($stmt);var_dump($row);

db2_close($conn);}else {echo "Connection failed.\n";}?>

Ejemplo 4: Visualizar una lista de los índices y las estadísticas para una tabla<?php$conn = db2_connect(’sample’, ’db2inst1’, ’ibmdb2’);

if($conn) {echo "Test DEPARTMENT table:\n";$result = db2_statistics($conn, NULL, NULL, "EMPLOYEE", 1);while ($row = db2_fetch_assoc($result)) {var_dump($row);}

echo "Test non-existent table:\n";$result = db2_statistics($conn,NULL,NULL,"NON_EXISTENT_TABLE",1);$row = db2_fetch_array($result);if ($row) {echo "Non-Empty\n";} else {echo "Empty\n";}

db2_close($conn);}else {echo ’no connection: ’ . db2_conn_errormsg();}?>

Capítulo 3. Desarrollo de aplicaciones PHP 37

Page 44: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Ejemplo 5: Visualizar una lista de tablas y los privilegios asociados de la base dedatos<?php$conn = db2_connect(’sample’, ’db2inst1’, ’ibmdb2’);

if($conn) {$stmt = db2_table_privileges($conn, NULL, "%%", "DEPARTMENT");while ($row = db2_fetch_assoc($stmt)) {var_dump($row);}db2_close($conn);}else {echo db2_conn_errormsg();printf("Connection failed\n\n");}?>

Desarrollo de aplicaciones en PHP (PDO)La extensión PDO_IBM proporciona una serie de útiles funciones de PHP paraacceder a los datos y manipularlos a través de una interfaz de base de datosorientada a objetos estándar incorporada en PHP 5.1.

La extensión incluye funciones para conectarse a una base de datos, ejecutar ypreparar sentencias de SQL, recuperar filas de conjuntos de resultados, gestionartransacciones, llamar a procedimientos almacenados, gestionar errores y recuperarmetadatos.

Conexión a una base de datos de IBM Data Server con PHP(PDO)Antes de poder emitir sentencias de SQL para crear, actualizar, suprimir orecuperar datos, debe conectarse a una base de datos.

Puede utilizar la interfaz de objetos de datos PHP (PDO) para PHP para conectarcon una base de datos de IBM Data Server mediante una conexión catalogada ouna conexión TCP/IP directa.

Para mejorar el rendimiento, también puede crear una conexión persistente.

Antes de empezar

Debe configurar el entorno de PHP 5.1 (o posterior) en el sistema y habilitar lasextensiones PDO y PDO_IBM.

Acerca de esta tarea

Este procedimiento devuelve un objeto de conexión a una base de datos de IBMData Server. Esta conexión continúa abierta hasta que establece el objeto de PDOen NULL o hasta que finaliza el script de PHP.

Procedimiento

Para conectar con una base de datos de IBM Data Server:1. Cree una conexión a la base de datos llamando al constructor de PDO dentro

de un bloque try{}. Pase un valor DSN que especifique ibm: para la extensiónPDO_IBM, seguido de un nombre de base de datos catalogada o de toda unaserie de conexión de base de datos para una conexión TCP/IP directa.

38 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 45: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

v (Windows): Por omisión, la extensión PDO_IBM utiliza el agrupamiento deconexiones para minimizar los recursos de conexión y mejorar el rendimientode las conexiones.

v (Linux y UNIX): Para crear una conexión persistente, proporcionearray(PDO::ATTR_PERSISTENT => TRUE) como el (cuarto) argumentoopciones_controlador al constructor de PDO.

2. Opcional: Establezca las opciones de manejo de errores para la conexión PDOen el cuarto argumento al constructor de PDO:v Por omisión, PDO establece un mensaje de error que se puede recuperar

mediante PDO::errorInfo() y un SQLCODE que se puede recuperarmediante PDO::errorCode() cuando se produce cualquier error; para solicitaresta modalidad de forma explícita, establezca PDO::ATTR_ERRMODE =>PDO::ERRMODE_SILENT

v Para emitir un E_WARNING de PHP cuando se produzca cualquier error,además de establecer el mensaje de error y SQLCODE, establezcaPDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

v Para emitir una excepción de PHP cuando se produzca cualquier error,establezca PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

3. Detecte cualquier excepción emitida por el bloque try{} en un bloque catch {}correspondiente.Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

Ejemplo

Conexión a una base de datos de IBM Data Server en una conexión persistente.try {

$connection = new PDO("ibm:SAMPLE", "db2inst1", "ibmdb2", array(PDO::ATTR_PERSISTENT => TRUE,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)

);}catch (Exception $e) {

echo($e->getMessage());}

Qué hacer a continuación

A continuación, prepare y ejecute las sentencias de SQL.

Ejecución de sentencias de SQL en PHP (PDO)Después de conectarse a una base de datos, utilice los métodos disponibles en laAPI de PDO para preparar y ejecutar sentencias de SQL. Las sentencias de SQLpueden contener texto estático o marcadores de parámetros que representan laentrada de variables.

Ejecución de una única sentencia de SQL en PHP (PDO):

Para preparar y ejecutar una única sentencia de SQL que no acepta parámetros deentrada, utilice el método PDO::exec o PDO::query. Emplee el método PDO::execpara ejecutar una sentencia que no devuelve conjuntos de resultados. Utilice elmétodo PDO::query para ejecutar una sentencia que devuelve uno o variosconjuntos de resultados.

Capítulo 3. Desarrollo de aplicaciones PHP 39

Page 46: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Antes de empezar

Importante: Para evitar amenazas a la seguridad por ataques de inyección de SQL,utilice el método PDO::exec o PDO::query sólo para ejecutar sentencias de SQLcompuestas de series estáticas. La interpolación de variables de PHP querepresentan la entrada del usuario en la sentencia de SQL puede exponer laaplicación a ataques de inyección de SQL.

Obtener un objeto de conexión mediante una llamada al constructor de PDO.

Procedimiento

Para preparar y ejecutar una única sentencia de SQL que no acepta parámetros deentrada, llame a uno de los métodos listados:v Para ejecutar una sentencia de SQL que no devuelve conjuntos de resultados,

llame al método PDO::exec en el objeto de conexión PDO, proporcionando unaserie que contenga la sentencia de SQL. Por ejemplo, un uso típico de PDO::execes establecer el esquema por omisión para la aplicación en un archivo deinclusión común o clase base.Si la sentencia de SQL se completa con éxito (inserta, modifica o suprime filassatisfactoriamente), el método PDO::execdevuelve un valor entero que representael número de filas que se han insertado, modificado o suprimido.Para determinar si el método PDO::exec falló (devolvió FALSE o 0), utilice eloperador === para probar estrictamente el valor devuelto contra FALSE.

v Para ejecutar una sentencia de SQL que devuelve uno o varios conjuntos deresultados, llame al método PDO::query en el objeto de conexión PDO,proporcionando una serie que contenga la sentencia de SQL. Por ejemplo, esposible que desee llamar a este método para ejecutar una sentencia SELECTestática.Si la llamada de método se realiza con éxito, devuelve un recurso PDOStatementque puede utilizar en llamadas de método posteriores.

Si la llamada de método falla (devuelve FALSE), puede utilizar el métodoPDO::errorCode y PDO::errorInfo para recuperar información de diagnóstico sobreel error.Para obtener más información sobre la API de PDO, consulte http://php.net/manual/en/book.pdo.php.

Ejemplo

Ejemplo 1: Llamar al método PDO::exec para determinar el esquema por omisión desu aplicación$conn = new PDO(’ibm:SAMPLE’, ’db2inst1’, ’ibmdb2’);$result = $conn->exec(’SET SCHEMA myapp’);if ($result === FALSE) {

print "Failed to set schema: " . $conn->errorMsg();}

Ejemplo 2: Llamar al método PDO::query para emitir una sentencia de SQL SELECT$conn = new PDO(’ibm:SAMPLE’, ’db2inst1’, ’ibmdb2’);$result = $conn->query(’SELECT firstnme, lastname FROM employee’);if (!$result) {

print "<p>Could not retrieve employee list: " . $conn->errorMsg(). "</p>";}while ($row = $conn->fetch()) {

print "<p>Name: {$row[0] $row[1]}</p>";}

40 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 47: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Qué hacer a continuación

Si llamó al método PDO::query para crear un objeto PDOStatement, puedeempezar a recuperar filas del objeto llamando al método PDOStatement::fetch oPDOStatement::fetchAll.

Preparación y ejecución de sentencias de SQL en PHP (PDO):

Para preparar y ejecutar una sentencia de SQL que incluya la entrada de variables,utilice los métodos PDO::prepare, PDOStatement::bindParam yPDOStatement::execute. Preparar una sentencia mejora el rendimiento porque elservidor de bases de datos crea un plan de acceso optimizado para la recuperaciónde datos que puede reutilizar si se vuelve a ejecutar la sentencia.

Antes de empezar

Obtener un objeto de conexión mediante una llamada al constructor de PDO.Consulte “Conexión a una base de datos de IBM Data Server con PHP (PDO)” enla página 38.

Procedimiento

Para preparar y ejecutar una sentencia de SQL que incluye marcadores deparámetro:1. Llame al método PDO::prepare, pasando los argumentos listados:

sentenciaUna serie que contiene la sentencia de SQL, incluidos los signos deinterrogación (?), o variables con nombre (:name), como marcadores deparámetro para cualquier valor de columna o predicado que requieraentrada de variables. Sólo puede utilizar marcadores de parámetro comolugar reservado para los valores de columna o predicado. El compilador deSQL no puede crear un plan de acceso para una sentencia que usamarcadores de parámetro en lugar de nombres de columna, nombres detabla u otros identificadores de SQL. No puede utilizar marcadores deparámetro con signo de interrogación (?) y marcadores de parámetro connombre (:name) en la misma sentencia de SQL.

opciones_controladorOpcional: Una matriz que contiene opciones de sentencias:

PDO::ATTR_CURSOREsta opción establece el tipo de cursor que PDO devuelve para losconjuntos de resultados. Por omisión, PDO devuelve un cursor de sóloavance (PDO::CURSOR_FWDONLY), que devuelve la fila siguiente deun conjunto de resultados para cada llamada a PDOStatement::fetch().Puede establecer este parámetro en PDO::CURSOR_SCROLL parasolicitar un cursor desplazable.

Si la llamada de función tiene éxito, devuelve un objeto PDOStatement quepuede utilizar en llamadas de método posteriores relacionadas con estaconsulta.Si la llamada de función falla (devuelve False), puede utilizar el métodoPDO::errorCode o PDO::errorInfo para recuperar información de diagnósticosobre el error.

2. Opcional: Por cada marcador de parámetro en la serie de SQL, llame al métodoPDOStatement::bindParam, proporcionando los argumentos listados. Vincular

Capítulo 3. Desarrollo de aplicaciones PHP 41

Page 48: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

valores de entrada a marcadores de parámetros garantiza que cada valor deentrada se trate como un único parámetro, evitando ataques de inyección deSQL contra la aplicación.

parámetroUn identificador de parámetro. Para los marcadores de parámetro con signode interrogación (?)se trata de un entero que representa la posiciónindexada 1 del parámetro en la sentencia de SQL. Para marcadores deparámetro con nombre (:name), se trata de una serie que representa elnombre de parámetro.

variableValor que se debe utilizar en lugar del marcador de parámetro

3. Llame al método PDOStatement::execute, opcionalmente pasando una matrizque contiene los valores que se deben utilizar en lugar de los marcadores deparámetro, bien en orden para marcadores de parámetro de signo deinterrogación, bien como una matriz asociativa :name => value paramarcadores de parámetro con nombre.Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

Ejemplo

Preparar y ejecutar una sentencia que incluye entrada de variables.$sql = "SELECT firstnme, lastname FROM employee WHERE bonus > ? AND bonus < ?";$stmt = $conn->prepare($sql);if (!$stmt) {

// Manejar los errores}

// Vincular explícitamente los parámetros$stmt->bindParam(1, $_POST[’lower’]);$stmt->bindParam(2, $_POST[’upper’]);

$stmt->execute($stmt);

// Invocar de nuevo la sentencia utilizando parámetros vinculados dinámicamente$stmt->execute($stmt, array($_POST[’lower’], $_POST[’upper’]));

Qué hacer a continuación

Si la sentencia de SQL devuelve uno o varios conjuntos de resultados, puedeempezar a captar filas del recurso de sentencia llamando al métodoPDOStatement::fetch o PDOStatement::fetchAll.

Inserción de objetos grandes en PHP (PDO):

Cuando inserta un objeto grande en la base de datos, en lugar de cargar todos losdatos del objeto grande en una serie de PHP y entonces pasarlos a la base de datosde IBM Data Server mediante una sentencia INSERT, puede insertar los objetosgrandes directamente desde un archivo en el servidor PHP.

Antes de empezar

Obtener un objeto de conexión mediante una llamada al constructor de PDO.

Procedimiento

Para insertar un objeto grande en la base de datos directamente desde un archivo:

42 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 49: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

1. Llame al método PDO::prepare para crear un objeto PDOStatement a partir deuna sentencia INSERT con un marcador de parámetro que represente lacolumna del objeto grande.

2. Cree una variable de PHP que represente una secuencia (por ejemplo,asignando el valor devuelto por la función fopen a la variable).

3. Llame al método PDOStatement::bindParam, pasando los argumentos listadospara vincular el marcador de parámetro a la variable de PHP que represente lasecuencia de datos para el objeto grande:

parámetroUn identificador de parámetro. Para los marcadores de parámetro con signode interrogación (?)se trata de un entero que representa la posiciónindexada 1 del parámetro en la sentencia de SQL. Para marcadores deparámetro con nombre (:name), se trata de una serie que representa elnombre de parámetro.

variableValor que se debe utilizar en lugar del marcador de parámetro

data_typeLa constante de PHP, PDO::PARAM_LOB, que indica a la extensión PDO quedebe recuperar los datos de un archivo.

4. Llame al método PDOStatement::execute para emitir la sentencia INSERT.

Ejemplo

Insertar un objeto grande en la base de datos.$stmt = $conn->prepare("INSERT INTO animal_pictures(picture) VALUES (?)");$picture = fopen("/opt/albums/spook/grooming.jpg", "rb");$stmt->bindParam(1, $picture, PDO::PARAM_LOB);$stmt->execute();

Lectura de conjuntos de resultados de consultas

Captación de filas o columnas de conjuntos de resultados en PHP (PDO):

Después de ejecutar una sentencia que devuelve uno o más conjuntos deresultados, utilice uno de los métodos disponibles en la API de PDO para iterarpor las filas devueltas. La API de PDO ofrece también métodos para captar unaúnica columna de una o varias filas en el conjunto de resultados.

Antes de empezar

Debe tener un recurso de sentencia que haya devuelto el método PDO::query oPDOStatement::execute que tenga asociados uno o varios conjuntos de resultados.

Procedimiento

Para captar datos de un conjunto de resultados:1. Capte los datos de un conjunto de resultados llamando a uno de los métodos

de captación:v Para devolver una única fila de un conjunto de resultados como una matriz

u objeto, llame al método PDOStatement::fetch.v Para devolver todas las filas del conjunto de resultados como una matriz de

matrices u objetos, llame al método PDOStatement::fetchAll.

Capítulo 3. Desarrollo de aplicaciones PHP 43

Page 50: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Por omisión, PDO devuelve cada fila como una matriz indexada por el nombrede columna y la posición de columna indexada 0 en la fila. Para solicitar unestilo de devolución diferente, especifique una de las constantes PDO::FETCH_*como primer parámetro al llamar al método PDOStatement::fetch:

PDO::FETCH_ASSOCDevuelve una matriz indexada por nombre de columna tal y como seha devuelto en el conjunto de resultados.

PDO::FETCH_BOTH (valor por omisión)Devuelve una matriz indexada tanto por nombre de columna como pornúmero de columna indexado 0 en el conjunto de resultados

PDO::FETCH_BOUNDDevuelve TRUE y asigna los valores de las columnas del conjunto deresultados a las variables de PHP a las que estaban vinculadas con elmétodo PDOStatement::bindParam.

PDO::FETCH_CLASSDevuelve una nueva instancia de la clase solicitada, correlacionando lascolumnas del conjunto de resultados con las propiedades con nombrede la clase.

PDO::FETCH_INTOActualiza una instancia existente de la clase solicitada, correlacionandolas columnas del conjunto de resultados con las propiedades de laclase.

PDO::FETCH_LAZYCombina PDO::FETCH_BOTH y PDO::FETCH_OBJ, creando los nombres devariable de objeto conforme se accede a los mismos.

PDO::FETCH_NUMDevuelve una matriz indexada por número de columna tal y como seha devuelto en el conjunto de resultados, empezando en la columna 0.

PDO::FETCH_OBJDevuelve un objeto anónimo con nombres de propiedad que secorresponden con los nombres de columna devueltos en el conjunto deresultados.

Si ha solicitado un cursor desplazable al llamar al método PDO::query oPDOStatement::execute, puede pasar los parámetros opcionales listados quecontrolan qué filas se devuelven al emisor:v Una de las constantes PDO::FETCH_ORI_* que representa la orientación de

captación de la petición de captación:

PDO::FETCH_ORI_NEXT (valor por omisión)Capta la siguiente fila del conjunto de resultados.

PDO::FETCH_ORI_PRIORCapta la fila anterior del conjunto de resultados.

PDO::FETCH_ORI_FIRSTCapta la primera fila del conjunto de resultados.

PDO::FETCH_ORI_LASTCapta la última fila del conjunto de resultados.

PDO::FETCH_ORI_ABSCapta la fila absoluta del conjunto de resultados. Requiere un enteropositivo como tercer argumento para el métodoPDOStatement::fetch.

44 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 51: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

PDO::FETCH_ORI_RELcapta la fila relativa del conjunto de resultados. Requiere un enteropositivo o negativo como tercer argumento para el métodoPDOStatement::fetch.

v Entero que solicita la fila absoluta o relativa del conjunto de resultados,correspondiente a la orientación de captación solicitada en el segundoargumento al método PDOStatement::fetch.

2. Opcional: Capte una única columna de una o varias filas de un conjunto deresultados llamando a uno de los métodos listados:v Para devolver una sola columna desde una sola fila del conjunto de

resultados:Llame al método PDOStatement::fetchColumn especificando la columna quedesee recuperar como el primer argumento del método. Los números decolumna empiezan por el 0. Si no especifica ninguna columna,PDOStatement::fetchColumn devuelve la primera columna de la fila.

v Para devolver una matriz que contenga una sola columna de todas las filasrestantes del conjunto de resultados:Llame al método PDOStatement::fetchAll pasando la constantePDO::FETCH_COLUMN como el primer argumento y la columna que desearecuperar como el segundo argumento. Los números de columna empiezanpor el 0. Si no especifica ninguna columna, al llamar aPDOStatement::fetchAll(PDO::FETCH_COLUMN) se devuelve la primeracolumna de la fila.

Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

Ejemplo

Devolver una matriz indexada por número de columna.$stmt = $conn->query("SELECT firstnme, lastname FROM employee");while ($row = $stmt->fetch(PDO::FETCH_NUM)) {

print "Name: <p>{$row[0] $row[1]}</p>";}

Qué hacer a continuación

Cuando esté listo para cerrar la conexión a la base de datos, establezca el objetoPDO en NULL. La conexión se cierra automáticamente cuando finaliza el script dePHP.

Captación de objetos grandes en PHP (PDO):

Al captar un objeto grande desde un conjunto de resultados, en lugar de tratar elobjeto grande como una serie de PHP, puede guardar los recursos del sistemamediante la captación de objetos grandes directamente en un archivo de suservidor PHP.

Antes de empezar

Obtener un objeto de conexión mediante una llamada al constructor de PDO.

Procedimiento

Para captar un objeto grande desde la base de datos directamente en un archivo:

Capítulo 3. Desarrollo de aplicaciones PHP 45

Page 52: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

1. Cree una variable PHP que represente una corriente. Por ejemplo, asigne a unavariable el valor de retorno de una llamada a la función fopen.

2. Cree un objeto PDOStatement a partir de una sentencia de SQL llamando almétodo PDO::prepare.

3. Vincule la columna de salida del objeto grande a la variable de PHP querepresenta a la secuencia llamando al método PDOStatement::bindColumn. Elsegundo argumento es una serie que representa el nombre de la variable dePHP que conserva el nombre y la vía de acceso del archivo. El tercerargumento es una constante de PHP, PDO::PARAM_LOB, que indica a laextensión PDO que grabe los datos en un archivo. Debe llamar al métodoPDOStatement::bindColumn para asignar una variable de PHP distinta paracada columna del conjunto de resultados.

4. Emita la sentencia de SQL llamando al método PDOStatement::execute.5. Llame a PDOStatement::fetch(PDO::FETCH_BOUND) para recuperar la fila

siguiente del conjunto de resultados, vinculando la salida de la columna a lasvariables de PHP que asoció cuando llamó al métodoPDOStatement::bindColumn.

Ejemplo

Capte un objeto grande desde la base de datos directamente en un archivo.$stmt = $conn->prepare("SELECT name, picture FROM animal_pictures");$picture = fopen("/opt/albums/spook/grooming.jpg", "wb");$stmt->bindColumn(’NAME’, $nickname, PDO::PARAM_STR, 32);$stmt->bindColumn(’PICTURE’, $picture, PDO::PARAM_LOB);$stmt->execute();$stmt->fetch(PDO::FETCH_BOUND);

Invocación de procedimientos almacenados en PHP (PDO)Para llamar a un procedimiento almacenado desde una aplicación PHP, ejecute unasentencia de SQL CALL. El procedimiento que invoca puede incluir parámetros deentrada (IN), parámetro de salida (OUT) y parámetros de entrada y salida.

Antes de empezar

Obtener un objeto de conexión mediante una llamada al constructor de PDO.

Acerca de esta tarea

Este procedimiento prepara y ejecuta una sentencia de SQL CALL. Para obtenermás información, consulte también el tema sobre preparación y ejecución desentencias de SQL.

Procedimiento

Para llamar a un procedimiento almacenado:1. Llame al método PDO::prepare para preparar una sentencia CALL con

marcadores de parámetro que representen los parámetros OUT e INOUT.2. Para cada marcado de parámetro de la sentencia CALL, llame al método

PDOStatement::bindParam para vincular cada marcador de parámetro con elnombre de la variable de PHP que contendrá el valor de salida del parámetrodespués de emitir la sentencia CALL. Para los parámetros INOUT, el valor dela variable de PHP se pasa como el valor de entrada del parámetro cuando seemite la sentencia CALL.

46 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 53: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

a. Establezca el tercer parámetro, data_type, en una de las constantes dePDO::PARAM_* que especifica el tipo de datos que se está vinculando:

PDO::PARAM_NULLRepresenta el tipo de datos SQL NULL.

PDO::PARAM_INTRepresenta los tipos enteros SQL.

PDO::PARAM_LOBRepresenta los tipos de objetos grandes SQL.

PDO::PARAM_STRRepresenta los tipos de datos de caracteres SQL.

Para un parámetro INOUT, utilice el operador basado en bits OR paraañadir PDO::PARAM_INPUT_OUTPUT al tipo de datos que se está vinculando.

b. Establezca el cuarto parámetro, longitud, en la longitud máxima esperadadel valor de salida.

3. Llame al método PDOStatement::execute, pasando la sentencia preparada comoun argumento.Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

Ejemplo

Prepare y ejecute una sentencia de SQL CALL.$sql = ’CALL match_animal(?, ?)’;$stmt = $conn->prepare($sql);

$second_name = "Rickety Ride";$weight = 0;

$stmt->bindParam(1, $second_name, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 32);$stmt->bindParam(2, $weight, PDO::PARAM_INT, 10);

print "Values of bound parameters _before_ CALL:\n";print " 1: {$second_name} 2: {$weight}\n";

$stmt->execute();

print "Values of bound parameters _after_ CALL:\n";print " 1: {$second_name} 2: {$weight}\n";

Recuperación de varios conjuntos de resultados de un procedimientoalmacenado en PHP (PDO):

Cuando una única llamada a un procedimiento almacenado devuelve más de unconjunto de resultados, puede utilizar el método PDOStatement::nextRow de laAPI de PDO para recuperar los conjuntos de resultados.

Antes de empezar

Debe tener un objeto PDOStatement que haya devuelto la llamada a unprocedimiento almacenado con el método PDO::query o PDOStatement::execute.

Procedimiento

Para recuperar varios conjuntos de resultados:

Capítulo 3. Desarrollo de aplicaciones PHP 47

Page 54: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

1. Capte filas del primer conjunto de resultados devuelto por el procedimientomediante la llamada a uno de los métodos de captación de PDO. (El primerconjunto de resultados que se devuelve del procedimiento está asociado con elobjeto PDOStatement que devuelve la sentencia CALL).v Para devolver una única fila de un conjunto de resultados como una matriz

u objeto, llame al método PDOStatement::fetch.v Para devolver todas las filas del conjunto de resultados como una matriz de

matrices u objetos, llame al método PDOStatement::fetchAll.

Capte filas desde el objeto PDOStatement hasta que no haya disponibles másfilas en el primer conjunto de resultados.

2. Recupere los conjuntos de resultados siguientes llamando al métodoPDOStatement::nextRowset para devolver el conjunto de resultados siguiente.Puede captar filas desde el objeto PDOStatement hasta que no haya disponiblesmás filas en el conjunto de resultados.El método PDOStatement::nextRowset devuelve False cuando no hay másconjuntos de resultados disponibles o cuando el procedimiento no ha devueltoningún conjunto de resultados.Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

Ejemplo

Recuperar varios conjuntos de resultados de un procedimiento almacenado.$sql = ’CALL multiple_results()’;$stmt = $conn->query($sql);do {

$rows = $stmt->fetchAll(PDO::FETCH_NUM);if ($rows) {

print_r($rows);}

} while ($stmt->nextRowset());

Qué hacer a continuación

Cuando esté listo para cerrar la conexión a la base de datos, establezca el objetoPDO en NULL. La conexión se cierra automáticamente cuando finaliza el script dePHP.

Modalidades de confirmación en PHP (PDO)Puede controlar cómo se confirman los grupos de sentencias de SQL especificandouna modalidad de confirmación para un recurso de conexión. La extensión PDOadmite dos modalidades de confirmación: la confirmación automática y laconfirmación manual.

Modalidad de confirmación automáticaEn modalidad de confirmación automática, cada sentencia de SQL es unatransacción completa, que se confirma automáticamente. La modalidadAutocommit le ayuda a evitar problemas de escalas de bloqueo quepuedan obstaculizar el rendimiento de aplicaciones Web muy escalables.Por omisión, la extensión PDO abre cada conexión en modalidad deconfirmación automática.

Modalidad de confirmación manualEn modalidad de confirmación manual, la transacción comienza al llamaral método PDO::beginTransaction, y finaliza al llamar al métodoPDO::commit o PDO::rollBack. Esto significa que las sentencias ejecutadas

48 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 55: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

(en la misma conexión) entre el inicio de una transacción y la llamada almétodo de confirmación o retrotracción se tratan como una únicatransacción.

La modalidad de confirmación manual es útil si se necesita retrotraer unatransacción que contiene una o varias sentencias de SQL. Si emitesentencias SQL en una transacción y el script finaliza sin confirmar oretrotraer explícitamente la transacción, PDO automáticamente retrotraecualquier trabajo realizado en la transacción.

Después de confirmar o retrotraer la transacción, PDO restableceautomáticamente la conexión de base de datos a la modalidadAutocommit.

Para obtener más información sobre la API de PDO, consulte http://php.net/manual/en/book.pdo.php.

Ejemplo

Finalizar la transacción cuando se llama a PDO::commit o PDO::rollBack.$conn = new PDO(’ibm:SAMPLE’, ’db2inst1’, ’ibmdb2’, array(

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));// PDO::ERRMODE_EXCEPTION significa que un error SQL emite una excepción

try {// Emitir estas sentencias SQL en una transacción en un bloque try{}$conn->beginTransaction();

// Una o más sentencias SQL

$conn->commit();}catch (Exception $e) {

// Si algo ha emitido una excepción en nuestro bloque de transacciones// de sentencias, retrotraer cualquier trabajo realizado en la transacciónprint ’<p>No se ha podido completar la transacción</p>’;$conn->rollBack();

}

Manejo de errores y avisos en PHP (PDO)En ocasiones se producen problemas al intentar conectarse a una base de datos oemitir una sentencia de SQL. Es posible que la contraseña para la conexión seaincorrecta, que la tabla a la que hizo referencia en una sentencia SELECT no existao que la sentencia de SQL no sea válida.

PDO proporciona métodos de manejo de errores para ayudarle a recuperarse sinproblemas de las situaciones de error.

Antes de empezar

Debe configurar el entorno de PHP en el sistema y habilitar las extensiones PDO yPDO_IBM.

Acerca de esta tarea

PDO le ofrece la opción de manejar errores como avisos, errores o excepciones. Sinembargo, cuando crea un nuevo objeto de conexión de PDO, éste siempre emite unobjeto PDOException si se produce un error. Si no capta la excepción, PHPimprime un rastreo de la información del error, que puede mostrar las credencialesde conexión de la base de datos, incluido su nombre de usuario y contraseña.

Capítulo 3. Desarrollo de aplicaciones PHP 49

Page 56: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Este procedimiento capta un objeto PDOException y gestiona el error asociado.

Procedimiento1. Para captar un objeto PDOException y gestionar el error asociado:

a. Transmita la llamada al constructor de PDO en un bloque try.b. A continuación del bloque try, incluya un bloque catch que capte el objeto

PDOException.c. Recupere el mensaje de error asociado al error invocando el método

Exception::getMessage en el objeto PDOException.2. Para recuperar el SQLSTATE asociado a un objeto PDO o PDOStatement,

invoque el método errorCode sobre el objeto.3. Para recuperar la matriz asociada a un objeto PDO o PDOStatement, invoque el

método errorInfo sobre el objeto. La matriz contiene una serie que representa elSQLSTATE como el primer elemento, un entero que representa el código deerror SQL o CLI como el segundo elemento y una serie que contiene el textocompleto del mensaje de error como el tercer elemento.Para obtener más información sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

50 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 57: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Capítulo 4. Desarrollo de aplicaciones Python

Desarrollo de aplicaciones Python, SQLAlchemy y Django Frameworkpara servidores de base de datos de IBM

Python es un lenguaje de creación de scripts general y de primer nivel muyadecuado para el rápido desarrollo de las aplicaciones. Python hace hincapié en lalegibilidad del código y admite diversos paradigmas de programación, queincluyen la programación de procedimientos, orientada a objetos, orientada aaspectos, funcional y la metaprogramación. Python Software Foundationadministra el lenguaje Python.

Las extensiones que se muestran están disponibles para acceder a los servidores debase de datos de IBM desde una aplicación Python:

ibm_dbIBM define esta API, que proporciona el mejor soporte para característicasavanzadas. Además de emitir consultas de SQL, llamar a procedimientosalmacenados y utilizar el soporte pureXML, puede acceder a informaciónde metadatos.

ibm_db_dbiEsta API implementa Python Database API Specification 2.0. Dado que laAPI ibm_db_dbi se ajusta a la especificación, no ofrece algunas de lascaracterísticas avanzadas que soporta la API ibm_db. Si tiene unaaplicación con un controlador que admita Python Database APISpecification v2.0, puede cambiar fácilmente a ibm_db. Las API ibm_db eibm_db_dbi se empaquetan conjuntamente.

ibm_db_saEste adaptador da soporte a SQLAlchemy, que ofrece una forma flexible deacceder a servidores de base de datos de IBM. SQLAlchemy es un popularkit de herramientas de código abierto y correlacionador relacional deobjetos (ORM) SQL Python.

ibm_db_djangoEste adaptador proporciona acceso a servidores de datos de IBM desdeDjango. Django es una conocida infraestructura web que se utiliza paracrear aplicaciones web elegantes y de alto rendimiento de forma rápida.

Si desea conectar las aplicaciones Python a DB2 para i V5R4 y servidoresposteriores, debe tener aplicado PTF SI27256 a esos servidores.

Descargas y recursos relacionados de PythonHay disponibles muchos recursos para ayudarle a desarrollar aplicaciones dePython para servidores de datos de IBM.

Tabla 10. Descargas y recursos relacionados de Python

Descargas

Python (incluye archivos binarios deWindows. La mayoría de las distribucionesLinux incorporan Python previamentecompilado. )

http://www.python.org/download/

© Copyright IBM Corp. 2006, 2014 51

Page 58: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 10. Descargas y recursos relacionados de Python (continuación)

Descargas

SQLAlchemy http://www.sqlalchemy.org/download.html

Django http://www.djangoproject.com/download/

Extensiones ibm_db e ibm_db_dbi (incluidoel código fuente)

http://pypi.python.org/pypi/ibm_db/

http://code.google.com/p/ibm-db/downloads/list

Adaptador ibm_db_sa para SQLAlchemy 0.4 http://code.google.com/p/ibm-db/downloads/list

http://pypi.python.org/pypi/ibm_db_sa

Adaptador ibm_db_django para Django 1.0.xy 1.1

http://code.google.com/p/ibm-db/downloads/list

http://pypi.python.org/pypi/ibm_db_django

Programa setuptools http://pypi.python.org/pypi/setuptools

IBM Data Server Driver Package(controlador DS)

http://www.ibm.com/software/data/support/data-server-clients/index.html

Documentación de la API

Documentación de la API ibm_db http://code.google.com/p/ibm-db/wiki/APIs

Python Database API Specification v2.0 http://www.python.org/dev/peps/pep-0249/

Documentación de SQLAlchemy

Pasos rápidos de iniciación para ibm_db_sa http://code.google.com/p/ibm-db/wiki/README

Documentación de SQLAlchemy http://www.sqlalchemy.org/docs/index.html

Documentación de Django

Pasos de iniciación para ibm_db_django http://code.google.com/p/ibm-db/wiki/ibm_db_django_README

Documentación de Django http://www.djangoproject.com

Recursos adicionales

Sitio web del lenguaje de programaciónPython

http://www.python.org/

Sitio web del kit de herramientas y elcorrelacionador relacional de objetos de SQLde Python

http://www.sqlalchemy.org/

Configuración del entorno Python para servidores de base dedatos de IBM

Antes de poder conectarse a un servidor de base de datos de IBM y ejecutarsentencias SQL, debe configurar el entorno Python instalando el controladoribm_db (Python) y, opcionalmente, el adaptador ibm_db_sa (SQLAlchemy) oibm_db_django (Django).

Antes de empezar

Asegúrese de que el siguiente software esté instalado en su sistema:

52 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 59: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

v Python 2.5 o posterior. Para los sistemas operativos Linux, también se necesita elpaquete python2.5-dev.

v El programa setuptools o el programa distribute. El programa setuptools estádisponible en http://pypi.python.org/pypi/setuptools y el programadistribute está disponible en http://pypi.python.org/pypi/distribute. Puedeutilizar el programa setuptools o el programa distribute para descargar,compilar, instalar, actualizar y desinstalar paquetes Python.

v Si la aplicación Python se va a conectar a una base de datos de IBM remota, serequiere uno de los siguientes productos en el sistema donde se ejecutará laaplicación:– El producto IBM Data Server Client– El producto IBM Data Server Runtime Client– El producto IBM Data Server Driver Package– El producto IBM Data Server Driver para ODBC y CLI

Si la aplicación Python se conecta a un servidor de base de datos de IBM en elsistema local, no se necesita ningún producto de servidor de datos adicional deIBM.

Procedimiento

Para configurar el entorno Python:1. Utilizando uno de los dos métodos siguientes, instale el controlador Python

ibm_db:v Instalación desde el repositorio remoto:

a. Establezca la variable de entorno IBM_DB_HOME utilizando el mandatoexport:$export IBM_DB_HOME=DB2HOME

donde DB2HOME es el directorio donde está instalado el producto delservidor de datos de IBM.Por ejemplo, emita el mandato siguiente para establecer la variable deentorno IBM_DB_HOME:$ export IBM_DB_HOME=/home/db2inst1/sqllib

b. Emita el mandato siguiente:$ easy_install ibm_db

v Utilice los archivos que se incluyen con los productos del servidor de datosde IBM. El cliente de IBM Data Server y el software de IBM Data ServerDriver Package incluyen los archivos Python necesarios.a. Cambie la vía de acceso actual por la vía de acceso de instalación del

producto del servidor de datos de IBM donde se encuentran los archivos.egg de Python (IBM_DB_HOME/pythonXX).

b. Emita el mandato siguiente:$ easy_install ibm_db-X.X.X-pyX.X-XXXXXXXX.egg

2. Opcional: Utilizando uno de los dos métodos siguientes, instale el adaptadorSQLAlchemy ibm_db_sa o el adaptador Django ibm_db_django:v Instalación desde el repositorio remoto:

– Para instalar el adaptador SQLAlchemy, emita el mandato siguiente:$ easy_install ibm_db_sa

– Para instalar el adaptador Django, emita el mandato siguiente:$ easy_install ibm_db_django

Capítulo 4. Desarrollo de aplicaciones Python 53

Page 60: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

v Utilice los archivos que se incluyen con los productos del servidor de datosde IBM:a. Cambie la vía de acceso actual por la vía de acceso de instalación del

producto del servidor de datos de IBM donde se encuentran los archivos.egg de Python (IBM_DB_HOME/pythonXX).

b. Para instalar el adaptador SQLAlchemy, emita el mandato siguiente:$ easy_install ibm_db_sa-X.X.X-pyX.X.egg

c. Para instalar el adaptador django, emita el mandato siguiente:$ easy_install ibm_db_django-X.X.X-pyX.X.egg

3. Asegúrese de que el controlador Python pueda acceder al archivo libdb2.sodel controlador CLI:v Para los sistemas operativos Linux y UNIX de 32 bits distintos al sistema

operativo AIX, establezca la variable LD_LIBRARY_PATH en el directorioIBM_DB_HOME/lib32 emitiendo el mandato export:export LD_LIBRARY_PATH=IBM_DB_HOME/lib32

v Para los sistemas operativos Linux y UNIX de 64 bits distintos al sistemaoperativo AIX, establezca la variable LD_LIBRARY_PATH en el directorioIBM_DB_HOME/lib64 emitiendo el mandato export:export LD_LIBRARY_PATH=IBM_DB_HOME/lib64

v Para un sistema operativo AIX de 32 bits, establezca la variable LIBPATH en eldirectorio IBM_DB_HOME/lib32 emitiendo el mandato export:export LIBPATH=IBM_DB_HOME/lib32

v Para un sistema operativo AIX de 64 bits, establezca la variable LIBRARY_PATHen el directorio IBM_DB_HOME/lib64 emitiendo el mandato export:export LIBPATH=IBM_DB_HOME/lib64

Qué hacer a continuación

Pruebe la conexión del controlador Python ibm_db, el adaptador SQLAlchemyibm_db_sa y el adaptador Django ibm_db_django utilizando las aplicaciones deprueba.

Verificación de la instalación del controlador Python, eladaptador SQLAlchemy y el adaptador Django

Cuando la instalación del controlador Python y los adaptadores opcionales se hacompletado, se recomienda probar el nuevo entorno Python para verificar que lainstalación está funcionando.

Antes de empezar

Debe tener el siguiente software instalado en su sistema:v Python 2.5 o posterior. Para los sistemas operativos Linux, también es necesario

el paquete python2.5-dev.v Si la aplicación Python se conecta a una base de datos de IBM remota, el sistema

que ejecuta la aplicación Python requiere uno de los siguientes productos:– IBM Data Server Client– IBM Data Server Runtime Client– IBM Data Server Driver Package– IBM Data Server Driver para ODBC y CLI

54 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 61: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

v Si la aplicación Python se conecta a una base de datos de IBM local, no senecesita ningún producto de servidor de datos adicional de IBM.

v El entorno Python debe estar configurado para el controlador y los adaptadoreslistados:– controlador Python ibm_db– adaptador SQLAlchemy ibm_db_sa– adaptador Django ibm_db_django

Procedimiento

Para verificar que la instalación de Python sea satisfactoria:1. Utilizando el mandato python, inicie el intérprete de Python.

$ python

2. Utilizando el código listado, pruebe el controlador Python ibm_db:import ibm_dbibm_db_conn = ibm_db.connect(’database’, ’user’, ’password’)import ibm_db_dbiconn = ibm_db_dbi.Connection(ibm_db_conn)conn.tables(’SYSCAT’, ’%’)

Debe especificar un nombre de base de datos válido (database), el ID deusuario (user) y la contraseña (password) en el código. Una conexiónsatisfactoria indica la instalación válida del controlador Python ibm_db.

3. Opcional: Utilizando el código listado, pruebe el adaptador SQLAlchemyibm_db_sa:import sqlalchemyfrom sqlalchemy import *import ibm_db_sa.ibm_db_sadb2 = sqlalchemy.create_engine(’ibm_db_sa://user:[email protected]:50000/database’)metadata = MetaData()users = Table(’STAFF’, metadata,Column(’ID’, Integer, primary_key = True),Column(’NAME’, String(9), nullable = False),Column(’DEPT’, Integer, nullable = False),Column(’JOB’, String(5), nullable = False))

Debe especificar un nombre de base de datos válido (database), el ID deusuario (user) y la contraseña (password) en la serie de argumentosqlalchemy.create_engine. Una conexión satisfactoria indica la instalación válidadel adaptador Django ibm_db_django .

4. Opcional: Utilizando el código listado, pruebe el adaptador Djangoibm_db_django:a. Utilizando el mandato django-admin.py startproject, cree un nuevo

proyecto Django:django-admin.py startproject myproj

b. Utilizando el editor de su elección, edite el diccionario DATABASES en elarchivo settings.py para configurar el acceso al servidor de base de datosde IBM:DATABASES = {’default’: {’ENGINE’ : ’ibm_db_django’,’NAME’ : ’database’,’USER’ : ’user’,’PASSWORD’ : ’password’,’HOST’ : ’localhost’,’PORT’ : ’50000’,’PCONNECT’ : True, #Optional property. It is true by default}

}

Capítulo 4. Desarrollo de aplicaciones Python 55

Page 62: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Debe especificar un nombre de base de datos válido (database), el ID deusuario (user), la contraseña (password), el nombre de sistema principal(localhost) y el número de puerto (50000) en la entrada del archivosettings.py.

c. Utilizando el editor de su elección, añada la siguiente tupla de series a lasección INSTALLED_APPS del archivo settings.py:’django.contrib.flatpages’,’django.contrib.redirects’,’django.contrib.comments’,’django.contrib.admin’,

d. Utilizando la aplicación manage.py, verifique la configuración de Django:python manage.py test

Desarrollo de aplicaciones en Python con ibm_dbLa API ibm_db proporciona una serie de funciones Python para acceder a datos deuna base de datos de servidores de datos IBM y manipularlos, incluyendo entreotros datos, las funciones de conexión a una base de datos, de preparación yemisión de sentencias de SQL, de captación de filas de conjuntos de resultados, dellamadas a procedimientos almacenados, de confirmación y retrotracción detransacciones, de manejo de errores y de recuperación de metadatos.

Conexión a un servidor de base de datos de IBM en PythonAntes de poder ejecutar sentencias de SQL para crear, actualizar, suprimir orecuperar datos, debe conectarse a una base de datos. Puede utilizar la API ibm_dbpara conectarse a una base de datos mediante una conexión catalogada o nocatalogada. Para mejorar el rendimiento, también puede crear una conexiónpersistente.

Antes de empezarv Configuración del entorno Python para servidores de base de datos de IBM.v Emita el mandato import ibm_db desde el script de Python.

Procedimiento

Llame a una de las funciones que se muestran para establecer conexión con unservidor de base de datos de IBM:

Tabla 11. Funciones de conexión de ibm_db

Función Descripción

ibm_db.connect Crea una conexión no persistente.

ibm_db.pconnect Crea una conexión persistente. Una conexiónpersistente permanece abierta después de lapetición inicial del script de Python, lo quepermite que las peticiones de Pythonposteriores reutilicen la conexión. Laspeticiones de conexión de Python posterioresdeben tener un conjunto idéntico decredenciales.

El valor de base de datos que proporcione como argumento a estas funcionespuede ser un nombre de base de datos catalogado o una serie de conexión de basede datos completa para una conexión TCP/IP directa. Puede especificarargumentos opcionales que controlen la temporización de confirmación de lastransacciones, las mayúsculas/minúsculas de los nombres de columna que sedevuelven y el tipo de cursor.Si el intento de conexión falla, puede recuperar información de diagnósticollamando a la función ibm_db.conn_error o ibm_db.conn_errormsg.

56 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 63: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Para obtener más información sobre la API ibm_db, consulte http://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Ejemplo 1: Conexión con una base de datos local o catalogadaimport ibm_dbconn = ibm_db.connect("database","username","password")

Ejemplo 2: Conexión con una base de datos no catalogadaimport ibm_dbibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;

PWD=password;", "", "")

Qué hacer a continuación

Si el intento de conexión se realiza correctamente, puede utilizar el recurso deconexión al llamar a funciones de ibm_db que ejecutan sentencias de SQL. Acontinuación, prepare y ejecute las sentencias de SQL.

Ejecución de sentencias de SQL en PythonDespués de conectarse a una base de datos, utilice las funciones disponibles en laAPI ibm_db para preparar y ejecutar sentencias de SQL. Las sentencias de SQLpueden contener texto estático, expresiones XQuery o marcadores de parámetrosque representan la entrada de variables.

Preparación y ejecución de una única sentencia de SQL en Python:

Para preparar y ejecutar una única sentencia de SQL, utilice la funciónibm_db.exec_immediate.

Para evitar amenazas a la seguridad por ataques de inyección de SQL, utilice lafunción ibm_db.exec_immediate sólo para ejecutar sentencias de SQL compuestasde series estáticas. La interpolación de variables de Python que representan laentrada del usuario en la sentencia de SQL puede exponer la aplicación a ataquesde inyección de SQL.

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db. Para obtener más información, consulte “Conexión a un servidor debase de datos de IBM en Python” en la página 56.

Procedimiento

Para preparar y ejecutar una única sentencia de SQL, llame a la funciónibm_db.exec_immediate, proporcionando los argumentos listados:

conexiónUn recurso de conexión de base de datos válido devuelto por la funciónibm_db.connect o ibm_db.pconnect.

sentenciaUna serie que contiene la sentencia de SQL. Esta serie puede incluir unaexpresión XQuery a la que llama la función XMLQUERY.

opcionesOpcional: Un diccionario que especifica el tipo de cursor que debe devolverse

Capítulo 4. Desarrollo de aplicaciones Python 57

Page 64: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

para conjuntos de resultados. Puede utilizar este parámetro para solicitar uncursor desplazable para servidores de bases de datos que admitan este tipo decursor. Por omisión, se devuelve un cursor de sólo avance.

Si la llamada de función falla (devuelve False), puede utilizar la funciónibm_db.stmt_error o ibm_db.stmt_errormsg para recuperar información dediagnóstico sobre el error.Si la llamada de función tiene éxito, puede utilizar la función ibm_db.num_rowspara devolver el número de filas que la sentencia de SQL ha devuelto o a las queha afectado. Si la sentencia de SQL devuelve un conjunto de resultados, puedeempezar a captar las filas.Para obtener más información sobre la API ibm_db, consulte http://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Ejemplo 1: Ejecutar una única sentencia de SQLimport ibm_dbconn = ibm_db.connect("database","username","password")stmt = ibm_db.exec_immediate(conn, "UPDATE employee SET bonus = ’1000’ WHERE job =’MANAGER’")print "Number of affected rows: ", ibm_db.num_rows(stmt)

Ejemplo 2: Ejecutar una expresión XQueryimport ibm_dbconn = ibm_db.connect("database","username","password")if conn:

sql = "SELECT XMLSERIALIZE(XMLQUERY(’for $i in $t/address where$i/city = \"Olathe\" return <zip>{$i/zip/text()}</zip>’passing c.xmlcol as \"t\") AS CLOB(32k)) FROM xml_test c WHERE id = 1"stmt = ibm_db.exec_immediate(conn, sql)result = ibm_db.fetch_both(stmt)while( result ):

print "Result from XMLSerialize and XMLQuery:", result[0]result = ibm_db.fetch_both(stmt)

Qué hacer a continuación

Si la sentencia de SQL devuelve uno o varios conjuntos de resultados, puedeempezar a captar filas del recurso de sentencia.

Preparación y ejecución de sentencias de SQL con entrada de variables enPython:

Para preparar y ejecutar una sentencia de SQL que incluya la entrada de variables,utilice las funciones ibm_db.prepare, ibm_db.bind_param e ibm_db.execute.Preparar una sentencia mejora el rendimiento porque el servidor de bases de datoscrea un plan de acceso optimizado para la recuperación de datos que puedereutilizar si se vuelve a ejecutar la sentencia.

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db. Consulte “Conexión a un servidor de base de datos de IBM enPython” en la página 56.

Procedimiento

Para preparar y ejecutar una sentencia de SQL que incluye marcadores deparámetro:1. Llame a la función ibm_db.prepare, pasando los argumentos listados:

58 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 65: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

conexiónUn recurso de conexión de base de datos válido devuelto por la funciónibm_db.connect o ibm_db.pconnect.

sentenciaUna serie que contiene la sentencia de SQL, incluidos los signos deinterrogación (?), como marcadores de parámetro para los valores decolumna o predicado que requieran entrada de variables. Esta serie puedeincluir una expresión XQuery a la que llama la función XMLQUERY.

opcionesOpcional: Un diccionario que especifica el tipo de cursor que debedevolverse para conjuntos de resultados. Puede utilizar este parámetro parasolicitar un cursor desplazable para servidores de bases de datos queadmitan este tipo de cursor. Por omisión, se devuelve un cursor de sóloavance.

Si la llamada de función tiene éxito, devuelve un recurso de descriptor decontexto de sentencia que puede utilizar en llamadas de función posterioresrelacionadas con la consulta.Si la llamada de función falla (devuelve False), puede utilizar la funciónibm_db.stmt_error o ibm_db.stmt_errormsg para recuperar información dediagnóstico sobre el error.

2. Opcional: Por cada marcador de parámetro en la serie de SQL, llame a lafunción ibm_db.bind_param, proporcionando los argumentos listados. Vincularvalores de entrada a marcadores de parámetros garantiza que cada valor deentrada se trate como un único parámetro, evitando ataques de inyección deSQL.

sentenciaLa sentencia preparada que devuelve la llamada a la funciónibm_db.prepare.

número_parámetroUn entero que representa la posición del marcador de parámetro en lasentencia de SQL.

variableValor que se debe utilizar en lugar del marcador de parámetro.

3. Llame a la función ibm_db.execute, pasando los argumentos listados:

sentenciaUna sentencia preparada que devuelve ibm_db.prepare.

parámetrosUna tupla de parámetros de entrada que coinciden con los marcadores deparámetro contenidos en la sentencia preparada.

Para obtener más información sobre la API ibm_db, consultehttp://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Preparar y ejecutar una sentencia que incluye entrada de variables.import ibm_dbconn = ibm_db.connect("database","username","password")sql = "SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE EMPNO > ? AND EMPNO < ?"stmt = ibm_db.prepare(conn, sql)max = 50min = 0# Vincular explícitamente los parámetros

Capítulo 4. Desarrollo de aplicaciones Python 59

Page 66: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

ibm_db.bind_param(stmt, 1, min)ibm_db.bind_param(stmt, 2, max)ibm_db.execute(stmt)# Procesar resultados

# Invocar de nuevo sentencia preparada usando parámetros vinculados dinámicamenteparam = max, min,ibm_db.execute(stmt, param)

Qué hacer a continuación

Si la sentencia de SQL devuelve uno o varios conjuntos de resultados, puedeempezar a captar filas del recurso de sentencia.

Captación de filas o columnas de conjuntos de resultados enPythonDespués de ejecutar una sentencia que devuelve uno o más conjuntos deresultados, utilice una de las funciones disponibles en la API ibm_db para iterarpor las filas devueltas.

Si el conjunto de resultados incluye columnas que contienen datos de gran tamaño(por ejemplo, datos BLOB o CLOB), puede recuperar los datos de columna encolumna para evitar que se utilice demasiada memoria.

Antes de empezar

Debe disponer de un recurso de sentencia devuelto por la funciónibm_db.exec_immediate o ibm_db.execute que tenga uno o varios conjuntos deresultados asociados.

Procedimiento

Para captar datos de un conjunto de resultados:1. Capte los datos de un conjunto de resultados llamando a una de las funciones

de captación.

Tabla 12. Funciones de captación de ibm_db

Función Descripción

ibm_db.fetch_tuple Devuelve una tupla, indexada por posiciónde columna, que representa una fila en unconjunto de resultados. Las columnas estánindexadas en 0.

ibm_db.fetch_assoc Devuelve un diccionario, indexado pornombre de columna, que representa una filaen un conjunto de resultados.

ibm_db.fetch_both Devuelve un diccionario, indexado tanto pornombre de columna como por posición, querepresenta una fila en un conjunto deresultados.

ibm_db.fetch_row Establece el puntero del conjunto deresultados en la siguiente fila o la filasolicitada. Utilice esta función para iterarpor un conjunto de resultados.

Estas funciones aceptan los argumentos listados:

60 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 67: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

sentenciaUn recurso de sentencia válido.

número_filaEl número de la fila que desea recuperar del conjunto de resultados.Especifique un valor para este parámetro si ha solicitado un cursordesplazable al llamar a la función ibm_db.exec_immediate oibm_db.prepare. Con el cursor de sólo avance por omisión, cada llamada aun método de captación devuelve la fila siguiente del conjunto deresultados.

2. Opcional: Si ha llamado a la función ibm_db.fetch_row, para cada iteración detodo el conjunto de resultados, recupere un valor de una columna especificadallamando a la función ibm_db.result. Puede especificar la columna pasando unentero que represente la posición de la columna en la fila (empezando por 0) opasando una serie que represente el nombre de la columna.

3. Continúe captando filas hasta que el método de captación devuelva un valorfalso, lo que indicará que habrá llegado al final del conjunto de resultados.Para obtener más información sobre la API ibm_db, consultehttp://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Ejemplo 1: Captación de filas de un conjunto de resultados llamando a la funciónibm_db.fetch_bothimport ibm_db

conn = ibm_db.connect("database","username","password")sql = "SELECT * FROM EMPLOYEE"stmt = ibm_db.exec_immediate(conn, sql)dictionary = ibm_db.fetch_both(stmt)while dictionary != False:

print "The ID is : ", dictionary["EMPNO"]print "The Name is : ", dictionary[1]dictionary = ibm_db.fetch_both(stmt)

Ejemplo 2: Captación de filas de un conjunto de resultados llamando a la funciónibm_db.fetch_tupleimport ibm_db

conn = ibm_db.connect("database","username","password")sql = "SELECT * FROM EMPLOYEE"stmt = ibm_db.exec_immediate(conn, sql)tuple = ibm_db.fetch_tuple(stmt)while tuple != False:

print "The ID is : ", tuple[0]print "The name is : ", tuple[1]tuple = ibm_db.fetch_tuple(stmt)

Ejemplo 3: Captación de filas de un conjunto de resultados llamando a la funciónibm_db.fetch_associmport ibm_db

conn = ibm_db.connect("database","username","password")sql = "SELECT * FROM EMPLOYEE"stmt = ibm_db.exec_immediate(conn, sql)dictionary = ibm_db.fetch_assoc(stmt)while dictionary != False:

print "The ID is : ", dictionary["EMPNO"]print "The name is : ", dictionary["FIRSTNME"]dictionary = ibm_db.fetch_assoc(stmt)

Capítulo 4. Desarrollo de aplicaciones Python 61

Page 68: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Ejemplo 4: Captación de columnas de un conjunto de resultadosimport ibm_db

conn = ibm_db.connect("database","username","password")sql = "SELECT * FROM EMPLOYEE"stmt = ibm_db.exec_immediate(conn, sql)while ibm_db.fetch_row(stmt) != False:

print "The Employee number is : ", ibm_db.result(stmt, 0)print "The last name is : ", ibm_db.result(stmt, "LASTNAME")

Qué hacer a continuación

Cuando esté listo para cerrar la conexión a la base de datos, llame a la funciónibm_db.close. Si intenta cerrar una conexión persistente creada conibm_db.pconnect, la petición de cierre devuelve True, y la conexión permanecerádisponible para el siguiente interlocutor.

Invocación de procedimientos almacenados en PythonPara invocar un procedimiento almacenado desde una aplicación Python, utilice lafunción ibm_db.callproc. El procedimiento que invoca puede incluir parámetros deentrada (IN), parámetros de salida (OUT) y parámetros de entrada y salida.

Antes de empezar

Obtener un recurso de conexión invocando una de las funciones de conexión en laAPI ibm_db.

Procedimiento

Invoque la función ibm_db.callproc pasando los argumentos enumerados:

conexiónUn recurso de conexión de base de datos válido devuelto por la funciónibm_db.connect o ibm_db.pconnect.

nombre_procUn nombre de procedimiento almacenado válido

parámetrosUna tupla de parámetros que coinciden con los parámetros declarados en elprocedimiento almacenado.

Ejemplo

Para invocar un procedimiento almacenado con la función ibm_db.callproc:import ibm_db

conn = ibm_db.connect("sample", "username", "password")if conn:

name = "Peaches"second_name = "Rickety Ride"weight = 0

print "Values of bound parameters _before_ CALL:"print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight)stmt, name, second_name, weight = ibm_db.callproc(conn, ’match_animal’, (name, second_name, weight))if stmt is not None:

print "Values of bound parameters _after_ CALL:"print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight)

Qué hacer a continuación

Si la llamada al procedimiento devuelve uno o varios conjuntos de resultados,puede empezar a captar filas del recurso de sentencia.

62 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 69: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Recuperación de varios conjuntos de resultados de unprocedimiento almacenado en PythonCuando una única llamada a un procedimiento almacenado devuelve más de unconjunto de resultados, puede utilizar la función ibm_db.next_result de la APIibm_db para recuperar los conjuntos de resultados.

Antes de empezar

Debe disponer de un recurso de sentencia que haya devuelto la funciónibm_db.exec_immediate o ibm_db.execute que tenga varios conjuntos deresultados.

Procedimiento

Para recuperar varios conjuntos de resultados:1. Captar filas del primer conjunto de resultados devuelto por el procedimiento

mediante la llamada a una de las funciones listadas de captación ibm_db,proporcionando el recurso de sentencia como argumento. (El primer conjuntode resultados que se devuelve del procedimiento está asociado con el recursode sentencia).

Tabla 13. Funciones de captación de ibm_db

Función Descripción

ibm_db.fetch_tuple Devuelve una tupla, indexada por posiciónde columna, que representa una fila en unconjunto de resultados. Las columnas estánindexadas en 0.

ibm_db.fetch_assoc Devuelve un diccionario, indexado pornombre de columna, que representa una filaen un conjunto de resultados.

ibm_db.fetch_both Devuelve un diccionario, indexado tanto pornombre de columna como por posición, querepresenta una fila en un conjunto deresultados.

ibm_db.fetch_row Establece el puntero del conjunto deresultados en la siguiente fila o la filasolicitada. Utilice esta función para iterarpor un conjunto de resultados.

2. Recuperar los conjuntos de resultados siguientes proporcionando el recurso desentencia original como primer argumento a la función ibm_db.next_result.Puede captar filas del recurso de sentencia hasta que no haya disponibles másfilas en el conjunto de resultados.La función ibm_db.next_result devuelve False cuando no hay más conjuntos deresultados disponibles o el procedimiento no ha devuelto ningún conjunto deresultados.Para obtener más información sobre la API ibm_db, consultehttp://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Recuperar varios conjuntos de resultados de un procedimiento almacenado.import ibm_dbconn = ibm_db.connect( "sample", "user", "password" )if conn:

Capítulo 4. Desarrollo de aplicaciones Python 63

Page 70: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

sql = ’CALL sp_multi()’stmt = ibm_db.exec_immediate(conn, sql)row = ibm_db.fetch_assoc(stmt)while row != False :

print "The value returned : ", rowrow = ibm_db.fetch_assoc(stmt)

stmt1 = ibm_db.next_result(stmt)while stmt1 != False:

row = ibm_db.fetch_assoc(stmt1)while row != False :

print "The value returned : ", rowrow = ibm_db.fetch_assoc(stmt1)

stmt1 = ibm_db.next_result(stmt)

Qué hacer a continuación

Cuando esté listo para cerrar la conexión a la base de datos, llame a la funciónibm_db.close. Si intenta cerrar una conexión persistente creada conibm_db.pconnect, la petición de cierre devuelve True, y la conexión del cliente deservidor de datos de IBM permanecerá disponible para el siguiente interlocutor.

Modalidades de confirmación en aplicaciones PythonPuede controlar cómo se confirman los grupos de sentencias de SQL especificandouna modalidad de confirmación para un recurso de conexión. La API ibm_dbadmite dos modalidades de confirmación: la confirmación automática y laconfirmación manual.

Modalidad de confirmación automáticaEn modalidad de confirmación automática, cada sentencia de SQL es unatransacción completa, que se confirma automáticamente. La modalidadAutocommit le ayuda a evitar problemas de escalas de bloqueo quepuedan obstaculizar el rendimiento de aplicaciones web muy escalables.Por omisión, la API ibm_db abre cada conexión en modalidad deconfirmación automática.

Si la modalidad de confirmación automática está inhabilitada, puedehabilitarla llamando a ibm_db.autocommit(conn,ibm_db.SQL_AUTOCOMMIT_ON), donde conn es un recurso de conexión válido.

Llamar a la función ibm_db.autocommit puede afectar al rendimiento desus scripts de Python, porque requiere comunicación adicional entrePython y el sistema de gestión de bases de datos.

Modalidad de confirmación manualEn modalidad de confirmación manual, la transacción finaliza al llamar ala función ibm_db.commit o ibm_db.rollback. Esto significa que todas lassentencias ejecutadas en la misma conexión entre el inicio de unatransacción y la llamada a la función de confirmación o retrotracción setratan como una única transacción.

La modalidad de confirmación manual es útil si se necesita retrotraer unatransacción que contiene una o varias sentencias de SQL. Si ejecutasentencias de SQL en una transacción y el script finaliza sin confirmar oretrotraer explícitamente la transacción, la extensión ibm_db retrotraeautomáticamente cualquier trabajo que se realice en la transacción.

Puede inhabilitar la modalidad de confirmación manual al crear unaconexión de base de datos utilizando el valor de {ibm_db.SQL_ATTR_AUTOCOMMIT: ibm_db.SQL_AUTOCOMMIT_OFF } en la matrizde opciones ibm_db.connect o ibm_db.pconnect. También puede desactivar

64 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 71: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

la modalidad de confirmación automática para un recurso de conexiónllamando a ibm_db.autocommit(con, ibm_db.SQL_AUTOCOMMIT_OFF), dondecon es un recurso de conexión válido.

Para obtener más información sobre la API ibm_db, consulte http://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Inhabilitar la modalidad de confirmación automática y finalizar la transaccióncuando se llama a ibm_db.commit o ibm_db.rollback.import ibm_db

array = { ibm_db.SQL_ATTR_AUTOCOMMIT : ibm_db.SQL_AUTOCOMMIT_OFF }conn = ibm_db.pconnect("SAMPLE", "user", "password", array)sql = "DELETE FROM EMPLOYEE"try:

stmt = ibm_db.exec_immediate(conn, sql)except:

print "Transaction couldn’t be completed."ibm_db.rollback(conn)

else:ibm_db.commit(conn)print "Transaction complete."

Funciones de manejo de errores en PythonEn ocasiones se producen problemas al intentar conectarse a una base de datos oemitir una sentencia de SQL. Puede que el nombre de usuario o la contraseña seanincorrectos, que un nombre de tabla o columna se haya escrito mal o que lasentencia de SQL no sea válida.

La API ibm_db proporciona funciones de manejo de errores para ayudarle arecuperarse sin problemas de las situaciones de error.

Errores de conexión

Utilice una de las funciones listadas para recuperar información de diagnóstico sifalla un intento de conexión.

Tabla 14. Funciones de ibm_db para manejar errores de conexión

Función Descripción

ibm_db.conn_error Recupera el SQLSTATE devuelto por elúltimo intento de conexión.

ibm_db. conn_errormsg Recupera un mensaje de error descriptivoadecuado a la anotación cronológica deerrores de la aplicación

Errores de SQL

Utilice una de las funciones listadas para recuperar información de diagnóstico sifalla un intento de preparar o ejecutar una sentencia de SQL o de captar unresultado de un conjunto de resultados.

Capítulo 4. Desarrollo de aplicaciones Python 65

Page 72: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 15. Funciones de ibm_db para manejar errores de SQL

Función Descripción

ibm_db.stmt_error Recupera el SQLSTATE devuelto por elúltimo intento de preparar o ejecutar unasentencia de SQL o de captar un resultadode un conjunto de resultados.

ibm_db.stmt_errormsg Recupera un mensaje de error descriptivoadecuado a la anotación cronológica deerrores de la aplicación

Para obtener más información sobre la API ibm_db, consulte http://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Ejemplo 1: Manejo de errores de conexiónimport ibm_dbtry:

conn = ibm_db.connect("database","username","password")except:

print "no connection:", ibm_db.conn_errormsg()else:

print "The connection was successful"

Ejemplo 2: Manejo de errores de SQLimport ibm_dbconn = ibm_db.connect("database","username","password")sql = "DELETE FROM EMPLOYEE"try:

stmt = ibm_db.exec_immediate(conn, sql)except:

print "Transaction couldn’t be completed:" , ibm_db.stmt_errormsg()else:

print "Transaction complete."

Funciones de recuperación de metadatos de base de datos enPythonPuede utilizar funciones en la API ibm_db para recuperar metadatos para bases dedatos de IBM.

Antes de llamar a estas funciones, debe instalar el entorno Python, emitirimport_db en su script de Python y obtener un recurso de conexión llamando a lafunción ibm_db.connect o ibm_db.pconnect.

Importante: La llamada a funciones de metadatos utiliza una cantidad de espacioconsiderable. Si es posible, modifique los resultados de las llamadas para su uso enllamadas posteriores.

Tabla 16. Funciones de recuperación de metadatos de ibm_db

Función Descripción

ibm_db.client_info Devuelve un objeto de sólo lectura coninformación acerca del cliente de servidor dedatos de IBM.

ibm_db.column_privileges Devuelve un conjunto de resultados queenumera las columnas y los privilegiosasociados para una tabla

66 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 73: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 16. Funciones de recuperación de metadatos de ibm_db (continuación)

Función Descripción

ibm_db.columns Devuelve un conjunto de resultados queenumera las columnas y los metadatosasociados para una tabla

ibm_db.foreign_keys Devuelve un conjunto de resultados queenumera las claves foráneas para una tabla

ibm_db.primary_keys Devuelve un conjunto de resultados queenumera las claves primarias para una tabla

ibm_db.procedure_columns Devuelve un conjunto de resultados queenumera los parámetros para uno o variosprocedimientos almacenados

ibm_db.procedures Devuelve una lista de resultados queenumera los procedimientos almacenadosregistrados en una base de datos

ibm_db.server_info Devuelve un objeto de sólo lectura coninformación acerca de IBM Data Server

ibm_db.special_columns Devuelve un conjunto de resultados queenumera las columnas de identificadorexclusivo de fila para una tabla

ibm_db.statistics Devuelve un conjunto de resultados queenumera el índice y las estadísticas para unatabla

ibm_db.table_privileges Devuelve un conjunto de resultados queenumera las tablas de una base de datos ylos privilegios asociados

Para obtener más información sobre la API ibm_db, consulte http://code.google.com/p/ibm-db/wiki/APIs.

Ejemplo

Ejemplo 1: Mostrar información sobre IBM Data Server Clientimport ibm_db

conn = ibm_db.connect("sample", "user", "password")client = ibm_db.client_info(conn)

if client:print "DRIVER_NAME: string(%d) \"%s\"" % (len(client.DRIVER_NAME),

client.DRIVER_NAME)print "DRIVER_VER: string(%d) \"%s\"" % (len(client.DRIVER_VER),

client.DRIVER_VER)print "DATA_SOURCE_NAME: string(%d) \"%s\"" % (len(client.DATA_SOURCE_NAME),

client.DATA_SOURCE_NAME)print "DRIVER_ODBC_VER: string(%d) \"%s\"" % (len(client.DRIVER_ODBC_VER),

client.DRIVER_ODBC_VER)print "ODBC_VER: string(%d) \"%s\"" % (len(client.ODBC_VER), client.ODBC_VER)print "ODBC_SQL_CONFORMANCE: string(%d) \"%s\"" %

(len(client.ODBC_SQL_CONFORMANCE), client.ODBC_SQL_CONFORMANCE)print "APPL_CODEPAGE: int(%s)" % client.APPL_CODEPAGEprint "CONN_CODEPAGE: int(%s)" % client.CONN_CODEPAGEibm_db.close(conn)

else:print "Error."

Ejemplo 2: Mostrar información sobre IBM Data Serverimport ibm_db

conn = ibm_db.connect("sample", "user", "password")server = ibm_db.server_info(conn)

if server:print "DBMS_NAME: string(%d) \"%s\"" % (len(server.DBMS_NAME), server.DBMS_NAME)print "DBMS_VER: string(%d) \"%s\"" % (len(server.DBMS_VER), server.DBMS_VER)

Capítulo 4. Desarrollo de aplicaciones Python 67

Page 74: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

print "DB_NAME: string(%d) \"%s\"" % (len(server.DB_NAME), server.DB_NAME)ibm_db.close(conn)

else:print "Error."

68 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 75: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Capítulo 5. Desarrollo de aplicaciones Ruby on Rails

Controlador IBM_DB Ruby y adaptador RailsConjuntamente conocido como IBM_DB gem, el controlador IBM_DB Ruby yadaptador Rails permiten que las aplicaciones Ruby accedan a los servidores debase de datos de IBM.

Las aplicaciones Ruby que están conectadas a servidores DB2 para z/OS y DB2para i requieren el uso de la licencia DB2 Connect .

El adaptador IBM_DB Ruby permite que cualquier aplicación Rails respaldada poruna base de datos interactúe con servidores de datos de IBM.

Para obtener más información sobre los proyectos de IBM Ruby y la comunidad decódigo abierto RubyForge, consulte http://rubyforge.org/projects/rubyibm/

Para obtener una lista de los requisitos de instalación para productos de base dedatos de DB2, consulte http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.qb.server.doc/doc/r0025127.html

Para obtener una lista de los requisitos de instalación para el servidor IBMInformix, consulte http://www-01.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.expr.doc/ids_in_004x.htm

Para obtener información sobre la descarga de un IBM Data Server Driver Package,consulte http://www.ibm.com/software/data/support/data-server-clients/index.html.

Iniciación a Ruby on RailsAntes de poder desarrollar aplicaciones Ruby on Rails para los servidores de basede datos de IBM, debe configurar el entorno Rails con un cliente de servidor dedatos de IBM.

Procedimiento

Para configurar el entorno Ruby on Rails con un cliente de servidor de datos deIBM:1. Descargue e instale el software de base de datos de DB2 o IBM Informix desde

http://www.ibm.com/software/data/servers/.2. Descargue e instale la versión más reciente de Ruby desde

http://www.ruby-lang.org/en/downloads/.3. Instale la gema Rails y sus dependencias emitiendo el mandato de instalación

de la gema:gem install rails --include-dependencies

Qué hacer a continuación

Ya está listo para instalar el controlador IBM_DB Ruby y el adaptador Rails comouna gema.

© Copyright IBM Corp. 2006, 2014 69

Page 76: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Instalación del controlador IBM_DB Ruby y el adaptador Railscomo una gema Ruby

El controlador IBM_DB Ruby y el adaptador Rails están disponibles como unagema Ruby para la instalación en clientes de servidor de datos de IBM.

Ruby Gems es la infraestructura estándar de empaquetado e instalación parabibliotecas y aplicaciones en el entorno de ejecución de Ruby. Se denomina gema aun solo archivo por cada paquete que es compatible con el formato de paqueteestandarizado. Este paquete se distribuye y almacena en un depósito central, loque permite el despliegue simultáneo de varias versiones de la misma biblioteca oaplicación.

Antes de empezar

Debe instalar uno de los productos de clientes de servidor de datos de IBM o IBMData Server Driver en el sistema donde se instala o ejecuta la aplicación Ruby:v El producto IBM Data Server Clientv El producto IBM Data Server Runtime Clientv El producto IBM Data Server Driver Packagev El producto IBM Data Server Driver para ODBC y CLI

Si la aplicación Ruby o la aplicación Ruby on Rails se conecta a un servidor debase de datos de IBM en el sistema local, no se necesita ningún producto deservidor de datos adicional de IBM.

De forma similar a la gestión de paquetes y los paquetes (.rpm, .deb) utilizados enlas distribuciones Linux, estas gemas también se pueden consultar, instalar,desinstalar y manipular a través del programa de utilidad de gemas.

El programa de utilidad de gemas puede: consultar rápidamente el repositoriocentral RubyForge remoto y buscar e instalar cualquiera de los numerososprogramas de utilidad que hay disponibles. Cuando se instala la gema IBM_DB, elcontrolador IBM_DB Ruby y el adaptador Rails están accesibles inmediatamentedesde cualquier aplicación en el entorno de ejecución de Ruby, a través delmandato require:require ’ibm_db’

o en Windows:require ’mswin32/ibm_db’

Procedimiento

Para instalar el controlador IBM_DB Ruby y el adaptador Rails como una gema deRuby:1. Opcional: Puede saltarse este paso si está instalando la gema ibm_db desde el

software de clientes de servidor de datos de IBM o IBM Data Server DriverPackage. En las plataformas Linux y UNIX, establezca la variable de entornoIBM_DB_HOME y, opcionalmente, importe el perfil de DB2:Emita los mandatos export para establecer la variable de entorno IBM_DB_HOME:$export IBM_DB_HOME=DB2HOME

donde DB2HOME es el directorio donde está instalado el producto del servidorde datos de IBM. Por ejemplo:

70 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 77: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

$ export IBM_DB_HOME=/home/db2inst1/sqllib

Nota:

En el entorno de IBM Data Server Driver Package, DB2HOME es el directoriodonde se extrae el paquete del cliente, por ejemplo, el directorioodbc_cli_driver/linux/clidriver.

En el entorno del servidor de DB2, DB2HOME es el directorio sqllib debajo dela instancia de DB2.

2. En todas las plataformas soportadas, emita el mandato gem install parainstalar el controlador IBM_DB Ruby y el adaptador Rails:$ gem install ibm_db

Si está instalando la gema desde el producto de IBM Data Server, especifique laubicación del archivo de la gema con el mandato gem install:$ gem install /home/db2inst1/sqllib/ruby64/ibm_db-X.X.XX.gem

3. Antes de ejecutar un script Ruby que se conecte al servidor de base de datos deIBM, debe asegurarse de que el controlador IBM_DB Ruby pueda acceder alcontrolador CLI en las plataformas Linux o UNIX añadiendo la vía de accesodel archivo libdb2.so a la variable de entorno LD_LIBRARY_PATH. Si elcontrolador IBM_DB Ruby no puede acceder al controlador CLI, se devuelve elmensaje de error missing libraries - libdb2.so.1 al programa Ruby.Al utilizar el software de IBM Data Server Driver Package, el archivo libdb2.sose encuentra en el directorio odbc_cli_driver/linux/clidriver/lib.En el entorno del producto de IBM Data Server, libdb2.so está en la vía deacceso sqllib/lib/.

Verificación de la instalación del controlador IBM_DB Ruby conel shell Ruby interactivoPara verificar la instalación del controlador IBM_DB Ruby, utilice el shell Rubyinteractivo (irb) para conectarse a la base de datos y emitir una consulta.

Procedimiento

Para verificar la instalación del controlador Ruby con el shell Ruby interactivo,ejecute los mandatos listados:C:\>irbirb(main):001:0> require ’mswin32/ibm_db’#Si está utilizando una plataforma basada en Linux, emita require ’ibm_db’)=>trueirb(main):002:0> conn = IBM_DB.connect ’devdb’,’username’,’password’=> #<IBM_DB::Connection:0x2dddf40>#Aquí 'devdb' es la base de datos catalogada en el directorio#de base de datos del cliente o la entrada db en el archivo db2dsdriver.cfg.#Para conectarse a una base de datos remota,#necesitará especificar todos los atributos necesarios, como#nombre de sistema principal, puerto, etc., del siguiente modo.#IBM_DB.connect(’DRIVER={IBM DB2 ODBC=DRIVER};DATABASE=devdb;HOSTNAME=myhost;PORT=60000;PROTOCOL=TCPIP;UID=uname;PWD=password;’,’’,’’)irb(main):003:0> stmt = IBM_DB.exec conn,’select * from staff’=> #<IBM_DB::Statement:0x2beaabc>irb(main):004:0> IBM_DB.fetch_assoc stmt#Obtiene la primera fila del conjunto de resultados

Verificación de la instalación del adaptador IBM_DB RailsPara verificar que el adaptador IBM_DB Rails está instalado correctamente, cree yejecute una aplicación Rails de ejemplo.

Procedimiento1. Cree una aplicación Rails nueva emitiendo el siguiente mandato:

C:\>rails new newapp --database=ibm_dbcreatecreate app/controllers

Capítulo 5. Desarrollo de aplicaciones Ruby on Rails 71

Page 78: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

create app/helperscreate app/modelscreate app/views/layoutscreate config/environmentscreate config/initializerscreate db[......]create log/server.logcreate log/production.logcreate log/development.logcreate log/test.log

2. Cambie el directorio actual por el directorio newapp recién creado:C:\>cd newapp

3. Opcional: Si está utilizando una versión de Rails anterior a Rails 2.0, deberegistrar el adaptador IBM_DB en la lista de adaptadores de conexión en lainfraestructura Rails. Puede registrar el adaptador IBM_DB en la lista deadaptadores de conexión en la infraestructura Rails, añadiendo manualmenteibm_db a la lista de adaptadores de conexión en <RubyHome>\gems\1.8\gems\activerecord-1.15.6\lib\active_record.rb, en torno a la línea 77:RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebirdsqlserver db2 oracle sybase openbase frontbase ibm_db )

4. Para configurar las conexiones para las aplicaciones Rails, edite el archivodatabase.yml. En el siguiente ejemplo se muestra una entrada de sección dedesarrollo para el archivo database.yml:development:adapter: ibm_dbusername: db2inst1password: secretdatabase: devdb # Nombre de la base de datos#schema: db2inst1#host: localhost #Host en el que reside la base de datos#port: 50000 #puerto al que está escuchando el servidor de datos remoto

5. Cree un modelo y un andamio emitiendo el mandato rails:C:\>rails generate scaffold Tool name:string model_num:integerexists app/models/exists app/controllers/[....]create db/migratecreate db/migrate/20080716103959_create_tools.rb

6. Cree la tabla tools en la base de datos devdb emitiendo el mandato rakedb:migrate:C:\ >rake db:migrate(in C:/ruby trials/newapp)== 20080716111617 CreateTools: migrating======================================-- create_table(:tools)-> 0.5320s== 20080716111617 CreateTools: migrated (0.5320s)

La aplicación Rails ya puede acceder a la tabla tools.7. Para probar la aplicación, emita el mandato rails console:

C:\ruby trials\newapp>rails consoleLoading development environment (Rails )>> tool = Tool.new=> #<Tool id: nil, name: nil, model_num: nil, created_at: nil,updated_at: nil>>> tool.name = ’chistel’=> "chistel">> tool.model_num = ’007’=> "007">> tool.save

72 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 79: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

=> true>> Tool.find :all=> [#<Tool id: 100, name: "chistel", model_num: 7, created_at:"2008-07-16 11:29:35", updated_at: "2008-07-16 11:29:35">]>>

Configuración de conexiones de aplicaciones de servidoresde datos de IBM

Las conexiones de base de datos se configuran para una aplicación Railsespecificando los detalles de la conexión en el archivo database.yml.

Procedimiento

Para configurar conexiones de servidor de datos de sistema principal para unaaplicación de Rails:

Edite los detalles de la configuración de bases de datos envía_acceso_aplicación_rails\config\database.yml y especifique los atributos deconexión listados:# El adaptador IBM_DB requiere el controlador Ruby nativo (ibm_db)

# para los servidores de datos de IBM (ibm_db.so).# +config+ hash pasado como contenido del argumento del inicializador:# == parámetros obligatorios# adapter: ’ibm_db’ // nombre de Adaptador IBM_DB# username: ’db2user’ // usuario de servidor de datos (database)# password: ’secret’ // contraseña de servidor de datos (database)# database: ’DEVDB’ // nombre de base de datos remota (o alias de entrada de catálogo)# == opcional (muy recomendado para fines de auditoría y supervisión de servidores de datos)# schema: ’rails123’ // calificador de espacio de nombres# account: ’tester’ // cuenta de SO (estación de trabajo cliente)# app_user: ’test11’ // usuario de aplicación autentificado# application: ’rtests’ // nombre de aplicación# workstation: ’plato’ // nombre de estación de trabajo cliente# == conexión TCP/IP remota (necesario cuando no hay ninguna entrada de catálogo de base de datos# == local disponible)# host: ’Socrates’ // nombre de host totalmente calificado o dirección IP# port: ’50000’ // número de puerto TCP/IP de servidor de datos## Cuando no se especifique el esquema, se utilizará el valor de nombre de usuario en su lugar.

Nota: Los cambios en la información de conexión en este archivo se aplicancuando se inicializa el entorno de Rails durante el arranque del servidor. Loscambios realizados después de la inicialización no afectarán a las conexiones quese han creado.

Schema, account, app_user, application y workstation no están soportados paraIBM Informix.

Controlador IBM Ruby y contextos fiablesEl controlador IBM_DB Ruby admite contextos fiables mediante la utilización depalabras clave de serie.

Los contextos fiables proporcionan un método para crear aplicaciones de tresniveles más seguras y con mayor rapidez. La identidad del usuario siempre semantiene para operaciones de auditoría y seguridad. Cuando requiere conexionesseguras, los contextos fiables mejoran el rendimiento ya que no es necesarioobtener conexiones nuevas.

Capítulo 5. Desarrollo de aplicaciones Ruby on Rails 73

Page 80: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Ejemplo

El ejemplo establece una conexión fiable y cambia al usuario de la mismaconexión.def trusted_connection(database,hostname,port,auth_user,auth_pass,tc_user,tc_pass)

dsn = "DATABASE=#{database};HOSTNAME=#{hostname};PORT=#{port};PROTOCOL=TCPIP;UID=#{auth_user};PWD=#{auth_pass};"

conn_options = {IBM_DB::SQL_ATTR_USE_TRUSTED_CONTEXT => IBM_DB::SQL_TRUE}tc_options = {IBM_DB::SQL_ATTR_TRUSTED_CONTEXT_USERID => tc_user,

IBM_DB::SQL_ATTR_TRUSTED_CONTEXT_PASSWORD => tc_pass}tc_conn = IBM_DB.connect dsn, ’’, ’’, conn_optionsif tc_conn

puts "Trusted connection established successfully."val = IBM_DB.get_option tc_conn, IBM_DB::SQL_ATTR_USE_TRUSTED_CONTEXT, 1if val

userBefore = IBM_DB.get_option tc_conn, IBM_DB::SQL_ATTR_TRUSTED_CONTEXT_USERID, 1#do some work as user 1#....#....#switch the userresult = IBM_DB.set_option tc_conn, tc_options, 1userAfter = IBM_DB.get_option tc_conn, IBM_DB::SQL_ATTR_TRUSTED_CONTEXT_USERID, 1if userBefore != userAfter

puts "User has been switched."#do some work as user 2#....#....

endendIBM_DB.close tc_conn

elseputs "Attempt to connect failed due to: #{IBM_DB.conn_errormsg}"

end end

Dependencias y consecuencias del adaptador IBM_DB RailsEl adaptador IBM_DB (ibm_db_adapter.rb) tiene una dependencia directa delcontrolador IBM_DB, que utiliza IBM Data Server Driver para ODBC y CLI paraconectarse a los servidores de datos de IBM. La interfaz de nivel de llamada (CLI)de IBM es una interfaz de SQL llamable para servidores de datos de IBM que soncompatibles con ODBC (Open Database Connectivity).

Esta dependencia tiene varias ramificaciones para el adaptador y controladorIBM_DB.v Es necesario realizar la instalación de IBM Data Server Driver para ODBC y CLI,

que cumple el requisito de IBM_DB.IBM Data Server Driver para ODBC y CLI viene incluido en la instalación deuna base de datos DB2 completa, o puede obtenerse por separado

Nota: IBM Data Server Driver para ODBC y CLI se incluye en los paquetes decliente listados:– IBM Data Server Client– IBM Data Server Runtime Client– IBM Data Server Driver Package

v El comportamiento del controlador puede modificarse fuera de una aplicaciónRails mediante el uso de CLI y de palabras clave de configuración de IBM DataServer Driver.Las palabras clave de CLI que se establecen en el archivo db2cli.ini y laspalabras clave de configuración de IBM Data Server Driver del archivo deconfiguración de IBM Data Server Driver (db2dsdriver.cfg) afectan a lasaplicaciones Rails de la misma forma que las aplicaciones CLI. Por ejemplo,pueden utilizarse palabras clave CLI para establecer el esquema actual omodificar elementos transaccionales tales como la desactivación delcomportamiento de confirmación automática.

v Cualquier recopilación de diagnósticos requiere el rastreo del controlador CLI.

74 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 81: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Dado que todas las peticiones realizadas a través de IBM_DB se implementanmediante IBM Data Server Driver para ODBC y CLI, el recurso de rastreo deCLI puede identificar los problemas de las aplicaciones que utilicen el adaptadory controlador IBM_DB.Un rastreo de CLI captura todas las llamadas de API efectuadas por unaaplicación a IBM Data Server Driver para ODBC y CLI (incluidos todos losparámetros de entrada) y captura todos los valores devueltos desde elcontrolador a la aplicación. Es un rastreo de interfaz que captura cómointeractúa una aplicación con IBM Data Server Driver para ODBC y CLI yproporciona información sobre el funcionamiento interno del controlador.

El controlador IBM_DB y el adaptador Rails no estánsoportados en JRuby

El adaptador IBM_DB no está soportado en JRuby.

El adaptador IBM_DB no está soportado en JRuby porque (como se indica en elWiki de JRuby, "Getting Started") muchas gemas funcionarán correctamente enJRuby, aunque algunas gemas construyen bibliotecas C nativas como parte de suproceso de instalación. Estas gemas no funcionarán en JRuby salvo que cuententambién con un equivalente Java™ para la biblioteca nativa. Para obtener másinformación, consulte http://kenai.com/projects/jruby/pages/GettingStarted.

El adaptador IBM_DB se basa en el controlador IBM_DB Ruby (extensión C) y enIBM Data Server Driver para ODBC y CLI para acceder a bases de datos enservidores de datos de IBM. Como método alternativo, puede utilizar laimplementación normal de C de Ruby o bien utilizar JDBC_adapter para acceder alas bases de datos.

Consideraciones acerca del tamaño de almacenamientodinámico con DB2 en Rails

Las aplicaciones Rails en DB2 requieren que el parámetro de configuración de basede datos applheapsz esté establecido en valores superiores a 1024.

Debe establecer este parámetro para cada base de datos para la que se ejecutaránaplicaciones Rails en DB2. Utilice el mandato db2 update db cfg para actualizar elparámetro applheapsz:db2 update db cfg for nombre_basedatos using APPLHEAPSZ 1024

Para activar este parámetro, debe reiniciar la instancia de DB2.

Capítulo 5. Desarrollo de aplicaciones Ruby on Rails 75

Page 82: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

76 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 83: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Apéndice A. Información técnica DB2

La información técnica de DB2 está disponible en diversos formatos a los que sepuede acceder de varias maneras.

La información técnica de DB2 está disponible a través de las herramientas y losmétodos siguientes:v Documentación en línea de DB2 documentation en IBM Knowledge Center:

– Temas (tarea, concepto y temas de consulta)– Programas de ejemplo– Guías de aprendizaje

v Centro de información de DB2 instalado localmente:– Temas (tarea, concepto y temas de consulta)– Programas de ejemplo– Guías de aprendizaje

v Documentos de DB2:– Archivos PDF (descargables)– Archivos PDF (desde el DVD con PDF de DB2)– Manuales impresos

v Ayuda de línea de mandatos:– Ayuda de mandatos– Ayuda de mensajes

Importante: La documentación de IBM Knowledge Center y del Centro deinformación de DB2 se actualiza con más frecuencia que los manuales en PDF o losmanuales impresos. Para obtener la información más actualizada, instale lasactualizaciones de documentación a medida que estén disponibles o consulte ladocumentación de DB2 en IBM Knowledge Center.

Puede acceder a información técnica de DB2 adicional, como notas técnicas,documentación técnica y publicaciones en línea de IBM Redbooks en ibm.com.Acceda al sitio de la biblioteca de software de gestión de información de DB2 enhttp://www.ibm.com/software/data/sw-library/.

Comentarios sobre la documentación

El equipo de desarrollo de información de DB2 agradece sus comentarios sobre ladocumentación de DB2. Si tiene sugerencias sobre cómo podemos mejorar ladocumentación de DB2, envíe un correo electrónico a [email protected]. Elequipo de desarrollo de información de DB2 lee todos los comentarios de losusuarios, pero no puede responderlos directamente. Proporcione ejemplosespecíficos siempre que sea posible de manera que podamos comprender mejor susproblemas. Si realiza comentarios sobre un tema o archivo de ayuda determinado,incluya el título del tema y el URL.

No utilice la dirección [email protected] para ponerse en contacto con elSoporte al cliente de DB2. Si tiene un problema técnico de DB2 que no está tratadopor la documentación, consulte al centro local de servicio técnico de IBM paraobtener ayuda.

© Copyright IBM Corp. 2006, 2014 77

Page 84: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Biblioteca técnica de DB2 en copia impresa o en formato PDFPuede descargar la biblioteca técnica de DB2 en formato PDF o puede solicitar unacopia impresa desde el Centro de publicaciones de IBM.

Puede descargar los manuales de DB2 Versión 10.5 en inglés y las traduccionescorrespondientes en formato PDF desde la documentación de producto de la basede datos DB2 en www.ibm.com/support/docview.wss?rs=71&uid=swg27009474.

Las siguientes tablas describen la biblioteca de DB2 disponible desde el Centro depublicaciones de IBM en http://www.ibm.com/e-business/linkweb/publications/servlet/pbi.wss. Aunque las tablas identifican los manuales en copia impresadisponibles, puede que dichos manuales no estén disponibles en su país o región.

El número de documento se incrementa cada vez que se actualiza un manual.Asegúrese de que lee la versión más reciente de los manuales, tal como aparece acontinuación:

La documentación en línea de DB2 en IBM Knowledge Center se actualiza con másfrecuencia que los manuales en PDF o los manuales impresos.

Tabla 17. Información técnica de DB2

NombreNúmero deformulario

Copia impresadisponible

Fecha dedisponibilidad

Consulta de las APIadministrativas

SC27-5506-00 Sí 28 de julio de 2013

Rutinas y vistasadministrativas

SC27-5507-01 No 1 de octubre de 2014

Call Level InterfaceGuide and ReferenceVolume 1

SC27-5511-01 Sí 1 de octubre de 2014

Call Level InterfaceGuide and ReferenceVolume 2

SC27-5512-01 No 1 de octubre de 2014

Consulta de mandatos SC27-5508-01 No 1 de octubre de 2014

Database AdministrationConcepts andConfiguration Reference

SC27-4546-01 Sí 1 de octubre de 2014

Data Movement UtilitiesGuide and Reference

SC27-5528-01 Sí 1 de octubre de 2014

Database MonitoringGuide and Reference

SC27-4547-01 Sí 1 de octubre de 2014

Data Recovery and HighAvailability Guide andReference

SC27-5529-01 No 1 de octubre de 2014

Database Security Guide SC27-5530-01 No 1 de octubre de 2014

Guía y consulta de DB2Workload Management

SC27-5520-01 No 1 de octubre de 2014

Developing ADO.NETand OLE DBApplications

SC27-4549-01 Sí 1 de octubre de 2014

Developing EmbeddedSQL Applications

SC27-4550-00 Sí 28 de julio de 2013

78 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 85: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 17. Información técnica de DB2 (continuación)

NombreNúmero deformulario

Copia impresadisponible

Fecha dedisponibilidad

Desarrollo de aplicacionesJava

SC27-5503-01 No 1 de octubre de 2014

Desarrollo de aplicacionesPerl, PHP, Python yRuby on Rails

SC11-8358-01 No 1 de octubre de 2014

Desarrollo de aplicacionesRDF para servidores dedatos IBM

SC27-5505-00 Sí 28 de julio de 2013

Developing User-definedRoutines (SQL andExternal)

SC27-5501-00 Sí 28 de julio de 2013

Getting Started withDatabase ApplicationDevelopment

GI13-2084-01 Sí 1 de octubre de 2014

Iniciación a la instalacióny administración de DB2en Linux y Windows

GI13-1963-01 Sí 1 de octubre de 2014

Globalization Guide SC27-5531-00 No 28 de julio de 2013

Instalación de servidoresDB2

GC11-8366-01 No 1 de octubre de 2014

Instalación de clientes deIBM Data Server

GC11-8367-01 No 1 de octubre de 2014

Consulta de mensajesVolumen 1

SC27-5523-00 No 28 de julio de 2013

Consulta de mensajesVolumen 2

SC27-5524-00 No 28 de julio de 2013

Net Search ExtenderGuía de administración ydel usuario

SC27-5526-01 No 1 de octubre de 2014

Partitioning andClustering Guide

SC27-5532-01 No 1 de octubre de 2014

pureXML Guide SC27-5521-00 No 28 de julio de 2013

Spatial Extender Guíadel usuario y manual deconsulta

SC27-5525-00 No 28 de julio de 2013

SQL ProceduralLanguages: ApplicationEnablement and Support

SC27-5502-00 No 28 de julio de 2013

Consulta de SQL -Volumen 1

SC27-5509-01 No 1 de octubre de 2014

Consulta de SQL -Volumen 2

SC27-5510-01 No 1 de octubre de 2014

Guía de Text Search SC27-5527-01 Sí 1 de octubre de 2014

Troubleshooting andTuning DatabasePerformance

SC27-4548-01 Sí 1 de octubre de 2014

Apéndice A. Información técnica DB2 79

Page 86: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Tabla 17. Información técnica de DB2 (continuación)

NombreNúmero deformulario

Copia impresadisponible

Fecha dedisponibilidad

Actualización a DB2Versión 10.5

SC11-8365-01 Sí 1 de octubre de 2014

Novedades en DB2Versión 10.5

SC27-5519-01 Sí 1 de octubre de 2014

XQuery Reference SC27-5522-01 No 1 de octubre de 2014

Tabla 18. Información técnica de DB2 Connect

NombreNúmero deformulario

Copia impresadisponible

Fecha dedisponibilidad

Installing andConfiguring DB2Connect Servers

SC27-5517-00 Sí 28 de julio de 2013

Guía del usuario de DB2Connect

SC27-5518-01 Sí 1 de octubre de 2014

Visualización de la ayuda para estados de SQL desde el procesadorde línea de mandatos

Los productos DB2 devuelven un valor de SQLSTATE para las condiciones quepueden ser el resultado de una sentencia de SQL. La ayuda de SQLSTATE explicalos significados de los estados de SQL y los códigos de las clases de estados deSQL.

Procedimiento

Para iniciar la ayuda para estados de SQL, abra el procesador de línea demandatos y entre:

? sqlstate o ? código de clase

donde sqlstate representa un estado de SQL válido de cinco dígitos y código de claserepresenta los dos primeros dígitos del estado de SQL.Por ejemplo, ? 08003 visualiza la ayuda para el estado de SQL 08003, y ? 08visualiza la ayuda para el código de clase 08.

Acceso a la documentación en línea de DB2 para distintas versionesde DB2

Puede acceder en línea a la documentación de todas las versiones de losproductosDB2 en IBM Knowledge Center.

Acerca de esta tarea

Toda la documentación de DB2 por versión está disponible en IBM KnowledgeCenter en http://www.ibm.com/support/knowledgecenter/SSEPGG/welcome. Sinembargo, puede acceder a una versión específica utilizando el URL asociado con laversión en cuestión.

80 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 87: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Procedimiento

Para acceder en línea a la documentación de DB2 documentation de una versiónde DB2 específica:v Para acceder a la documentación deDB2 Versión 10.5, diga este URL:

http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.kc.doc/welcome.html.

v Para acceder a la documentación deDB2 Versión 10.1, diga este URL:http://www.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.kc.doc/welcome.html.

v Para acceder a la documentación de DB2 Versión 9.8, siga este URL:http://www.ibm.com/support/knowledgecenter/SSEPGG_9.8.0/com.ibm.db2.luw.kc.doc/welcome.html

v Para acceder a la documentación de DB2 Versión 9.7, siga este URL:http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.kc.doc/welcome.html

v Para acceder a la documentación de DB2 Versión 9.5, siga este URL:http://www.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.kc.doc/welcome.html

Términos y condicionesLos permisos para utilizar estas publicaciones se otorgan sujetos a los siguientestérminos y condiciones.

Aplicación: Además de las condiciones de uso del sitio web de IBM, se aplicanestos términos y condiciones.

Uso personal: Puede reproducir estas publicaciones para su uso personal, nocomercial, siempre y cuando se mantengan los avisos sobre la propiedad. Nopuede distribuir, visualizar o realizar trabajos derivados de estas publicaciones, ode partes de las mismas, sin el consentimiento expreso de IBM.

Uso comercial: Puede reproducir, distribuir y visualizar estas publicacionesúnicamente dentro de su empresa, siempre y cuando se mantengan todos losavisos sobre la propiedad. No puede realizar trabajos derivativos de estaspublicaciones, ni reproducirlas, distribuirlas o visualizarlas, ni de partes de lasmismas fuera de su empresa, sin el consentimiento expreso de IBM.

Derechos: Excepto lo expresamente concedido en este permiso, no se concedenotros permisos, licencias ni derechos, explícitos o implícitos, sobre las publicacionesni sobre ninguna información, datos, software u otra propiedad intelectualcontenida en el mismo.

IBM se reserva el derecho de retirar los permisos aquí concedidos cuando, a sudiscreción, el uso de las publicaciones sea en detrimento de su interés o cuando,según determine IBM, no se sigan correctamente las instrucciones anteriores.

No puede descargar, exportar ni volver a exportar esta información excepto en elcaso de cumplimiento total con todas las leyes y regulaciones vigentes, incluyendotodas las leyes y regulaciones sobre exportación de los Estados Unidos.

IBM NO GARANTIZA EL CONTENIDO DE ESTAS PUBLICACIONES. LASPUBLICACIONES SE PROPORCIONAN "TAL CUAL" Y SIN GARANTÍA DENINGUNA CLASE, NI EXPLÍCITA NI IMPLÍCITA, INCLUYENDO PERO SIN

Apéndice A. Información técnica DB2 81

Page 88: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

LIMITARSE A LAS GARANTÍAS IMPLÍCITAS DE COMERCIALIZACIÓN, NOVULNERACIÓN E IDONEIDAD PARA UN FIN DETERMINADO.

Marcas registradas de IBM: IBM, el logotipo de IBM e ibm.com son marcasregistradas de International Business Machines Corp., que se han registrado enmuchas otras jurisdicciones. Otros nombres de productos y servicios pueden sermarcas registradas de IBM o de otras empresas. Puede consultarse en línea unalista actualizada de las marcas registradas de IBM en la web enwww.ibm.com/legal/copytrade.shtml.

82 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 89: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Apéndice B. Avisos

Esta información ha sido desarrollada para productos y servicios que se ofrecen enEstados Unidos de América. La información acerca de productos que no son IBMse basa en la información disponible cuando se publicó este documento porprimera vez y está sujeta a cambio.

Es posible que IBM no comercialice en otros países algunos productos, servicios ocaracterísticas descritos en este manual. Consulte al representante local de IBMpara obtener información sobre los productos y servicios que actualmente puedenadquirirse en su zona. Cualquier referencia a un producto, programa o servicio deIBM no pretende afirmar ni implicar que sólo se pueda utilizar dicho producto,programa o servicio de IBM. En su lugar se puede utilizar cualquier producto,programa o servicio funcionalmente equivalente que no vulnere ninguno de losderechos de propiedad intelectual de IBM. Sin embargo, es responsabilidad delusuario evaluar y verificar el funcionamiento de cualquier producto, programa oservicio que no sea de IBM.

IBM puede tener patentes o solicitudes de patentes en tramitación que afecten altema tratado en este documento. La posesión de este documento no confiereninguna licencia sobre dichas patentes. Puede realizar consultas sobre licenciasescribiendo a:

IBM Director of LicensingIBM CorporationNorth Castle DriveArmonk, NY 10504-1785EE.UU.

Para realizar consultas sobre licencias referentes a información de juegos decaracteres de doble byte (DBCS), puede ponerse en contacto con el Departamentode Propiedad Intelectual de IBM de su país o escribir a:

Intellectual Property LicensingLegal and Intellectual Property LawIBM Japan, Ltd.19-21, Nihonbashi-Hakozakicho, Chuo-kuTokio 103-8510, Japón

El párrafo siguiente no es aplicable al Reino Unido ni a ningún país/región endonde tales disposiciones sean incompatibles con la legislación local:INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONAESTA PUBLICACIÓN “TAL CUAL”, SIN GARANTÍA DE NINGUNA CLASE, NIEXPLÍCITA NI IMPLÍCITA, INCLUIDAS, PERO SIN LIMITARSE A ELLAS, LASGARANTÍAS IMPLÍCITAS DE NO VULNERACIÓN DE DERECHOS,COMERCIALIZACIÓN O IDONEIDAD PARA UN FIN DETERMINADO. Algunosestados no permiten la exclusión de garantías expresas o implícitas endeterminadas transacciones, por lo que es posible que esta declaración no seaaplicable en su caso.

Esta publicación puede contener inexactitudes técnicas o errores tipográficos.Periódicamente se efectúan cambios en la información aquí contenida; dichoscambios se incorporarán a las nuevas ediciones de la publicación. IBM puede

© Copyright IBM Corp. 2006, 2014 83

Page 90: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

efectuar, en cualquier momento y sin previo aviso, mejoras y cambios en losproductos y programas descritos en esta publicación.

Las referencias hechas en esta publicación a sitios web que no son de IBM seproporcionan sólo para la comodidad del usuario y no constituyen un aval de esossitios web. La información de esos sitios web no forma parte de la información delpresente producto de IBM y la utilización de esos sitios web se realiza bajo laresponsabilidad del usuario.

IBM puede utilizar o distribuir cualquier información que se le facilite de lamanera que considere adecuada, sin contraer por ello ninguna obligación con elremitente.

Los licenciatarios de este programa que deseen obtener información sobre él con elfin de habilitar: (i) el intercambio de información entre programas creados deforma independiente y otros programas (incluido éste) y (ii) el uso mutuo de lainformación intercambiada, deben ponerse en contacto con:

IBM Canada LimitedU59/36003600 Steeles Avenue EastMarkham, Ontario L3R 9Z7CANADÁ

Dicha información puede estar disponible, sujeta a los términos y condicionesapropiados, incluido en algunos casos el pago de una tarifa.

El programa bajo licencia descrito en este documento y todo el material bajolicencia asociado a él, los proporciona IBM según los términos del Acuerdo deCliente de IBM, el Acuerdo Internacional de Programas Bajo Licencia de IBM ocualquier acuerdo equivalente entre el usuario e IBM.

Los datos de rendimiento contenidos en este documento se obtuvieron en unentorno controlado. Por lo tanto, los resultados obtenidos en otros entornosoperativos pueden variar significativamente. Algunas mediciones pueden haberserealizado en sistemas experimentales y no es seguro que estas mediciones sean lasmismas en los sistemas disponibles comercialmente. Además, algunas medicionespueden haberse calculado mediante extrapolación. Los resultados reales puedenvariar. Los usuarios del presente manual deben verificar los datos aplicables parasu entorno específico.

La información referente a productos que no son de IBM se ha obtenido de losproveedores de esos productos, de sus anuncios publicados o de otras fuentesdisponibles públicamente. IBM no ha probado esos productos y no puedeconfirmar la exactitud del rendimiento, la compatibilidad ni ninguna otraafirmación referente a productos que no son de IBM. Las preguntas sobre lasprestaciones de productos que no son de IBM deben dirigirse a los proveedores deesos productos.

Todas las declaraciones de intenciones de IBM están sujetas a cambio o cancelaciónsin previo aviso, y sólo representan objetivos.

Este manual puede contener ejemplos de datos e informes que se utilizan enoperaciones comerciales diarias. Para ilustrarlos de la forma más completa posible,los ejemplos incluyen nombres de personas, empresas, marcas y productos. Todos

84 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 91: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

estos nombres son ficticios y cualquier similitud con nombres y direccionesutilizados por una empresa real es totalmente fortuita.

LICENCIA DE COPYRIGHT:

Este manual contiene programas de aplicaciones de ejemplo escritos en lenguajefuente, que muestran técnicas de programación en diversas plataformas operativas.Puede copiar, modificar y distribuir estos programas de ejemplo como desee, sinpago alguno a IBM con la intención de desarrollar, utilizar, comercializar odistribuir programas de aplicaciones de acuerdo con la interfaz de programaciónde aplicaciones correspondiente a la plataforma operativa para la que están escritoslos programas de ejemplo. Estos ejemplos no se han probado exhaustivamente bajotodas las condiciones. Por lo tanto, IBM no puede asegurar ni implicar lafiabilidad, utilidad o función de estos programas. Los programas de ejemplo seproporcionan "TAL CUAL", sin ningún tipo de garantía. IBM no se haráresponsable de los daños derivados de la utilización que haga el usuario de losprogramas de ejemplo.

Cada copia o parte de estos programas de ejemplo o cualquier trabajo derivadodebe incluir una nota de copyright como la siguiente:

© (nombre de la empresa) (año). Partes de este código proceden de programas deejemplo de IBM Corp. © Copyright IBM Corp. _entre el o los años_. Reservadostodos los derechos.

Marcas registradas

IBM, el logotipo de IBM e ibm.com son marcas registradas de InternationalBusiness Machines Corp., que se han registrado en muchas otras jurisdicciones.Otros nombres de productos y servicios pueden ser marcas registradas de IBM ode otras empresas. La lista actual de marcas registradas de IBM está disponible enla web, en “Copyright and trademark information”, en la direcciónwww.ibm.com/legal/copytrade.shtml.

Los siguientes términos son marcas registradas de otras empresas.v Linux es una marca registrada de Linus Torvalds en los Estados Unidos y/o en

otros países.v Java y todos los logotipos y marcas registradas basadas en Java son marcas

registradas de Oracle, sus filiales o ambos.v UNIX es una marca registrada de The Open Group en los Estados Unidos y/o

en otros países.v Intel, el logotipo de Intel, Intel Inside, el logotipo de Intel Inside, Celeron, Intel

SpeedStep, Itanium y Pentium son marcas registradas de Intel Corporation o desus empresas subsidiarias en Estados Unidos y en otros países.

v Microsoft, Windows, Windows NT y el logotipo de Windows son marcasregistradas de Microsoft Corporation en los Estados Unidos y/o en otros países.

Otros nombres de empresas, productos o servicios, pueden ser marcas registradaso marcas de servicio de otras empresas.

Apéndice B. Avisos 85

Page 92: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

86 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 93: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Índice

Aadaptador ibm_db_sa

detalles 51adaptador Rails

dependencias 74detalles 69iniciación 69instalación 70soporte de JRuby 75verificación de la instalación 71

API ibm_dbdetalles 51visión general 56

API ibm_db_dbidetalles 51

aplicaciones Railsconfiguración de la conexión 73

autocommit, función (ibm_db) 64avisos 83ayuda

sentencias SQL 80

Bbind_param, función (ibm_db)

llamada 58, 62

CCALL, sentencia

PHP 29, 46Python 62

client_info, función (ibm_db) 66close, función (ibm_db)

captación desde conjuntos de resultados 60recuperar varios conjuntos de resultados 63

column_privileges, función (ibm_db) 66columnas

captaciónPHP 26, 43

columns, función (ibm_db) 66commit, función (ibm_db) 64conexiones

aplicaciones Rails 73conn_error, función (ibm_db) 65conn_errormsg, función (ibm_db) 65connect, función (ibm_db) 56connect, método (DBI de Perl) 6contextos fiables

aplicaciones PHP 21soporte de controlador IBM_DB Ruby 73

controlador DB2::DB2descargas 5recursos 5soporte de pureXML 9

controlador IBM_DB Ruby y adaptador Railsconfiguración del entorno 69contextos fiables 73dependencias 74detalles 69

controlador IBM_DB Ruby y adaptador Rails (continuación)gema Ruby, instalación 70soporte de JRuby 75verificación de la instalación 71

controlador node-ibm_dbconexión de prueba 2instalación 2recursos 1visión general 1

controlador Rubycontextos fiables 73detalles 69iniciación 69instalación del controlador IBM_DB Ruby y el adaptador

Rails 70soporte de JRuby 75verificación de la instalación 71

Ddb2_autocommit, función (ibm_db2) 32db2_bind_param, función (ibm_db2)

ejecutar sentencias de SQL con entrada de variables 24insertar objetos grandes 26invocación de procedimientos almacenados 29preparar sentencias de SQL con entrada de variables 24

db2_client_info, función (ibm_db2) 35db2_close, función (ibm_db2) 26db2_column_privileges, función (ibm_db2) 35db2_columns, función (ibm_db2) 35db2_commit, función (ibm_db2) 32db2_conn_error, función (ibm_db2) 33db2_conn_errormsg, función (ibm_db2) 33db2_connect, función (ibm_db2) 20db2_exec, función (ibm_db2) 22db2_executem, función (ibm_db2)

ejecución de sentencias de SQL 24insertar objetos grandes 26invocación de procedimientos almacenados 29

db2_fetch_array, función (ibm_db2)captar datos del conjunto de resultados 26recuperar varios conjuntos de resultados 31

db2_fetch_assoc, función (ibm_db2)captar datos del conjunto de resultados 26recuperar varios conjuntos de resultados 31

db2_fetch_both, función (ibm_db2)captar datos del conjunto de resultados 26recuperar varios conjuntos de resultados 31

db2_fetch_object, función (ibm_db2)captar datos del conjunto de resultados 26recuperación de objetos grandes 29

db2_fetch_row, función (ibm_db2)captar datos del conjunto de resultados 26recuperar varios conjuntos de resultados 31

db2_foreign_keys, función (ibm_db2) 35db2_next_result, función (ibm_db2)

recuperar varios conjuntos de resultados 31db2_pconnect, función (ibm_db2) 20db2_prepare, función (ibm_db2)

insertar objetos grandes 26invocación de procedimientos almacenados 29

© Copyright IBM Corp. 2006, 2014 87

Page 94: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

db2_prepare, función (ibm_db2) (continuación)preparar sentencias de SQL 24

db2_primary_keys, función (ibm_db2) 35db2_procedure_columns, función (ibm_db2) 35db2_procedures, función (ibm_db2) 35db2_result, función (ibm_db2) 26db2_rollback, función (ibm_db2) 32db2_server_info, función (ibm_db2) 35db2_special_columns, función (ibm_db2) 35db2_statistics, función (ibm_db2) 35db2_stmt_error, función (ibm_db2) 33db2_stmt_errormsg, función (ibm_db2) 33db2_table_privileges, función (ibm_db2) 35disconnect, método (DBI de Perl) 6diseño de aplicación

creación de prototipos en Node.js 1prototipo en Perl 5

Djangoconfiguración del entorno de servidor de datos de IBM 52verificación de la instalación 54

documentaciónarchivos PDF 78copia impresa 78términos y condiciones de uso 81

documentación de DB2formatos disponibles 77

documentación de DB2 en líneaIBM Knowledge Center 80

Eejecución de método (DBI de Perl) 7ejemplos

Perl 11, 12err, método 8errores

Perl 8PHP 33, 49Python 65

errstr, método 8estado, método 8exec_immediate, función (ibm_db) 57execute, función (ibm_db)

ejecutar sentencias de SQL con entrada de variables 58invocación de procedimientos almacenados 62

Ffetch_assoc, función (ibm_db)

captación de columnas 60captación de filas 60captación de varios conjuntos de resultados 63

fetch_both, función (ibm_db)captación de columnas 60captación de filas 60captación de varios conjuntos de resultados 63

fetch_row, función (ibm_db)captación de columnas 60captación de filas 60captación de varios conjuntos de resultados 63

fetch_tuple, función (ibm_db)captación de columnas 60captación de filas 60captación de varios conjuntos de resultados 63

fetchrow, método (DBI de Perl) 7

filascaptación

Perl 7PHP 26, 43Python 60

foreign_keys, función (ibm_db) 66funciones

PHPdb2_autocommit 32db2_bind_param 24, 26, 29db2_client_info 35db2_close 26, 31db2_column_privileges 35db2_columns 35db2_commit 32db2_conn_error 33db2_conn_errormsg 33db2_connect 20db2_exec 22db2_execute 24, 26, 29db2_fetch_array 26, 31db2_fetch_assoc 26, 31db2_fetch_both 26, 31db2_fetch_object 26, 29db2_fetch_row 26, 31db2_foreign_keys 35db2_next_result 31db2_pconnect 20db2_prepare 24, 26, 29db2_primary_keys 35db2_procedure_columns 35db2_procedures 35db2_result 26db2_rollback 32db2_server_info 35db2_special_columns 35db2_statistics 35db2_stmt_error 33db2_stmt_errormsg 33db2_table_privileges 35

Pythonibm_db.autocommit 64ibm_db.bind_param 58, 62ibm_db.client_info 66ibm_db.close 60, 63ibm_db.column_privileges 66ibm_db.columns 66ibm_db.commit 64ibm_db.conn_error 65ibm_db.conn_errormsg 65ibm_db.connect 56ibm_db.exec_immediate 57ibm_db.execute 58, 62ibm_db.fetch_assoc 60, 63ibm_db.fetch_both 60, 63ibm_db.fetch_row 60, 63ibm_db.fetch_tuple 60, 63ibm_db.foreign_keys 66ibm_db.next_result 63ibm_db.pconnect 56ibm_db.prepare 58, 62ibm_db.primary_keys 66ibm_db.procedure_columns 66ibm_db.procedures 66ibm_db.result 60ibm_db.rollback 64ibm_db.server_info 66

88 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 95: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

funciones (continuación)Python (continuación)

ibm_db.special_columns 66ibm_db.statistics 66ibm_db.stmt_error 65ibm_db.stmt_errormsg 65ibm_db.table_privileges 66

Iibm_db2, API

contextos fiables 21desarrollo de aplicaciones PHP 20detalles 15

IBM Knowledge CenterVersiones de documentación de DB2 80

JJRuby

controlador IBM_DB Ruby y adaptador Rails 75

Mmarcadores de parámetros

Perl 8metadatos

recuperarPHP 35Python 66

métodosPerl

connect 6disconnect 6err 8errstr 8estado 8execute 7fetchrow 7prepare 7

PHPPDO::beginTransaction 48PDO::commit 48PDO::exec 40PDO::prepare 41, 42, 46PDO::query 40PDO::rollBack 48PDOStatement::bindColumn 45PDOStatement::bindParam 41, 42, 46PDOStatement::execute 41, 42, 46PDOStatement::fetch 43, 45, 47PDOStatement::fetchAll 43, 47PDOStatement::fetchColumn 43PDOStatement::nextRowset 47

modalidades de confirmaciónaplicaciones de Python 64aplicaciones PHP 32, 48

Nnext_result, función (ibm_db) 63

Oobjetos grandes (LOB)

captaciónPHP 29, 45

inserciónPHP 26, 42

Ppconnect, función (ibm_db) 56PDO::beginTransaction, método (PDO) 48PDO::commit, método (PDO) 48PDO::exec, método (PDO) 40PDO::prepare, método (PDO) 41, 42, 46PDO::query, método (PDO) 40PDO::rollBack, método (PDO) 48pdo_ibm

desarrollo de aplicaciones PHP 38detalles 15

PDOStatement::bindColumn, método (PDO) 45PDOStatement::bindParam, método (PDO) 41, 42, 46PDOStatement::execute, método (PDO) 41, 42, 46PDOStatement::fetch, método (PDO) 43, 45, 47PDOStatement::fetchAll, método (PDO) 43, 47PDOStatement::fetchColumn, método (PDO) 43PDOStatement::nextRowset, método (PDO) 47Perl

captación de filas 7conexión con una base de datos 6controladores 5descargas 5documentación 5errores 8marcadores de parámetros 8métodos

connect 6disconnect 6err 8errstr 8estado 8execute 7fetchrow 7prepare 7

notificación de problemas 5programas de ejemplo 11, 12restricciones 9soporte de pureXML 9variables SQLCODE 8variables SQLSTATE 8visión general 5

PHPcaptación de columnas 26, 43captación de filas 26, 43conexión con base de datos 20, 38configuración

Linux 18UNIX 18visión general 16

configuración del entorno de servidor de datos de IBM(Windows) 16

contextos fiables 21desarrollo de aplicaciones 15, 20, 38descargas 15documentación 15extensión PDO_IBM

conexión con base de datos 38

Índice 89

Page 96: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

PHP (continuación)extensión PDO_IBM (continuación)

ejecución de una única sentencia 40extensiones para servidores de datos de IBM 15funciones

db2_autocommit 32db2_bind_param 29db2_client_info 35db2_close 26, 31db2_column_privileges 35db2_columns 35db2_commit 32db2_conn_error 33db2_conn_errormsg 33db2_connect 20db2_exec 22db2_execute 29db2_fetch_array 26, 31db2_fetch_assoc 26, 31db2_fetch_both 26, 31db2_fetch_object 26, 29db2_fetch_row 26, 31db2_foreign_keys 35db2_next_result 31db2_pconnect 20db2_prepare 29db2_primary_keys 35db2_procedure_columns 35db2_procedures 35db2_result 26db2_rollback 32db2_server_info 35db2_special_columns 35db2_statistics 35db2_stmt_error 33db2_stmt_errormsg 33db2_table_privileges 35

ibm_db2, APIconexión con base de datos 20visión general 20

manejo de errores 33, 49métodos

PDO::beginTransaction 48PDO::commit 48PDO::exec 40PDO::prepare 41, 42, 46PDO::query 40PDO::rollBack 48PDOStatement::bindColumn 45PDOStatement::bindParam 41, 42, 46PDOStatement::execute 41, 42, 46PDOStatement::fetch 43, 45, 47PDOStatement::fetchAll 43, 47PDOStatement::fetchColumn 43PDOStatement::nextRowset 47

objetos grandes 26, 42procedimientos 29, 46procedimientos almacenados

llamada 29, 46recuperar resultados 31, 47

recuperación de metadatos de base de datos 35recuperación de objetos grandes 29, 45sentencias SQL

ejecución (visión general) 22, 39ejecución de sentencias con entrada de variables 24, 41ejecución de una única sentencia 22, 40

PHP (continuación)sentencias SQL (continuación)

preparación de sentencias con entrada de variables 24,41

transacciones 32, 48preparación de método (DBI de Perl) 7prepare, función (ibm_db) 58, 62primary_keys, función (ibm_db) 66procedimientos

PHP 29, 46Python 62

procedimientos almacenadosPHP

llamada 29, 46recuperar resultados 31, 47

Pythonllamada 62recuperar resultados 63

recuperar conjuntos de resultadosPHP 31, 47Python 63

procedure_columns, función (ibm_db) 66procedures, función (ibm_db) 66pureXML

controlador DB2::DB2 9Python

captación de filas 60conexión con base de datos 56configuración del entorno de servidor de datos de IBM 52desarrollo de aplicaciones 51, 56descargar extensiones 51documentación de API 51extensiones para servidores de datos de IBM 51funciones

ibm_db.autocommit 64ibm_db.bind_param 58, 62ibm_db.client_info 66ibm_db.close 60, 63ibm_db.column_privileges 66ibm_db.columns 66ibm_db.commit 64ibm_db.conn_error 65ibm_db.conn_errormsg 65ibm_db.connect 56ibm_db.exec_immediate 57ibm_db.execute 58, 62ibm_db.fetch_assoc 60, 63ibm_db.fetch_both 60, 63ibm_db.fetch_row 60, 63ibm_db.fetch_tuple 60, 63ibm_db.foreign_keys 66ibm_db.next_result 63ibm_db.pconnect 56ibm_db.prepare 58, 62ibm_db.primary_keys 66ibm_db.procedure_columns 66ibm_db.procedures 66ibm_db.result 60ibm_db.rollback 64ibm_db.server_info 66ibm_db.special_columns 66ibm_db.statistics 66ibm_db.stmt_error 65ibm_db.stmt_errormsg 65ibm_db.table_privileges 66

ibm_db 56manejo de errores 65

90 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 97: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Python (continuación)procedimientos 62procedimientos almacenados

llamada 62recuperar resultados 63

recuperación de metadatos de base de datos 66sentencias SQL 57, 58transacciones 64verificación de la instalación 54

RRadRails

configuración de servidores de datos de IBM en Rails 70result, función (ibm_db) 60rollback, función (ibm_db) 64Ruby on Rails

tamaño de almacenamiento dinámico, problemas 75

Ssentencias SQL

ayudavisualización 80

PHP 22, 24, 26, 39, 40, 41, 42, 43, 45Python 57, 58

server_info, función (ibm_db) 66special_columns, función (ibm_db) 66SQL dinámico

soporte de Perl 5soporte Node.js 1

SQL estáticoPerl 9

SQLAlchemyadaptador para servidores de datos de IBM 51configuración del entorno de servidor de datos de IBM 52descargar extensión 51verificación de la instalación 54

statistics, función (ibm_db) 66stmt_error, función (ibm_db) 65stmt_errormsg, función (ibm_db) 65

Ttable_privileges, función (ibm_db) 66términos y condiciones

publicaciones 81transacciones

PHP 32, 48Python 64

Vvariables del lenguaje principal

Perl 7Versiones de la documentación de DB2

IBM Knowledge Center 80

Índice 91

Page 98: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

92 Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Rails

Page 99: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,
Page 100: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

����

Impreso en España

SC11-8358-01

Page 101: Desarrollo de aplicaciones Perl, PHP, Python y Ruby on Railspublic.dhe.ibm.com/ps/.../pdf/es_ES/DB2Dev-Perl-PHP...IBM DB2 10.5 para Linux,UNIX yWindows Desarrollo de aplicaciones Perl,PHP,

Spineinformation:

IBM

DB2

10.5

para

Linu

x,UN

IXy

Win

dow

sDe

sarr

ollo

deap

licac

ione

sPe

rl,PH

P,Py

thon

yRu

byon

Rails

��