db2dev perl php python ruby db2apz970

Upload: david-lopez

Post on 02-Mar-2016

80 views

Category:

Documents


0 download

TRANSCRIPT

  • IBM DB2 9.7para Linux, UNIX y Windows

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

    SC11-3908-00

  • IBM DB2 9.7para Linux, UNIX y Windows

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

    SC11-3908-00

  • NotaAntes de utilizar esta informacin y el producto al que da soporte, lea la informacin general contenida en el apartadoApndice B, Avisos, en la pgina 97.

    Nota de edicin

    Este manual es la traduccin del original en ingls IBM DB2 9.7 for Linux, UNIX, and Windows Developing Perl, PHP,Python, and Ruby on Rails Applications (SC27-2447-00).

    Este documento contiene informacin propiedad de IBM. Se proporciona segn un acuerdo de licencia y estprotegido por la ley de la propiedad intelectual. La informacin contenida en esta publicacin no incluye ningunagaranta de producto, por lo que ninguna declaracin proporcionada en este manual deber interpretarse como tal.

    Puede realizar pedidos de publicaciones de IBM en lnea o a travs del representante de IBM de su localidad.v Para realizar pedidos en lnea, vaya a IBM Publications Center ubicado en el sitio web www.ibm.com/shop/publications/order

    v Para encontrar al representante de IBM de su localidad, vaya al IBM Directory of Worldwide Contacts en el sitioweb 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 enva informacin a IBM, otorga a IBM un derecho no exclusivo a utilizar o distribuir dicha informacin enla forma en que IBM considere adecuada, sin contraer por ello ninguna obligacin con el remitente.

    Copyright International Business Machines Corporation 2006, 2009.

  • ContenidoParte 1. Desarrollo de aplicacionesPerl . . . . . . . . . . . . . . . . 1

    Captulo 1. Consideraciones sobre laprogramacin en Perl . . . . . . . . . 3Descargas y recursos relacionados de Perl . . . . 3Conexiones de bases de datos en Perl . . . . . . 4Captacin de resultados en Perl . . . . . . . . 5Marcadores de parmetro en Perl . . . . . . . 6Variables SQLSTATE y SQLCODE en Perl . . . . 7Restricciones de Perl . . . . . . . . . . . . 7pureXML y Perl . . . . . . . . . . . . . 7Ejecucin de programas de ejemplo de Perl. . . . 10Ejecucin de rutinas desde aplicaciones Perl . . . 11

    Parte 2. Desarrollo de aplicacionesPHP . . . . . . . . . . . . . . . 13

    Captulo 2. Desarrollo de aplicacionesPHP para servidores de datos de IBM . 15Descargas y recursos relacionados de PHP . . . . 16Configuracin del entorno PHP. . . . . . . . 16

    Configuracin del entorno PHP en Windows . . 16Configuracin del entorno PHP en Linux o UNIX 17

    Desarrollo de aplicaciones en PHP (ibm_db2) . . . 19Conexin a una base de datos de IBM DataServer en PHP (ibm_db2) . . . . . . . . . 19Ejecucin de sentencias de SQL en PHP(ibm_db2) . . . . . . . . . . . . . . 21Lectura de conjuntos de resultados de consultas 25Invocacin de procedimientos almacenados enPHP (ibm_db2) . . . . . . . . . . . . 28Modalidades de confirmacin en aplicacionesPHP (ibm_db2) . . . . . . . . . . . . 31Funciones de manejo de errores en aplicacionesPHP (ibm_db2) . . . . . . . . . . . . 32Funciones de recuperacin de metadatos de basede datos en PHP (ibm_db2) . . . . . . . . 34

    Desarrollo de aplicaciones en PHP (PDO) . . . . 37Conexin a una base de datos de IBM DataServer con PHP (PDO) . . . . . . . . . 37Ejecucin de sentencias de SQL en PHP (PDO) 38Lectura de conjuntos de resultados de consultas 42Invocacin de procedimientos almacenados enPHP (PDO) . . . . . . . . . . . . . 45Modalidades de confirmacin en PHP (PDO) . . 47Manejo de errores y avisos en PHP (PDO) . . . 48

    Parte 3. Desarrollo de aplicacionesPython . . . . . . . . . . . . . . 51

    Captulo 3. Desarrollo de aplicacionesPython y SQLAlchemy para losservidores de datos de IBM. . . . . . 53Descargas y recursos relacionados de Python . . . 53Configuracin del entorno Python para servidoresde datos IBM . . . . . . . . . . . . . . 54Desarrollo de aplicaciones en Python con ibm_db . 56

    Conexin a una base de datos de IBM DataServer en Python . . . . . . . . . . . 56Ejecucin de sentencias de SQL en Python . . . 57Captacin de filas o columnas de conjuntos deresultados en Python . . . . . . . . . . 60Invocacin de procedimientos almacenados enPython . . . . . . . . . . . . . . . 62Recuperacin de varios conjuntos de resultadosde un procedimiento almacenado en Python . . 64Modalidades de confirmacin en aplicacionesPython . . . . . . . . . . . . . . . 65Funciones de manejo de errores en Python . . . 66Funciones de recuperacin de metadatos de basede datos en Python . . . . . . . . . . . 67

    Parte 4. Desarrollo de aplicacionesRuby on Rails . . . . . . . . . . . 71

    Captulo 4. Controlador IBM_DB Ruby yadaptador Rails . . . . . . . . . . . 73Iniciacin a los servidores de datos de IBM en Rails 73

    Configuracin de un entorno de desarrollointegrado para Rails . . . . . . . . . . 74

    Instalacin del adaptador y controlador IBM_DBcomo una gema Ruby . . . . . . . . . . . 74

    Verificacin de la instalacin con DB2 Express-C 76Verificacin de la instalacin con servidores dedatos de IBM en aplicaciones de Rails . . . . 77

    Configuracin de conexiones de aplicaciones deservidores de datos de IBM . . . . . . . . . 79Controlador IBM Ruby y contextos fiables . . . . 79Dependencias y consecuencias del adaptadorIBM_DB Rails . . . . . . . . . . . . . 80El controlador IBM_DB y el adaptador Rails noestn soportados en JRuby . . . . . . . . . 81Adaptador ActiveRecord-JDBC frente a adaptadorIBM_DB . . . . . . . . . . . . . . . 81Consideraciones acerca del tamao dealmacenamiento dinmico con DB2 en Rails . . . 82

    Parte 5. Apndices. . . . . . . . . 83

    Apndice A. Visin general de lainformacin tcnica de DB2 . . . . . 85Biblioteca tcnica de DB2 en copia impresa o enformato PDF . . . . . . . . . . . . . . 85

    Copyright IBM Corp. 2006, 2009 iii

  • Pedido de manuales de DB2 en copia impresa . . . 88Visualizacin de la ayuda para estados de SQLdesde el procesador de lnea de mandatos . . . . 89Acceso a diferentes versiones del Centro deinformacin de DB2 . . . . . . . . . . . 89Visualizacin de temas en su idioma preferido en elCentro de informacin de DB2 . . . . . . . . 90Actualizacin del Centro de informacin de DB2instalado en el sistema o en el servidor de intranet . 90Actualizacin manual del Centro de informacin deDB2 instalado en el sistema o en el servidor deintranet . . . . . . . . . . . . . . . . 92

    Guas de aprendizaje de DB2 . . . . . . . . 94Informacin de resolucin de problemas de DB2 . . 94Trminos y condiciones . . . . . . . . . . 95

    Apndice B. Avisos . . . . . . . . . 97

    ndice. . . . . . . . . . . . . . . 101

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

  • Parte 1. Desarrollo de aplicaciones Perl

    Copyright IBM Corp. 2006, 2009 1

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

  • Captulo 1. Consideraciones sobre la programacin en PerlPerl Database Interface (DBI) es una interfaz de programacin de aplicacionesestndar que proporciona acceso de base de datos a las aplicaciones cliente escritasen Perl. La DBI de Perl define un conjunto de funciones, variables y convencionesque ofrecen una interfaz de base de datos independiente de la plataforma.

    Puede utilizar IBM DB2 Database Driver para la DBI de Perl (el controladorDBD::DB2) disponible en http://www.ibm.com/software/data/db2/perl junto conel mdulo DBI de Perl disponible en http://www.perl.com para crear aplicacionesde DB2 que usen Perl.

    Dado que Perl es un lenguaje interpretado y que el mdulo DBI de Perl utilizaSQL dinmico, Perl constituye el lenguaje idneo para crear y revisar con rapidezlos prototipos de aplicaciones de DB2. El mdulo DBI de Perl utiliza una interfazbastante similar a las interfaces CLI y JDBC, lo que le permitir trasladarfcilmente sus prototipos Perl a CLI y JDBC.

    La mayora de proveedores de bases de datos proporcionan un controlador de basede datos para el mdulo DBI de Perl, lo cual significa que tambin se puedeutilizar Perl para crear aplicaciones que accedan a datos de muchos servidores debases de datos distintos. Por ejemplo, puede escribir en Perl una aplicacin de DB2que conecte con una base de datos Oracle utilizando el controlador de base dedatos DBD::Oracle, captar datos de la base de datos Oracle e insertar los datos enuna base de datos DB2 utilizando el controlador de base de datos DBD::DB2.

    Para obtener informacin sobre servidores de bases de datos soportados,instrucciones de instalacin y requisitos previos, consulte http://www.ibm.com/software/data/db2/perl

    Descargas y recursos relacionados de PerlHay disponibles varios recursos para ayudarle a desarrollar aplicaciones Perl queacceden a servidores de datos de IBM.

    Tabla 1. Descargas y recursos relacionados de PerlDescargas

    Mdulo Perl Database Interface (DBI) http://www.perl.com

    Controlador DBD::DB2 http://www.ibm.com/software/data/db2/perl

    Clientes de IBM Data Server http://www-01.ibm.com/software/data/db2/ad/deploy.html

    Descargas de fixpacks y clientes http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg27007053

    Documentacin de la API

    Documentacin de la API de DBI http://search.cpan.org/~timb/DBI/DBI.pm

    Recursos relacionados

    Nota tcnica de DB2 Perl Database Interfacefor LUW, que incluye el archivo lame y lasinstrucciones de instalacin

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

    Copyright IBM Corp. 2006, 2009 3

  • Tabla 1. Descargas y recursos relacionados de Perl (continuacin)Descargas

    Sistema de notificacin de errores decontrolador de Perl

    http://rt.cpan.org/

    Notificacin de errores al equipo de cdigoabierto de IBM

    [email protected]

    Conexiones de bases de datos en PerlEl controlador DBD::DB2 proporciona soporte para las funciones de conexin debase de datos estndar definidas por la API de DBI.

    Para permitir que Perl cargue el mdulo DBI, debe incluir la lnea siguiente en suaplicacin:

    use DBI;

    El mdulo DBI carga automticamente el controlador DBD::DB2 cuando se crea undescriptor de contexto de base de datos utilizando la sentencia DBI->connect con lasintaxis siguiente:

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

    donde:

    $dbhandlerepresenta el descriptor de contexto de base de datos devuelto por lasentencia de conexin

    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 conexin completaque incluye el nombre del sistema principal, el nmero de puerto, elprotocolo, el ID de usuario y la contrasea para conectar con el sistemaprincipal remoto

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

    $passwordrepresenta la contrasea para el ID de usuario utilizado para conectar conla base de datos

    Para obtener ms informacin sobre la API de DBI, consulte http://search.cpan.org/~timb/DBI/DBI.pm.

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

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

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

  • 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;

    Captacin de resultados en PerlEl mdulo DBI de Perl ofrece mtodos para la conexin con una base de datos, lapreparacin y emisin de sentencias de SQL y la captacin de filas de resultados.

    Acerca de esta tarea

    Este procedimiento capta los resultados de una consulta de SQL.

    Restriccin: Puesto que el mdulo DBI de Perl slo soporta SQL dinmico, no sepueden utilizar 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 conexin 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 bases de datos llamando al mtodoprepare y pasando una sentencia de SQL como argumento de serie, tal y comose muestra en la sentencia de Perl siguiente:

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

    FROM employee ');

    3. Emita la sentencia de SQL llamando al mtodo execute en el descriptor decontexto de sentencia. Una llamada satisfactoria al mtodo execute asocia unconjunto de resultados al descriptor de contexto de sentencia. Por ejemplo,puede ejecutar la sentencia preparada en el ejemplo anterior utilizando lasentencia de Perl siguiente:

    #Nota: $rc representa el cdigo 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 mtodo 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 siguiente:

    Captulo 1. Perl 5

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

    }

    EjemploEl ejemplo siguiente muestra cmo conectar con una base de datos y emitir unasentencia SELECT desde una aplicacin 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";

    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 captacinwarn $DBI::errstr if $DBI::err;

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

    Marcadores de parmetro en PerlEl mdulo DBI de Perl soporta la ejecucin de una sentencia preparada queincluye marcadores de parmetro para la entrada de variables. Para incluir unmarcador de parmetro en una sentencia de SQL, utilice un signo de interrogacin(?) o un carcter de dos puntos seguido de un nombre (:name).

    El cdigo Perl siguiente crea un descriptor de contexto de sentencia que acepta unmarcador de parmetro para la clusula WHERE de una sentencia SELECT. Acontinuacin, el cdigo ejecuta la sentencia dos veces, utilizando los valores deentrada 25000 y 35000 para sustituir el marcador de parmetro.

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

    FROM employeeWHERE salary > ?'

    );

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

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

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

    Variables SQLSTATE y SQLCODE en PerlEl mdulo DBI de Perl proporciona mtodos 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 mtodo state.Por ejemplo, para devolver el SQLSTATE asociado al descriptor de contexto debase de datos $descripbd, incluya la sentencia de Perl siguiente en la aplicacin:

    my $sqlstate = $descripbd->state;

    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 mtodo err.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 mtodo errstr. Por ejemplo, para devolver el SQLCODE asociado al descriptorde contexto de base de datos $descripbd, incluya la sentencia de Perl siguiente enla aplicacin:

    my $sqlcode = $descripbd->err;

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

    El mdulo DBI de Perl slo soporta SQL dinmico. Cuando tenga que ejecutar unasentencia varias veces, se puede mejorar el rendimiento de las aplicaciones Perlemitiendo una llamada prepare para preparar la sentencia.

    Perl no da soporte al acceso a bases de datos de varias hebras.

    Para obtener informacin actual sobre las restricciones de la versin delcontrolador de DBD::DB2 que instale en la estacin de trabajo, consulte el archivoCAVEATS contenido en el paquete del controlador de DBD::DB2.

    pureXML y PerlEl controlador DBD::DB2 da soporte a DB2 pureXML. El soporte para pureXMLofrece un acceso ms directo a los datos a travs del controlador DBD::DB2 yayuda a reducir la lgica de aplicacin ofreciendo una comunicacin mstransparente entre la aplicacin y la base de datos.

    Con el soporte de pureXML, puede insertar directamente documentos XML en labase de datos DB2. La aplicacin ya no necesita analizar los documentos XMLporque el analizador de pureXML se ejecuta automticamente al insertar los datosXML en la base de datos. La posibilidad de gestionar el anlisis de los documentosdesde el exterior de la aplicacin mejora el rendimiento de la aplicacin y reducelos esfuerzos de mantenimiento. Tambin resulta fcil la recuperacin de datosXML almacenados con el controlador DBD::DB2; puede acceder a los datosutilizando un BLOB o registro.

    Captulo 1. Perl 7

  • Para obtener informacin sobre DB2 Perl Database Interface y sobre cmodescargar el controlador DBD::DB2 ms reciente, consulte http://www.ibm.com/software/data/db2/perl.

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

    # Utilizar mdulo DBD:DB2:# para crear una sola tabla DB2 con una columna XML# Aadir 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" ;

    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 telfono# 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);

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

  • $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;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(\'

    Bill Jones

    5 RedwoodTorontoOntarioM6W 1E9

    416-555-9911416-555-1212

    \') ;

    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->execute

    Captulo 1. Perl 9

  • or die "Can't execute statement: $DBI::errstr";

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

    }

    Ejecucin de programas de ejemplo de PerlHay disponibles programas de ejemplo de Perl que muestran cmo crear unaaplicacin Perl.

    Antes de empezar

    Antes de ejecutar los programas de ejemplo de Perl, debe instalar la ltima versindel controlador DB2::DB2 para la DBI de Perl. Para conocer ms informacin sobrecmo obtener el controlador ms reciente, consulte http://www.ibm.com/software/data/db2/perl.

    Acerca de esta tarea

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

    Procedimiento

    Para ejecutar el intrprete de Perl en un programa de ejemplo de Perl desde lalnea de mandatos:

    Entre el nombre del intrprete y el nombre del programa (incluyendo la extensindel archivo):v Si est conectando localmente en el servidor:

    perl dbauth.pl

    v Si est conectando desde un cliente remoto:perl dbauth.pl sample

    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, tendra queemitir los mandatos siguientes:v Si est conectando localmente en el servidor:

    tbselinitperl tbsel.pl

    v Si est conectando desde un cliente remoto:tbselinitperl tbsel.pl sample

    Nota: Para un cliente remoto es necesario modificar la sentencia de conexin enlos archivos tbselinit o tbselinit.bat para codificar el ID de usuario y lacontrasea: db2 connect to sample user using

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

  • Ejecucin 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 slo se puede crear en el servidor, y no desdeun cliente remoto.

    Procedimiento

    Para crear procedimientos de SQL en una biblioteca compartida y, a continuacin,accesos a los procedimientos desde una aplicacin 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 siguientes paracrear y catalogar los procedimientos de SQL en la biblioteca spserver:

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

    2. Vuelva al directorio de muestras perl (puede estar en una estacin de trabajocliente remota) y ejecute el intrprete 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

    Captulo 1. Perl 11

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

  • Parte 2. Desarrollo de aplicaciones PHP

    Copyright IBM Corp. 2006, 2009 13

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

  • Captulo 2. Desarrollo de aplicaciones PHP para servidores dedatos de IBM

    PHP: Hypertext Preprocessor (PHP) es un lenguaje de programacin interpretadoque se utiliza habitualmente para el desarrollo de aplicaciones Web. PHP se haconvertido en un lenguaje muy usado en el desarrollo Web porque es fcil deaprender a utilizar, se centra en soluciones prcticas y da soporte a las funcionesms utilizadas en aplicaciones 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 manipulacin de XML, la creacin de clientes yservidores SOAP y el cifrado de comunicaciones entre servidor y navegador. Sinembargo, las extensiones ms utilizadas para PHP proporcionan acceso de lecturay escritura a bases de datos, por lo que puede crear fcilmente un sitio Webdinmico destinado a bases de datos.

    IBM ofrece las extensiones PHP siguientes para acceder a bases de datos deservidores de datos de IBM:

    ibm_db2Una interfaz de programacin de aplicaciones (API) de procedimientos queofrece, adems de las operaciones de base de datos de creacin, lectura,actualizacin y grabacin normales, un amplio acceso a los metadatos de labase de datos. Puede compilar la extensin ibm_db2 con PHP 4 o con PHP5. IBM escribe, mantiene y ofrece soporte a esta extensin.

    pdo_ibmControlador para la extensin de objetos de datos PHP (PDO) que ofreceacceso a bases de datos de servidores de datos de IBM mediante la interfazde base de datos orientada a objetos estndar implementada en PHP 5.1.

    Estas extensiones se incluyen como parte de IBM Data Server Client. Las versionesms recientes de ibm_db2 y pdo_ibm tambin estn disponibles en la bibliotecaPECL (PHP Extension Community Library) http://pecl.php.net/.

    Las aplicaciones PHP pueden acceder a las siguientes bases de datos de servidorde datos de IBM:v IBM DB2 Versin 9.1 para Linux, UNIX y Windows, Fixpack 2 y posteriorv IBM DB2 Universal Database ( DB2 UDB) Versin 8 para Linux, UNIX yWindows, Fixpack 15 y posterior

    v Conexiones remotas a IBM DB2 Universal Database en i5/OS V5R3v Conexiones remotas a IBM DB2 para IBM i 5.4 y posteriorv Conexiones remotas a IBM DB2 para z/OS, Versin 8 y Versin 9

    Una tercera extensin, Unified ODBC, ha ofrecido histricamente acceso a lossistemas de bases de datos DB2. No obstante, se recomienda utilizar ibm_db2 ypdo_ibm para las aplicaciones nuevas, ya que ofrecen ventajas significativas encuanto a rendimiento y estabilidad en comparacin con Unified ODBC. La API dela extensin ibm_db2 convierte la tarea de transportar una aplicacin escritaanteriormente para Unified ODBC en algo casi tan sencillo como realizar uncambio global del nombre de funcin odbc_ por db2_ en el cdigo fuente de laaplicacin.

    Copyright IBM Corp. 2006, 2009 15

  • Descargas y recursos relacionados de PHPHay disponibles muchos recursos para ayudarle a desarrollar aplicaciones PHPpara servidores de datos de IBM.

    Tabla 2. Descargas y recursos relacionados de PHPDescargas

    Cdigo fuente de PHP completo (Incluyebinarios de Windows. La mayora de lasdistribuciones Linux incluyen PHP yaprecompilado.)

    http://www.php.net/downloads.php

    ibm_db2 y pdo_ibm desde la bibliotecaPECL (PHP Extension Community Library)

    http://pecl.php.net/

    Clientes de IBM Data Server http://www-01.ibm.com/software/data/db2/ad/deploy.html

    Descargas de fixpacks y clientes http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg27007053

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

    Documentacin

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

    Documentacin de la API ibm_db2 http://www.php.net/ibm_db2

    Documentacin de la API de PDO http://php.net/manual/en/book.pdo.php

    Recursos relacionados

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

    Configuracin del entorno PHPPuede configurar el entorno de PHP en sistemas operativos Linux, UNIX oWindows instalando una versin binaria precompilada de PHP y habilitando elsoporte para los servidores de datos de IBM.

    Para facilitar la instalacin y configuracin en los sistemas operativos Linux, UNIXo Windows, puede descargar e instalar Zend Server para utilizarlo en sistemas deproduccin en http://www.zend.com/en/products/server/downloads. Enhttp://www.zend.com/en/products/server/editions encontrar informacin sobreel paquete.

    En Windows, las versiones binarias precompiladas de PHP estn disponibles parasu descarga en http://www.php.net/downloads.php. La mayora de lasdistribuciones Linux incluyen una versin precompilada de PHP. En sistemasoperativos UNIX que no incluyen una versin precompilada de PHP, puedecompilar su propia versin de PHP.

    Para obtener ms informacin sobre la instalacin y configuracin de PHP, consultehttp://www.php.net/manual/en/install.php.

    Configuracin del entorno PHP en WindowsAntes de poder conectarse a un servidor de datos de IBM y ejecutar sentencias deSQL, debe configurar el entorno PHP.

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

  • Antes de empezar

    Debe tener el siguiente software instalado en su sistema:v Apache HTTP Serverv Uno de los siguientes tipos de cliente: IBM Data Server Driver Package, IBMData Server Client, o IBM Data Server Driver para ODBC y CLI

    Acerca de esta tarea

    Este procedimiento instala de forma manual una versin binaria precompilada dePHP y habilita soporte para los servidores de datos de IBM en Windows.

    Procedimiento

    Para configurar el entorno PHP en Windows:1. Descargue la ltima versin del paquete zip de PHP y el grupo del paquete zip

    de mdulos PECL de http://www.php.net/downloads.php.2. Extraiga el paquete zip de PHP en un directorio de instalacin.3. Extraiga el grupo del paquete zip de mdulos PECL en el subdirectorio \ext\

    del directorio de instalacin de PHP.4. Cree un nuevo archivo denominado php.ini en el directorio de instalacin

    realizando una copia del archivo php.ini-recommended.5. Abra el archivo php.ini en un editor de texto y aada las siguientes lneas.

    v Para habilitar la extensin PDO y el controlador pdo_ibm:extension=php_pdo.dllextension=php_pdo_ibm.dll

    v Para habilitar la extensin ibm_db2:extension=php_ibm_db2.dll

    6. Si utiliza Apache HTTP Server 2.x., habilite el soporte de PHP aadiendo lassiguientes lneas al archivo httpd.conf, en el que phpdir hace referencia aldirectorio de instalacin de PHP:LoadModule php5_module 'phpdir/php5apache2.dll'AddType application/x-httpd-php .phpPHPIniDir 'phpdir'

    7. Vuelva a iniciar Apache HTTP Server para habilitar la configuracinmodificada.

    Resultados

    Las extensiones PHP se habrn instalado en su sistema y estarn listos para usar.

    Qu hacer a continuacin

    Conctese al servidor de datos y empiece a ejecutar sentencias de SQL.

    Configuracin del entorno PHP en Linux o UNIXAntes de poder conectarse a un servidor de datos de IBM y ejecutar sentencias deSQL, debe configurar el entorno PHP.

    Antes de empezar

    Captulo 2. Introduccin 17

  • DB2 da soporte al acceso de bases de datos para aplicaciones cliente escritas en ellenguaje de programacin PHP utilizando la extensin ibm_db2 o el controladorpdo_ibm para la extensin PHP Data Objects (PDO), o bien ambos.

    Debe tener el software y los archivos siguientes instalados en su sistema:v Apache HTTP Serverv Los archivos de cabecera de desarrollo y las bibliotecas de base de datos DB2v El compilador gcc y los siguientes paquetes de desarrollo: apache-devel,autoconf, automake, bison, flex, gcc y el paquete libxml2-devel.

    v Uno de los siguientes tipos de cliente: IBM Data Server Driver Package, IBMData Server Client, o IBM Data Server Driver para ODBC y CLI

    Acerca de esta tarea

    Este procedimiento compila e instala PHP de forma manual desde el programafuente con soporte para DB2 en Linux o UNIX.

    Procedimiento

    Para configurar el entorno PHP en Linux o UNIX:1. Descargue la ltima versin de PHP tarball con el cdigo fuente completo

    desde http://www.php.net.2. Desempaquete el archivo con el siguiente mandato:

    tar -xjf php-5.x.x.tar.bz2

    3. Cambie el directorio al directorio php-5.x.x recin creado.4. Configure el makefile emitiendo el mandato configure. Especifique las

    funciones y extensiones que desea incluir en la versin personalizada de PHP.Un mandato de configuracin tpico incluye las siguientes opciones:./configure --enable-cli --disable-cgi --with-apxs2=/usr/sbin/apxs2--with-zlib --with-pdo-ibm=

    Las opciones de configuracin tienen los siguientes efectos:

    --enable-cliHabilita la modalidad de lnea de mandatos del acceso de PHP.

    --disable-cgiInhabilita la modalidad Common Gateway Interface (CGI) del accesode PHP.

    --with-apxs2=/usr/sbin/apxs2Habilita la modalidad de Apache 2 Dynamic Server Object (DSO) delacceso de PHP.

    --with-zlibHabilita el soporte de compresin de zlib.

    --with-pdo-ibm=Habilita el controlador de pdo_ibm utilizando la biblioteca de CLI deDB2 para acceder a los sistemas de bases de datos. El valor hace referencia al directorio en el que se instala DB2.

    5. Compile los archivos emitiendo el mandato make.6. Instale los archivos emitiendo el mandato make install. En funcin de cmo

    haya configurado el directorio de instalacin de PHP utilizando el mandatoconfigure, es posible que necesite autorizacin de root para emitir

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

  • satisfactoriamente este mandato. Esto debera instalar los archivos ejecutablesy actualizar la configuracin de Apache HTTP Server para que d soporte aPHP.

    7. Instale la extensin ibm_db2 emitiendo el siguiente mandato como usuariocon autorizacin root:pecl install ibm_db2

    Este mandato descarga, configura, compila e instala la extensin ibm_db2 paraPHP.

    8. Copie el archivo php.ini-recommended en la va de acceso del archivo deconfiguracin correspondiente a la nueva instalacin de PHP. Para determinarla va de acceso del archivo de configuracin, emita el mandato php -i ybusque la palabra clave php.ini. Cambie el nombre del archivo por php.ini.

    9. Abra el nuevo archivo php.ini con un editor de texto y aada las siguienteslneas, donde instancia es el nombre de la instancia de DB2 en Linux o UNIX.v Para establecer el entorno de DB2 para pdo_ibm:

    PDO_IBM.db2_instance_name=instancia

    v Para habilitar la extensin ibm_db2 y establecer el entorno de DB2:extension=ibm_db2.soibm_db2.instance_name=instancia

    10. Vuelva a iniciar Apache HTTP Server para habilitar la configuracinmodificada.

    Desarrollo de aplicaciones en PHP (ibm_db2)La extensin 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. Laextensin 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.

    Conexin 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 desde su aplicacin PHP.Puede utilizar la API ibm_db2 para conectar con una base de datos de IBM DataServer mediante una conexin catalogada o una conexin TCP/IP directa. Paramejorar el rendimiento, tambin puede crear una conexin persistente.

    Antes de empezar

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

    Procedimiento

    Para devolver un recurso de conexin que puede utilizar para llamar a sentenciasde SQL, llame a una de las funciones de conexin siguientes:

    Tabla 3. Funciones de conexin de ibm_db2Funcin Descripcin

    db2_connect Crea una conexin no persistente.

    Captulo 2. Introduccin 19

  • Tabla 3. Funciones de conexin de ibm_db2 (continuacin)Funcin Descripcin

    db2_pconnect Crea una conexin persistente. Permaneceabierta una conexin persistente entrepeticiones de PHP, lo que permite que laspeticiones de script de PHP posterioresreutilicen la conexin si tienen un conjuntode credenciales idntico.

    Los valores de base de datos que proporcione como argumentos para estasfunciones pueden especificar un nombre de base de datos catalogado o una seriede conexin de base de datos completa para una conexin TCP/IP directa. Puedeespecificar argumentos opcionales que controlen cundo se confirman lastransacciones, las maysculas/minsculas de los nombres de columna que sedevuelven y el tipo de cursor.Si el intento de conexin falla, puede recuperar informacin de diagnsticollamando a la funcin db2_conn_error o db2_stmt_errormsg.Al crear una conexin llamando a la funcin db2_connect, PHP cierra la conexincon la base de datos cuando se produce uno de los sucesos siguientes:v Llama a la funcin db2_close para la conexinv Establece el recurso de conexin en NULLv Finaliza el script de PHPCuando crea una conexin llamando a la funcin db2_pconnect, PHP ignoracualquier llamada a la funcin db2_close para el recurso de conexin especificadoy mantiene abierta la conexin con la base de datos para los scripts de PHPposteriores.Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploConectar con una base de datos catalogada.

    Qu hacer a continuacin

    Si el intento de conexin se realiza correctamente, puede utilizar el recurso deconexin al llamar a funciones de ibm_db2 que ejecutan sentencias de SQL. Acontinuacin, prepare y ejecute las sentencias de SQL.

    Contextos fiables en aplicaciones PHP (ibm_db2)A partir de la Versin 9.5 Fixpack 3 (o posterior), la extensin de ibm_db2 admitecontextos fiables mediante el uso de palabras clave de serie de conexin.

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

  • Los contextos fiables proporcionan un mtodo para crear aplicaciones de tresniveles ms seguras y con mayor rapidez. La identidad del usuario siempre semantiene para operaciones de auditora y seguridad. Cuando se necesitanconexiones seguras, los contextos fiables mejoran el rendimiento ya que no esnecesario obtener conexiones nuevas.

    EjemploHabilitar contextos fiables, alternar usuarios y obtener el ID de usuario actual.

  • Obtener un recurso de conexin invocando una de las funciones de conexin en laAPI ibm_db2.

    Procedimiento

    Para preparar y ejecutar una nica sentencia de SQL, llame a la funcin db2_exec,pasando los argumentos siguientes:

    conexinUn recurso de conexin de base de datos vlido que devuelve la funcindb2_connect o db2_pconnect.

    sentenciaUna serie que contiene la sentencia de SQL. Esta serie puede incluir unaexpresin XQuery a la que llama la funcin 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 estndar SQL, esta opcin establece el caso en los que los nombres decolumna se devolvern a la aplicacin. Por omisin, el caso demaysculas/minsculas est establecido en DB2_CASE_NATURAL, lo quedevuelve nombres de columna tal y como los devuelve la base de datos .Puede establecer este parmetro en DB2_CASE_LOWER para obligar a quelos nombres de columna estn en minsculas, o en DB2_CASE_UPPERpara obligar a que los nombres de columna estn en maysculas.

    DB2_ATTR_CURSOREsta opcin establece el tipo de cursor que ibm_db2 devuelve para losconjuntos de resultados. Por omisin, ibm_db2 devuelve un cursor de sloavance (DB2_FORWARD_ONLY) que devuelve la fila siguiente delconjunto de resultados para cada llamada a db2_fetch_array,db2_fetch_assoc, db2_fetch_both, db2_fetch_object o db2_fetch_row. Puedeestablecer este parmetro en DB2_SCROLLABLE para solicitar un cursordesplazable de forma que las funciones de captacin de ibm_db2 aceptenun segundo argumento especificando la posicin absoluta de la fila a laque desea acceder en el conjunto de resultados.

    Si la llamada de funcin tiene xito, devuelve un recurso de sentencia que puedeutilizar en llamadas de funcin posteriores relacionadas con esta consulta.Si la llamada de funcin falla (devuelve False), puede utilizar la funcindb2_stmt_error o db2_stmt_errormsg para recuperar informacin de diagnsticosobre el error.Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploEjemplo 1: Ejecucin de una nica sentencia de SQL.

    Ejemplo 2: Ejecucin de una expresin XQuery.

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

  • Qu hacer a continuacin

    Si la sentencia de SQL ha seleccionado filas utilizando un cursor desplazable, o hainsertado, actualizado o suprimido filas, puede llamar a la funcin db2_num_rowspara devolver el nmero 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.

    Preparacin y ejecucin de sentencias de SQL con entrada devariables 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 recuperacin de datos que puede reutilizar si sevuelve a ejecutar la sentencia.

    Antes de empezar

    Obtener un recurso de conexin invocando una de las funciones de conexin en laAPI ibm_db2.

    Procedimiento

    Para preparar y ejecutar una sentencia de SQL que incluye marcadores deparmetro:

    Procedimiento

    1. Llame a la funcin db2_prepare pasando los argumentos siguientes:

    conexinUn recurso de conexin de base de datos vlido que devuelve la funcindb2_connect o db2_pconnect.

    sentenciaUna serie que contiene la sentencia de SQL, incluidos los signos deinterrogacin (?), como marcadores de parmetro para cualquier valor decolumna o predicado que requiera entrada de variables. Esta serie puedeincluir una expresin XQuery a la que llama la funcin XMLQUERY. Slopuede utilizar marcadores de parmetro 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 parmetro 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 estndar SQL, esta opcin establece el caso en los que losnombres de columna se devolvern a la aplicacin. Por omisin, el casode maysculas/minsculas est establecido en DB2_CASE_NATURAL,lo que devuelve nombres de columna tal y como los devuelve la base

    Captulo 2. Introduccin 23

  • de datos . Puede establecer este parmetro en DB2_CASE_LOWER paraobligar a que los nombres de columna estn en minsculas, o enDB2_CASE_UPPER para obligar a que los nombres de columna estnen maysculas.

    DB2_ATTR_CURSOREsta opcin establece el tipo de cursor que ibm_db2 devuelve para losconjuntos de resultados. Por omisin, ibm_db2 devuelve un cursor deslo avance (DB2_FORWARD_ONLY) que devuelve la fila siguiente delconjunto 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 parmetro en DB2_SCROLLABLE para solicitarun cursor desplazable de forma que las funciones de captacin deibm_db2 acepten un segundo argumento especificando la posicinabsoluta de la fila a la que desea acceder en el conjunto de resultados.

    Si la llamada a la funcin tiene xito, devuelve un recurso de descriptor decontexto de sentencia que puede utilizar en posteriores llamadas a funcinrelacionadas con esta consulta.Si la llamada de funcin falla (devuelve False), puede utilizar la funcindb2_stmt_error o db2_stmt_errormsg para recuperar informacin dediagnstico sobre el error.

    2. Opcional: Por cada marcador de parmetro en la serie de SQL, llame a lafuncin db2_bind_param proporcionando los argumentos siguientes. Vincularvalores de entrada a marcadores de parmetros garantiza que cada valor deentrada se trate como un nico parmetro, evitando ataques de inyeccin deSQL contra la aplicacin.

    sentenciaUna sentencia preparada que devuelve la llamada a la funcindb2_prepare.

    nmero_parmetroUn entero que representa la posicin del marcador de parmetro en lasentencia de SQL.

    nombre-variableUna serie que especifica el nombre de la variable PHP que se vincular alparmetro especificado en nmero_parmetro.

    3. Llame a la funcin db2_execute pasando los argumentos siguientes:sentencia

    Una sentencia preparada que devuelve la funcin db2_prepare.

    parmetrosOpcional: Una matriz que contiene los valores que se deben utilizar enlugar de los marcadores de parmetro, en orden.

    Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploPreparar 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 explcitamente los parmetros

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

  • db2_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 parmetros vinculados dinmicamentedb2_execute($stmt, array($_POST['lower'], $_POST['upper']));

    Qu hacer a continuacin

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

    Insercin 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.

    Antes de empezar

    Obtener un recurso de conexin invocando una de las funciones de conexin en laAPI ibm_db2.

    Procedimiento

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

    marcador de parmetro que represente la columna del objeto grande.2. Establezca el valor de una variable de PHP en la va de acceso y el nombre del

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

    3. Llame a la funcin db2_bind_param para vincular el marcador de parmetro ala variable. El tercer argumento de esta funcin es una serie que representa elnombre de la variable de PHP que conserva el nombre y la va de acceso delarchivo. El cuarto argumento es DB2_PARAM_FILE, que indica a la extensinibm_db2 que recupere los datos de un archivo.

    4. Llame a la funcin db2_execute para emitir la sentencia INSERT.

    EjemploInsertar 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 consultasCaptacin de columnas o columnas de conjuntos de resultadosen PHP (ibm_db2)Despus de ejecutar una sentencia que devuelve uno o ms conjuntos deresultados, utilice una de las funciones disponibles en la API ibm_db2 para iterarpor las filas devueltas de cada conjunto de resultados. Si el conjunto de resultados

    Captulo 2. Introduccin 25

  • incluye columnas que contienen datos extremadamente grandes, puede recuperarlos datos de columna en columna para evitar que se utilice demasiada memoria.

    Antes de empezar

    Debe tener un recurso de sentencia que haya devuelto la funcin 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 captacin.

    Tabla 4. Funciones de captacin de ibm_db2Funcin Descripcin

    db2_fetch_array Devuelve una matriz, indexada por posicinde columna, que representa una fila en unconjunto de resultados. Las columnas estnindexadas 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 posicin, 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 funcin 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 siguientes:

    sentenciaUn recurso de sentencia vlido.

    nmero_filaEl nmero de la fila que desea recuperar del conjunto de resultados. Lanumeracin de las filas empieza por 1. Especifique un valor para esteparmetro opcional si ha solicitado un cursor desplazable al llamar a lafuncin db2_exec o db2_prepare. Con el cursor de slo avance por omisin,cada llamada a un mtodo de captacin devuelve la fila siguiente delconjunto de resultados.

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

    3. Contine captando filas hasta que la funcin de captacin devuelva False, loque indicar que habr llegado al final del conjunto de resultados.

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

  • Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploEjemplo 1: Captacin de filas de un conjunto de resultados llamando a la funcindb2_fetch_object

    Ejemplo 2: Captacin de filas de un conjunto de resultados llamando a la funcindb2_fetch_row

    Ejemplo 3: Captacin de filas de un conjunto de resultados llamando a la funcindb2_fetch_both

    Qu hacer a continuacin

    Captulo 2. Introduccin 27

  • Cuando est listo para cerrar la conexin con la base de datos, llame a la funcindb2_close. Si intenta cerrar una conexin persistente creada con db2_pconnect, lapeticin de cierre devuelve TRUE, y la conexin del cliente de servidor de datos deIBM permanecer disponible para el siguiente interlocutor.

    Captacin 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 captacin de objetos grandes directamente en un archivo de suservidor PHP.

    Antes de empezar

    Obtener un recurso de conexin invocando una de las funciones de conexin 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 funcin fopen.2. Cree una sentencia SELECT llamando a la funcin db2_prepare.3. Vincule la columna de salida del objeto grande a la variable de PHP que

    representa a la secuencia llamando a la funcin db2_bind_param. El tercerargumento de esta funcin es una serie que representa el nombre de la variablede PHP que conserva el nombre y la va de acceso del archivo. El cuartoargumento es DB2_PARAM_FILE, que indica a la extensin ibm_db2 que grabelos datos en un archivo.

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

    captacin de ibm_db2 (por ejemplo, db2_fetch_object).Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploCaptar 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);

    Invocacin de procedimientos almacenados en PHP (ibm_db2)Para llamar a un procedimiento almacenado desde una aplicacin PHP, prepare yejecute una sentencia SQL CALL. El procedimiento que invoca puede incluirparmetros de entrada (IN), parmetro de salida (OUT) y parmetros de entrada ysalida.

    Antes de empezar

    Obtener un recurso de conexin invocando una de las funciones de conexin en laAPI ibm_db2.

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

  • Procedimiento

    Para llamar a un procedimiento almacenado:1. Llame a la funcin db2_prepare pasando los argumentos siguientes:

    conexinUn recurso de conexin de base de datos vlido que devuelve db2_connecto db2_pconnect.

    sentenciaUna serie que contiene la sentencia de SQL CALL, incluidos los marcadoresde parmetro (?), para los parmetros de entrada o salida

    opcionesOpcional: Una matriz asociativa que especifica el tipo de cursor que debedevolverse para conjuntos de resultados. Puede utilizar este parmetro parasolicitar un cursor desplazable en los servidores de base de datos queadmitan este tipo de cursor. Por omisin, se devuelve un cursor de sloavance.

    2. Por cada marcador de parmetro en la sentencia CALL, llame a la funcindb2_bind_param proporcionando los argumentos siguientes:

    sentenciaLa sentencia preparada que devuelve la llamada a la funcin db2_prepare.

    nmero_parmetroUn entero que representa la posicin del marcador de parmetro en lasentencia de SQL.

    nombre-variableEl nombre de la variable PHP que se vincular al parmetro especificado ennmero_parmetro.

    tipo_parmetroUna constante que especifica si se vincular la variable PHP al parmetrode SQL como un parmetro de entrada (DB2_PARAM_INPUT), unparmetro de salida (DB2_PARAM_OUTPUT) o un parmetro que aceptauna entrada y devuelve una salida (DB2_PARAM_INPUT_OUTPUT).

    Este paso vincula cada marcador de parmetro al nombre de una variable PHPque contendr la salida.

    3. Llame a la funcin db2_execute, pasando la sentencia preparada como unargumento.Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploPrepare y ejecute una sentencia 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";

    Captulo 2. Introduccin 29

  • db2_execute($stmt);

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

    Qu hacer a continuacin

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

    Recuperacin de varios conjuntos de resultados de unprocedimiento almacenado en PHP (ibm_db2)Cuando una nica llamada a un procedimiento almacenado devuelve ms de unconjunto de resultados, puede utilizar la funcin 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 funcin 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 siguientes funciones de captacin 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 5. Funciones de captacin de ibm_db2Funcin Descripcin

    db2_fetch_array Devuelve una matriz, indexada por posicinde columna, que representa una fila en unconjunto de resultados. Las columnas estnindexadas 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 posicin, 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 funcin 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.

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

  • 2. Recupere los conjuntos de resultados siguientes proporcionando el recurso desentencia original como primer argumento a la funcin db2_next_result. Puedecaptar filas del recurso de sentencia hasta que no haya disponibles ms filas enel conjunto de resultados.La funcin db2_next_result devuelve False cuando no hay ms conjuntos deresultados disponibles o el procedimiento no ha devuelto ningn conjunto deresultados.Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploRecuperar 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 continuacin

    Cuando est listo para cerrar la conexin con la base de datos, llame a la funcindb2_close. Si intenta cerrar una conexin persistente creada con db2_pconnect, lapeticin de cierre devuelve TRUE, y la conexin persistente del cliente de servidorde datos de IBM permanecer disponible para el siguiente interlocutor.

    Modalidades de confirmacin en aplicaciones PHP (ibm_db2)Puede controlar cmo se confirman los grupos de sentencias de SQL especificandouna modalidad de confirmacin para un recurso de conexin. La extensinibm_db2 admite dos modalidades de confirmacin: la confirmacin automtica y laconfirmacin manual.

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

    Modalidad de confirmacin automticaEn modalidad de confirmacin automtica, cada sentencia de SQL es unatransaccin completa, que se confirma automticamente. La modalidadAutocommit le ayuda a evitar problemas de escalas de bloqueo que

    Captulo 2. Introduccin 31

  • puedan obstaculizar el rendimiento de aplicaciones Web muy escalables.Por omisin, la extensin ibm_db2 abre cada conexin en modalidadAutocommit.

    Puede activar la modalidad de confirmacin automtica tras inhabilitarlallamando a db2_autocommit($con, DB2_AUTOCOMMIT_ON), donde con es unrecurso de conexin vlido.

    Llamar a la funcin db2_autocommit puede afectar al rendimiento de susscripts de PHP, porque requiere comunicacin adicional entre PHP y elsistema de gestin de bases de datos.

    Modalidad de confirmacin manualEn modalidad de confirmacin manual, la transaccin finaliza al llamar ala funcin db2_commit o db2_rollback. Esto significa que todas lassentencias ejecutadas en la misma conexin entre el inicio de unatransaccin y la llamada a la funcin de confirmacin o retrotraccin setratan como una nica transaccin.

    La modalidad de confirmacin manual es til si se necesita retrotraer unatransaccin que contiene una o varias sentencias de SQL. Si emitesentencias de SQL en una transaccin y el script finaliza sin confirmar oretrotraer explcitamente la transaccin, la extensin ibm_db2 retrotraeautomticamente cualquier trabajo realizado en la transaccin.

    Puede inhabilitar la modalidad de confirmacin automtica al crear unaconexin de base de datos utilizando la configuracin AUTOCOMMIT=> DB2_AUTOCOMMIT_OFF en la matriz de opciones db2_connect.Tambin puede desactivar la modalidad de confirmacin automtica paraun recurso de conexin existente llamando a db2_autocommit($con,DB2_AUTOCOMMIT_OFF), donde con es un recurso de conexin vlido.

    Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploFinalizar la transaccin cuando se llama a db2_commit o db2_rollback.$conn = db2_connect('SAMPLE', 'db2inst1', 'ibmdb2', array(

    'AUTOCOMMIT' => DB2_AUTOCOMMIT_ON));

    // Emitir una o ms sentencias SQL en la transaccin$result = db2_exec($conn, 'DELETE FROM TABLE employee');if ($result === FALSE) {

    print 'No se ha podido completar la transaccin';db2_rollback($conn);

    }else {

    print 'Successfully completed transaction!';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 contrasea pueden serincorrectos, puede haberse escrito mal un nombre de tabla o columna o lasentencia de SQL puede no ser vlida. La API ibm_db2 proporciona funciones demanejo de errores para ayudarle a recuperarse sin problemas de estas situaciones.

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

  • Errores de conexin

    Utilice una de las funciones siguientes para recuperar informacin de diagnsticosi falla un intento de conexin.

    Tabla 6. Funciones de ibm_db2 para manejar errores de conexinFuncin Descripcin

    db2_conn_error Recupera el SQLSTATE devuelto por elltimo intento de conexin.

    db2_conn_errormsg Recupera un mensaje de error descriptivoadecuado a la anotacin cronolgica deerrores de la aplicacin

    Errores de SQL

    Utilice una de las funciones siguientes para recuperar la informacin dediagnstico si falla un intento de preparar o ejecutar una sentencia de SQL, o decaptar un resultado de un conjunto de resultados.

    Tabla 7. Funciones de ibm_db2 para manejar errores de SQLFuncin Descripcin

    db2_stmt_error Recupera el SQLSTATE devuelto por elltimo 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 anotacin cronolgica deerrores de la aplicacin

    Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    Consejo: Para evitar las vulneraciones de la seguridad que podran derivar de lavisualizacin directa del SQLSTATE en bruto devuelto por la base de datos yofrecer una mejor experiencia general del usuario en la aplicacin Web, utilice unaestructura de conmutacin para recuperar de los estados de errores conocidos odevolver mensajes de errores personalizados. Por ejemplo:switch($this->state):

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

    EjemploEjemplo 1: Manejo de errores de conexin$connection = db2_connect($database, $user, $password);if (!$connection) {

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

    }

    Ejemplo 2: Manejo de errores de SQL

    Captulo 2. Introduccin 33

  • $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 ejecucin de sentenciaspreparadas$success = db2_execute($stmt, array('Dan');if (!$success) {

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

    }

    Funciones de recuperacin 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 Database para Linux, UNIX y Windows, IBMCloudscape y, a travs de DB2 Connect, DB2 para z/OS y DB2 para i.

    Algunas clases de aplicaciones como, por ejemplo, las interfaces de administracin,deben reflejar de forma dinmica 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 decatlogos del sistema; sin embargo, el esquema de las tablas de catlogos delsistema podra variar entre versiones de DB2 o el esquema de las tablas decatlogos del sistema en DB2 Database para Linux, UNIX y Windows puede diferirdel esquema de las tablas de catlogos del sistema en DB2 para z/OS. En lugar deconservar estas diferencias en el cdigo de su aplicacin, lo que conlleva unesfuerzo considerable, puede utilizar las funciones de PHP disponibles en laextensin 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 conexin que haya devuelto la funcin 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 8. Funciones de recuperacin de metadatos de ibm_db2Funcin Descripcin

    db2_client_info Devuelve un objeto de slo lectura coninformacin 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 forneas para una tabla

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

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

  • Tabla 8. Funciones de recuperacin de metadatos de ibm_db2 (continuacin)Funcin Descripcin

    db2_procedure_columns Devuelve un conjunto de resultados queenumera los parmetros para uno o variosprocedimientos almacenados

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

    db2_server_info Devuelve un objeto de slo lectura coninformacin sobre la configuracin y elsoftware del sistema de gestin 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 estadsticas parauna tabla

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

    La mayora de las funciones de recuperacin de metadatos de base de datos queofrece ibm_db2 devuelven conjuntos de resultados con columnas definidas paracada funcin. 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 slo lectura. Las propiedades de estos objetos puedenutilizarse para crear una aplicacin que tenga un comportamiento distinto enfuncin del sistema de gestin de bases de datos al que se conecte. Por ejemplo, enlugar de codificar un lmite del denominador comn inferior para todos lossistemas de gestin de bases de datos posibles, una aplicacin de administracinde bases de datos basada en Web creada en la extensin ibm_db2 podra utilizar lapropiedad db2_server_info()->MAX_COL_NAME_LEN para visualizar de formadinmica los campos de texto para denominar las columnas con longitudesmximas que se correspondan con la longitud mxima de los nombres de columnaen el sistema de gestin de bases de datos al que est conectado.

    Para obtener ms informacin sobre la API ibm_db2, consultehttp://www.php.net/docs.php.

    EjemploEjemplo 1: Visualizar una lista de las columnas y los privilegios asociados para unatabla

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

    }?>

    Ejemplo 2: Visualizar una lista de las claves primarias para una tabla

    Ejemplo 3: Visualizar una lista de parmetros para uno o varios procedimientosalmacenados

    Ejemplo 4: Visualizar una lista de los ndices y las estadsticas para una tabla

  • db2_close($conn);}else {echo 'no connection: ' . db2_conn_errormsg();

    }?>

    Ejemplo 5: Visualizar una lista de tablas y los privilegios asociados de la base dedatos

    Desarrollo de aplicaciones en PHP (PDO)La extensin PDO_IBM proporciona una serie de tiles funciones de PHP paraacceder a los datos y manipularlos a travs de una interfaz de base de datosorientada a objetos estndar incorporada en PHP 5.1. La extensin incluyefunciones para conectarse a una base de datos, ejecutar y preparar sentencias deSQL, recuperar filas de conjuntos de resultados, gestionar transacciones, llamar aprocedimientos almacenados, gestionar errores y recuperar metadatos.

    Conexin 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 deobjetos de datos PHP (PDO) para PHP para conectar con una base de datos deIBM Data Server mediante una conexin catalogada o una conexin TCP/IPdirecta. Para mejorar el rendimiento, tambin puede crear una conexinpersistente.

    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 conexin a una base de datos de IBMData Server. Esta conexin contina 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:

    Captulo 2. Introduccin 37

  • 1. Cree una conexin a la base de datos llamando al constructor de PDO dentrode un bloque try{}. Pase un valor DSN que especifique ibm: para la extensinPDO_IBM, seguido de un nombre de base de datos catalogada o de toda unaserie de conexin de base de datos para una conexin TCP/IP directa.v (Windows): Por omisin, la extensin PDO_IBM utiliza el agrupamiento deconexiones para minimizar los recursos de conexin y mejorar el rendimientode las conexiones.

    v (Linux y UNIX): Para crear una conexin 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 conexin PDOen el cuarto argumento al constructor de PDO:v Por omisin, PDO establece un mensaje de error que se puede recuperarmediante PDO::errorInfo() y un SQLCODE que se puede recuperarmediante PDO::errorCode() cuando se produce cualquier error; para solicitaresta modalidad de forma explcita, establezca PDO::ATTR_ERRMODE =>PDO::ERRMODE_SILENT

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

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

    3. Detecte cualquier excepcin emitida por el bloque try{} en un bloque catch {}correspondiente.Para obtener ms informacin sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

    EjemploConexin a una base de datos de IBM Data Server en una conexin 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 continuacin

    A continuacin, prepare y ejecute las sentencias de SQL.

    Ejecucin de sentencias de SQL en PHP (PDO)Despus de conectarse a una base de datos, utilice los mtodos disponibles en laAPI de PDO para preparar y ejecutar sentencias de SQL. Las sentencias de SQLpueden contener texto esttico o marcadores de parmetros que representan laentrada de variables.

    Ejecucin de una nica sentencia de SQL en PHP (PDO)Para preparar y ejecutar una nica sentencia de SQL que no acepta parmetros deentrada, utilice el mtodo PDO::exec o PDO::query. Emplee el mtodo PDO::exec

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

  • para ejecutar una sentencia que no devuelve conjuntos de resultados. Utilice elmtodo PDO::query para ejecutar una sentencia que devuelve uno o variosconjuntos de resultados.

    Importante: Para evitar amenazas a la seguridad por ataques de inyeccin de SQL,utilice el mtodo PDO::exec o PDO::query slo para ejecutar sentencias de SQLcompuestas de series estticas. La interpolacin de variables de PHP querepresentan la entrada del usuario en la sentencia de SQL puede exponer laaplicacin a ataques de inyeccin de SQL.

    Antes de empezar

    Obtener un objeto de conexin mediante una llamada al constructor de PDO.

    Procedimiento

    Para preparar y ejecutar una nica sentencia de SQL que no acepta parmetros deentrada, llame a uno de los mtodos siguientes:v Para ejecutar una sentencia de SQL que no devuelve conjuntos de resultados,llame al mtodo PDO::exec en el objeto de conexin PDO, proporcionando unaserie que contenga la sentencia de SQL. Por ejemplo, un uso tpico de PDO::execes establecer el esquema por omisin para la aplicacin en un archivo deinclusin comn o clase base.Si la sentencia de SQL se completa con xito (inserta, modifica o suprime filassatisfactoriamente), el mtodo PDO::execdevuelve un valor entero que representael nmero de filas que se han insertado, modificado o suprimido.Para determinar si el mtodo 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 mtodo PDO::query en el objeto de conexin PDO,proporcionando una serie que contenga la sentencia de SQL. Por ejemplo, esposible que desee llamar a este mtodo para ejecutar una sentencia SELECTesttica.Si la llamada de mtodo se realiza con xito, devuelve un recurso PDOStatementque puede utilizar en llamadas de mtodo posteriores.

    Si la llamada de mtodo falla (devuelve FALSE), puede utilizar el mtodoPDO::errorCode y PDO::errorInfo para recuperar informacin de diagnstico sobreel error.Para obtener ms informacin sobre la API de PDO, consulte http://php.net/manual/en/book.pdo.php.

    EjemploEjemplo 1: Llamar al mtodo PDO::exec para determinar el esquema por omisin desu aplicacin$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 mtodo 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) {

    Captulo 2. Introduccin 39

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

    print "Name: {$row[0] $row[1]}";}

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

    Preparacin y ejecucin de sentencias de SQL en PHP (PDO)Para preparar y ejecutar una sentencia de SQL que incluya la entrada de variables,utilice los mtodos 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 recuperacinde datos que puede reutilizar si se vuelve a ejecutar la sentencia.

    Antes de empezar

    Obtener un objeto de conexin mediante una llamada al constructor de PDO.

    Procedimiento

    Para preparar y ejecutar una sentencia de SQL que incluye marcadores deparmetro:1. Llame al mtodo PDO::prepare, pasando los argumentos siguientes:

    sentenciaUna serie que contiene la sentencia de SQL, incluidos los signos deinterrogacin (?), o variables con nombre (:name), como marcadores deparmetro para cualquier valor de columna o predicado que requieraentrada de variables. Slo puede utilizar marcadores de parmetro 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 parmetro en lugar de nombres de columna, nombres detabla u otros identificadores de SQL. No puede utilizar marcadores deparmetro con signo de interrogacin (?) y marcadores de parmetro connombre (:name) en la misma sentencia de SQL.

    opciones_controladorOpcional: Una matriz que contiene opciones de sentencias:

    PDO::ATTR_CURSOREsta opcin establece el tipo de cursor que PDO devuelve para losconjuntos de resultados. Por omisin, PDO devuelve un cursor de sloavance (PDO::CURSOR_FWDONLY), que devuelve la fila siguiente deun conjunto de resultados para cada llamada a PDOStatement::fetch().Puede establecer este parmetro en PDO::CURSOR_SCROLL parasolicitar un cursor desplazable.

    Si la llamada de funcin tiene xito, devuelve un objeto PDOStatement quepuede utilizar en llamadas de mtodo posteriores relacionadas con estaconsulta.Si la llamada de funcin falla (devuelve False), puede utilizar el mtodoPDO::errorCode o PDO::errorInfo para recuperar informacin de diagnsticosobre el error.

    2. Opcional: Por cada marcador de parmetro de la serie de SQL, llame al mtodoPDOStatement::bindParam, proporcionando los argumentos siguientes. Vincular

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

  • valores de entrada a marcadores de parmetros garantiza que cada valor deentrada se trate como un nico parmetro, evitando ataques de inyeccin deSQL contra la aplicacin.

    parmetroUn identificador de parmetro. Para los marcadores de parmetro con signode interrogacin (?)se trata de un entero que representa la posicinindexada 1 del parmetro en la sentencia de SQL. Para marcadores deparmetro con nombre (:name), se trata de una serie que representa elnombre de parmetro.

    variableValor que se debe utilizar en lugar del marcador de parmetro

    3. Llame al mtodo PDOStatement::execute, opcionalmente pasando una matrizque contiene los valores que se deben utilizar en lugar de los marcadores deparmetro, bien en orden para marcadores de parmetro de signo deinterrogacin, bien como una matriz asociativa :name => value paramarcadores de parmetro con nombre.Para obtener ms informacin sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

    EjemploPreparar 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 explcitamente los parmetros$stmt->bindParam(1, $_POST['lower']);$stmt->bindParam(2, $_POST['upper']);

    $stmt->execute($stmt);

    // Invocar de nuevo la sentencia utilizando parmetros vinculados dinmicamente$stmt->execute($stmt, array($_POST['lower'], $_POST['upper']));

    Qu hacer a continuacin

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

    Insercin 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 conexin mediante una llamada al constructor de PDO.

    Procedimiento

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

    Captulo 2. Introduccin 41

  • 1. Llame al mtodo PDO::prepare para crear un objeto PDOStatement a partir deuna sentencia INSERT con un marcador de parmetro que represente lacolumna del objeto grande.

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

    3. Llame al mtodo PDOStatement::bindParam y pase los argumentos siguientespara vincular el marcador de parmetro a la variable de PHP que represente lasecuencia de datos para el objeto grande:

    parmetroUn identificador de parmetro. Para los marcadores de parmetro con signode interrogacin (?)se trata de un entero que representa la posicinindexada 1 del parmetro en la sentencia de SQL. Para marcadores deparmetro con nombre (:name), se trata de una serie que representa elnombre de parmetro.

    variableValor que se debe utilizar en lugar del marcador de parmetro

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

    4. Llame al mtodo PDOStatement::execute para emitir la sentencia INSERT.

    EjemploInsertar 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 consultasCaptacin de filas o columnas de conjuntos de resultados enPHP (PDO)Despus de ejecutar una sentencia que devuelve uno o ms conjuntos deresultados, utilice uno de los mtodos disponibles en la API de PDO para iterarpor las filas devueltas. La API de PDO ofrece tambin mtodos que le permitirncaptar 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 mtodo PDO::query oPDOStatement::execute que tenga asociados uno o varios conjuntos de resultados.

    Acerca de esta tarea

    Para captar datos de un conjunto de resultados:

    Procedimiento

    1. Capte los datos de un conjunto de resultados llamando a uno de los mtodosde captacin siguientes:v Para devolver una nica fila de un conjunto de resultados como una matrizu objeto, llame al mtodo PDOStatement::fetch.

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

  • v Para devolver todas las filas del conjunto de resultados como una matriz dematrices u objetos, llame al mtodo PDOStatement::fetchAll.

    Por omisin, PDO devuelve cada fila como una matriz indexada por el nombrede columna y la posicin de columna indexada 0 en la fila. Para solicitar unestilo de devolucin diferente, especifique una de las constantes siguientescomo primer parmetro al llamar al mtodo 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 omisin)Devuelve una matriz indexada tanto por nombre de columna como pornmero 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 elmtodo 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 nmero de columna tal y como seha devuelto en el conjunto de resultados, empezando en la columna 0.

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

    Si solicit un cursor desplazable al llamar al mtodo PDO::query oPDOStatement::execute, proporcione los parmetros opcionales siguientes quecontrolan qu filas se devuelven al emisor de la llamada:v Una de las constantes siguientes que representa la orientacin de captacinde la peticin de captacin:

    PDO::FETCH_ORI_NEXT (valor por omisin)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.

    Captulo 2. Introduccin 43

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

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

    v Entero que solicita la fila absoluta o relativa del conjunto de resultados,correspondiente a la orientacin de captacin solicitada en el segundoargumento al mtodo PDOStatement::fetch.

    2. Opcional: Capte una nica columna de una o varias filas de un conjunto deresultados llamando a uno de los mtodos siguientes:v Para devolver una sola columna desde una sola fila del conjunto deresultados:Llame al mtodo PDOStatement::fetchColumn especificando la columna quedesee recuperar como el primer argumento del mtodo. Los nmeros 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 mtodo PDOStatement::fetchAll pasando la constantePDO::FETCH_COLUMN como el primer argumento y la columna que desearecuperar como el segundo argumento. Los nmeros 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 ms informacin sobre la API de PDO, consultehttp://php.net/manual/en/book.pdo.php.

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

    print "Name: {$row[0] $row[1]}";}

    Qu hacer a continuacin

    Cuando est listo para cerrar la conexin a la base de datos, establezca el objetoPDO en NULL. La conexin se cierra automticamente cuando finaliza el script dePHP.

    Captacin 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