Vous êtes sur la page 1sur 425

DB2

DB2 Versin 9
para Linux, UNIX y Windows

Desarrollo de aplicaciones Java

SC11-3189-00

DB2

DB2 Versin 9
para Linux, UNIX y Windows

Desarrollo de aplicaciones Java

SC11-3189-00

Antes de utilizar esta informacin y el producto al que da soporte, asegrese de leer la informacin general incluida en el apartado Avisos.

Informacin sobre la edicin Esta publicacin es la traduccin del original ingls DB2 Version 9 for Linux, UNIX, and Windows Developing Java Applications, (SC10-4233-00). Este documento contiene informacin sobre productos patentados de IBM. Se proporciona segn un acuerdo de licencia y est protegido por la ley de la propiedad intelectual. La presente publicacin no incluye garantas del producto y las declaraciones que contiene no deben interpretarse como tales. Puede realizar pedidos de publicaciones en lnea o a travs del representante de IBM de su localidad. v Para realizar pedidos de publicaciones en lnea, vaya a IBM Publications Center en www.ibm.com/shop/ publications/order v Para encontrar el representante de IBM correspondiente a su localidad, vaya a IBM Directory of Worldwide Contacts en www.ibm.com/planetwide Para realizar pedidos de publicaciones en marketing y ventas de DB2 de los EE.UU. o de Canad, llame al nmero 1-800-IBM-4YOU (426-4968). Cuando enva informacin a IBM, otorga a IBM un derecho no exclusivo para utilizar o distribuir dicha informacin en la forma en que IBM considere adecuada, sin contraer por ello ninguna obligacin con el remitente. Copyright International Business Machines Corporation 2006. Reservados todos los derechos.

Contenido
Captulo 1. Introduccin . . . . . . . . 1
Introduccin al desarrollo de aplicaciones Java para DB2 . . . . . . . . . . . . . . . . . 1 Controladores soportados por JDBC y SQLJ . . . . 1 Software de desarrollo de aplicaciones Java soportado . . . . . . . . . . . . . . . 3 Configuracin del entorno de desarrollo de JDBC y SQLJ de DB2 . . . . . . . . . . . . . . 4 Instalacin del controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . . 4 Programa de utilidad DB2Binder . . . . . . 9 Programa de utilidad DB2LobTableCreator . . . 10 Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . 11 Configuracin especial para acceder a servidores DB2 para z/OS desde programas Java . . . . 16 DB2T4XAIndoubtUtil para transacciones distribuidas con DB2 UDB para los servidores OS/390 y z/OS Versin 7 . . . . . . . . . 17 Instalacin especial para ejecutar rutinas Java en el entorno HP-UX . . . . . . . . . . . 20 Llamada a procedimientos almacenados en aplicaciones JDBC . . . . . . . . . . . Trabajo con LOB en aplicaciones JDBC . . . . Uso de valores ROWID en JDBC con el controlador IBM DB2 para JDBC y SQLJ . . . . Tipos diferenciados en aplicaciones JDBC . . . Puntos de salvaguarda en aplicaciones JDBC . . Recuperacin de valores de columnas de identidad en aplicaciones JDBC . . . . . . . Suministro de informacin ampliada sobre el cliente al servidor DB2 con el Controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . Trabajo con datos XML en aplicaciones JDBC . . . Datos XML en aplicaciones JDBC . . . . . . Actualizacin de columnas XML en aplicaciones JDBC . . . . . . . . . . . . . . . Recuperacin de datos XML en aplicaciones JDBC . . . . . . . . . . . . . . . Invocacin de rutinas con parmetros XML en aplicaciones Java . . . . . . . . . . . Soporte de Java para el registro y la eliminacin de esquemas XML . . . . . . . . . . . Control de transacciones en aplicaciones JDBC . . Establecimiento del nivel de aislamiento para una transaccin de JDBC . . . . . . . . . . Confirmacin o retrotraccin de transacciones JDBC . . . . . . . . . . . . . . . Manejo de errores y avisos en aplicaciones JDBC . . Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ . . . . Manejo de un aviso de SQL en el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . Recuperacin de informacin de una excepcin BatchUpdateException . . . . . . . . . . Manejo de una excepcin de SQL cuando se utiliza el controlador JDBC de DB2 de tipo 2 . . Manejo de un aviso de SQL con el controlador JDBC de DB2 de tipo 2 . . . . . . . . . Controlador IBM DB2 para soporte de redireccionamiento de cliente de JDBC y SQLJ . . . Desconexin de servidores de bases de datos en aplicaciones JDBC . . . . . . . . . . . . 58 63 67 68 69 70

73 75 75 76 77 80 81 83 83 83 84 84 88 90 91 92 93 96

Captulo 2. Programacin de aplicaciones JDBC . . . . . . . . . 23


Pasos bsicos para escribir una aplicacin JDBC . . Conexin con servidores de bases de datos en aplicaciones JDBC . . . . . . . . . . . . Conexin de las aplicaciones JDBC a una fuente de datos . . . . . . . . . . . . . . Conexin de aplicaciones DB2 a una fuente de datos utilizando la interfaz DriverManager con el controlador JDBC de DB2 de tipo 2 . . . . . Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . Conexin a una fuente de datos utilizando la interfaz DataSource . . . . . . . . . . . Determinacin del tipo de conectividad del Controlador IBM DB2 para JDBC y SQLJ que debe utilizarse . . . . . . . . . . . . Objetos de conexin JDBC . . . . . . . . Creacin y despliegue de objetos DataSource . . Paquetes Java para el soporte JDBC . . . . . . Obtencin de informacin acerca de una fuente de datos mediante mtodos DatabaseMetaData . . . Variables en aplicaciones JDBC . . . . . . . . Ejecucin de sentencias de SQL en aplicaciones JDBC . . . . . . . . . . . . . . . . Interfaces JDBC para ejecutar SQL . . . . . . Actualizacin de tablas de DB2 en aplicaciones JDBC . . . . . . . . . . . . . . . Recuperacin de datos de tablas de DB2 en aplicaciones JDBC . . . . . . . . . . . 23 26 26

28

30 33

35 36 37 38 39 41 42 42 43 48

Captulo 3. Programacin de aplicaciones SQLJ. . . . . . . . . . 97


Pasos bsicos para grabar una aplicacin SQLJ . Conexin a una fuente de datos utilizando SQLJ Paquetes Java para el soporte SQLJ . . . . . Variables en aplicaciones SQLJ . . . . . . Comentarios en una aplicacin SQLJ . . . . Ejecucin de sentencias de SQL en aplicaciones SQLJ . . . . . . . . . . . . . . . Sentencias de SQL en una aplicacin SQLJ . Actualizacin de tablas de DB2 en aplicaciones SQLJ . . . . . . . . . . . . . . . 97 100 . 106 . 106 . 108 . 108 . 109 . 110

Copyright IBM Corp. 2006

iii

Recuperacin de datos de tablas de DB2 en aplicaciones SQLJ . . . . . . . . . . . Llamada a procedimientos almacenados en aplicaciones SQLJ . . . . . . . . . . . Trabajo con LOB en aplicaciones SQLJ . . . . Uso de SQLJ y JDBC en la misma aplicacin Control de la ejecucin de sentencias de SQL en SQLJ . . . . . . . . . . . . . . . Uso de valores ROWID en SQLJ con el controlador IBM DB2 para JDBC y SQLJ . . . Tipos diferenciados en aplicaciones SQLJ . . . Puntos de salvaguarda en aplicaciones SQLJ . . Trabajo con datos XML en aplicaciones SQLJ . . . Datos XML en aplicaciones SQLJ . . . . . . Actualizaciones de columnas XML en aplicaciones SQLJ . . . . . . . . . . . Recuperacin de datos XML en aplicaciones SQLJ . . . . . . . . . . . . . . . Control de transacciones en aplicaciones SQLJ . . Establecimiento del nivel de aislamiento para una transaccin SQLJ . . . . . . . . . . Confirmacin o retrotraccin de transacciones SQLJ . . . . . . . . . . . . . . . Manejo de errores y avisos en aplicaciones SQLJ Manejo de errores de SQL en una aplicacin SQLJ . . . . . . . . . . . . . . . Manejo de avisos de SQL en una aplicacin SQLJ . . . . . . . . . . . . . . . Cierre de una conexin a una fuente de datos en una aplicacin SQLJ . . . . . . . . . . .

120 132 134 138 141 141 143 143 144 145 145 147 149 149 149 150 150 150 151

Creacin de applets SQLJ . . . . . . . Creacin de aplicaciones SQLJ . . . . . . Consideraciones sobre los applets Java . . . Opciones de aplicaciones y applets SQLJ para UNIX . . . . . . . . . . . . . . Opciones de aplicaciones y applets SQLJ para Windows . . . . . . . . . . . . . Creacin de rutinas SQLJ . . . . . . . Opciones de rutinas SQLJ para UNIX . . . Opciones de rutinas SQLJ para Windows . .

. . . . . . . .

. 173 . 174 . 175 . 176 . . . . 177 177 179 180

Captulo 6. Aplicaciones Java de ejemplo . . . . . . . . . . . . . . 181


Ejemplos Ejemplos Ejemplos Ejemplos de de de de JDBC . . . . SQLJ . . . . plugins de Java Java WebSphere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 187 191 192

Captulo 7. Diagnstico de problemas de JDBC y SQLJ . . . . . . . . . . 195


Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . . Diagnstico de problemas de JDBC y SQLJ en el controlador IBM DB2 para JDBC y SQLJ . . . Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC . Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ . . . Supervisin del sistema del controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador JDBC de DB2 de tipo 2 . . Recurso de rastreo de CLI/ODBC/JDBC . . . Archivos de rastreo de CLI y JDBC . . . . . 195 195 198 199 203 206 206 212

Captulo 4. Seguridad en JDBC y SQLJ . . . . . . . . . . . . . . . 153


Seguridad cuando se utiliza el controlador JDBC de DB2 de tipo 2 . . . . . . . . . . . . Seguridad en el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . . Seguridad basada en el ID de usuario y la contrasea bajo el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . Seguridad basada slo en el ID de usuario bajo el controlador IBM DB2 para JDBC y SQLJ . . . . Seguridad de contrasea cifrada o ID de usuario cifrado y seguridad de contrasea cifrada en el controlador IBM DB2 para JDBC y SQLJ . . . . Seguridad Kerberos en el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . Soporte de plugin de seguridad del Controlador IBM DB2 para JDBC y SQLJ . . . . . . . . Controlador IBM DB2 para soporte de contexto fiable de JDBC y SQLJ . . . . . . . . . . Seguridad para la preparacin de aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . . 153 154

Captulo 8. Java 2 Platform, Enterprise Edition . . . . . . . . . . . . . . 221


Visin general de Java 2 Platform Enterprise Edition . . . . . . . . . . . . . . . Java 2 Platform Enterprise Edition . . . . . . Contenedores de Java 2 Platform Enterprise Edition . . . . . . . . . . . . . . . Servidor Java 2 Platform Enterprise Edition . . . Requisitos de la base de datos de Java 2 Platform Enterprise Edition . . . . . . . . . . . . Java Naming and Directory Interface (JNDI) . . . Gestin de transacciones Java . . . . . . . . Ejemplo de una transaccin distribuida que utiliza mtodos de JTA . . . . . . . . . . . . Enterprise Java Beans. . . . . . . . . . . 221 222 222 223 223 223 224 225 230

156 158

158 160 163 165

167

Captulo 5. Creacin de aplicaciones de bases de datos Java . . . . . . . 169


Creacin de applets JDBC . . Creacin de aplicaciones JDBC Creacin de rutinas JDBC . . . . . . . . . . . . . . . . . . . . . 169 . 170 . 171

Captulo 9. Soporte de agrupaciones de conexiones JDBC y SQLJ . . . . 233

iv

Desarrollo de aplicaciones Java

Captulo 10. Soporte para el controlador IBM DB2 para JDBC y SQLJ para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex . . . . . . . . . . 235
Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex . . . . . . . . . . 235 Ejemplo de habilitacin del controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y equilibrado de carga de trabajo Sysplex . . . . 236 Tcnicas para supervisar el controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y el equilibrado de carga de trabajo Sysplex . . . . 238

Captulo 11. Informacin de consulta sobre JDBC y SQLJ . . . . . . . . 243


Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC . . . . . . . Propiedades del controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . . . . . . . Soporte para las API de JDBC . . . . . . . . Informacin de consulta sobre sentencias de SQLJ Clusula SQLJ . . . . . . . . . . . . Expresin de lenguaje principal de SQLJ . . . Clusula implements de SQLJ . . . . . . . Clusula with de SQLJ . . . . . . . . . Clusula connection-declaration SQLJ . . . . Clusula de declaracin de iterador de SQLJ Clusula ejecutable de SQLJ . . . . . . . Clusula context de SQLJ . . . . . . . . Clusula de sentencia de SQLJ . . . . . . Clusula SET TRANSACTION de SQLJ . . . Clusula de asignacin de SQLJ . . . . . . Clusula de conversin a iterador de SQLJ . . Consulta de sqlj.runtime . . . . . . . . . . Resumen de las interfaces y clases del paquete sqlj.runtime . . . . . . . . . . . . . sqlj.runtime.ConnectionContext interface . . . Interfaz sqlj.runtime.ForUpdate . . . . . . Interfaz sqlj.runtime.NamedIterator . . . . . Interfaz sqlj.runtime.PositionedIterator . . . . Interfaz sqlj.runtime.ResultSetIterator . . . . Interfaz sqlj.runtime.Scrollable . . . . . . . Clase sqlj.runtime.AsciiStream . . . . . . . Clase sqlj.runtime.BinaryStream . . . . . . Clase sqlj.runtime.CharacterStream . . . . . Clase sqlj.runtime.ExecutionContext . . . . . Clase sqlj.runtime.SQLNullException . . . . Clase sqlj.runtime.StreamWrapper . . . . . 243 249 264 284 284 284 285 286 287 288 290 291 291 293 294 295 295 295 297 301 302 302 303 306 308 309 309 311 319 319

Clase sqlj.runtime.UnicodeStream . . . . . Informacin de consulta sobre el Controlador IBM DB2 para JDBC y SQLJ . . . . . . . . . . Interfaces y clase slo de DB2 . . . . . . . Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 . . . . . . . . . . . . Diferencias de SQLJ entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores DB2 JDBC . . . . . . . . . . . . . Cdigos de error emitidos por el controlador IBM DB2 para JDBC y SQLJ . . . . . . . SQLSTATE emitidos por el controlador de IBM DB2 para JDBC y SQLJ . . . . . . . . . Cmo buscar en el controlador IBM DB2 informacin sobre el entorno y la versin de JDBC y SQLJ . . . . . . . . . . . . Mandatos para la preparacin de programas de SQLJ . . . . . . . . . . . . . . . . sqlj - Conversor SQLJ. . . . . . . . . . db2sqljcustomize - Personalizador de perfiles de SQLJ . . . . . . . . . . . . . . . db2sqljbind - Vinculador de perfiles SQLJ . . . db2sqljprint - Impresora de perfiles de SQLJ . .

320 321 321

358

366 368 369

370 371 371 375 385 392

Apndice A. Informacin tcnica sobre DB2 Database . . . . . . . . 393


Visin general de la informacin tcnica de DB2 Comentarios sobre la documentacin . . . . Biblioteca tcnica de DB2 en formato PDF . . . . Pedido de manuales de DB2 en copia impresa . . Visualizacin de la ayuda para estados de SQL desde el procesador de lnea de mandatos . . . . Acceso a diferentes versiones del Centro de informacin de DB2 . . . . . . . . . . . Visualizacin de temas en el idioma preferido en el Centro de informacin de DB2 . . . . . . . Actualizacin del Centro de informacin de DB2 instalado en el sistema o en un servidor de intranet Guas de aprendizaje de DB2 . . . . . . . . Informacin de resolucin de problemas de DB2 Trminos y condiciones . . . . . . . . . . 393 393 394 396 397 398 398 399 401 401 402

Apndice B. Avisos . . . . . . . . . 403


Marcas registradas. . . . . . . . . . . . 405

ndice . . . . . . . . . . . . . . . 407 Cmo ponerse en contacto con IBM 413

Contenido

vi

Desarrollo de aplicaciones Java

Captulo 1. Introduccin
Los temas siguientes introducen el soporte de aplicaciones Java para el sistema de bases de datos DB2 y explican cmo configurar el soporte de aplicaciones Java. v Introduccin al desarrollo de aplicaciones Java para DB2 v Controladores soportados por JDBC y SQLJ v Software de desarrollo de aplicaciones Java soportado en la pgina 3 v Configuracin del entorno de desarrollo de JDBC y SQLJ de DB2 en la pgina 4

Introduccin al desarrollo de aplicaciones Java para DB2


El sistema de bases de datos de DB2 proporciona soporte de controlador para aplicaciones cliente y applets que se graban en Java utilizando JDBC, as como para SQL incorporado para Java (SQLJ). JDBC es una interfaz de programacin de aplicaciones (API) que las aplicaciones de Java utilizan para acceder a las bases de datos relacionales. El soporte de DB2 para JDBC permite grabar aplicaciones de Java que acceden a los datos locales de DB2 o los datos relacionales remotos de un servidor que d soporte a DRDA. SQLJ proporciona soporte para SQL esttico incorporado en aplicaciones Java. IBM, Oracle y Tandem desarrollaron inicialmente SQLJ, para complementar al modelo JDBC de SQL dinmico con un modelo de SQL esttico. En general, las aplicaciones Java utilizan JDBC para el SQL dinmico y SQLJ para el SQL esttico. Sin embargo, debido a que SQLJ puede interaccionar con JDBC, un programa de aplicacin puede utilizar JDBC y SQLJ dentro de la misma unidad de trabajo. Conceptos relacionados: v Controladores soportados por JDBC y SQLJ en la pgina 1 v Software de desarrollo de aplicaciones Java soportado en la pgina 3

Controladores soportados por JDBC y SQLJ


De acuerdo con la especificacin JDBC, existen cuatro tipos de arquitecturas de controlador JDBC: Tipo 1 Son controladores que implementan la API de JDBC como una correlacin con otra API de acceso a datos, como por ejemplo Open Database Connectivity (ODBC). Los controladores de este tipo generalmente dependen de una biblioteca nativa, lo cual limita su portabilidad. El sistema de bases de datos DB2 no da soporte a un controlador de tipo 1. Tipo 2 Son controladores grabados parcialmente en el lenguaje de programacin Java y parcialmente en cdigo nativo. Estos controladores utilizan una biblioteca cliente nativa que es especfica de la fuente de datos a la que se conectan. Debido al cdigo nativo, la portabilidad de estos controladores es limitada.

Copyright IBM Corp. 2006

Tipo 3 Son controladores que utilizan un cliente Java puro y se comunican con un servidor utilizando un protocolo que es independiente de la base de datos. A su vez, el cliente transmite las peticiones del cliente a la fuente de datos. El sistema de bases de datos DB2 no da soporte a un controlador de tipo 3. Tipo 4 Estos controladores son Java puro e implementan el protocolo de red de una fuente de datos determinada. El cliente se conecta directamente con la fuente de datos. DB2 Versin 9.1 soporta un controlador que combina las implementaciones JDBC de los tipos 2 y 4. DB2 Versin 9.1 tambin soporta un controlador de tipo 2, aunque este soporte ha quedado obsoleto. El controlador de tipo 2 de DB2 Versin 9.1 sigue utilizando la interfaz CLI de DB2 para comunicarse con los servidores de bases de datos DB2. Los controladores que estn soportados en DB2 Versin 9.1 son: El controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2) ha quedado obsoleto: El controlador JDBC de DB2 de tipo 2 permite que las aplicaciones Java realicen llamadas a DB2 a travs de JDBC. Las llamadas al controlador JDBC de DB2 de tipo 2 se convierten a mtodos nativos Java. Las aplicaciones Java que utilizan este controlador se deben ejecutar en un cliente DB2, a travs del cual las peticiones JDBC circulan hacia el servidor DB2. DB2 Connect Versin 9.1 debe estar instalado antes de que se pueda utilizar el controlador de aplicaciones JDBC de DB2 para acceder a fuentes de datos de DB2 UDB para iSeries o fuentes de datos en DB2 para los entornos OS/390 o z/OS. El controlador JDBC de DB2 de tipo 2 soporta estas funciones de JDBC y SQLJ: v La mayora de los mtodos que se describen en la especificacin de JDBC 1.2 y algunos de los mtodos que se describen en la especificacin de JDBC 2.0. Consulte el tema Comparacin del soporte de controlador para las API de JDBC. v Sentencias de SQLJ que ejecutan funciones equivalentes para todos los mtodos JDBC v Agrupacin de conexiones v Transacciones distribuidas v Funciones definidas por el usuario y procedimientos almacenados de Java El controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows no recibir soporte en releases futuros del sistema de bases de datos DB2. Debe pues considerar la posibilidad de migrar hacia el Controlador IBM DB2 para JDBC y SQLJ. Controlador IBM DB2 para JDBC y SQLJ (tipo 2 y tipo 4): El Controlador IBM DB2 para JDBC y SQLJ es un controlador que incluye funciones de los tipos 2 y 4 de JDBC, as como soporte de SQLJ. Cuando una aplicacin carga el Controlador IBM DB2 para JDBC y SQLJ, se carga una instancia de controlador para las implementaciones de tipo 2 y tipo 4. La aplicacin puede establecer conexiones de tipo 2 y tipo 4 utilizando esta instancia de controlador. Las conexiones de tipo 2 y tipo 4 se pueden establecer simultneamente. Al comportamiento del Controlador IBM DB2 para JDBC y SQLJ de tipo 2 se le hace referencia como Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2. Al

Desarrollo de aplicaciones Java

comportamiento del Controlador IBM DB2 para JDBC y SQLJ de tipo 4 se le hace referencia como Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. El Controlador IBM DB2 para JDBC y SQLJ soporta estas funciones JDBC y SQLJ: v Todos los mtodos que se describen en las especificaciones de JDBC 3.0. Consulte el tema Comparacin del soporte de controlador para las API de JDBC. v Sentencias de SQLJ que ejecutan funciones equivalentes para la mayora de los mtodos JDBC. v Conexiones que estn habilitadas para la agrupacin de conexiones. WebSphere Application Server u otro servidor de aplicaciones realiza la agrupacin de conexiones. v Funciones definidas por el usuario y procedimientos almacenados de Java (slo Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2). v Transacciones globales que se ejecutan bajo WebSphere Application Server Versin 5.0 y versiones superiores. v Soporte para la gestin de transacciones distribuidas. Este soporte implementa las especificaciones Java 2 Platform, Enterprise Edition (J2EE) Java Transaction Service (JTS) y Java Transaction API (JTA), las cuales cumplen el estndar de X/Open para transacciones distribuidas (Distributed Transaction Processing: The XA Specification, que se puede consultar en http://www.opengroup.org). Conceptos relacionados: v Conexin de las aplicaciones JDBC a una fuente de datos en la pgina 26 v Seguridad en el controlador IBM DB2 para JDBC y SQLJ en la pgina 154 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358 v Diferencias de SQLJ entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores DB2 JDBC en la pgina 366

Software de desarrollo de aplicaciones Java soportado


Para desarrollar y desplegar aplicaciones Java que se ejecuten en bases de datos de DB2, deber utilizar software de desarrollo y sistemas operativos compatibles. Al instalar el Controlador IBM DB2 para JDBC y SQLJ, el proceso de instalacin no instalar ningn kit de desarrollo de software (SDK) para Java. Si el proceso de instalacin del producto DB2 Database para Linux, UNIX y Windows instala un SDK para Java, dicho proceso de instalacin instalar el SDK ms reciente para Java que se encuentre disponible. En la tabla siguiente, se listan los niveles soportados de SDK para Java. Slo estn soportados los niveles listados y las versiones posteriores compatibles del mismo nivel. Por ejemplo, si slo se lista el nivel 1.4.2 para un sistema operativo particular, tambin est soportado el nivel 1.4.2 SRn, pero no est soportado el nivel 5. Si se lista el nivel 1.4.2 hasta el nivel 5, tambin est soportado el nivel 1.4.2 SRn y el nivel 5 SRm. Debido a que hay arreglos y actualizaciones frecuentes de SDK para Java, no se han probado todos los niveles y versiones. Si la aplicacin de base de datos tiene problemas que estn relacionados con SDK para Java, intntelo con la siguiente versin disponible de SDK para Java del nivel en cuestin.
Captulo 1. Introduccin

Las versiones no IBM de SDK para Java slo estn soportados para crear y ejecutar aplicaciones Java autnomas. Para crear y ejecutar procedimientos almacenados Java y funciones definidas por el usuario slo est soportado el IBM SDK para Java que est incluido en el producto DB2 Database para Linux, UNIX y Windows.
Tabla 1. SDK para Java por DB2 Database para Linux, UNIX y Windows Sistema operativo AIX 5 HP-UX 11i Linux en Intel x86 Linux en IA64 Linux en AMD64/EM64T Linux en PowerPC Linux en zSeries Solaris Windows en Intel x86 Windows en IA64 Windows en x64 Notas: 1. Las mismas versiones de SDK para Java que se encuentran disponibles en Hewlett-Packard estn soportadas para crear y ejecutar aplicaciones cliente con el Controlador IBM DB2 para JDBC y SQLJ. 2. Las mismas versiones de SDK para Java que se encuentran disponibles en Sun Microsystems estn soportadas para crear y ejecutar aplicaciones cliente con el Controlador IBM DB2 para JDBC y SQLJ. 3. Se necesita un nivel mnimo de SDK para Java 1.4.2 SR3 para los procesadores Montecito. Sistema operativo de 31, 32 o 64 bits 32 bits/64 bits 32 bits/64 bits 32 bits 64 bits 32 bits/64 bits 32 bits/64 bits 31 bits/64 bits 32 bits/64 bits 32 bits 64 bits 32 bits/64 bits Niveles soportados de SDK para Java 1.4.2 hasta 5 1.4.21 1.4.2 hasta 52 1.4.22,3 1.4.2 hasta 52 1.4.2 hasta 5 1.4.2 hasta 5 1.4.22 1.4.2 hasta 52 1.4.22,3 1.4.2 hasta 52

Tareas relacionadas: v Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4

Configuracin del entorno de desarrollo de JDBC y SQLJ de DB2


Los siguientes temas contienen informacin sobre la configuracin del entorno para la programacin de aplicaciones Java en DB2 Database para Linux, UNIX y Windows. v Instalacin del controlador IBM DB2 para JDBC y SQLJ v Programa de utilidad DB2Binder en la pgina 9 v Programa de utilidad DB2LobTableCreator en la pgina 10 v Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ en la pgina 11 v Configuracin especial para acceder a servidores DB2 para z/OS desde programas Java en la pgina 16 v DB2T4XAIndoubtUtil para transacciones distribuidas con DB2 UDB para los servidores OS/390 y z/OS Versin 7 en la pgina 17 v Instalacin especial para ejecutar rutinas Java en el entorno HP-UX en la pgina 20

Instalacin del controlador IBM DB2 para JDBC y SQLJ


Siga estos pasos para instalar el Controlador IBM DB2 para JDBC y SQLJ. Requisitos necesarios: v Un SDK para Java, 1.4.2 o posterior.

Desarrollo de aplicaciones Java

Para todos los productos DB2 excepto DB2 Runtime Client, el proceso de instalacin instala automtica u opcionalmente un SDK para Java. v Soporte de hebras nativas JVM Los JVM que ejecutan aplicaciones Java que tienen acceso a bases de datos DB2 deben incluir soporte a hebras nativas. Puede especificar las hebras nativas como soporte de hebras por omisin para algunos JVM estableciendo el valor native a la variable de entorno THREADS_FLAG. Consulte la documentacin del entorno Java para conocer las instrucciones sobre cmo hacer que las hebras nativas sean las hebras por omisin en su sistema. v Soporte para acceder a servidores de bases de datos DB2 para z/OS Si piensa acceder a servidores de bases de datos DB2 para z/OS con las aplicaciones Java, siga las instrucciones que se dan en Configuracin especial para acceder a servidores DB2 para z/OS desde programas Java. v Soporte de Unicode para los servidores iSeries Si hay algn programa SQLJ o JDBC que utilice el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 para conectarse a un servidor DB2 UDB para iSeries, el sistema operativo OS/400 deber dar soporte al esquema de codificacin UTF-8 de Unicode. La tabla siguiente lista los PTF de OS/400 que son necesarios para dar soporte a UTF-8 de Unicode:
Tabla 2. PTF de OS/400 para el soporte de UTF-8 de Unicode Versin OS/400 V5R3 o posterior V5R2 V5R1 Nmeros de PTF Ninguno (el soporte est incluido) SI06541, SI06796, SI07557, SI07564, SI07565, SI07566 y SI07567 SI06308, SI06300, SI06301, SI06302, SI06305, SI06307 y SI05872

v Soporte de Java a clientes y servidores HP-UX Servidores HP-UX: el Controlador IBM DB2 para JDBC y SQLJ no da soporte a las bases de datos que hagan uso del juego de caracteres por omisin de HP-UX, Roman8. Por tanto, cuando cree una base de datos en un servidor HP-UX al que piense acceder mediante el Controlador IBM DB2 para JDBC y SQLJ, es necesario que cree la base de datos con un juego de caracteres diferente. Clientes y servidores de HP-UX: el entorno de Java de un sistema HP-UX requiere una configuracin especial para poder ejecutar procedimientos almacenados en el Controlador IBM DB2 para JDBC y SQLJ. Consulte Configuracin especial para ejecutar rutinas Java en el entorno HP-UX para obtener ms informacin. Procedimiento: 1. Durante el proceso de instalacin de DB2 Database para Linux, UNIX y Windows, seleccione Soporte de Java en UNIX o Linux, o Soporte de JDBC en Windows. Son las opciones por omisin. Si ya ha instalado DB2 Database para Linux, UNIX y Windows sin el soporte de JDBC, puede ejecutar el proceso de instalacin en modalidad Personalizada para aadir el soporte de JDBC. La seleccin del Soporte de Java o del Soporte de JDBC hace que el proceso de instalacin realice estas acciones: v instalar los archivos de clase del Controlador IBM DB2 para JDBC y SQLJ, y modificar la sentencia CLASSPATH para incluirlos. Estos archivos se colocan en el directorio sqllib\java para los sistemas Windows, o en el directorio sqllib/java para los sistemas Unix o Linux.
Captulo 1. Introduccin

Los nombres de estos archivos son db2jcc.jar y sqlj.zip. Slo necesita db2jcc.jar para preparar y ejecutar programas JDBC. Necesita db2jcc.jar y sqlj.zip para preparar y ejecutar programas SQLJ. v Instalar archivos de licencia del Controlador IBM DB2 para JDBC y SQLJ y modificar la sentencia CLASSPATH para incluirlos. Estos archivos se colocan en el directorio sqllib\java para los sistemas Windows, o en el directorio sqllib/java para los sistemas Unix o Linux. Los nombres de archivo son:
Tabla 3. Archivos de licencia del Controlador IBM DB2 para JDBC y SQLJ Archivo de licencia db2jcc_license_c.jar db2jcc_license_cu.jar Servidor al que el archivo de licencia Producto donde se incluye el archivo permite una conexin de licencia Cloudscape Cloudscape Todos los servidores de DB2 Database para Linux, UNIX y Windows Cloudscape Todos los servidores de DB2 Database para Linux, UNIX y Windows DB2 para z/OS DB2 UDB para iSeries Cloudscape Network Server Todos los productos de DB2 Database para Linux, UNIX y Windows

db2jcc_license_cisuz.jar

Todos los productos de DB2 Connect

v Instalar bibliotecas nativas del Controlador IBM DB2 para JDBC y SQLJ para el soporte de Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2. Estos archivos se colocan en el directorio sqllib\bin para los sistemas Windows, o en el directorio sqllib/lib para los sistemas Unix o Linux. Los nombres de archivo son: libdb2jcct2.so Para AIX, HP-UX en IPF, Linux y Solaris libdb2jcct2.sl Para HP-UX en PA-RISC db2jcct2.dll Para Windows 2. Personalice las propiedades de configuracin del controlador si cualquiera de los valores por omisin no son adecuados. Vea Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ para obtener ms informacin. 3. Configure TCP/IP Los servidores se deben configurar para la comunicacin TCP/IP en estos casos: v Aplicaciones JDBC o SQLJ que utilizan el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. v Aplicaciones JDBC o SQLJ que utilizan el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2, y especifique servidor y puerto en el URL de conexin. Asegrese de que el TCP/IP listener se est ejecutando. Para activar el TCP/IP listener: a. Defina con el valor TCPIP la variable de entorno DB2COMM:

Desarrollo de aplicaciones Java

db2set DB2COMM=TCPIP

b. Actualice el archivo de configuracin del gestor de bases de datos con el nombre del servicio de TCP/IP que se haya especificado en el archivo de servicios:
db2 update dbm cfg using SVCENAME nombre_servicio_TCP/IP

Debe ejecutar los mandatos db2stop y db2start para que este valor surta efecto. El nmero de puerto utilizado para los applets y los programas de SQLJ necesita ser el mismo que el nmero de SVCENAME de TCP/IP utilizado en el archivo de configuracin del gestor de bases de datos. 4. En los servidores DB2 Database para Linux, UNIX y Windows en los que tiene previsto ejecutar los procedimientos almacenados de Java o las funciones definidas por el usuario, actualice la configuracin del gestor de bases de datos para que incluya la va de acceso donde se encuentra el SDK para Java. Puede hacerlo entrando mandatos similares a stos en la lnea de mandatos del servidor: Para los sistemas de bases de datos en UNIX o Linux:
db2 update dbm cfg using JDK_PATH /home/db2inst/jdk142

/home/db2inst/jdk142 es la va de acceso donde el SDK para Java est instalado. Para los sistemas de bases de datos en Windows:
db2 update dbm cfg using JDK_PATH c:\Archivos de programa\jdk142

c:\Archivos de programa\jdk142 es la va de acceso donde el SDK para Java est instalado. Para verificar el valor correcto del campo JDK_PATH en la configuracin del gestor de base de datos DB2, entre el mandato siguiente en el servidor de bases de datos:
db2 get dbm cfg

Es posible que desee redirigir la salida a un archivo, para tener una visin ms fcil. El campo JDK_PATH aparece cerca del comienzo de los datos de salida del mandato. 5. Si tiene previsto invocar procedimientos SQL que se encuentran en servidores DB2 Database para Linux, UNIX y Windows desde programas Java, y el formato de la fecha y la hora que se asocia al cdigo de territorio de los servidores de bases de datos no se corresponde al formato propio de EE.UU., siga estos pasos: a. Defina la variable de registro DB2_SQLROUTINE_PREPOPTS en los servidores de bases de datos para indicar que el formato de la fecha y la hora por omisin es ISO:
db2set DB2_SQLROUTINE_PREPOPTS="DATETIME ISO"

b. Vuelva a definir los procedimientos SQL existentes que tenga previsto invocar desde programas Java. Estos pasos son necesarios para garantizar que la aplicacin de llamada recibe correctamente los valores de fecha y hora. 6. Si piensa ejecutar procedimientos almacenados de Java que funcionen con datos XML en servidores DB2 Database para Linux, UNIX y Windows, tendr que definir el Controlador IBM DB2 para JDBC y SQLJ como el controlador

Captulo 1. Introduccin

JDBC por omisin para la ejecucin de procedimientos almacenados. Para ello, establezca el valor de entorno DB2_USE_DB2JCCT2_JROUTINE en YES, yes, ON, on, TRUE, true, o 1. Por ejemplo: Para definir el Controlador IBM DB2 para JDBC y SQLJ como el controlador por omisin en el nivel de instancia:
db2set DB2_USE_DB2JCCT2_JROUTINE=YES -i nombre-instancia

Para definir el Controlador IBM DB2 para JDBC y SQLJ como el controlador por omisin en el nivel global:
db2set DB2_USE_DB2JCCT2_JROUTINE=YES -g

7. Si tiene previsto utilizar la seguridad Kerberos, coloque los archivos siguientes en la sentencia CLASSPATH de la aplicacin de Java: v ibmjceprovider.jar v ibmjcefw.jar v ibmjlog.jar v US_export_policy.jar v Local_policy.jar v ibmjgssprovider.jar v jaas.jar v ibmjceprovider.jar v ibmjcefw.jar v ibmjlog.jar v US_export_policy.jar v Local_policy.jar 8. Si tiene previsto conectarse a un servidor DB2 para z/OS, ejecute el programa de utilidad com.ibm.db2.jcc.DB2Binder para vincular los paquetes de DB2 que el Controlador IBM DB2 para JDBC y SQLJ utiliza en el servidor. Vea Programa de utilidad DB2Binder para obtener ms informacin. 9. Determine si necesita utilizar localizadores de LOB para acceder a los tipos de datos siguientes en los servidores DB2 para z/OS: v Datos de las columnas DBCLOB v Datos de las columnas CLOB En caso afirmativo necesitar crear tablas en los servidores de bases de datos que son necesarias para captar datos de columnas DBCLOB o CLOB utilizando localizadores de LOB. Cree las tablas de una de las maneras siguientes: v En los servidorers DB2 para z/OS, personalice y ejecute el trabajo DSNTIJMS. Este trabajo se encuentra ubicado en el archivo prefijo.SDSNSAMP. v En el cliente, ejecute el programa de utilidad com.ibm.db2.jcc.DB2LobTableCreator en cada uno de los servidores DB2 para z/OS. Vea Programa de utilidad DB2LobTableCreator para obtener ms informacin. 10. Si tiene previsto utilizar el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 para implementar transacciones distribuidas en servidores DB2 para z/OS Versin 7, ejecute el programa de utilidad DB2T4XAIndoubtUtil una vez por cada servidor DB2 para z/OS Versin 7. Consulte Programa de utilidad DB2T4XAIndoubtUtil para obtener ms informacin. Conceptos relacionados: v Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ en la pgina 11 v Software de desarrollo de aplicaciones Java soportado en la pgina 3

Desarrollo de aplicaciones Java

Tareas relacionadas: v Instalacin especial para ejecutar rutinas Java en el entorno HP-UX en la pgina 20 v Configuracin de comunicaciones de TCP/IP para una instancia DB2 en Suplemento de instalacin y configuracin v Actualizacin del archivo de configuracin del gestor de bases de datos en el servidor para las comunicaciones de TCP/IP en Suplemento de instalacin y configuracin v Actualizacin del archivo de servicios en el servidor para las comunicaciones de TCP/IP en Suplemento de instalacin y configuracin v Configuracin especial para acceder a servidores DB2 para z/OS desde programas Java en la pgina 16 Informacin relacionada: v Programa de utilidad DB2Binder en la pgina 9 v Programa de utilidad DB2LobTableCreator en la pgina 10 v Kit de desarrollo de software de IBM para niveles Java de productos DB2 en Gua rpida de iniciacin para servidores DB2 v DB2T4XAIndoubtUtil para transacciones distribuidas con DB2 UDB para los servidores OS/390 y z/OS Versin 7 en la pgina 17 v Oferta de productos DB2 Connect en Gua del usuario de DB2 Connect

Programa de utilidad DB2Binder


El El programa de utilidad DB2Binder vincula los paquetes DB2 que el Controlador IBM DB2 para JDBC y SQLJ utiliza en el servidor de bases de datos y otorga la autorizacin EXECUTE sobre los paquetes igual a PUBLIC. Sintaxis de DB2Binder:
java com.ibm.db2.jcc.DB2Binder -url jdbc:db2://servidor : puerto /basedatos

-user ID-usuario -password contrasea -size entero -collection nombre_coleccin

-action add , -tracelevel opcin_rastreo -action replace -help

Descripciones de la opcin DB2Binder: -url Especifica la fuente de datos donde deben vincularse los paquetes JCC. Las partes variables del valor -url son: servidor El nombre de dominio o direccin IP del sistema MVS en el que reside el subsistema DB2.

Captulo 1. Introduccin

puerto El nmero de puerto del servidor TCP/IP asignado al subsistema DB2. El valor por omisin es 446. basedatos El nombre de la ubicacin del subsistema DB2, tal como est definido en la tabla del catlogo SYSIBM.LOCATIONS. -user Especifica el ID de usuario utilizado para vincular los paquetes. Este usuario debe tener autorizacin BIND sobre los paquetes. -size Especifica el nmero de paquetes DB2 que DB2binder vincula para cada uno de los cuatro niveles de aislamiento de DB2 y cada uno de los dos valores de holdability. El Controlador IBM DB2 para JDBC y SQLJ utiliza estos paquetes para procesar SQL dinmico. Adems, el programa DB2binder vincula un paquete que el Controlador IBM DB2 para JDBC y SQLJ utiliza para el SQL esttico. Por tanto, el nmero total de paquetes que DB2binder vincula es:
4*2*entero+1

El valor por omisin de entero es 3. -collection Especifica el ID de coleccin de los paquetes que son utilizados por una instancia del Controlador IBM DB2 para JDBC y SQLJ. El valor por omisin es NULLID. DB2binder convierte este valor a maysculas. Puede crear varias instancias del conjunto de paquetes JCC en una sola ubicacin ejecutando varias veces com.ibm.db2.jcc.DB2Binder y especificando un valor diferente para -collection cada vez. Durante la ejecucin, seleccione una instancia del Controlador IBM DB2 para JDBC y SQLJ asignando a la propiedad currentPackageSet un valor que coincida con valor de -collection. -tracelevel Especifica qu se debe rastrear mientras se ejecuta DB2Binder. -action Especifica si los paquetes del Controlador IBM DB2 para JDBC y SQLJ pueden sustituirse. add replace Indica que puede crearse un paquete aunque ya exista otro paquete con el mismo nombre. El paquete nuevo sustituir al anterior. Texto de referencia Tareas relacionadas: v Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4 Indica que puede crearse un paquete slo si no existe ya. Add es el valor por omisin.

Programa de utilidad DB2LobTableCreator


El programa de utilidad DB2LobTableCreator crea tablas en un servidor de bases de datos DB2 para z/OS que son necesarias para que las aplicaciones JDBC o SQLJ tengan acceso a los tipos de datos siguientes mediante localizadores de LOB: v Datos de las columnas DBCLOB v Datos de las columnas CLOB

10

Desarrollo de aplicaciones Java

Sintaxis de DB2LobTableCreator:
java com.ibm.db2.jcc.DB2LobTableCreator -url jdbc:db2: //servidor :puerto -user ID-usuario -password contrasea -help /basedatos

Descripciones de las opciones de DB2LobTableCreator: -url Especifica la fuente de datos en donde se debe ejecutar DB2LobTableCreator. Las partes variables del valor -url son: jdbc:db2: Indica que la conexin es con un servidor perteneciente a la familia de productos DB2. servidor El nombre de dominio o direccin IP del servidor de bases de datos. puerto El nmero de puerto del servidor TCP/IP que est asignado al servidor de bases de datos. Es un valor entero comprendido entre 0 y 65535. El valor por omisin es 446. basedatos Nombre del servidor de bases de datos. basedatos es el nombre de ubicacin DB2 que se define durante la instalacin. Todos los caracteres de este valor deben ser caracteres en maysculas. Puede determinar el nombre de ubicacin ejecutando la sentencia SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

-user Especifica el ID de usuario utilizado para ejecutar DB2LobTableCreator. Este usuario debe tener autorizacin para crear tablas en la base de datos DSNATPDB. -password Especifica la contrasea del ID de usuario. -help Especifica que el programa de utilidad DB2LobTableCreator describe todas las opciones a las que da soporte. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. Tareas relacionadas: v Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4

Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ
Las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ permiten establecer los valores de las propiedades que tienen un mbito a nivel de controlador. Estos valores se aplican en las aplicaciones e instancias de DataSource. Puede cambiar los valores sin tener que cambiar el cdigo fuente de aplicacin ni las caractersticas de DataSource.
Captulo 1. Introduccin

11

Cada valor de propiedad de configuracin del Controlador IBM DB2 para JDBC y SQLJ tiene este formato:
propiedad=valor

propiedad puede tener uno o varios de los formatos siguientes: v db2.jcc.override.nombre_propiedad v db2.jcc.nombre_propiedad v db2.jcc.default.nombre_propiedad Si la propiedad de configuracin comienza por db2.jcc.override, esta propiedad se aplica a todas las conexiones y prevalece sobre cualquier propiedad de Connection o DataSource con el mismo valor nombre_propiedad. Si la propiedad de configuracin comienza por db2.jcc o db2.jcc.default, el valor de la propiedad de configuracin es un valor por omisin. Los valores de las propiedades de Connection o DataSource prevalecen sobre ese valor. Puede establecer las propiedades de configuracin de estas formas: v Establezca las propiedades de configuracin como propiedades del sistema Java. Estos valores prevalecen sobre cualquier otro. En el caso de las aplicaciones Java autnomas, puede establecer las propiedades de configuracin como propiedades del sistema Java; para ello, especifique -Dpropiedad=valor para cada propiedad de configuracin cuando ejecute el mandato java. v Establezca las propiedades de configuracin en un recurso cuyo nombre se especifica en la propiedad del sistema Java db2.jcc.propertiesFile. Por ejemplo, puede especificar un nombre de va de acceso absoluta para el valor db2.jcc.propertiesFile. En el caso de las aplicaciones Java autnomas, puede establecer las propiedades de configuracin especificando la opcin -Ddb2.jcc.propertiesFile=va_acceso cuando ejecute el mandato java. v Establezca las propiedades de configuracin en un recurso denominado DB2JccConfiguration.properties. Se utiliza una bsqueda de recursos Java estndar para localizar DB2JccConfiguration.properties. El Controlador IBM DB2 para JDBC y SQLJ busca este recurso solamente si no ha establecido la propiedad del sistema Java db2.jcc.propertiesFile. DB2JccConfiguration.properties puede ser un archivo autnomo o puede estar incluido en un archivo JAR. Si el archivo DB2JccConfiguration.properties tiene el esquema de codificacin ISO 8859-1 (Latin-1) o si tiene el esquema de codificacin Latin-1 con algunos caracteres Unicode (\udddd), no es necesario realizar la conversin de los caracteres para que el Controlador IBM DB2 para JDBC y SQLJ pueda utilizar el archivo. Si el archivo DB2JccConfiguration.properties tiene algn otro esquema de codificacin, debe utilizar el conversor Java native2ascii para convertir el contenido a Latin-1 o Unicode. Si DB2JccConfiguration.properties es un archivo autnomo, la va de acceso de DB2JccConfiguration.properties debe estar en la concatenacin CLASSPATH. Si DB2JccConfiguration.properties est en un archivo JAR, el archivo JAR debe estar en la concatenacin CLASSPATH. Puede establecer cualquiera de las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ siguientes. Todas las propiedades son opcionales. db2.jcc.currentSchema o db2.jcc.override.currentSchema Especifica el nombre de esquema por omisin que se utiliza para calificar

12

Desarrollo de aplicaciones Java

objetos de base de datos no calificados en sentencias de SQL preparadas dinmicamente. Este valor de esta propiedad establece el valor del registro especial CURRENT SCHEMA de un servidor DB2. db2.jcc.currentSQLID o db2.jcc.override.currentSQLID Especifica: v El ID de autorizacin que se utiliza para la comprobacin de autorizaciones en las sentencias CREATE, GRANT y REVOKE de SQL preparadas dinmicamente. v El propietario de un espacio de tablas, base de datos, grupo de almacenamiento o sinnimo que es creado por una sentencia CREATE emitida dinmicamente. v El calificador implcito de todos los nombres de tabla, vista, alias e ndice especificados en sentencias de SQL dinmico. La propiedad currentSQLID define el valor del registro especial CURRENT SQLID en un servidor DB2 para z/OS. Si la propiedad currentSQLID no est definida, el nombre de esquema por omisin es el valor del registro especial CURRENT SQLID. Esta propiedad slo se aplica al Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 en un servidor DB2 para z/OS. db2.jcc.dumpPool Especifica los tipos de estadsticas sobre los sucesos de agrupacin de transporte global que se graban adems de las estadsticas de resumen. La agrupacin de transporte global se utiliza para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. El tipo de datos de db2.jcc.dumpPool es int. db2.jcc.dumpPoolStatisticsOnSchedule y db2.jcc.dumpPoolStatisticsOnScheduleFile tambin deben estar definidas para grabar estadsticas antes de que se graben las estadsticas. Con la propiedad db2.jcc.dumpPool se pueden especificar uno o ms de los tipos de estadsticas siguientes: v DUMP_REMOVE_OBJECT (hexadecimal: X'01', decimal: 1) v DUMP_GET_OBJECT (hexadecimal: X'02', decimal: 2) v DUMP_WAIT_OBJECT (hexadecimal: X'04', decimal: 4) v DUMP_SET_AVAILABLE_OBJECT (hexadecimal: X'08', decimal: 8) v DUMP_CREATE_OBJECT (hexadecimal: X'10', decimal: 16) v DUMP_SYSPLEX_MSG (hexadecimal: X'20', decimal: 32) v DUMP_POOL_ERROR (hexadecimal: X'80', decimal: 128) Para rastrear ms de un tipo de suceso, aada los valores correspondientes a los tipos de sucesos que desee rastrear. Por ejemplo, suponga que desea rastrear los sucesos DUMP_GET_OBJECT y DUMP_CREATE_OBJECT. Los equivalentes numricos de estos valores son 2 y 16, por lo que debe especificar 18 para el valor de db2.jcc.dumpPool. El valor por omisin es 0, que significa que slo se graban las estadsticas de resumen correspondientes a la agrupacin de transporte global. db2.jcc.dumpPoolStatisticsOnSchedule Especifica la frecuencia, en segundos, con que las estadsticas de agrupacin de transporte global se graban en el archivo especificado por db2.jcc.dumpPoolStatisticsOnScheduleFile. La agrupacin de objetos de transporte global se utiliza para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex.

Captulo 1. Introduccin

13

El valor por omisin es -1. -1 significa que no se graban las estadsticas de agrupacin de transporte global. db2.jcc.dumpPoolStatisticsOnScheduleFile Especifica el nombre del archivo en el que se graban las estadsticas de agrupacin de transporte global. La agrupacin de transporte global se utiliza para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. Si no se especifica db2.jcc.dumpPoolStatisticsOnScheduleFile, no se graban las estadsticas de agrupacin de transporte global. db2.jcc.maxTransportObjectIdleTime Especifica la cantidad de tiempo en segundos que un objeto de transporte no utilizado debe permanecer en una agrupacin de objetos de transporte global para poderlo suprimir de la agrupacin. Los objetos de transporte se utilizan para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. El valor por omisin de db2.jcc.maxTransportObjectIdleTime es 60. Si se establece db2.jcc.maxTransportObjectIdleTime en un valor menor que 0, los objetos de transporte no utilizados se suprimen de la agrupacin inmediatamente. Esta accin no es recomendable, ya que puede provocar una importante disminucin del rendimiento. db2.jcc.maxTransportObjects Especifica el lmite superior del nmero de objetos de transporte de una agrupacin de objetos de transporte global para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. Cuando el nmero de objetos de transporte de la agrupacin alcanza el valor de db2.jcc.maxTransportObjects, los objetos de transporte que no se han utilizado durante un perodo de tiempo superior al valor de db2.jcc.maxTransportObjectIdleTime se suprimen de la agrupacin. El valor por omisin de db2.jcc.maxTransportObjects es -1. Todos los valores que sean 0 o que sean menores que 0 indican que no hay lmite alguno en cuanto al nmero de objetos de transporte que puede haber en la agrupacin de objetos de transporte global. db2.jcc.maxTransportObjectWaitTime Especifica la cantidad de tiempo en segundos que una aplicacin espera un objeto de transporte si se alcanza el valor de db2.jcc.maxTransportObjects. Los objetos de transporte se utilizan para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. Cuando una aplicacin espera ms tiempo que el especificado por el valor de db2.jcc.maxTransportObjectWaitTime, la agrupacin de objetos de transporte global emite una excepcin de SQL (SQLException). El valor por omisin de db2.jcc.maxTransportObjectWaitTime es -1. Los valores negativos significan que las aplicaciones esperan sin limitacin de tiempo. db2.jcc.minTransportObjects Especifica el lmite inferior del nmero de objetos de transporte de una agrupacin de objetos de transporte global para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. Cuando se crea una JVM, no hay objetos de transporte en la agrupacin. Los objetos de transporte se aaden a la agrupacin a medida que se necesitan. Una vez alcanzado el valor de db2.jcc.minTransportObjects, el nmero de objetos de transporte de la agrupacin de objetos de transporte global nunca ser inferior al valor de db2.jcc.minTransportObjects mientras exista esa JVM.

14

Desarrollo de aplicaciones Java

El valor por omisin de db2.jcc.minTransportObjects es 0. Todos los valores que sean 0 o que sean menores que 0 indican que no hay lmite alguno en cuanto al nmero de objetos de transporte que puede haber en la agrupacin de objetos de transporte global. db2.jcc.traceDirectory o db2.jcc.override.traceDirectory Habilita el rastreo del Controlador IBM DB2 para JDBC y SQLJ para el cdigo de controlador Java y especifica el directorio en el que se grabar la informacin de rastreo. Cuando se especifica db2.jcc.override.traceDirectory, la informacin de rastreo correspondiente a varias conexiones en el mismo DataSource se graba en varios archivos. Cuando se especifica db2.jcc.override.traceDirectory, el resultado del rastreo de una conexin se guarda en un archivo denominado nombre_archivo_origen_n. n es la conexin nmero n correspondiente a un DataSource. Si no se especifica db2.jcc.traceFileName ni db2.jcc.override.traceFileName, nombre-archivo es traceFile. Si se especifica db2.jcc.traceFileName o db2.jcc.override.traceFileName, nombre-archivo es el valor de db2.jcc.traceFileName o db2.jcc.override.traceFileName. origen indica el origen del grabador de anotaciones cronolgicas que se est utilizando. Los valores posibles de origen son: cpds Grabador de anotaciones cronolgicas para un objeto DB2ConnectionPoolDataSource.

driver Grabador de anotaciones cronolgicas para un objeto DB2Driver. global Grabador de anotaciones cronolgicas para un objeto DB2TraceManager. sds xads Grabador de anotaciones cronolgicas para un objeto DB2SimpleDataSource. Grabador de anotaciones cronolgicas para un objeto DB2XADataSource.

La propiedad db2.jcc.override.traceDirectory prevalece sobre la propiedad traceDirectory en el caso de un objeto Connection o DataSource. Por ejemplo, si se especifica el valor siguiente para db2.jcc.override.traceDirectory, se habilita el rastreo del cdigo Java del Controlador IBM DB2 para JDBC y SQLJ que se guardar en archivos del directorio /SYSTEM/tmp:
db2.jcc.override.traceDirectory=/SYSTEM/tmp

Debe establecer las propiedades del rastreo bajo la direccin del soporte de software de IBM. db2.jcc.sqljUncustomizedWarningOrException Especifica la accin que el Controlador IBM DB2 para JDBC y SQLJ llevar a cabo cuando se ejecute una aplicacin SQLJ no personalizada. db2.jcc.sqljUncustomizedWarningOrException puede tener los valores siguientes: 0 El Controlador IBM DB2 para JDBC y SQLJ no emitir un aviso o una excepcin cuando se ejecute una aplicacin SQLJ no personalizada. ste es el valor por omisin. El Controlador IBM DB2 para JDBC y SQLJ emitir un aviso cuando se ejecute una aplicacin SQLJ no personalizada. El Controlador IBM DB2 para JDBC y SQLJ emitir una excepcin cuando se ejecute una aplicacin SQLJ no personalizada.
Captulo 1. Introduccin

1 2

15

db2.jcc.traceFile o db2.jcc.override.traceFile Habilita el rastreo del Controlador IBM DB2 para JDBC y SQLJ para el cdigo de controlador Java y especifica el nombre en el que se basan los nombres de archivo de rastreo. Especifique un nombre de archivo totalmente calificado para el valor de la propiedad db2.jcc.override.traceFile. La propiedad db2.jcc.override.traceFile prevalece sobre la propiedad traceFile en el caso de un objeto Connection o DataSource. Por ejemplo, si se especifica el valor siguiente para db2.jcc.override.traceFile, se habilita el rastreo del cdigo Java del Controlador IBM DB2 para JDBC y SQLJ que se guardar en un archivo denominado /SYSTEM/tmp/jdbctrace:
db2.jcc.override.traceFile=/SYSTEM/tmp/jdbctrace

Debe establecer las propiedades del rastreo bajo la direccin del soporte de software de IBM. db2.jcc.traceFileAppend o db2.jcc.override.traceFileAppend Especifica si se debe o no se debe aadir o sobregrabar los datos en el archivo especificado por la propiedad db2.jcc.override.traceFile. El tipo de datos de esta propiedad es boolean. El valor por omisin es false, que significa que se sobregraba el archivo especificado por la propiedad traceFile. La propiedad db2.jcc.override.traceFileAppend prevalece sobre la propiedad traceFileAppend en el caso de un objeto Connection o DataSource. Por ejemplo, si se especifica el valor siguiente para db2.jcc.override.traceFileAppend, los datos de rastreo se aaden al archivo de rastreo existente:
db2.jcc.override.traceFileAppend=true

Debe establecer las propiedades del rastreo bajo la direccin del soporte de software de IBM. Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Configuracin especial para acceder a servidores DB2 para z/OS desde programas Java
Siga estos pasos si tiene previsto escribir aplicaciones JDBC o SQLJ que accedan a servidores de bases de datos DB2 para z/OS. Procedimiento: 1. Instale procedimiento almacenados DB2 para z/OS. Si cualquiera de las aplicaciones JDBC o SQLJ van a conectarse a un servidor DB2 para z/OS, deber instalar una serie de procedimientos almacenados en dicho servidor para permitir la recuperacin de informacin del catlogo DB2, la funcin de rastreo y el formateo de los mensajes de error. Los procedimientos almacenados son: v SQLCOLPRIVILEGES v SQLCOLUMNS v SQLFOREIGNKEYS v SQLGETTYPEINFO v SQLPRIMARYKEYS

16

Desarrollo de aplicaciones Java

v SQLPROCEDURECOLS v SQLPROCEDURES v SQLSPECIALCOLUMNS v SQLSTATISTICS v SQLTABLEPRIVILEGES v SQLTABLES v SQLUDTS v SQLCAMESSAGE Los PTF de DB2 para z/OS siguientes proporcionan las versiones ms recientes de los procedimientos almacenados:
Tabla 4. PTF para procedimientos almacenados de DB2 para z/OS DB2 para z/OS Versin 7 Versin 8 Nmeros de PTF UQ72083, UQ93889 UQ93890

Pregunte al administrador del sistema de DB2 para z/OS si estos procedimientos almacenados estn instalados. 2. Cree tablas DB2 para z/OS. Si cualquiera de las aplicaciones JDBC o SQLJ va a aplicarse a un servidor DB2 para z/OS, es necesario que las tablas siguientes se instalen en dicho servidor para permitir el almacenamiento eficaz de los datos en las columnas CLOB o DBCLOB: v SYSIBM.SYSDUMMYU v SYSIBM.SYSDUMMYA v SYSIBM.SYSDUMMYE Los trabajos que definen las tablas se envan a los PTF siguientes:
Tabla 5. PTF para DB2 para z/OS Versin de DB2 para z/OS Versin 7 Versin 8 Nmero de PTF UQ86843 UQ86844

Pregunte al administrador del sistema de DB2 para z/OS si estas tablas estn definidas. 3. Habilite el soporte de Unicode para servidores OS/390 y z/OS. Si cualquiera de los programas SQLJ o JDBC van a utilizar el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 para conectarse a un servidor DB2 para z/OS Versin 7, el sistema operativo OS/390 o z/OS debe dar soporte al esquema de codificacin UTF-8 de Unicode. Este soporte requiere OS/390 Versin 2 Release 9 con el APAR OW44581, o un release posterior de OS/390 o z/OS, adems del soporte de OS/390 R8/R9/R10 a Unicode. Los APAR II13048 y II13049 de informacin contienen datos adicionales.

DB2T4XAIndoubtUtil para transacciones distribuidas con DB2 UDB para los servidores OS/390 y z/OS Versin 7
Si tiene previsto implementar transacciones distribuidas mediante el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 que incluyan DB2 UDB para los servidores OS/390 y z/OS Versin 7, debe ejecutar el programa de utilidad DB2T4XAIndoubtUtil con esos servidores. Este programa de utilidad permite a los servidores de la Versin 7, que no incorporan el soporte para las transacciones distribuidas que implementan la especificacin XA, emular ese soporte.
Captulo 1. Introduccin

17

DB2T4XAIndoubtUtil ejecuta una de estas tareas o las dos: v Crea la tabla SYSIBM.INDOUBT y un ndice asociado v Vincula los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04 de DB2 Debe crear y descartar los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04 slo mediante la ejecucin de DB2T4XAIndoubtUtil. Puede crear y descartar SYSTEM.INDOUBT y su ndice manualmente, pero se recomienda que emplee el programa de utilidad. Consulte Notas de uso de DB2T4XAIndoubtUtil en la pgina 19 si desea instrucciones sobre cmo crear estos objetos manualmente. Autorizacin DB2T4XAIndoubtUtil: Si desea ejecutar el programa de utilidad DB2T4XAIndoubtUtil para crear SYSTEM.INDOUBT y vincular los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04, necesita la autorizacin SYSADM. Si desea ejecutar DB2T4XAIndoubtUtil slo para vincular los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04, necesita la autorizacin BIND para los paquetes. Sintaxis DB2T4XAIndoubtUtil:
java com.ibm.db2.jcc.DB2T4XAIndoubtUtil -url jdbc:db2: //servidor :puerto /basedatos

-user ID-usuario -password contrasea -owner ID_propietario -help -delete

-jdbcCollection NULLID -bindonly -showSQL -jdbcCollection ID_coleccin

Informacin de parmetros de DB2T4XAIndoubtUtil: -url Especifica la fuente de datos en donde se debe ejecutar DB2T4XAIndoubtUtil. Las partes variables del valor -url son: jdbc:db2: Indica que la conexin es con un servidor perteneciente a la familia de productos DB2. servidor El nombre de dominio o direccin IP del servidor de bases de datos. puerto El nmero de puerto del servidor TCP/IP que est asignado al servidor de bases de datos. Es un valor entero comprendido entre 0 y 65535. El valor por omisin es 446. basedatos Nombre del servidor de bases de datos. basedatos es el nombre de ubicacin DB2 que se define durante la instalacin. Todos los caracteres de este valor deben ser caracteres en maysculas. Puede determinar el nombre de ubicacin ejecutando la sentencia de SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

18

Desarrollo de aplicaciones Java

-user Especifica el ID de usuario utilizado para ejecutar DB2T4XAIndoubtUtil. Este usuario debe tener la autorizacin SYSADM o debe ser miembro de un grupo RACF que se corresponda con un ID de autorizacin secundaria con la autorizacin SYSADM. -password Especifica la contrasea del ID de usuario. -owner Especifica un ID de autorizacin secundaria que tiene la autorizacin SYSADM. Utilice el parmetro -owner si -user no tiene la autorizacin SYSADM. El valor del parmetro -user debe ser miembro de un grupo RACF cuyo nombre es ID_propietario. Cuando se especifique el parmetro -owner, DB2T4XAIndoubtUtil utiliza ID_propietario como: v El ID de autorizacin para la creacin de la tabla SYSIBM.INDOUBT. v El ID de autorizacin del propietario de los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04. Las sentencias de SQL de esos paquetes se ejecutan mediante la autorizacin de ID_propietario. -help Especifica que el programa de utilidad DB2T4XAIndoubtUtil describa cada una de las opciones a las que da soporte. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. -delete Especifica que el programa de utilidad DB2T4XAIndoubtUtil debe suprimir los objetos que se crearon anteriormente al ejecutar DB2T4XAIndoubtUtil. -bindonly Especifica que el programa de utilidad DB2T4XAIndoubtUtil vincule los paquetes T4XAIN01, T4XAIN02, T4XAIN03 y T4XAIN04 y otorgue permiso a PUBLIC para ejecutar los paquetes, pero no crea la tabla SYSIBM.INDOUBT. -showSQL Especifica que el programa de utilidad DB2T4XAIndoubtUtil muestre las sentencias de SQL que ejecute. -jdbcCollection nombre_coleccin|NULLID Especifica el valor del parmetro -collection que se ha utilizado al vincular los paquetes del Controlador IBM DB2 para JDBC y SQLJ con el programa de utilidad DB2Binder. El parmetro -jdbcCollection debe especificarse si el valor del parmetro -collection especificado de manera implcita o explcita no era NULLID. El valor por omisin es -jdbcCollection NULLID. Notas de uso de DB2T4XAIndoubtUtil: Para crear manualmente la tabla SYSTEM.INDOUBT y su ndice, utilice estas sentencias de SQL:
CREATE TABLESPACE INDBTTS USING STOGROUP LOCKSIZE ROW BUFFERPOOL BP0 SEGSIZE 32 CCSID EBCDIC; CREATE TABLE SYSIBM.INDOUBT(indbtXid VARCHAR(140) FOR BIT DATA NOT NULL,
Captulo 1. Introduccin

19

uowId VARCHAR(25) FOR BIT DATA NOT NULL, pSyncLog VARCHAR(150) FOR BIT DATA, cSyncLog VARCHAR(150) FOR BIT DATA) IN INDBTTS; CREATE UNIQUE INDEX INDBTIDX ON SYSIBM.INDOUBT(indbtXid, uowId);

Ejemplo de DB2T4XAIndoubtUtil: Ejecute DB2T4XAIndoubtUtil para permitir que un DB2 para OS/390 y un subsistema z/OS Versin 7 con la direccin IP mvs1, nmero de puerto 446 y nombre de ubicacin de DB2 SJCEC1 participen en transacciones distribuidas XA.
java com.ibm.db2.jcc.DB2T4XAIndoubtUtil -url jdbc:db2://mvs1:446/SJCEC1 \ -user SYSADM -password mypass

Tareas relacionadas: v Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4

Instalacin especial para ejecutar rutinas Java en el entorno HP-UX


Para el sistema operativo HP-UX en los procesadores PA-RISC, existen requisitos previos adicionales para ejecutar los procedimientos almacenados en Java y las funciones definidas por el usuario. Adems de los requisitos previos indicados en Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4, deber ejecutar los pasos de requisito previo siguientes: 1. Habilite la herramienta db2hpjv emitiendo los mandatos siguientes en la lnea de mandatos:
db2hpjv -e db2stop db2start

Si necesita inhabilitar db2hpjv, ejecute estos mandatos:


db2hpjv -d db2stop db2start

Java tiene que estar instalado en el sistema operativo, antes de ejecutar db2hpjv -e. DB2 Database para Linux, UNIX y Windows no puede ejecutarse en HP-UX si est habilitado el soporte a la rutina Java y Java no est en el sistema operativo. 2. D acceso al enlazador de tiempo de ejecucin de HP-UX a las bibliotecas compartidas de Java. Para ejecutar los procedimientos almacenados Java o las funciones definidas por el usuario, el enlazador de tiempo de ejecucin de HP-UX debe poder acceder a determinadas bibliotecas compartidas de Java y el sistema DB2 debe poder cargar dichas libreras y la JVM. Debido a que el programa que realiza esta carga se ejecuta con privilegios setuid, slo buscar las bibliotecas dependientes en /usr/lib/pa20_64. Para crear un acceso a las bibliotecas compartidas de Java, elija uno de los mtodos siguientes: v Cree enlaces simblicos con las bibliotecas compartidas de Java. Para ello, inicie sesin como root y emita los mandatos siguientes para crear enlaces simblicos en las bibliotecas compartidas de Java:
ln -s /opt/java1.4/jre/lib/PA_RISC2.0W/*.sl /usr/lib/pa20_64 ln -s /opt/java1.4/jre/lib/PA_RISC2.0W/hotspot/*.sl /usr/lib/pa20_64

20

Desarrollo de aplicaciones Java

Estos mandatos crean enlaces simblicos con las bibliotecas siguientes:


/opt/java1.4/jre/lib/PA_RISC2.0W/libnet.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libzip.sl /opt/java1.4/jre/lib/PA_RISC2.0W/librmi.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libnio.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libverify.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libmlib_image.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libhprof.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjaas_unix.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libawt.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libcmm.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libdcpr.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libdt_socket.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libfontmanager.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libioser12.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libmawt.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjsound.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjava.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjawt.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjcov.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjcpm.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjdwp.sl /opt/java1.4/jre/lib/PA_RISC2.0W/libjpeg.sl /opt/java1.4/jre/lib/PA_RISC2.0W/hotspot/libjsig.sl /opt/java1.4/jre/lib/PA_RISC2.0W/hotspot/libjvm.sl

v Aada los directorios /opt/java1.4/jre/lib/PA_RISC2.0W y opt/java1.4/jre/lib/PA_RISC2.0W/hotspot al archivo /etc/dld.sl.conf y al entorno SHLIB_PATH. Si el servidor DB2 no puede encontrar las bibliotecas de Java compartidas cuando ejecuta una rutina Java, generar un error -4300. Conceptos relacionados: v Programas de ejemplo Java en Temas de ejemplos v Consideraciones sobre los applets Java en la pgina 175 v El entorno de desarrollo de aplicaciones de bases de datos de DB2 en Iniciacin al desarrollo de aplicaciones de bases de datos Tareas relacionadas: v Instalacin del controlador IBM DB2 para JDBC y SQLJ en la pgina 4

Captulo 1. Introduccin

21

22

Desarrollo de aplicaciones Java

Captulo 2. Programacin de aplicaciones JDBC


Los temas siguientes contienen informacin sobre la escritura de aplicaciones JDBC. v Pasos bsicos para escribir una aplicacin JDBC v Conexin con servidores de bases de datos en aplicaciones JDBC en la pgina 26 v Paquetes Java para el soporte JDBC en la pgina 38 v Obtencin de informacin acerca de una fuente de datos mediante mtodos DatabaseMetaData en la pgina 39 v Variables en aplicaciones JDBC en la pgina 41 v Ejecucin de sentencias de SQL en aplicaciones JDBC en la pgina 42 v Trabajo con datos XML en aplicaciones JDBC en la pgina 75 v Control de transacciones en aplicaciones JDBC en la pgina 83 v Manejo de errores y avisos en aplicaciones JDBC en la pgina 84 v Controlador IBM DB2 para soporte de redireccionamiento de cliente de JDBC y SQLJ en la pgina 93 v Desconexin de servidores de bases de datos en aplicaciones JDBC en la pgina 96

Pasos bsicos para escribir una aplicacin JDBC


La escritura de una aplicacin JDBC es muy similar a la escritura de una aplicacin SQL en cualquier otro lenguaje: en general, es necesario seguir los pasos siguientes: v Acceder a los paquetes Java donde estn contenidos los mtodos de JDBC. v Declarar variables para enviar datos a tablas de DB2 o recuperar datos de las mismas. v Conectar con una fuente de datos. v Ejecutar sentencias de SQL. v Manejar los errores y avisos de SQL. v Desconectar de la fuente de datos. Aunque las tareas que necesita realizar son similares a las que se ejecutan en otros lenguajes, la forma de ejecutarlas es algo diferente. La Figura 1 en la pgina 24 es un programa sencillo que muestra la ejecucin de cada tarea. Este programa se ejecuta en el Controlador IBM DB2 para JDBC y SQLJ.

Copyright IBM Corp. 2006

23

import java.sql.*; public class EzJava { public static void main(String[] args) { String urlPrefix = "jdbc:db2:"; String url; String empNo; Connection con; Statement stmt; ResultSet rs; System.out.println ("**** Especificar clase EzJava");

// Comprobar que el primer argumento tenga el formato correcto para la parte // del URL que sigue a jdbc:db2:, tal como se describe // en el tema Conexin a una fuente de datos utilizando la interfaz DriverManager // con el controlador IBM DB2 para JDBC y SQLJ. // Por ejemplo, para la conectividad del controlador IBM DB2 para JDBC y SQLJ de tipo 2, // args[0] puede ser MVS1DB2M. Para la // conectividad de tipo 4, args[0] puede // ser //stlmvs1:10110/MVS1DB2M. if (args.length==0) { System.err.println ("Valor no vlido. Primer argumento aadido a "+ "jdbc:db2: debe especificar un URL vlido."); System.exit(1); } url = urlPrefix + args[0]; try { // Cargar el Controlador IBM DB2 para JDBC y SQLJ Class.forName("com.ibm.db2.jcc.DB2Driver"); System.out.println("**** Controlador JDBC cargado");

3a

// Crear la conexin mediante el controlador IBM DB2 para JDBC y SQLJ con = DriverManager.getConnection (url); 3b // Confirmar los cambios manualmente con.setAutoCommit(false); System.out.println("**** Creada una conexin JDBC con la fuente de datos"); // Crear el objeto Statement stmt = con.createStatement(); System.out.println("**** Creado el objeto Statement de JDBC"); 4a

// Ejecutar una consulta y generar instancia del conjunto de resultados rs = stmt.executeQuery("SELECT EMPNO FROM EMPLOYEE"); 4b System.out.println("**** Creado el objeto JDBC ResultSet"); // Imprimir todos los nmeros de empleado en el dispositivo de salida estndar while (rs.next()) { empNo = rs.getString(1); System.out.println("Nmero de empleado = " + empNo); } System.out.println("**** Buscadas todas las filas del conjunto de resultados de JDBC");

Figura 1. Aplicacin JDBC sencilla (Parte 1 de 2)

24

Desarrollo de aplicaciones Java

// Cerrar el conjunto de resultados rs.close(); System.out.println("**** Cerrado el conjunto de resultados de JDBC"); // Cerrar el objeto Statement stmt.close(); System.out.println("**** Cerrado el objeto Statement de JDBC"); // La conexin debe estar en un lmite de unidad de trabajo para permitir el cierre con.commit(); System.out.println ( "**** Transaccin confirmada" ); // Cierre la conexin con.close(); System.out.println("**** Desconectado de la fuente de datos"); 6

System.out.println("**** Salida de JDBC de la clase EzJava - sin errores"); } catch (ClassNotFoundException e) { System.err.println("No se pudo cargar el controlador JDBC"); System.out.println("Exception: " + e); e.printStackTrace(); } catch(SQLException ex) { System.err.println("Informacin sobre SQLException"); while(ex!=null) { System.err.println ("Mensaje de error: " + ex.getMessage()); System.err.println ("SQLSTATE: " + ex.getSQLState()); System.err.println ("Cdigo de error: " + ex.getErrorCode()); ex.printStackTrace(); ex = ex.getNextException(); // Para controladores que soportan // excepciones encadenadas } } } // End main } // End EzJava 5

Figura 1. Aplicacin JDBC sencilla (Parte 2 de 2)

Notas para la Figura 1 en la pgina 24:


Nota 1 Descripcin Esta sentencia importa el paquete java.sql, el cual contiene la API bsica de JDBC. Para obtener informacin acerca de otros paquetes Java a los que pueda necesitar acceder, consulte Acceso a paquetes Java para soporte de JDBC. La variable empNo de tipo String realiza la funcin de una variable del lenguaje principal. Es decir, se utiliza para contener datos obtenidos en una consulta de SQL. Consulte el tema Declarar variables en aplicaciones JDBC para obtener ms informacin. Estos dos conjuntos de sentencias muestran cmo conectar con una fuente de datos utilizando una de dos interfaces disponibles. Consulte el tema Conectar a una fuente de datos utilizando JDBC para obtener ms detalles. Estos dos conjuntos de sentencias muestran cmo ejecutar una operacin SELECT en JDBC. Para obtener informacin sobre cmo ejecutar otras operaciones de SQL, consulte el tema Ejecutar SQL en una aplicacin JDBC. Este bloque try/catch muestra el uso de la clase SQLException para el manejo de errores de SQL. Para obtener ms informacin acerca de cmo manejar errores de SQL, consulte Manejo de una excepcin de SQL bajo el controlador IBM DB2 para JDBC y SQLJ. Para obtener informacin acerca de cmo manejar avisos de SQL, consulte Manejo de avisos SQL en una aplicacin JDBC. Esta sentencia desconecta la aplicacin respecto de la fuente de datos. Consulte el tema Cerrar la conexin con la fuente de datos.

3a y 3b 4a y 4b 5

Captulo 2. Programacin de aplicaciones JDBC

25

Conceptos relacionados: v Paquetes Java para el soporte JDBC en la pgina 38 v Conexin de las aplicaciones JDBC a una fuente de datos en la pgina 26 v Variables en aplicaciones JDBC en la pgina 41 v Interfaces JDBC para ejecutar SQL en la pgina 42 Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Manejo de un aviso de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 88

Conexin con servidores de bases de datos en aplicaciones JDBC


Los siguientes temas contienen informacin sobre la conexin con servidores de bases de datos DB2 Database para Linux, UNIX y Windows.

Conexin de las aplicaciones JDBC a una fuente de datos


Para poder ejecutar sentencias de SQL en un programa SQL cualquiera, debe conectarse a un servidor de bases de datos. En JDBC, un servidor de bases de datos se denomina fuente de datos. La Figura 2 en la pgina 27 muestra de qu manera una aplicacin Java se conecta a una fuente de datos para un controlador de tipo 2 o Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2.

26

Desarrollo de aplicaciones Java

Aplicacin Java

DriverManager o DataSource

Controlador* JDBC

Base de datos local o subsistema DB2

Servidor de base de datos

*Cdigo de bytes de Java ejecutado bajo JVM y cdigo nativo


Figura 2. Flujo de una aplicacin Java para un controlador de tipo 2 o Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2

La Figura 3 en la pgina 28 muestra de qu manera una aplicacin Java se conecta a una fuente de datos para Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4.

Captulo 2. Programacin de aplicaciones JDBC

27

Aplicacin Java

DriverManager o DataSource

Controlador* JDBC DRDA

Servidor de base de datos *Cdigo de bytes de Java ejecutado bajo JVM


Figura 3. Flujo de una aplicacin Java para Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4

Conceptos relacionados: v Conexin de aplicaciones DB2 a una fuente de datos utilizando la interfaz DriverManager con el controlador JDBC de DB2 de tipo 2 en la pgina 28 Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30

Conexin de aplicaciones DB2 a una fuente de datos utilizando la interfaz DriverManager con el controlador JDBC de DB2 de tipo 2
Una aplicacin JDBC puede establecer una conexin con una fuente de datos utilizando la interfaz DriverManager de JDBC, la cual forma parte del paquete java.sql. Primero la aplicacin Java carga el controlador JDBC invocando el mtodo Class.forName. Despus de cargar el controlador, la aplicacin conecta con un servidor de bases de datos invocando el mtodo DriverManager.getConnection. Para el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 JDBC de tipo 2), se carga el controlador invocando el mtodo Class.forName con el argumento siguiente:
COM.ibm.db2.jdbc.app.DB2Driver

El cdigo siguiente muestra la carga del controlador JDBC de DB2 de tipo 2:

28

Desarrollo de aplicaciones Java

try { // Cargar el Controlador JDBC de DB2 de tipo 2 con DriverManager Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); }

El bloque catch se utiliza para imprimir un error si se no se encuentra el controlador. Despus de cargar el controlador, se conecta a la fuente de datos invocando el mtodo DriverManager.getConnection. Puede utilizar uno de los formatos siguientes de getConnection:
getConnection(String url); getConnection(String url, usuario, contrasea); getConnection(String url, java.util.Properties info);

El argumento url representa una fuente de datos. Para el Controlador JDBC de DB2 de tipo 2, especifique un URL de la forma siguiente: Sintaxis de un URL para el Controlador JDBC de DB2 de tipo 2:
jdbc:db2:basedatos

Los elementos del URL tienen los significados siguientes: jdbc:db2: jdbc:db2: indica que la conexin es con un servidor de bases de datos DB2. basedatos Es un alias de base de datos. El alias hace referencia a la entrada del catlogo de bases de datos DB2 que existe en el cliente DB2. El argumento info es un objeto de tipo java.util.Properties que contiene un conjunto de propiedades de controlador correspondientes a la conexin. El argumento infor se especifica como alternativa a especificar las series propiedad=valor en el URL. Especificacin de un ID de usuario y contrasea para una conexin: existen varias formas de especificar un ID de usuario y una contrasea para una conexin: v Utilice el formato del mtodo getConnection en el que se especifica el usuario y contrasea. v Utilice el formato del mtodo getConnection en el que se especifica info despus de definir las propiedades correspondientes al usuario y contrasea en un objeto java.util.Properties. Ejemplo: definir el ID de usuario y contrasea en los parmetros de usuario y contrasea:
String url = "jdbc:db2:toronto"; // Definir URL para fuente de datos String user = "db2adm"; String password = "db2adm"; Connection con = DriverManager.getConnection(url, user, password); // Crear conexin

Captulo 2. Programacin de aplicaciones JDBC

29

Ejemplo: definir el ID de usuario y contrasea en un objeto java.util.Properties:


Properties properties = new Properties(); // Crear objeto Properties properties.put("user", "db2adm"); // Definir ID de usuario para conexin properties.put("password", "db2adm"); // Definir contrasea para conexin String url = "jdbc:db2:toronto"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear conexin

Conceptos relacionados: v Seguridad cuando se utiliza el controlador JDBC de DB2 de tipo 2 en la pgina 153

Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ
Una aplicacin JDBC puede establecer una conexin con una fuente de datos utilizando la interfaz DriverManager de JDBC, la cual forma parte del paquete java.sql. Primero la aplicacin Java carga el controlador JDBC invocando el mtodo Class.forName. Despus de cargar el controlador, la aplicacin conecta con un servidor de bases de datos invocando el mtodo DriverManager.getConnection. Para el Controlador IBM DB2 para JDBC y SQLJ, el controlador se carga invocando el mtodo Class.forName con este argumento:
com.ibm.db2.jcc.DB2Driver

Para mantener la compatibilidad con controladores JDBC anteriores, puede utilizar el argumento siguiente como alternativa:
COM.ibm.db2os390.sqlj.jdbc.DB2SQLJDriver

El cdigo siguiente muestra la carga del Controlador IBM DB2 para JDBC y SQLJ:
try { // Carga del controlador IBM DB2 para JDBC y SQLJ con DriverManager Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); }

El bloque catch se utiliza para imprimir un error si se no se encuentra el controlador. Despus de cargar el controlador, se conecta a la fuente de datos invocando el mtodo DriverManager.getConnection. Puede utilizar uno de los formatos siguientes de getConnection:
getConnection(String url); getConnection(String url, usuario, contrasea); getConnection(String url, java.util.Properties info);

Para Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4, el mtodo getConnection debe especificar un ID de usuario y una contrasea mediante parmetros o valores de propiedad. El argumento url representa una fuente de datos e indica el tipo de conectividad JDBC que se est utilizando.

30

Desarrollo de aplicaciones Java

Para Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4, especifique un URL de la forma siguiente: Sintaxis de un URL para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4:
jdbc:db2: jdbc:db2j:net: //servidor :puerto : propiedad = valor ; /basedatos

Para Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2, especifique un URL en una de las formas siguientes: Sintaxis para un URL del Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2:
jdbc:db2:basedatos jdbc:db2os390:basedatos jdbc:db2os390sqlj:basedatos jdbc:default:connection jdbc:db2os390 jdbc:db2os390sqlj

propiedad = valor ;

Los elementos del URL tienen los significados siguientes: jdbc:db2: o jdbc:db2j:net: El significado de la porcin inicial del URL es el siguiente: jdbc:db2: Indica que la conexin es con un servidor DB2 para z/OS o DB2 Database para Linux, UNIX y Windows. jdbc:db2j:net: Indica que la conexin es con un servidor IBM Cloudscape remoto. servidor El nombre de dominio o direccin IP del servidor de bases de datos. puerto El nmero de puerto del servidor TCP/IP que est asignado al servidor de bases de datos. Es un valor entero comprendido entre 0 y 65535. El valor por omisin es 446. basedatos Nombre del servidor de bases de datos. Este nombre depende de si se utiliza el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 o el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2. Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4: v Si la conexin es con un servidor DB2 para z/OS, basedatos es el nombre de ubicacin de DB2 que se define durante la instalacin. Todos los caracteres del nombre de ubicacin de DB2 deben estar en maysculas. El Controlador

Captulo 2. Programacin de aplicaciones JDBC

31

IBM DB2 para JDBC y SQLJ no convierte en maysculas para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 los caracteres de la base de datos que estn en minsculas. Puede determinar el nombre de ubicacin ejecutando la sentencia de SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

v Si la conexin es con un servidor DB2 para z/OS, todos los caracteres de la basedatos deben estar en maysculas. v Si la conexin es con un servidor DB2 Database para Linux, UNIX y Windows, basedatos es el nombre de la base de datos que se define durante la instalacin. v Si la conexin es con un servidor IBM Cloudscape, basedatos es el nombre totalmente calificado del archivo que contiene la base de datos. Este nombre debe estar encerrado entre comillas dobles ("). Por ejemplo:
"c:/basedatos/testdb"

Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2: v basedatos es el nombre de base de datos que se define durante la instalacin, si el valor de la propiedad de conexin serverName es nulo. Si el valor de la propiedad serverName no es nulo, basedatos es un alias de base de datos. v Si la conexin es con un servidor DB2 para z/OS o un servidor DB2 UDB para iSeries, todos los caracteres de basedatos deben estar en maysculas. propiedad=valor; Es una propiedad de la conexin JDBC. Para conocer las definiciones de estas propiedades consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ. El argumento info es un objeto de tipo java.util.Properties que contiene un conjunto de propiedades de controlador correspondientes a la conexin. El argumento infor se especifica como alternativa a especificar las series propiedad=valor en el URL. Consulte el tema Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener informacin sobre las propiedades que se pueden especificar. Especificacin de un ID de usuario y contrasea para una conexin: existen varias formas de especificar un ID de usuario y una contrasea para una conexin: v Utilice la modalidad del mtodo getConnection por el que se especifica el url con clusulas propiedad=valor;, e incluya las propiedades correspondientes al usuario y contrasea en el URL. v Utilice la modalidad del mtodo getConnection por el que se especifica el usuario y contrasea. v Utilice la modalidad del mtodo getConnection en la que se especifica info, despus de definir las propiedades correspondientes al usuario y contrasea en un objeto java.util.Properties. Ejemplo: definir el ID de usuario y contrasea en un URL:
String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose:" + "user=db2adm;password=db2adm;"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url); // Crear conexin

Ejemplo: definir el ID de usuario y contrasea en los parmetros de usuario y contrasea:

32

Desarrollo de aplicaciones Java

String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose"; // Definir URL para fuente de datos String user = "db2adm"; String password = "db2adm"; Connection con = DriverManager.getConnection(url, user, password); // Crear conexin

Ejemplo: definir el ID de usuario y contrasea en un objeto java.util.Properties:


Properties properties = new Properties(); // Crear objeto Properties properties.put("user", "db2adm"); // Definir ID de usuario para conexin properties.put("password", "db2adm"); // Definir contrasea para conexin String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear conexin

Conceptos relacionados: v Seguridad en el controlador IBM DB2 para JDBC y SQLJ en la pgina 154 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Conexin a una fuente de datos utilizando la interfaz DataSource


El uso de DriverManager para conectar con una fuente de datos reduce la portabilidad, pues la aplicacin debe identificar un nombre de clase y URL determinados para el controlador JDBC. El nombre de clase y el URL del controlador son especficos de un proveedor de JDBC, de la implementacin del controlador y de la fuente de datos. Si es necesario que sus aplicaciones se puedan migrar de una fuente de datos a otra, debe utilizar la interfaz DataSource. Cuando se conecta a una fuente de datos utilizando la interfaz DataSource, utiliza un objeto DataSource. La forma ms sencilla de utilizar un objeto DataSource es crear y utilizar el objeto en la misma aplicacin, tal como hace en la interfaz DriverManager. Sin embargo, este mtodo no proporciona portabilidad. La Figura 4 muestra un ejemplo de creacin y utilizacin de un objeto DataSource en la misma aplicacin.
Figura 4. Creacin y utilizacin de un objeto DataSource en la misma aplicacin import java.sql.*; import javax.sql.*; // Base JDBC // Mtodos para producir aplicaciones // del lado del servidor mediante Java import com.ibm.db2.jcc.*; // Interfaces del controlador IBM DB2 para JDBC // y SQLJ 1 DB2SimpleDataSource db2ds=new DB2SimpleDataSource(); 2 db2ds.setDatabaseName("db2loc1"); 3 // Asignar el nombre de ubicacin db2ds.setDescription("Our Sample Database"); // Descripcin de la documentacin db2ds.setUser("john"); // Asignar el ID de usuario db2ds.setPassword("db2"); // Asignar la contrasea Connection con=db2ds.getConnection(); 4 // Crear un objeto Connection

Captulo 2. Programacin de aplicaciones JDBC

33

Nota 1 2

Descripcin Importa el paquete donde reside la implementacin de la interfaz DataSource. Crea un objeto DB2SimpleDataSource.DB2SimpleDataSource es una de las implementaciones para DB2 de la interfaz DataSource. Consulte el tema Crear y desplegar objetos DataSource para obtener informacin sobre las implementaciones de DataSource para DB2. Los mtodos setDatabaseName, setDescription, setUser y setPassword asignan atributos al objeto DB2SimpleDataSource. Consulte el tema Propiedades para el controlador IBM DB2 para JDBC y SQLJ para obtener informacin sobre los atributos que puede definir para un objeto DB2SimpleDataSource cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ. Establece una conexin con la fuente de datos representada por el objeto db2ds de DB2SimpleDataSource.

La mejor manera de utilizar un objeto DataSource consiste en que el administrador del sistema lo cree y gestione de forma independiente, utilizando WebSphere o alguna otra herramienta. El programa que crea y gestiona un objeto DataSource tambin utiliza Java Naming and Directory Interface (JNDI) para asignar un nombre lgico al objeto DataSource. La aplicacin JDBC que hace uso del objeto DataSource puede luego referirse al objeto utilizando su nombre lgico, y no necesita ninguna informacin sobre la fuente de datos subyacente. Adems, el administrador del sistema puede modificar los atributos de la fuente de datos y el usuario no necesita cambiar su programa de aplicacin. Para obtener ms informacin sobre cmo utilizar WebSphere para desplegar objetos DataSource, dirjase al URL siguiente de la Web:
http://www.ibm.com/software/webservers/appserv/

Para aprender sobre el despliegue de objetos DataSource, consulte el tema Crear y desplegar objetos DataSource. Puede utilizar la interfaz DataSource y la interfaz DriverManager en la misma aplicacin, pero para lograr una portabilidad mxima es recomendable que utilice solo la interfaz DataSource para obtener conexiones. El resto de este tema explica cmo crear una conexin utilizando un objeto DataSource, dando por supuesto que el administrador del sistema ya ha creado el objeto y le ha asignado un nombre lgico. Para obtener una conexin utilizando un objeto DataSource, siga estos pasos: 1. Consulte al administrador del sistema para conocer el nombre lgico de la fuente de datos con la que desea conectar. 2. Cree un objeto Context para utilizarlo en el paso siguiente. La interfaz Context forma parte de Java Naming and Directory Interface (JNDI) y no de JDBC. 3. En su programa de aplicacin, utilice JNDI para obtener el objeto DataSource que est asociado al nombre lgico de la fuente de datos. 4. Utilice el mtodo DataSource.getConnection para obtener la conexin. Puede utilizar uno de los formatos siguientes del mtodo getConnection:
getConnection(); getConnection(String usuario, String contrasea);

Utilice la segunda forma si necesita especificar un ID de usuario y una contrasea para la conexin que sean diferentes de los que se especificaron al desplegar el objeto DataSource.

34

Desarrollo de aplicaciones Java

La Figura 5 muestra un ejemplo del cdigo necesario en su programa de aplicacin para obtener una conexin utilizando un objeto DataSource, donde jdbc/sampledb es el nombre lgico de la fuente de datos con la que desea conectar. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Figura 5. Obtencin de una conexin utilizando un objeto DataSource import java.sql.*; import javax.naming.*; import javax.sql.*; ... Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("jdbc/sampledb"); Connection con=ds.getConnection();

2 3 4

Tareas relacionadas: v Creacin y despliegue de objetos DataSource en la pgina 37 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Determinacin del tipo de conectividad del Controlador IBM DB2 para JDBC y SQLJ que debe utilizarse
El Controlador IBM DB2 para JDBC y SQLJ da soporte a dos tipos de conectividad: la conectividad de tipo 2 y de tipo 4. En el caso de la interfaz DriverManager, el tipo de conectividad se especifica a travs del URL del mtodo DriverManager.getConnection. En el caso de la interfaz DataSource, el tipo de conectividad se especifica a travs de la propiedad driverType. En la tabla siguiente, se resumen las diferencias entre las conectividades de tipo 2 y tipo 4:
Tabla 6. Comparacin entre el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 y el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 Soporte del Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 Soporte del Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 Soportados directamente por el controlador para una conexin de una sola JVM. Soportados mediante DB2 Connect en todas las JVM. Protocolos de comunicacin Rendimiento Instalacin Procedimientos almacenados Proceso de transacciones distribuidas (XA) TCP/IP Mejor para acceder a un servidor de DB2 local. Requiere la instalacin de bibliotecas nativas y de clases Java. TCP/IP Mejor para acceder a un servidor de DB2 remoto. Requiere la instalacin de clases Java solamente.

Funcin

Equilibrado de carga de trabajo Soportados mediante DB2 Connect SYSPLEX y concentrador de conexin

Se pueden utilizar para llamar o Se pueden utilizar slo para llamar a ejecutar procedimientos almacenados. procedimientos almacenados. Soportado Soportado

Captulo 2. Programacin de aplicaciones JDBC

35

Tabla 6. Comparacin entre el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 y el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 (continuacin) Soporte del Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 Compatible Soporte del Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 Compatible

Funcin Compatibilidad J2EE 1.4

Los puntos siguientes pueden resultar de ayuda a la hora de determinar el tipo de conectividad que debe utilizarse. Utilice el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en las circunstancias siguientes: v La aplicacin JDBC o SQLJ se ejecuta localmente la mayor parte del tiempo. El rendimiento de las aplicaciones locales mejora con la conectividad de tipo 2. v Est ejecutando un procedimiento almacenado de Java. El entorno de un procedimiento almacenado consta de dos partes: un programa cliente, desde el cual se realizan llamadas a procedimientos almacenados, y un programa de servidor, donde se encuentran los procedimientos almacenados. Se puede llamar a un procedimiento almacenado de un programa JDBC o SQLJ que utilice conectividad de tipo 2 o tipo 4; sin embargo, para ejecutar un procedimiento almacenado de Java, deber utilizar la conectividad de tipo 2. Utilice el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 en las circunstancias siguientes: v La aplicacin JDBC o SQLJ se ejecuta de forma remota la mayor parte del tiempo. El rendimiento de las aplicaciones remotas mejora con la conectividad de tipo 4. v Est utilizando el controlador IBM DB2 para soporte del equilibrado de carga de trabajo Sysplex y del concentrador de conexin JDBC y SQLJ. Tareas relacionadas: v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Objetos de conexin JDBC


Cuando se conecta a una fuente de datos mediante cualquiera de los dos mtodos de conexin, crea un objeto Connection, que representa la conexin con la fuente de datos. Utilice este objeto Connection para realizar lo siguiente: v Crear objetos Statement, PreparedStatement, y CallableStatement para ejecutar sentencias de SQL. Esto se trata en el tema Ejecutar SQL en una aplicacin JDBC. v Reunir informacin sobre la fuente de datos a la que est conectado. Este proceso se trata en el tema Uso de DatabaseMetaData para obtener informacin sobre una fuente de datos. v Confirmar o retrotraer transacciones. Puede confirmar transacciones de forma manual o automtica. Estas operaciones se tratan en el tema Confirmar o retrotraer una transaccin JDBC.

36

Desarrollo de aplicaciones Java

v Cerrar la conexin con la fuente de datos. Esta operacin se trata en el tema Cerrar una conexin con una fuente de datos JDBC. Conceptos relacionados: v Interfaces JDBC para ejecutar SQL en la pgina 42 Tareas relacionadas: v Desconexin de servidores de bases de datos en aplicaciones JDBC en la pgina 96 v Confirmacin o retrotraccin de transacciones JDBC en la pgina 83 v Obtencin de informacin acerca de una fuente de datos mediante mtodos DatabaseMetaData en la pgina 39

Creacin y despliegue de objetos DataSource


A partir de la versin 2.0, JDBC proporciona la interfaz DataSource para conectar con una fuente de datos. La utilizacin de la interfaz DataSource es la forma preferida de conectar con una fuente de datos. La utilizacin de la interfaz DataSource comprende dos etapas: v Crear y desplegar objetos DataSource. Normalmente, esto lo hace un administrador del sistema utilizando una herramienta como WebSphere Application Server. v Utilizar objetos DataSource para crear una conexin. Esto se realiza en el programa de aplicacin. Este tema contiene informacin necesaria para que el propio usuario pueda crear y desplegar objetos DataSource. El Controlador IBM DB2 para JDBC y SQLJ proporciona las siguientes implementaciones de DataSource: v com.ibm.db2.jcc.DB2SimpleDataSource, que no da soporte a la agrupacin de conexiones. Puede utilizar esta implementacin con el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 o el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. v com.ibm.db2.jcc.DB2ConnectionPoolDataSource, que soporta la agrupacin de conexiones. Puede utilizar esta implementacin con el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 o el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. v com.ibm.db2.jcc.DB2XADataSource, que da soporte a la agrupacin de conexiones y a las transacciones distribuidas. El soporte para la agrupacin de conexiones es proporcionado por WebSphere Application Server u otro servidor de aplicaciones. Puede utilizar esta implementacin solamente con el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. El controlador JDBC de DB2 de tipo 2 proporciona las implementaciones de DataSource siguientes: v COM.ibm.db2.jdbc.DB2DataSource, que est habilitado para la agrupacin de conexiones. Con esta implementacin; la agrupacin de conexiones se maneja internamente y es transparente para la aplicacin. v COM.ibm.db2.jdbc.DB2XADataSource, que no tiene soporte interno para las transacciones distribuidas y la agrupacin de conexiones. Con esta implementacin, debe gestionar usted mismo las transacciones distribuidas y la

Captulo 2. Programacin de aplicaciones JDBC

37

agrupacin de conexiones, ya sea grabando su propio cdigo o utilizando una herramienta como WebSphere Application Server. Cuando crea y despliega un objeto DataSource, debe efectuar estas tareas: 1. Crear una instancia de la implementacin de DataSource apropiada. 2. Establecer las propiedades del objeto DataSource. 3. Registrar el objeto en el servicio de denominacin de Java Naming and Directory Interface (JNDI). El ejemplo de la Figura 6 muestra cmo realizar esas tareas.
import java.sql.*; import javax.naming.*; import javax.sql.*; import com.ibm.db2.jcc.*; // // // // Base JDBC Servicios de denominacin de JNDI Mtodos para producir aplicaciones del lado del servidor mediante Java // Implementacin DB2 de APIs de extensin // estndar de JDBC 1 2

DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); db2ds.setDatabaseName("db2loc1"); db2ds.setDescription("Our Sample Database"); db2ds.setUser("john"); db2ds.setPassword("db2"); . . . Context ctx=new InitialContext(); Ctx.bind("jdbc/sampledb",db2ds); Figura 6. Ejemplo de creacin y despliegue de un objeto DataSource Nota 1 2 3 4

3 4

Descripcin Crea una instancia de la clase DB2SimpleDataSource. Esta sentencia y las tres sentencias siguientes definen valores para propiedades del objeto DB2SimpleDataSource. Crea un contexto para su utilizacin por JNDI. Asocia el objeto db2ds de DBSimple2DataSource con el nombre lgico jdbc/sampledb. Una aplicacin que haga uso de este objeto puede hacer referencia a l utilizando el nombre jdbc/sampledb.

Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Paquetes Java para el soporte JDBC


Para invocar mtodos de JDBC necesita poder acceder a todos los paquetes Java (o parte de ellos) donde residen estos mtodos. Puede hacerlo importando los paquetes o clases especficas, o bien utilizando los nombres de clase totalmente calificados. Puede necesitar los paquetes o clases siguientes para su programa de JDBC: java.sql Contiene la API bsica de JDBC. javax.naming Contiene clases e interfaces para Java Naming and Directory Interface (JNDI), que se suele utilizar para implementar una DataSource (fuente de datos).

38

Desarrollo de aplicaciones Java

javax.sql Contiene mtodos para producir aplicaciones de servidor mediante Java javax.transaction Contiene soporte JDBC para transacciones distribuidas del controlador JDBC de DB2 JDBC de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 JDBC de tipo 2). com.ibm.db2.jcc Contiene la implementacin especfica de DB2 para el Controlador IBM DB2 para JDBC y SQLJ. COM.ibm.db2.jdbc Contiene la implementacin especfica de DB2 de JDBC del controlador de tipo JDBC de DB2. Conceptos relacionados: v Pasos bsicos para escribir una aplicacin JDBC en la pgina 23

Obtencin de informacin acerca de una fuente de datos mediante mtodos DatabaseMetaData


La interfaz DatabaseMetaData contiene mtodos para recuperar informacin sobre una fuente de datos. Estos mtodos son tiles cuando escribe aplicaciones genricas que pueden acceder a diversas fuentes de datos. En estos tipos de aplicaciones, es necesario comprobar si una fuente de datos puede manejar diversas operaciones de base de datos antes de ejecutarlas. Por ejemplo, debe determinar si el controlador de una fuente de datos se encuentra en el nivel JDBC 3.0 antes de invocar mtodos JDBC 3.0 para ese controlador. Los mtodos de DatabaseMetaData proporcionan los tipos de informacin siguientes: v Caractersticas soportadas por la fuente de datos, tales como el nivel SQL de ANSI v Informacin especfica sobre la fuente de datos, tal como el nivel del controlador v Lmites, tales como el nmero mximo de columnas que puede tener un ndice v Indicacin de si la fuente de datos soporta sentencias de definicin de datos (CREATE, ALTER, DROP, GRANT, REVOKE) v Lista de objetos contenidos en la fuente de datos, tales como tablas, ndices o procedimientos v Indicacin de si la fuente de datos soporta diversas funciones JDBC, tales como las actualizaciones por lotes o los conjuntos de resultados desplazables ResultSet v Lista de funciones escalares soportadas por el controlador Si su aplicacin se conecta a un servidor DB2 para z/OS, es necesario instalar en ese servidor varios procedimientos almacenados para poder invocar algunos mtodos DatabaseMetaData que necesitan informacin del catlogo de DB2. Los procedimientos almacenados son: v SQLCOLPRIVILEGES v SQLCOLUMNS v SQLFOREIGNKEYS v SQLGETTYPEINFO v SQLPRIMARYKEYS v SQLPROCEDURECOLS v SQLPROCEDURES
Captulo 2. Programacin de aplicaciones JDBC

39

v v v v v

SQLSPECIALCOLUMNS SQLSTATISTICS SQLTABLEPRIVILEGES SQLTABLES SQLUDTS

Para DB2 UDB para OS/390 y z/OS, Versin 7, los procedimientos almacenados se proporcionan en los PTF. El PTF se puede solicitar mediante los canales normales de servicio utilizando el nmero PTF siguiente:
Tabla 7. PTF para DB2 para z/OS Versin de DB2 para z/OS Versin 7 Nmero de PTF UQ72083

Pregunte al administrador del sistema de DB2 para z/OS si estos procedimientos almacenados estn instalados. Para invocar mtodos de DatabaseMetaData, debe seguir estos pasos bsicos: 1. Cree un objeto DatabaseMetaData invocando el mtodo getMetaData para la conexin. 2. Invoque mtodos de DatabaseMetaData para obtener informacin sobre la fuente de datos. 3. Si el mtodo devuelve un conjunto de resultados: a. En un bucle, posicione el cursor utilizando el mtodo next y recupere datos de cada columna de la fila actual del objeto ResultSet utilizando mtodos getXXX. b. Invoque el mtodo close para cerrar el objeto ResultSet. Por ejemplo, el cdigo siguiente muestra cmo utilizar mtodos DatabaseMetaData para determinar la versin del controlador, obtener una lista de los procedimientos almacenados disponibles en la fuente de datos y obtener una lista de las funciones de fecha y hora. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

40

Desarrollo de aplicaciones Java

Connection con; DatabaseMetaData dbmtadta; ResultSet rs; int mtadtaint; String procSchema; String procName; String dtfnList; ... dbmtadta = con.getMetaData(); // Crear objeto DatabaseMetaData 1 mtadtaint = dmtadta.getDriverVersion(); 2 // Comprobar la versin del controlador System.out.println("Driver version: " + mtadtaint); rs = dbmtadta.getProcedures(null, null, "%"); // Obtener informacin de todos los procedimientos while (rs.next()) { // Posicionar el cursor 3a procSchema = rs.getString("PROCEDURE_SCHEM"); // Obtener el esquema del procedimiento procName = rs.getString("PROCEDURE_NAME"); // Obtener el nombre del procedimiento System.out.println(procSchema + "." + procName); // Imprimir nombre de procedimiento calificado } dtfnList = dbmtadta.getTimeDateFunctions(); // Obtener lista de las funciones de fecha y // hora soportadas System.out.println("Supported datetime functions:"); System.out.println(dtfnList); // Imprimir la lista de las funciones de fecha // y hora rs.close(); // Cerrar ResultSet 3b Figura 7. Uso de mtodos DatabaseMetaData para obtener informacin sobre una fuente de datos

Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Variables en aplicaciones JDBC


Al igual que en cualquier otra aplicacin Java, cuando escribe aplicaciones JDBC, debe declarar variables. En las aplicaciones Java, esas variables se conocen como identificadores Java. Algunos de esos identificadores tienen la misma funcin que las variables del sistema principal en otros lenguajes de programacin: contienen los datos que se intercambian con tablas de DB2. El identificador empNo contenido en el programa de ejemplo del tema in Pasos bsicos para escribir una aplicacin JDBC es un ejemplo de un identificador Java de tipo String que contiene datos que se obtienen de una columna CHAR de una tabla de DB2. Los tipos de datos Java que seleccione pueden afectar al rendimiento del sistema, pues DB2 elige mejores vas de acceso cuando los tipos de datos de las variables Java se corresponden estrechamente con los tipos de datos DB2. Los tipos de datos Java, JDBC y SQL muestran las correlaciones recomendadas de los tipos de datos Java y JDBC con los tipos de datos SQL. Conceptos relacionados: v Pasos bsicos para escribir una aplicacin JDBC en la pgina 23 Informacin relacionada:

Captulo 2. Programacin de aplicaciones JDBC

41

v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Ejecucin de sentencias de SQL en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la ejecucin de sentencias de SQL en aplicaciones JDBC. v Interfaces JDBC para ejecutar SQL v Actualizacin de tablas de DB2 en aplicaciones JDBC en la pgina 43 v Recuperacin de datos de tablas de DB2 en aplicaciones JDBC en la pgina 48 v Llamada a procedimientos almacenados en aplicaciones JDBC en la pgina 58 v Trabajo con LOB en aplicaciones JDBC en la pgina 63 v Uso de valores ROWID en JDBC con el controlador IBM DB2 para JDBC y SQLJ en la pgina 67 v Tipos diferenciados en aplicaciones JDBC en la pgina 68 v Puntos de salvaguarda en aplicaciones JDBC en la pgina 69 v Recuperacin de valores de columnas de identidad en aplicaciones JDBC en la pgina 70 v Suministro de informacin ampliada sobre el cliente al servidor DB2 con el Controlador IBM DB2 para JDBC y SQLJ en la pgina 73

Interfaces JDBC para ejecutar SQL


Puede ejecutar sentencias de SQL dentro de un programa SQL tpico para insertar, actualizar, suprimir o fusionar datos de tablas, recuperar datos de tablas o llamar procedimientos almacenados. Para realizar las mismas funciones en un programa JDBC, debe invocar mtodos que estn definidos en las interfaces siguientes: v La interfaz Statement soporta la ejecucin de todas las sentencias de SQL. Las interfaces siguientes heredan mtodos de la interfaz Statement: La interfaz PreparedStatement soporta cualquier sentencia de SQL que contenga marcadores de parmetros de entrada. Los marcadores de parmetros representan variables de entrada. La interfaz PreparedStatement tambin se puede utilizar para sentencias de SQL sin marcadores de parmetros. Con el Controlador IBM DB2 para JDBC y SQLJ, la interfaz PreparedStatement permite invocar procedimientos almacenados que tienen parmetros de entrada y ningn parmetro de salida, y que no devuelven ningn conjunto de resultados. La interfaz CallableStatement soporta la invocacin de un procedimiento almacenado. La interfaz CallableStatement permite invocar procedimientos almacenados con parmetros de entrada, parmetros de salida, con ambas clases de parmetros o sin parmetros. Con el Controlador IBM DB2 para JDBC y SQLJ, tambin se puede utilizar la interfaz Statement para llamar a procedimientos almacenados, pero stos no deben tener parmetros. v La interfaz ResultSet proporciona acceso a los resultados generados por una consulta. La interfaz ResultSet tiene la misma finalidad que el cursor utilizado en las aplicaciones de SQL para otros lenguajes de programacin. Para obtener una lista completa del soporte de DB2 para interfaces JDBC, consulte el tema Comparacin del soporte de controlador para las API de JDBC. Tareas relacionadas:

42

Desarrollo de aplicaciones Java

v Recuperacin de datos de DB2 mediante el mtodo PreparedStatement.executeQuery en la pgina 52 v Actualizacin de datos de tablas DB2 mediante el mtodo PreparedStatement.executeUpdate en la pgina 44 v Recuperacin de datos de tablas DB2 mediante el mtodo Statement.executeQuery en la pgina 51 v Creacin y modificacin de objetos DB2 mediante el mtodo Statement.executeUpdate en la pgina 43 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264

Actualizacin de tablas de DB2 en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la creacin y modificacin de tablas de DB2 en aplicaciones JDBC. v Creacin y modificacin de objetos DB2 mediante el mtodo Statement.executeUpdate v Actualizacin de datos de tablas DB2 mediante el mtodo PreparedStatement.executeUpdate en la pgina 44 v Obtencin de informacin acerca de parmetros de PreparedStatement mediante mtodos ParameterMetaData en la pgina 45 v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46

Creacin y modificacin de objetos DB2 mediante el mtodo Statement.executeUpdate


Puede utilizar el mtodo Statement.executeUpdate para realizar las acciones siguientes: v Ejecutar sentencias de definicin de datos, tales como CREATE, ALTER, DROP, GRANT y REVOKE v Ejecutar sentencias INSERT, UPDATE, DELETE, y MERGE que no contienen marcadores de parmetros v Con el Controlador IBM DB2 para JDBC y SQLJ, ejecutar la sentencia CALL para invocar procedimientos almacenados que carecen de parmetros y no devuelven conjuntos de resultados. Para ejecutar esas sentencias de SQL, debe seguir estos pasos: 1. Invoque el mtodo Connection.createStatement para crear un objeto Statement. 2. Invoque el mtodo Statement.executeUpdate para ejecutar la operacin de SQL. 3. Invoque el mtodo Statement.close para cerrar el objeto Statement. Por ejemplo, suponga que desea ejecutar esta sentencia de SQL:
UPDATE EMPLOYEE SET PHONENO=4657 WHERE EMPNO=000010

El cdigo siguiente crea el objeto Statement denominado stmt, ejecuta la sentencia UPDATE y devuelve en numUpd el nmero de filas que fueron actualizadas. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

Captulo 2. Programacin de aplicaciones JDBC

43

Connection con; Statement stmt; int numUpd; ... stmt = con.createStatement(); // Crear un objeto Statement numUpd = stmt.executeUpdate( "UPDATE EMPLOYEE SET PHONENO=4657 WHERE EMPNO=000010"); // Ejecutar la actualizacin stmt.close(); // Cerrar el objeto Statement Figura 8. Utilizacin de Statement.executeUpdate

1 2 3

Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Actualizacin de datos de tablas DB2 mediante el mtodo PreparedStatement.executeUpdate


El mtodo Statement.executeUpdate funciona si se actualizan tablas DB2 que tienen valores contantes. No obstante, a menudo es necesario que las actualizaciones impliquen el pase de valores a las tablas de DB2 en variables. Para hacer esto, utilice el mtodo PreparedStatement.executeUpdate. Con el Controlador IBM DB2 para JDBC y SQLJ, puede tambin utilizar PreparedStatement.executeUpdate para invocar procedimientos almacenados que tienen parmetros de entrada y ningn parmetro de salida, y que no devuelven ningn conjunto de resultados. Cuando ejecuta una sentencia de SQL muchas veces, puede obtener un mejor rendimiento creando la sentencia de SQL en forma de objeto PreparedStatement. Por ejemplo, la siguiente sentencia UPDATE permite actualizar la tabla de empleados (EMPLOYEE) solamente para un nico nmero de telfono y nmero de empleado:
UPDATE EMPLOYEE SET PHONENO=4657 WHERE EMPNO=000010

Suponga que desea generalizar la operacin para poder actualizar la tabla de empleados para un conjunto cualquiera de nmeros de telfono y nmeros de empleado. Para ello es necesario que sustituya los valores constantes del nmero de telfono y nmero de empleado por variables:
UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?

Las variables de esta clase se denominan marcadores de parmetros. Para ejecutar una sentencia de SQL con marcadores de parmetros, debe seguir estos pasos: 1. Invoque el mtodo Connection.prepareStatement para crear un objeto PreparedStatement. 2. Invoque mtodos PreparedStatement.setXXX para pasar valores a las variables. 3. Invoque el mtodo PreparedStatement.executeUpdate para actualizar la tabla con los valores variables. 4. Invoque el mtodo PreparedStatement.close para cerrar el objeto PreparedStatement cuando termine de utilizar ese objeto. El cdigo siguiente ejecuta los pasos anteriores para actualizar el nmero de telfono 4657 del empleado cuyo nmero de empleado es 000010. Los nmeros

44

Desarrollo de aplicaciones Java

que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Connection con; PreparedStatement pstmt; int numUpd; ... pstmt = con.prepareStatement( "UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?"); // Crear un objeto PreparedStatement 1 pstmt.setString(1,"4657"); // Asignar primer valor a primer parmetro 2 pstmt.setString(2,"000010"); // Asignar primer valor a segundo parmetro numUpd = pstmt.executeUpdate(); // Ejecutar primera actualizacin 3 pstmt.setString(1,"4658"); // Asignar segundo valor a primer parmetro pstmt.setString(2,"000020"); // Asignar segundo valor a segundo parmetro numUpd = pstmt.executeUpdate(); // Ejecutar segunda actualizacin pstmt.close(); // Cerrar el objeto PreparedStatement 4 Figura 9. Uso de PreparedStatement.executeUpdate para una sentencia de SQL con marcadores de parmetros

Puede tambin utilizar el mtodo PreparedStatement.executeUpdate para sentencias que no tienen marcadores de parmetros. Los pasos para ejecutar un objeto PreparedStatement sin marcadores de parmetros son similares a los pasos para ejecutar el objeto PreparedStatement con marcadores de parmetros, excepto que se omite el paso 2. El ejemplo siguiente muestra estos pasos.
Connection con; PreparedStatement pstmt; int numUpd; ... pstmt = con.prepareStatement( "UPDATE EMPLOYEE SET PHONENO=4657 WHERE EMPNO=000010"); // Crear un objeto PreparedStatement 1 numUpd = pstmt.executeUpdate(); // Ejecutar la actualizacin 3 pstmt.close(); // Cerrar el objeto PreparedStatement 4 Figura 10. Uso de PreparedStatement.executeUpdate para una sentencia de SQL sin marcadores de parmetros

Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Obtencin de informacin acerca de parmetros de PreparedStatement mediante mtodos ParameterMetaData


El Controlador IBM DB2 para JDBC y SQLJ incluye soporte para la interfaz ParameterMetaData. La interfaz ParameterMetaData contiene mtodos obtienen informacin sobre los marcadores de parmetros de un objeto PreparedStatement. Los mtodos de ParameterMetaData proporcionan los tipos de informacin siguientes: v Los tipos de datos de los parmetros, incluida la precisin y escala de los parmetros decimales. v Los nombres de tipos de los parmetros, especficos de la base de datos. Para los parmetros que corresponden a columnas de tabla que estn definidas con tipos diferenciados, estos nombres son los nombres de los tipos diferenciados. v Indicacin de si los parmetros pueden contener nulos. v Indicacin de si los parmetros son parmetros de entrada o de salida.
Captulo 2. Programacin de aplicaciones JDBC

45

v Indicacin de si los valores de un parmetro numrico pueden tener signo. v El nombre de clase Java totalmente calificado que el objeto PreparedStatement.setObject utiliza cuando define un valor de parmetro. Para invocar mtodos de ParameterMetaData, debe seguir estos pasos bsicos: 1. Invoque el mtodo Connection.prepareStatement para crear un objeto PreparedStatement. 2. Invoque el mtodo PreparedStatement.getParameterMetaData para obtener un objeto ParameterMetaData. 3. Invoque ParameterMetaData.getParameterCount para determinar el nmero de parmetros de PreparedStatement. 4. Invoque mtodos de ParameterMetaData para parmetros individuales. Por ejemplo, el cdigo siguiente muestra el uso de mtodos de ParameterMetaData para determinar el nmero y tipo de datos de los parmetros contenidos en una sentencia UPDATE de SQL. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Connection con; ParameterMetaData pmtadta; int mtadtacnt; String sqlType; ... pstmt = con.prepareStatement( "UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?"); // Crear un objeto PreparedStatement pmtadta = pstmt.getParameterMetaData(); // Crear un objeto ParameterMetaData mtadtacnt = pmtadta.getParameterCount(); // Determinar el nmero de parmetros System.out.println("Nmero de parmetros de sentencia: " + mtadtacnt); for (int i = 1; i <= mtadtacnt; i++) { sqlType = pmtadta.getParameterTypeName(i); // Obtener tipo de datos de SQL para // cada parmetro System.out.println("Tipo de SQL del parmetro " + i " es " + sqlType); } ... pstmt.close(); // Cerrar PreparedStatement

1 2 3

Figura 11. Uso de mtodos de ParameterMetaData para obtener informacin sobre un objeto PreparedStatement

Informacin relacionada: v Soporte para las API de JDBC en la pgina 264

Realizacin de actualizaciones por lotes en aplicaciones JDBC


Mediante las actualizaciones por lotes, en lugar de actualizar las filas de una tabla de DB2 de una en una, se puede indicar a JDBC que ejecute un grupo de actualizaciones a la vez. Las sentencias que se pueden incluir en el mismo proceso por lotes de actualizaciones se conocen como sentencias procesables por lotes. Si una sentencia tiene parmetros de entrada o expresiones de lenguaje principal, puede incluir esa sentencia solo en un lote que tenga otras instancias de la misma sentencia. Este tipo de lote se denomina lote homogneo. Si una sentencia carece de parmetros de entrada, puede incluir esa sentencia en un lote solo si las dems sentencias del lote no tienen parmetros de entrada ni expresiones de lenguaje

46

Desarrollo de aplicaciones Java

principal. Este tipo de lote se denomina lote heterogneo. Dos sentencias que se puedan incluir en el mismo lote se dice que son compatibles por lote. Utilice los siguientes mtodos de Sentencia para crear, ejecutar y eliminar un lote de actualizaciones SQL: v addBatch v executeBatch v clearBatch Utilice el siguiente mtodo de sentencia preparada y sentencia invocable para crear un lote de parmetros para que una sentencia individual se pueda ejecutar varias veces en un lote, con un conjunto de parmetros diferente para cada ejecucin. v addBatch Para realizar actualizaciones por lotes utilizando varias sentencias sin parmetros de entrada, siga estos pasos bsicos: 1. Invoque el mtodo createStatement para crear un objeto Statement. 2. Para cada sentencia de SQL que desee ejecutar en el lote, invoque el mtodo addBatch. 3. Invoque el mtodo executeBatch para ejecutar el lote de sentencias. 4. Compruebe si se han producido errores. Si no han ocurrido errores: a. Obtenga el nmero de filas afectadas por cada sentencia de SQL a partir de la matriz devuelta por la invocacin de executeBatch. Este nmero no incluye las filas afectadas por activadores o por la aplicacin de la integridad referencial. b. Si AutoCommit est inhabilitado para el objeto Connection, invoque el mtodo commit para confirmar los cambios. Si AutoCommit est habilitado para el objeto Connection, el Controlador IBM DB2 para JDBC y SQLJ aade un mtodo commit al final del proceso por lotes. Para realizar actualizaciones por lotes utilizando una sola sentencia con varios conjuntos de parmetros de entrada, siga estos pasos bsicos: 1. Invoque el mtodo prepareStatement para crear un objeto PreparedStatement para la sentencia de SQL con parmetros de entrada. 2. Para cada conjunto de valores de parmetros de entrada: a. Ejecute mtodos setXXX para asignar valores a los parmetros de entrada. b. Invoque el mtodo addBatch para aadir el conjunto de parmetros de entrada al lote. 3. Invoque el mtodo executeBatch para ejecutar las sentencias con todos los conjuntos de parmetros. 4. Compruebe si se han producido errores. Si no han ocurrido errores: a. Obtenga el nmero de filas afectadas por cada ejecucin de la sentencia de SQL a partir de la matriz devuelta por la invocacin de executeBatch. b. Si AutoCommit est inhabilitado para el objeto Connection, invoque el mtodo commit para confirmar los cambios. Si AutoCommit est habilitado para el objeto Connection, el Controlador IBM DB2 para JDBC y SQLJ aade un mtodo commit al final del proceso por lotes. Ejemplo de actualizacin por lotes: en el siguiente fragmento de cdigo, dos conjuntos de parmetros forman parte de un lote. Luego, una sentencia UPDATE
Captulo 2. Programacin de aplicaciones JDBC

47

que toma dos parmetros de entrada se ejecuta dos veces, una vez con cada conjunto de parmetros. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
try { ... PreparedStatement prepStmt = con.prepareStatement( "UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?"); prepStmt.setString(1,mgrnum1); prepStmt.setString(2,deptnum1); prepStmt.addBatch();

1 2a 2b

prepStmt.setString(1,mgrnum2); prepStmt.setString(2,deptnum2); prepStmt.addBatch(); int [] numUpdates=prepStmt.executeBatch(); 3 for (int i=0; i < numUpdates.length; i++) { 4a if (numUpdates[i] == SUCCESS_NO_INFO) System.out.println("Execution " + i + ": unknown number of rows updated"); else System.out.println("Execution " + i + "successful: " numUpdates[i] + " rows updated"); } con.commit(); 4b } catch(BatchUpdateException b) { // process BatchUpdateException } Figura 12. Realizacin de una actualizacin por lotes

Tareas relacionadas: v Confirmacin o retrotraccin de transacciones JDBC en la pgina 83 Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Recuperacin de datos de tablas de DB2 en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la recuperacin de datos de tablas de DB2 en aplicaciones JDBC. v Caractersticas de un conjunto de resultados de JDBC con el controlador IBM DB2 para JDBC y SQLJ v Obtencin de informacin acerca de un conjunto de resultados utilizando mtodos ResultSetMetaData en la pgina 50 v Recuperacin de datos de tablas DB2 mediante el mtodo Statement.executeQuery en la pgina 51 v Recuperacin de datos de DB2 mediante el mtodo PreparedStatement.executeQuery en la pgina 52 v Realizacin de consultas por lotes en aplicaciones JDBC en la pgina 54 v Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC en la pgina 55

Caractersticas de un conjunto de resultados de JDBC con el controlador IBM DB2 para JDBC y SQLJ
Adems de avanzar fila a fila por un conjunto de resultados, puede ser deseable poder hacer lo siguiente:

48

Desarrollo de aplicaciones Java

v Retroceder o ir directamente a una fila especfica v Actualizar o suprimir filas de un conjunto de resultados v Dejar abierto el conjunto de resultados despus de una operacin COMMIT Los trminos siguientes describen caractersticas de un conjunto de resultados: capacidad de desplazamiento Capacidad que tiene el cursor de avanzar, retroceder o ir a una fila determinada. capacidad de actualizacin Capacidad de poder utilizar el cursor para actualizar o suprimir filas. Esta caracterstica no es aplicable a un conjunto de resultados devuelto por un procedimiento almacenado, pues un conjunto de resultados de un procedimiento almacenado no se puede actualizar. capacidad de retencin Capacidad que tiene el cursor de permanecer abierto despus de una operacin COMMIT. Un conjunto de resultados desplazable en JDBC es equivalente a la tabla de resultados de un cursor de DB2 declarado como SCROLL. Un cursor desplazable puede ser no sensible, sensible o sin sensibilidad. Insensible significa que los cambios hechos en la tabla subyacente despus de abrir el cursor no son visibles para el cursor. Sin sensibilidad significa que un cursor se puede comportar como cursor sensible o insensible, en funcin de si se utiliza como cursor de slo lectura o no. Los cursores insensibles son de solo lectura. Sensible significa lo siguiente: v Los cambios que el cursor hace en la tabla subyacente son siempre visibles para el cursor. v Los cambios hechos en la tabla subyacente por otros medios pueden ser visibles para el cursor. En DB2, si las filas se captan mediante FETCH INSENSITIVE, los cambios efectuados por otros medios no resultan visibles para el cursor. En DB2, si las filas se recuperan con FETCH SENSITIVE, los cambios hechos por otros medios son visibles para el cursor. En JDBC, la invocacin del mtodo refreshRow antes de invocar mtodos getXXX tiene el mismo efecto que FETCH SENSITIVE. En JDBC, un conjunto de resultados puede tambin ser esttico o dinmico, si el servidor de bases de datos da soporte a ambos atributos. El usuario determina si los cursores desplazables de un programa son estticos o dinmicos definiendo la propiedad cursorSensitivity. Consulte el tema Propiedades para el controlador IBM DB2 para JDBC y SQLJ para obtener ms informacin acerca de la propiedad cursorSensitivity. Si un conjunto de resultados de JDBC es esttico, el tamao de la tabla de resultados y el orden de las filas en la tabla de resultados no cambian despus de abrir el cursor. Esto significa que si inserta en la tabla subyacente, la tabla de resultados de un conjunto de resultados esttico no cambiar. Si suprime una fila de la tabla de resultados, se produce un hueco por supresin. Puede probar si la fila actual es un hueco por supresin utilizando el mtodo rowDeleted. Consulte el tema Comparacin del soporte de controlador para las API de JDBC para obtener una lista completa de los mtodos que tienen soporte para los conjuntos de resultados. Tareas relacionadas:

Captulo 2. Programacin de aplicaciones JDBC

49

v Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC en la pgina 55

Obtencin de informacin acerca de un conjunto de resultados utilizando mtodos ResultSetMetaData


En las explicaciones anteriores sobre la recuperacin de datos de una tabla o conjunto de resultados de un procedimiento almacenado se supona que se conoce el nmero de columnas y tipos de datos de las columnas contenidas en la tabla o conjunto de resultados. Esto no siempre es as, especialmente cuando se recuperan datos de una fuente de datos remota. Cuando escriba programas que obtienen conjuntos de resultados desconocidos, es necesario utilizar mtodos de ResultSetMetaData para determinar las caractersticas de los conjuntos de resultados antes de poder recuperar datos de ellos. Los mtodos de ResultSetMetaData proporcionan los tipos de informacin siguientes: v El nmero de columnas de un conjunto de resultados v El calificador de la tabla subyacente del conjunto de resultados v Informacin sobre una columna, tal como el tipo de datos, la longitud, la precisin, la escala y la posibilidad de contener nulos v La indicacin de si una columna es de solo lectura Despus de invocar el mtodo executeQuery para generar el conjunto de resultados de una consulta sobre una tabla, siga estos pasos bsicos para determinar el contenido del conjunto de resultados: 1. Invoque el mtodo getMetaData para el objeto ResultSet para crear un objeto ResultSetMetaData. 2. Invoque el mtodo getColumnCount para determinar el nmero de columnas del conjunto de resultados. 3. Para cada columna del conjunto de resultados, ejecute mtodos de ResultSetMetaData para determinar las caractersticas de las columnas. Los resultados de ResultSetMetaData.getColumnName para una misma definicin de tabla pueden diferir, dependiendo de la fuente de datos. Sin embargo, la informacin devuelta refleja correctamente la informacin de nombre de columna almacenada en el catlogo de DB2 para esa fuente de datos. Por ejemplo, el cdigo siguiente muestra cmo determinar los tipos de datos de todas las columnas de la tabla de empleados (EMPLOYEE). Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

50

Desarrollo de aplicaciones Java

String s; Connection con; Statement stmt; ResultSet rs; ResultSetMetaData rsmtadta; int colCount int mtadtaint; int i; String colName; String colType; ... stmt = con.createStatement(); // Crear un objeto Statement rs = stmt.executeQuery("SELECT * FROM EMPLOYEE"); // Obtener conjunto de resultados de la consulta rsmtadta = rs.getMetaData(); // Crear un objeto ResultSetMetaData 1 colCount = rsmtadta.getColumnCount(); 2 // Encontrar nmero de columnas de EMP for (i=1; i<= colCount; i++) { 3 colName = rsmtadta.getColumnName(); // Obtener nombre de columna colType = rsmtadta.getColumnTypeName(); // Obtener tipo de datos de la columna System.out.println("Columna = " + colName + " es del tipo de datos " + colType); // Imprimir el valor de columna } Figura 13. Uso de mtodos de ResultSetMetaData para obtener informacin sobre un conjunto de resultados

Tareas relacionadas: v Llamada a procedimientos almacenados mediante mtodos CallableStatement en la pgina 58 v Recuperacin de datos de tablas DB2 mediante el mtodo Statement.executeQuery en la pgina 51

Recuperacin de datos de tablas DB2 mediante el mtodo Statement.executeQuery


Para recuperar datos de una tabla utilizando una sentencia SELECT sin marcadores de parmetros, puede utilizar el mtodo Statement.executeQuery. Este mtodo devuelve una tabla de resultados en un objeto ResultSet. Una vez obtenida la tabla de resultados, debe utilizar mtodos de ResultSet para desplazarse por la tabla de resultados y obtener los valores de cada columna de cada fila. Con el Controlador IBM DB2 para JDBC y SQLJ, tambin puede utilizar el mtodo Statement.executeQuery para obtener un conjunto de resultados de una llamada de procedimiento almacenado, si ese procedimiento almacenado devuelve un solo conjunto de resultados. Si el procedimiento almacenado devuelve varios conjuntos de resultados, debe utilizar el mtodo Statement.execute. Consulte el tema Obtencin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC para obtener ms informacin. Este tema describe la modalidad ms sencilla de ResultSet, que es un objeto ResultSet de solo lectura en el que el usuario solo puede desplazarse hacia delante, una fila cada vez. El Controlador IBM DB2 para JDBC y SQLJ tambin da soporte a los conjuntos de resultados actualizables y desplazables. Esto se describe en el tema Especificacin de la capacidad de actualizacin, desplazamiento y retencin de los conjuntos de resultados en aplicaciones JDBC. Para recuperar filas de una tabla utilizando una sentencia SELECT sin marcadores de parmetros, siga estos pasos:
Captulo 2. Programacin de aplicaciones JDBC

51

1. Invoque el mtodo Connection.createStatement para crear un objeto Statement. 2. Invoque el mtodo Statement.executeQuery para obtener la tabla de resultados de la sentencia SELECT en un objeto ResultSet. 3. En un bucle, posicione el cursor utilizando el mtodo next y recupere datos de cada columna de la fila actual del objeto ResultSet utilizando mtodos getXXX. XXX representa un tipo de datos. Consulte el tema Comparacin del soporte de controlador para las API de JDBC para obtener una lista de los mtodos getXXX y setXXX soportados. 4. Invoque el mtodo ResultSet.close para cerrar el objeto ResultSet. 5. Invoque el mtodo Statement.close para cerrar el objeto Statement cuando termine de utilizar ese objeto. Por ejemplo, el cdigo siguiente muestra cmo recuperar todas las filas de la tabla de empleados (EMPLOYEE). Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
String empNo; Connection con; Statement stmt; ResultSet rs; ... stmt = con.createStatement(); // Crear un objeto Statement 1 rs = stmt.executeQuery("SELECT EMPNO FROM EMPLOYEE"); 2 // Obtener tabla de resultados de la consulta while (rs.next()) { // Posicionar el cursor 3 empNo = rs.getString(1); // Obtener solo el valor de la primera columna System.out.println("Nmero de empleado = " + empNo); // Imprimir el valor de columna } rs.close(); // Cerrar ResultSet 4 stmt.close(); // Cerrar Statement 5 Figura 14. Utilizacin de Statement.executeQuery

Tareas relacionadas: v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC en la pgina 60 v Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC en la pgina 55 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264

Recuperacin de datos de DB2 mediante el mtodo PreparedStatement.executeQuery


Para obtener datos de una tabla utilizando una sentencia SELECT con marcadores de parmetros, utilice el mtodo PreparedStatement.executeQuery. Este mtodo devuelve una tabla de resultados en un objeto ResultSet. Una vez obtenida la tabla de resultados, debe utilizar mtodos de ResultSet para desplazarse por la tabla de resultados y obtener los valores de cada columna de cada fila. Con el Controlador IBM DB2 para JDBC y SQLJ, tambin puede utilizar el mtodo PreparedStatement.executeQuery para obtener un conjunto de resultados de una llamada de procedimiento almacenado, si ese procedimiento almacenado devuelve un solo conjunto de resultados y tiene solamente parmetros de entrada. Si el

52

Desarrollo de aplicaciones Java

procedimiento almacenado devuelve varios conjuntos de resultados, debe utilizar el mtodo Statement.execute. Consulte el tema Obtencin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC para obtener ms informacin. Para obtener filas de una tabla utilizando una sentencia SELECT con marcadores de parmetros, siga estos pasos: 1. Invoque el mtodo Connection.prepareStatement para crear un objeto PreparedStatement. 2. Invoque mtodos PreparedStatement.setXXX para pasar valores a los parmetros de entrada. 3. Invoque el mtodo PreparedStatement.executeQuery para obtener la tabla de resultados de la sentencia SELECT en un objeto ResultSet. 4. En un bucle, posicione el cursor utilizando el mtodo ResultSet.next y recupere datos de cada columna de la fila actual del objeto ResultSet utilizando mtodos getXXX. 5. Invoque el mtodo ResultSet.close para cerrar el objeto ResultSet. 6. Invoque el mtodo PreparedStatement.close para cerrar el objeto PreparedStatement cuando termine de utilizar ese objeto. Por ejemplo, el cdigo siguiente muestra la obtencin de filas de la tabla de empleados (EMPLOYEE) para un empleado determinado. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
String empnum, phonenum; Connection con; PreparedStatement pstmt; ResultSet rs; ... pstmt = con.prepareStatement( "SELECT EMPNO, PHONENO FROM EMPLOYEE WHERE EMPNO=?"); // Crear un objeto PreparedStatement pstmt.setString(1,"000010"); // Asignar valor a parmetro de entrada

1 2

rs = pstmt.executeQuery(); // Obtener tabla de resultados de la consulta 3 while (rs.next()) { // Posicionar el cursor 4 empnum = rs.getString(1); // Obtener el valor de la primera columna phonenum = rs.getString(2); // Obtener el valor de la primera columna System.out.println("Nmero de empleado = " + empnum + "Nmero de telfono = " + phonenum); // Imprimir valores de columnas } rs.close(); // Cerrar ResultSet 5 pstmt.close(); // Cerrar PreparedStatement 6 Figura 15. Uso de PreparedStatement.executeQuery

Puede tambin utilizar el mtodo PreparedStatement.executeQuery para sentencias que no tienen marcadores de parmetros. Cuando ejecuta una consulta muchas veces, puede obtener un mejor rendimiento creando la sentencia de SQL en forma de objeto PreparedStatement. Tareas relacionadas: v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC en la pgina 60 Informacin relacionada:
Captulo 2. Programacin de aplicaciones JDBC

53

v Soporte para las API de JDBC en la pgina 264

Realizacin de consultas por lotes en aplicaciones JDBC


El Controlador IBM DB2 para JDBC y SQLJ proporciona una interfaz especfica de DB2 que le permite realizar consultas por lotes en un proceso por lotes homogneo. Con la interfaz DB2PreparedStatement, puede ejecutar una nica sentencia de SQL con varios conjuntos de parmetros de entrada. Utilice el mtodo PreparedStatement siguiente para crear un lote de parmetros para que una sola sentencia pueda ejecutarse varias veces en un lote, con un conjunto diferente de parmetros por cada ejecucin. v addBatch Utilice el mtodo DB2PreparedStatement siguiente para ejecutar la consulta por lotes. v executeDB2QueryBatch Para realizar consultas por lotes utilizando una sola sentencia con varios conjuntos de parmetros de entrada, siga estos pasos bsicos: 1. Invoque el mtodo prepareStatement para crear un objeto PreparedStatement para la sentencia de SQL con parmetros de entrada. 2. Para cada conjunto de valores de parmetros de entrada: a. Ejecute los mtodos PreparedStatement.setXXX para asignar valores a los parmetros de entrada. b. Invoque el mtodo PreparedStatement.addBatch para aadir el conjunto de parmetros de entrada al lote. 3. Difunda el objeto PreparedStatement a un objeto DB2PreparedStatement. 4. Invoque el mtodo DB2PreparedStatement.executeBatch para ejecutar la sentencia con todos los conjuntos de parmetros. 5. Compruebe si se han producido errores. Ejemplo de una consulta por lotes: en el fragmento de cdigo siguiente, dos conjuntos de parmetros forman un lote. Luego una sentencia SELECT que toma un parmetro de entrada se ejecuta dos veces, una por cada valor de parmetro. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
try { ... PreparedStatement prepStmt = con.prepareStatement( "SELECT EMPNO FROM EMPLOYEE WHERE EMPNO=?"); prepStmt.setString(1,empnum1); prepStmt.addBatch();

1 2a 2b

prepStmt.setString(1,empnum2); prepStmt.addBatch(); ((com.ibm.db2.jcc.DB2PreparedStatement)prepStmt).executeDB2QueryBatch(); 3,4 } catch(BatchUpdateException b) { 5 // process BatchUpdateException } Figura 16. Realizacin de una consulta por lotes

54

Desarrollo de aplicaciones Java

Tareas relacionadas: v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46

Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC
Para especificar las propiedades de capacidad de desplazamiento, capacidad de actualizacin y capacidad retencin para un conjunto de resultados, debe seguir estos pasos: 1. Si la sentencia SELECT por la que se define el conjunto de resultados no tiene parmetros de entrada, invoque el mtodo createStatement para crear un objeto Statement. En otro caso, invoque el mtodo prepareStatement para crear un objeto PreparedStatement. Es necesario especificar modalidades de los mtodos createStatement o prepareStatement que incluyan los parmetros resultSetType, resultSetConcurrency o resultSetHoldability . Esta es la modalidad del mtodo createStatement que da soporte a la capacidad de desplazamiento y a la capacidad de actualizacin:
createStatement(int resultSetType, int resultSetConcurrency);

Esta es la modalidad del mtodo createStatement que da soporte a la capacidad de desplazamiento, la capacidad de actualizacin y la capacidad de retencin:
createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability);

Esta es la modalidad del mtodo prepareStatement que da soporte a la capacidad de desplazamiento y a la capacidad de actualizacin:
prepareStatement(String sql, int resultSetType, int resultSetConcurrency);

Esta es la modalidad del mtodo prepareStatement que da soporte a la capacidad de desplazamiento, la capacidad de actualizacin y la capacidad de retencin:
prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability);

Consulte la Tabla 8 para ver una lista de los valores vlidos para resultSetType y resultSetConcurrency.
Tabla 8. Combinaciones vlidas de valores de resultSetType y resultSetConcurrency para conjuntos de resultados desplazables Valor de resultSetType TYPE_FORWARD_ONLY TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE TYPE_SCROLL_SENSITIVE Valor de resultSetConcurrency CONCUR_READ_ONLY CONCUR_UPDATABLE CONCUR_READ_ONLY CONCUR_READ_ONLY CONCUR_UPDATABLE

resultSetHoldability tiene dos valores posibles: HOLD_CURSORS_OVER_COMMIT y CLOSE_CURSORS_AT_COMMIT. Cualquiera de estos dos valores se puede especificar con una combinacin vlida cualquiera de resultSetConcurrency y resultSetHoldability. El valor que defina prevalece sobre la capacidad de retencin por omisin de la conexin.
Captulo 2. Programacin de aplicaciones JDBC

55

Restriccin: si el conjunto de resultados es desplazable y se utiliza para seleccionar columnas de una tabla en un servidor de DB2 Database para Linux, UNIX y Windows, la sentencia SELECT que sirve para definir el conjunto de resultados no puede seleccionar columnas que tengan los tipos de datos siguientes: v LONG VARCHAR v LONG VARGRAPHIC v DATALINK v BLOB v CLOB v Un tipo diferenciado que est basado en cualquiera de los tipos de datos anteriores de esta lista v Un tipo estructurado 2. Si la sentencia SELECT tiene parmetros de entrada, invoque mtodos setXXX para pasar valores a los parmetros de entrada. 3. Invoque el mtodo executeQuery para obtener la tabla de resultados de la sentencia SELECT en un objeto ResultSet. 4. Para cada fila a la que desee acceder: a. Posicione el cursor utilizando uno de los mtodos listados en la Tabla 9.
Tabla 9. Mtodos para posicionar un cursor desplazable en un conjunto de resultados Mtodo first() last() next()
1 2 3

Posiciona el cursor En la primera fila del conjunto de resultados En la ltima fila del conjunto de resultados En la fila siguiente del conjunto de resultados En la fila anterior del conjunto de resultados Si n>0, en la fila n del conjunto de resultados. Si n<0 y m es el nmero de filas del conjunto de resultados, en la fila m+n+1 del conjunto de resultados. Si n>0, en la fila que est situada n filas despus de la fila actual. Si n<0, en la fila que est situada n filas antes de la fila actual. Si n=0, en la fila actual. Despus de la ltima fila del conjunto de resultados Antes de la primera fila del conjunto de resultados

previous()

absolute(int n)

relative(int n)4,5

afterLast() beforeFirst() Notas:

1. Si el cursor est situado antes de la primera fila del conjunto de resultados, este mtodo posiciona el cursor en la primera fila. 2. Si el cursor est situado despus de la ltima fila del conjunto de resultados, este mtodo posiciona el cursor en la ltima fila. 3. Si el valor absoluto de n es mayor que el nmero de filas del conjunto de resultados, este mtodo posiciona el cursor despus de la ltima fila si n es positivo, o antes de la primera fila si n es negativo. 4. El cursor debe estar en una fila vlida del conjunto de resultados para poder utilizar este mtodo. Si el cursor est antes de la primera fila o despus de la ltima fila, el mtodo emite una excepcin de SQL. 5. Suponga que m es el nmero de filas del conjunto de resultados y x es la fila actual del conjunto de resultados. Si n>0 y x+n>m, el controlador posiciona el cursor despus de la ltima fila. Si n<0 y x+n><1, el controlador posiciona el cursor antes de la primera fila.

56

Desarrollo de aplicaciones Java

b. Si necesita conocer la posicin actual del cursor, utilice el mtodo getRow, isFirst, isLast, isBeforeFirst o isAfterLast para obtener esa informacin. c. Si para resultSetType ha especificado el valor TYPE_SCROLL_SENSITIVE en el paso 1 en la pgina 55, y necesita ver los valores ms recientes de la fila actual, invoque el mtodo refreshRow. Recomendacin: debido a que la renovacin de las filas de un conjunto de resultados puede afectar negativamente al rendimiento de las aplicaciones, debe invocar refreshRow solo cuando necesite ver los datos ms recientes. d. Ejecute una o ms de las operaciones siguientes: v Para recuperar datos de cada columna de la fila actual del objeto ResultSet, utilice mtodos getXXX. v Para actualizar la fila actual de la tabla subyacente, utilice mtodos updateXXX para asignar valores de columna a la fila actual del conjunto de resultados. Luego utilice updateRow para actualizar la fila correspondiente de la tabla subyacente. Si decide no actualizar la tabla subyacente, invoque el mtodo cancelRowUpdates en lugar del mtodo updateRow. El valor resultSetConcurrency del conjunto de resultados debe ser CONCUR_UPDATABLE para poder utilizar estos mtodos. v Para suprimir la fila actual de la tabla subyacente, utilice el mtodo deleteRow. La invocacin de deleteRow hace que el controlador sustituya la fila actual del conjunto de resultados espacio vaco. El valor resultSetConcurrency del conjunto de resultados debe ser CONCUR_UPDATABLE para poder utilizar este mtodo. 5. Invoque el mtodo close para cerrar el objeto ResultSet. 6. Invoque el mtodo close para cerrar el objeto Statement o PreparedStatement. Por ejemplo, el cdigo siguiente recupera todas las filas de la tabla de empleados en orden inverso, y actualiza el nmero de telfono para el nmero de empleado 000010. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

Captulo 2. Programacin de aplicaciones JDBC

57

String s; Connection con; Statement stmt; ResultSet rs; ... stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // Crear un objeto Statement // para un Resultset desplazable // y actualizable rs = stmt.executeQuery("SELECT EMPNO FROM EMPLOYEE FOR UPDATE OF PHONENO"); // Crear el conjunto de resultados rs.afterLast(); // Posicionar el cursor al final // el conjunto de resultados while (rs.previous()) { // Retroceder el cursor s = rs.getString("EMPNO"); // Obtener el nmero de empleado // (columna 1 de la tabla de // resultados) System.out.println("Employee number = " + s); // Imprimir el valor de columna if (s.compareTo("000010") == 0) { // Buscar empleado 000010 rs.updateString("PHONENO","4657"); // Actualizar su nmero de telfono rs.updateRow(); // Actualizar la fila } } rs.close(); // Cerrar ResultSet stmt.close(); // Cerrar Statement Figura 17. Uso de un cursor desplazable

3 4a 4d

5 6

Importante: el mtodo para ejecutar operaciones UPDATE de posicin descrito anteriormente en este tema sigue el estndar JDBC 2.0. El Controlador IBM DB2 para JDBC y SQLJ da soporte a un mtodo alternativo que sigue el estndar JDBC 1.0. No se recomienda dicho mtodo. El mtodo JDBC 1.0 implica el uso del mtodo ResultSet.getCursorName para obtener el nombre del cursor para el conjunto de resultados y definir una sentencia UPDATE de posicin que tenga el formato siguiente:
UPDATE tabla SET col1=value1,...coln=valueN WHERE CURRENT OF nombre-cursor

Si utiliza el mtodo JDBC 1.0 para actualizar datos de un servidor de bases de datos que d soporte a FETCH de varias filas, es posible que la sentencia UPDATE de posicin actualice varias filas en vez de actualizar una sola fila como esperaba. Para evitar actualizaciones inesperadas, modifique las aplicaciones para que utilicen el mtodo JDBC 2.0.

Llamada a procedimientos almacenados en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la llamada a procedimientos almacenados en aplicaciones JDBC. v Llamada a procedimientos almacenados mediante mtodos CallableStatement v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC en la pgina 60

Llamada a procedimientos almacenados mediante mtodos CallableStatement


Para llamar a procedimientos almacenados, invoque mtodos contenidos en la clase CallableStatement. Los pasos bsicos son: 1. Invoque el mtodo Connection.prepareCall con la sentencia CALL como argumento para crear un objeto CallableStatement.

58

Desarrollo de aplicaciones Java

La sentencia CALL no puede contener argumentos literales a menos que el servidor DB2 en el que se ejecuta la sentencia d soporte a ejecuciones dinmicas de la sentencia CALL. 2. Invoque los mtodos CallableStatement.setXXX para pasar valores a los parmetros de entrada (IN). Si el servidor de bases de datos no da soporte a la ejecucin dinmica de la sentencia CALL, debe especificar los tipos de datos para los parmetros de entrada de la sentencia CALL exactamente como estn especificados en la definicin de procedimiento almacenado. 3. Invoque el mtodo CallableStatement.registerOutParameter para indicar qu parmetros son de solo salida (OUT) o cules son de entrada y salida (INOUT). Si el servidor de bases de datos no da soporte a la ejecucin dinmica de la sentencia CALL, debe especificar los tipos de datos para los parmetros de entrada y salida o de slo salida de la sentencias CALL, exactamente como estn especificados en la definicin de procedimiento almacenado. 4. Invoque uno de los mtodos siguientes para llamar al procedimiento almacenado: CallableStatement.executeUpdate Invoque este mtodo si el procedimiento almacenado no devuelve conjuntos de resultados. CallableStatement.executeQuery Invoque este mtodo si el procedimiento almacenado devuelve un solo conjunto de resultados. CallableStatement.execute Invoque este mtodo si el procedimiento almacenado devuelve varios conjuntos de resultados, o un nmero desconocido de conjuntos de resultados. 5. Si el procedimiento almacenado devuelve conjuntos de resultados, recupere los resultados. Consulte el tema Recuperar varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC. 6. Invoque los mtodos CallableStatement.getXXX para recuperar valores a partir de los parmetros de salida (OUT) o entrada y salida (INOUT). 7. Invoque el mtodo CallableStatement.close para cerrar el objeto CallableStatement cuando termine de utilizar ese objeto. El cdigo siguiente muestra la invocacin de un procedimiento almacenado que tiene un parmetro de entrada, cuatro parmetros de salida y no devuelve ningn conjunto de resultados (ResultSet). Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

Captulo 2. Programacin de aplicaciones JDBC

59

int ifcaret; int ifcareas; int xsbytes; String errbuff; Connection con; CallableStatement cstmt; ResultSet rs; ... cstmt = con.prepareCall("CALL DSN8.DSN8ED2(?,?,?,?,?)"); 1 // Crear un objeto CallableStatement cstmt.setString (1, "DISPLAY THREAD(*)"); 2 // Establecer parmetro de entrada (mandato DB2) cstmt.registerOutParameter (2, Types.INTEGER); 3 // Registrar parmetros de salida cstmt.registerOutParameter (3, Types.INTEGER); cstmt.registerOutParameter (4, Types.INTEGER); cstmt.registerOutParameter (5, Types.VARCHAR); cstmt.executeUpdate(); // Llamar al procedimiento almacenado 4 ifcaret = cstmt.getInt(2); // Obtener valores de parmetros de salida 6 ifcareas = cstmt.getInt(3); xsbytes = cstmt.getInt(4); errbuff = cstmt.getString(5); cstmt.close(); 7 Figura 18. Utilizacin de mtodos CallableStatement para una llamada de procedimiento almacenado con marcadores de parmetros

Tareas relacionadas: v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC en la pgina 60 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin JDBC


Si invoca un procedimiento almacenado que devuelve conjuntos de resultados, es necesario que incluya cdigo para recuperar los conjuntos de resultados. Los pasos que debe emprender dependen de si conoce el nmero de conjuntos de resultados que se devuelven y el contenido de esos resultados. Recuperacin de un nmero conocido de conjuntos de resultados: Siga estos pasos para recuperar conjuntos de resultados cuando conoce su nmero y contenido: 1. Invoque el mtodo Statement.execute, el mtodo PreparedStatement.execute o el mtodo CallableStatement.execute para llamar al procedimiento almacenado. Utilice PreparedStatement.execute si el procedimiento almacenado tiene parmetros de entrada. 2. Invoque el mtodo getResultSet para obtener el primer conjunto de resultados, que est contenido en un objeto ResultSet. 3. En un bucle, posicione el cursor utilizando el mtodo next y recupere datos de cada columna de la fila actual del objeto ResultSet utilizando mtodos getXXX. 4. Si existen n conjuntos de resultados, repita los pasos siguientes n-1 veces: a. Invoque el mtodo getMoreResults para cerrar el conjunto de resultados actual y apuntar al conjunto de resultados siguiente.

60

Desarrollo de aplicaciones Java

b. Invoque el mtodo getResultSet para obtener el conjunto de resultados siguiente, que est contenido en un objeto ResultSet. c. En un bucle, posicione el cursor utilizando el mtodo next y recupere datos de cada columna de la fila actual del objeto ResultSet utilizando mtodos getXXX. El cdigo siguiente muestra la recuperacin de dos conjuntos de resultados. El primer conjunto de resultados contiene una columna INTEGER y el segundo conjunto de resultados contiene una columna CHAR. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
CallableStatement cstmt; ResultSet rs; int i; String s; ... cstmt.execute(); rs = cstmt.getResultSet(); while (rs.next()) { i = rs.getInt(1);

// Llamar al procedimiento almacenado 1 // Obtener primer conjunto de resultados 2 // Posicionar el cursor 3 // Recuperar el valor del conjunto de // resultados actual System.out.println ("Valor del primer conjunto de resultados = " + i); // Imprimir el valor } cstmt.getMoreResults(); // Apuntar al segundo conj. de resultados 4a // y cerrar el primer conj. de resultados rs = cstmt.getResultSet(); // Obtener el segundo conj. de resultados 4b while (rs.next()) { // Posicionar el cursor 4c s = rs.getString(1); // Recuperar el valor del conjunto de // resultados actual System.out.println ("Valor del segundo conjunto de resultados = " + s); // Imprimir el valor } rs.close(); // Cerrar el conjunto de resultados cstmt.close(); // Cerrar la sentencia Figura 19. Recuperacin de conjuntos de resultados conocidos de un procedimiento almacenado

Recuperacin de un nmero desconocido de conjuntos de resultados: Para recuperar conjuntos de resultados cuando no conoce su nmero ni su contenido, debe recuperar conjuntos de resultados hasta que no se recupere ninguno ms.. Para cada conjunto de resultados, utilice mtodos de ResultSetMetaData para determinar su contenido. Consulte el tema Uso de ResultSetMetaData para obtener informacin sobre un conjunto de resultados para conocer cmo determinar el contenido de un conjunto de resultados. Despus de invocar un procedimiento almacenado, siga estos pasos bsicos para recuperar el contenido de conjuntos de resultados cuando desconoce su nmero. 1. Examine el valor devuelto por la sentencia execute mediante la que se invoc el procedimiento almacenado. Si el valor devuelto es true, existe al menos un conjunto de resultados, por lo que necesita ir al paso siguiente. 2. Ejecute en bucle los pasos siguientes: a. Invoque el mtodo getResultSet para obtener un conjunto de resultados, que est contenido en un objeto ResultSet. La invocacin de este mtodo cierra el conjunto de resultados anterior. b. Procese el conjunto de resultados, tal como se indica en el tema Uso de ResultSetMetaData para obtener informacin sobre un conjunto de resultados.
Captulo 2. Programacin de aplicaciones JDBC

61

c. Invoque el mtodo getMoreResults para determinar si existe otro conjunto de resultados. Si getMoreResults devuelve true, vaya al paso 2a en la pgina 61 para obtener el conjunto de resultados siguiente. El cdigo siguiente muestra la recuperacin de conjuntos de resultados cuando no se conoce su nmero ni su contenido. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
CallableStatement cstmt; ResultSet rs; ... boolean resultsAvailable = cstmt.execute(); // Llamar al procedimiento almacenado while (resultsAvailable) { // Comprobar si hay conjuntos de resultados 1 ResultSet rs = cstmt.getResultSet(); // Obtener un conjunto de resultados 2a ... // Procesar conjunto de resultados resultsAvailable = cstmt.getMoreResults(); // Buscar conjunto de resultados siguiente 2c // (Tambin cierra el conjunto // de resultados anterior) } Figura 20. Recuperacin de conjuntos de resultados desconocidos de un procedimiento almacenado

Mantener abiertos los conjuntos de resultados: En la Figura 20, la invocacin de getMoreResults() cierra el objeto ResultSet que es devuelto por la invocacin anterior de getResultSet. Sin embargo, con el Controlador IBM DB2 para JDBC y SQLJ, puede invocar el formato 3 getMoreResults para JDBC, que tiene un parmetro que determina si se cierra el conjunto de resultados actual o los conjuntos de resultados abiertos previamente. Puede especificar una de estas constantes: Statement.KEEP_CURRENT_RESULT Busca el conjunto de resultados siguiente, pero no cierra el conjunto de resultados actual. Statement.CLOSE_CURRENT_RESULT Busca el conjunto de resultados siguiente y cierra el conjunto de resultados actual. Statement.CLOSE_ALL_RESULTS Cierra todos los conjuntos de resultados para el objeto Statement que anteriormente se mantuvieron abiertos. Por ejemplo, el cdigo mostrado en la Figura 21 en la pgina 63 mantiene abiertos todos los conjuntos de resultados hasta que se haya recuperado el ltimo conjunto de resultados, y luego los cierra todos.

62

Desarrollo de aplicaciones Java

CallableStatement cstmt; ... boolean resultsAvailable = cstmt.execute(); // Llamar al procedimiento almacenado if (resultsAvailable==true) { // Probar conjuntos de resultados ResultSet rs1 = cstmt.getResultSet(); // Obtener un conjunto de resultados ... // Procesar conjunto de resultados resultsAvailable = cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT); // Comprobar siguiente conjunto de // resultados pero no cerrar conj. // de resultados anterior if (resultsAvailable==true) { // Probar otro conjunto de resultados ResultSet rs2 = cstmt.getResultSet(); // Obtener siguiente conj. de resultados ... // Procesar ambos conj. de resultados } } resultsAvailable = cstmt.getMoreResults(Statement.CLOSE_ALL_RESULTS); // Cerrar los conjuntos de resultados Figura 21. Mantenimiento de los conjuntos de resultados recuperados de procedimientos almacenados abiertos

Tareas relacionadas: v Obtencin de informacin acerca de un conjunto de resultados utilizando mtodos ResultSetMetaData en la pgina 50

Trabajo con LOB en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la actualizacin y recuperacin de datos LOB en aplicaciones JDBC. v LOB en aplicaciones JDBC con el controlador IBM DB2 para JDBC y SQLJ v Tipos de datos Java para recuperar o actualizar datos de columnas LOB en aplicaciones JDBC en la pgina 65

LOB en aplicaciones JDBC con el controlador IBM DB2 para JDBC y SQLJ
El Controlador IBM DB2 para JDBC y SQLJ incluye soporte de LOB completo en la especificacin de JDBC 3.0 y especificaciones anteriores. Este controlador tambin incluye soporte para los LOB en mtodos adicionales y para tipos de datos adicionales. Soporte a la modalidad continua progresiva: si el servidor de bases de datos admite la modalidad continua progresiva, el Controlador IBM DB2 para JDBC y SQLJ podr utilizarla para recuperar datos en las columnas LOB o XML. Con la modalidad continua progresiva, el servidor de bases de datos determina de manera dinmica el modo ms eficaz para devolver datos LOB o XML en funcin del tamao de los objetos de LOB o XML. Para hacer que JDBC utilice la modalidad continua progresiva para recuperar datos, deber establecer la propiedad progressiveStreaming en DB2BaseDataSource.YES o DB2BaseDataSource.NOT_SET, y para conectarse con un servidor de bases de datos que de soporte a la modalidad continua progresiva, DB2 Versin 9.1 para z/OS o posterior. Cuando se habilita la modalidad continua progresiva, puede controlar el momento en que el controlador JDBC materializa los LOB con la propiedad streamBufferSize. Si un objeto LOB o XML es menor que o igual al valor streamBufferSize, el objeto se materializa. Con la modalidad continua progresiva, al recuperar un valor LOB o XML de un ResultSet en una variable de la aplicacin, podr manipular el contenido de dicha variable de la aplicacin hasta que mueva el cursor o lo cierre en ResultSet. Tras esta accin, ya no podr acceder al contenido de la variable de la aplicacin. Si lleva a cabo acciones en el LOB de la variable de la aplicacin, recibir una
Captulo 2. Programacin de aplicaciones JDBC

63

excepcin SQLException. Por ejemplo, suponga que la modalidad continua progresiva est habilitada y ejecuta sentencias del tipo siguiente:
... ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM MY_TABLE"); rs.next(); // Recuperar la primera fila de ResultSet Clob clobFromRow1 = rs.getClob(1); // Colocar CLOB la primera fila // en una variable de la aplicacin String substr1Clob = clobFromRow1.getSubstring(1,50); // Recuperar los primeros 50 bytes de CLOB rs.next(); // Mover el cursor hasta la fila siguiente. // clobFromRow1 ya no se encuentra disponible. // String substr2Clob = clobFromRow1.getSubstring(51,100); // Esta sentencia dara lugar a una excepcin // SQLException Clob clobFromRow2 = rs.getClob(2); // Colocar CLOB de la segunda fila // en una variable de la aplicacin rs.close(); // Cerrar el ResultSet. // clobFromRow2 tampoco se encuentra disponible.

Una vez que haya ejecutado rs.next() para colocar el cursor en la segunda fila de ResultSet, el valor CLOB de clobFromRow1 dejar de estar disponible. De forma similar, una vez que haya ejecutado rs.close() para cerrar el ResultSet, los valores de clobFromRow1 y clobFromRow2 dejarn de estar disponibles. Si inhabilita la modalidad continua progresiva, el modo en que el Controlador IBM DB2 para JDBC y SQLJ maneje los valores LOB depender del valor de la propiedad fullyMaterializeLobData. El uso de la modalidad continua progresiva es el mtodo ms recomendado para la recuperacin de datos LOB o XML. Soporte de localizador de LOB: el Controlador IBM DB2 para JDBC y SQLJ puede utilizar localizadores de LOB para recuperar datos de columnas LOB. Debe utilizar localizadores de LOB nicamente si el servidor de bases de datos no admite la modalidad continua progresiva. Para que JDBC utilice localizadores de LOB para recuperar datos de las columnas LOB, debe definir la propiedad fullyMaterializeLobData con el valor false y la propiedad progressiveStreaming con el valor DB2BaseDataSource.NO. Si no define la propiedad progressiveStreaming con el valor DB2BaseDataSource.NO, y el servidor de bases de datos admite la modalidad continua progresiva, el controlador JDBC pasar por alto el valor fullyMaterializeLobData. fullyMaterializeLobData no tiene ningn efecto sobre los parmetros de procedimientos almacenados. Al igual que ocurre en cualquier otro lenguaje, un localizador de LOB de una aplicacin Java se asocia a una sola base de datos. No puede utilizar un nico localizador de LOB para mover datos entre dos bases de datos diferentes. Para mover los datos LOB entre dos bases de datos, es necesario materializar los datos LOB cuando los recupera de una tabla de la primera base de datos y luego insertar dichos datos en la tabla de la segunda base de datos. Mtodos adicionales soportados por el Controlador IBM DB2 para JDBC y SQLJ: adems de los mtodos descritos en la especificacin de JDBC, el Controlador IBM DB2 para JDBC y SQLJ incluye soporte de LOB en los mtodos siguientes: v Puede especificar una columna BLOB como argumento de los mtodos ResultSet siguientes para recuperar datos de una columna BLOB: getBinaryStream

64

Desarrollo de aplicaciones Java

getBytes v Puede especificar una columna CLOB como argumento de los mtodos ResultSet siguientes para recuperar datos de una columna CLOB: getAsciiStream getCharacterStream getString getUnicodeStream v Puede utilizar los mtodos PreparedStatement siguientes para establecer los valores de parmetros que corresponden a columnas BLOB: setBytes setBinaryStream v Puede utilizar los mtodos PreparedStatement siguientes para establecer los valores de parmetros que corresponden a columnas CLOB: setString setAsciiStream setUnicodeStream setCharacterStream v Puede recuperar el valor de un parmetro CLOB de JDBC utilizando el mtodo CallableStatement siguiente: getString Restriccin sobre el uso de los LOB con el Controlador IBM DB2 para JDBC y SQLJ: si utiliza el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2, no puede invocar un procedimiento almacenado que tenga parmetros DBCLOB OUT o INOUT. Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358 v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Tipos de datos Java para recuperar o actualizar datos de columnas LOB en aplicaciones JDBC
Cuando la propiedad deferPrepares tiene el valor true, y el Controlador IBM DB2 para JDBC y SQLJ procesa una llamada PreparedStatement.setXXX, el controlador puede necesitar realizar tareas adicionales de proceso para determinar los tipos de datos. Estas tareas adicionales de proceso pueden afectar al rendimiento del sistema. Cuando el controlador JDBC no puede determinar inmediatamente el tipo de datos de un parmetro que se utiliza con una columna LOB, es necesario elegir un tipo de datos para el parmetro que sea compatible con el tipo de datos LOB. Parmetros de entrada para columnas BLOB: Para los parmetros de entrada de columnas BLOB, o parmetros de entrada/salida que se utilizan como entrada para columnas BLOB, puede utilizar uno de los mtodos siguientes: v Utilice una variable de entrada java.sql.Blob, que se corresponde exactamente con una columna BLOB:
cstmt.setBlob(parmIndex, blobData);

Captulo 2. Programacin de aplicaciones JDBC

65

v Utilice una llamada CallableStatement.setObject que especifique que el tipo de datos de destino es BLOB:
byte[] byteData = {(byte)0x1a, (byte)0x2b, (byte)0x3c}; cstmt.setObject(parmInd, byteData, java.sql.Types.BLOB);

v Utilice un parmetro de entrada de tipo java.io.ByteArrayInputStream con una llamada CallableStatement.setBinaryStream. Un objeto java.io.ByteArrayInputStream es compatible con un tipo de datos BLOB. Para esta llamada es necesario especificar la longitud exacta de los datos de entrada:
java.io.ByteArrayInputStream byteStream = new java.io.ByteArrayInputStream(byteData); int numBytes = byteData.length; cstmt.setBinaryStream(parmIndex, byteStream, numBytes);

Parmetros de salida para columnas BLOB: Para los parmetros de salida de columnas BLOB, o parmetros de entrada/salida que se utilizan como salida para columnas BLOB, puede utilizar uno de los mtodos siguientes: v Utilice la llamada CallableStatement.registerOutParameter para especificar que un parmetro de salida es de tipo BLOB. Luego puede recuperar el valor del parmetro e insertarlo en cualquier variable cuyo tipo de datos sea compatible con un tipo de datos BLOB. Por ejemplo, el cdigo siguiente permite recuperar un valor BLOB e insertarlo en una variable byte[]:
cstmt.registerOutParameter(parmIndex, java.sql.Types.BLOB); cstmt.execute(); byte[] byteData = cstmt.getBytes(parmIndex);

Parmetros de entrada para columnas CLOB: Para los parmetros de entrada de columnas CLOB, o parmetros de entrada/salida que se utilizan como entrada para columnas CLOB, puede utilizar uno de los mtodos siguientes: v Utilice una variable de entrada java.sql.Clob, que se corresponde exactamente con una columna CLOB:
cstmt.setClob(parmIndex, clobData);

v Utilice una llamada CallableStatement.setObject que especifique que el tipo de datos de destino es CLOB:
String charData = "CharacterString"; cstmt.setObject(parmInd, charData, java.sql.Types.CLOB);

v Utilice uno de los tipos siguientes de parmetros de entrada: Un parmetro de entrada java.io.StringReader con una llamada cstmt.setCharacterStream:
java.io.StringReader reader = new java.io.StringReader(charData); cstmt.setCharacterStream(parmIndex, reader, charData.length);

Un parmetro java.io.ByteArrayInputStream con una llamada cstmt.setAsciiStream, para datos ASCII:


byte[] charDataBytes = charData.getBytes("US-ASCII"); java.io.ByteArrayInputStream byteStream = new java.io.ByteArrayInputStream (charDataBytes); cstmt.setAsciiStream(parmIndex, byteStream, charDataBytes.length);

Para estas llamadas es necesario especificar la longitud exacta de los datos de entrada. v Utilice un parmetro de entrada de tipo String con una llamada cstmt.setString:

66

Desarrollo de aplicaciones Java

cstmt.setString(charData);

Si la longitud de los datos es mayor que 32 KB, el controlador JDBC asigna el tipo de datos CLOB a los datos de entrada. v Utilice un parmetro de entrada de tipo String con una llamada cstmt.setObject, y especifique el tipo de datos de destino como VARCHAR o LONGVARCHAR:
cstmt.setObject(parmIndex, charData, java.sql.Types.VARCHAR);

Si la longitud de los datos es mayor que 32 KB, el controlador JDBC asigna el tipo de datos CLOB a los datos de entrada. Parmetros de salida para columnas CLOB: Para los parmetros de salida de columnas CLOB, o parmetros de entrada/salida que se utilizan como salida para columnas CLOB, puede utilizar uno de los mtodos siguientes: v Utilice la llamada CallableStatement.registerOutParameter para especificar que un parmetro de salida es de tipo CLOB. Luego puede recuperar el valor del parmetro e insertarlo en cualquier variable cuyo tipo de datos sea compatible con un tipo de datos CLOB. Por ejemplo, el cdigo siguiente permite recuperar un valor CLOB e insertarlo en una variable de tipo String:
cstmt.registerOutParameter(parmIndex, java.sql.Types.CLOB); cstmt.execute(); String charData = cstmt.getString(parmIndex);

v Utilice la llamada CallableStatement.registerOutParameter para especificar que un parmetro de salida es de tipo VARCHAR o LONGVARCHAR:
cstmt.registerOutParameter(parmIndex, java.sql.Types.VARCHAR); cstmt.execute(); String charData = cstmt.getString(parmIndex);

Este mtodo solo se debe utilizar si conoce que la longitud de los datos recuperados es menor o igual que 32 KB. En otro caso, los datos se truncan. Conceptos relacionados: v LOB en aplicaciones JDBC con el controlador IBM DB2 para JDBC y SQLJ en la pgina 63 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Uso de valores ROWID en JDBC con el controlador IBM DB2 para JDBC y SQLJ
DB2 para z/OS y DB2 UDB para iSeries dan soporte al tipo de datos ROWID para una columna de una tabla DB2. Un ROWID es un valor que identifica una fila de una tabla de una forma exclusiva. Puede utilizar los siguientes de mtodos de ResultSet para recuperar datos de una columna ROWID: v getBytes v getObject

Captulo 2. Programacin de aplicaciones JDBC

67

Para getObject, el Controlador IBM DB2 para JDBC y SQLJ devuelve una instancia de la clase com.ibm.db2.jcc.DB2RowID, exclusiva de DB2. Puede utilizar los mtodos siguientes de PreparedStatement para definir un valor de un parmetro asociado a una columna ROWID: v setBytes v setObject Para setObject, utilice el tipo com.ibm.db2.jcc.Types.ROWID, exclusivo de DB2, o una instancia de la clase com.ibm.db2.jcc.DB2RowID como tipo de destino para los parmetros. Ejemplo: uso de PreparedStatement.setObject con un tipo de destino com.ibm.db2.jcc.DB2Types.ROWID: para definir el parmetro 1, utilice este formato del mtodo SetObject:
ps.setObject(1, bytes[], com.ibm.db2.jcc.DB2Types.ROWID);

Ejemplo: uso de PreparedStatement.setObject con un tipo de destino com.ibm.db2.jcc.DB2RowID: suponga que rwid es una instancia de com.ibm.db2.jcc.DB2RowID. Para definir el parmetro 1, utilice este formato del mtodo SetObject:
ps.setObject (1, rwid);

Para invocar un procedimiento almacenado que est definido con un parmetro de salida ROWID, registre ese parmetro para que sea del tipo com.ibm.db2.jcc.DB2Types.ROWID. Ejemplo: uso de CallableStatement.registerOutParameter con un tipo de parmetro com.ibm.db2.jcc.DB2Types.ROWID: para registrar el parmetro 1 de una sentencia CALL como perteneciente al tipo de datos com.ibm.db2.jcc.DB2Types.ROWID, utilice este formato del mtodo registerOutParameter:
cs.registerOutParameter(1, com.ibm.db2.jcc.DB2Types.ROWID)

Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Tipos diferenciados en aplicaciones JDBC


Un tipo diferenciado es un tipo de datos definido por el usuario cuya representacin interna es un tipo de datos SQL incorporado. Un tipo diferenciado se crea ejecutando la sentencia CREATE DISTINCT TYPE de SQL. En un programa JDBC, puede crear un tipo diferenciado utilizando el mtodo executeUpdate para ejecutar la sentencia CREATE DISTINCT TYPE. Puede tambin utilizar executeUpdate para crear una tabla que incluya una columna de ese tipo. Cuando se recuperan datos de una columna del tipo mencionado, o se actualiza una columna de dicho tipo, se utilizan identificadores Java con tipos de datos que corresponden a los tipos incorporados en que se basan los tipos diferenciados. El ejemplo siguiente crea un tipo diferenciado que est basado en un tipo INTEGER, crea una tabla con una columna de ese tipo, inserta una fila en la tabla y recupera la fila de la tabla:

68

Desarrollo de aplicaciones Java

Connection con; Statement stmt; ResultSet rs; String empNumVar; int shoeSizeVar; ... stmt = con.createStatement(); // Crear un objeto Statement stmt.executeUpdate( "CREATE DISTINCT TYPE SHOESIZE AS INTEGER"); // Crear tipo diferenciado stmt.executeUpdate( "CREATE TABLE EMP_SHOE (EMPNO CHAR(6), EMP_SHOE_SIZE SHOESIZE)"); // Crear tabla con tipo diferenciado stmt.executeUpdate("INSERT INTO EMP_SHOE " + "VALUES (000010, 6)"); // Insertar una fila rs=stmt.executeQuery("SELECT EMPNO, EMP_SHOE_SIZE FROM EMP_SHOE); // Crear ResultSet para consulta while (rs.next()) { empNumVar = rs.getString(1); // Obtener nmero de empleado shoeSizeVar = rs.getInt(2); // Obtener talla calzado (usar int // porque el tipo subyacente de // SHOESIZE es INTEGER) System.out.println("Nmero de empleado = " + empNumVar + " Talla de zapato = " + shoeSizeVar); } rs.close(); // Cerrar ResultSet stmt.close(); // Cerrar Statement Figura 22. Creacin y utilizacin de un tipo diferenciado

Informacin relacionada: v Sentencia CREATE DISTINCT TYPE en Consulta de SQL, Volumen 2

Puntos de salvaguarda en aplicaciones JDBC


Un punto de salvaguarda de SQL representa el estado que tienen datos y esquemas en un momento determinado dentro de una unidad de trabajo. Existen sentencias de SQL para establecer un punto de salvaguarda, liberar un punto de salvaguarda y para restaurar datos y esquemas al estado representado por el punto de salvaguarda. El Controlador IBM DB2 para JDBC y SQLJ soporta los mtodos siguientes para utilizar puntos de salvaguarda: Connection.setSavepoint() o Connection.setSavepoint(String nombre) Establece un punto de salvaguarda. Estos mtodos devuelven un objeto Savepoint, que posteriormente se utiliza en operaciones releaseSavepoint o rollback. Cuando ejecuta cualquiera de estos mtodos, DB2 ejecuta el formato de la sentencia SAVEPOINT que incluye ON ROLLBACK RETAIN CURSORS. Connection.releaseSavepoint(Savepoint punto_rescate) Libera el punto de salvaguarda especificado y todos los subsiguientes que haya establecidos. Connection.rollback(Savepoint punto_rescate) Retrotrae trabajos hasta el punto de salvaguarda especificado. DatabaseMetaData.supportsSavepoints() Indica si una fuente de datos soporta puntos de salvaguarda.

Captulo 2. Programacin de aplicaciones JDBC

69

El ejemplo siguiente muestra cmo establecer un punto de salvaguarda, retrotraer trabajos hasta un punto de salvaguarda y liberar el punto de salvaguarda.
Connection con; Statement stmt; ResultSet rs; String empNumVar; int shoeSizeVar; ... con.setAutoCommit(false); // Desactivar la confirmacin automtica stmt = con.createStatement(); // Crear un objeto Statement ... // Realizar operaciones SQLP con.commit(); // Confirmar la transaccin stmt.executeUpdate("INSERT INTO EMP_SHOE " + "VALUES (000010, 6)"); // Insertar una fila Savepoint savept = con.setSavepoint(); // Crear un punto de salvaguarda ... stmt.executeUpdate("INSERT INTO EMP_SHOE " + "VALUES (000020, 10)"); // Insertar otra fila conn.rollback(savept); // Retrotraer el trabajo al punto // posterior a la primera insercin ... con.releaseSavepoint(savept); // Liberar el punto de salvaguarda stmt.close(); // Cerrar Statement Figura 23. Establecimiento, retrotraccin y liberacin de un punto de salvaguarda en una aplicacin JDBC

Tareas relacionadas: v Confirmacin o retrotraccin de transacciones JDBC en la pgina 83 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264

Recuperacin de valores de columnas de identidad en aplicaciones JDBC


Una columna de identidad es una columna de una tabla de DB2 que proporciona una manera de que DB2 genere automticamente un valor numrico para cada fila. Puede definir una columna de clave en una sentencia CREATE TABLE o ALTER TABLE especificando la clusula AS IDENTITY cuando defina una columna que tenga un tipo numrico exacto con una escala de 0 (SMALLINT, INTEGER, BIGINT,DECIMAL con una escala de cero, o un tipo diferenciado basado en uno de estos tipos). Con el Controlador IBM DB2 para JDBC y SQLJ, puede recuperar columnas de una tabla de identidad de una tabla DB2 utilizando mtodos de JDBC 3.0. En un programa JDBC, las columnas de identidad se conocen como claves generadas automticamente. Para habilitar la recuperacin de claves generadas automticamente a partir de una tabla, es necesario que al insertar filas indique que desear recuperar valores de claves generadas automticamente. Para ello debe establecer un distintivo en una llamada de mtodo Connection.prepareStatement, Statement.executeUpdate o Statement.execute. La sentencia que se ejecuta debe ser una sentencia INSERT o una sentencia INSERT dentro de SELECT. De lo contrario, el controlador JDBC no tiene en cuenta el parmetro por el que se establece el distintivo. Para recuperar claves generadas automticamente de una tabla DB2, debe seguir estos pasos:

70

Desarrollo de aplicaciones Java

1. Utilice uno de los mtodos siguientes para indicar que desea obtener claves generadas automticamente: v Si piensa utilizar el mtodo PreparedStatement.executeUpdate para insertar filas, invoque uno de estos formatos del mtodo Connection.prepareStatement para crear un objeto PreparedStatement: Utilice el formato siguiente para una tabla de un servidor de bases de datos cualquiera que d soporte a las columnas de identidad. Utilice este formato slo para sentencias INSERT de una fila.
Connection.prepareStatement(sentencia-sql, Statement.RETURN_GENERATED_KEYS);

Utilice uno de los formatos siguientes slo para una tabla de cualquier servidor de bases de datos que d soporte a las columnas de identidad y a INSERT dentro de SELECT. Utilice uno de estos formatos para sentencias INSERT de una fila o sentencias INSERT de varias filas. Con el primer formato, especifique los nombres de las columnas para las que desea claves generadas automticamente. Con el segundo formato, especifique las posiciones de las columnas de la tabla para las que desea claves generadas automticamente.
Connection.prepareStatement(sentencia-sql, String [] nombresColumnas); Connection.prepareStatement(sentencias-sql, int [] ndicescolumna);

v Si utiliza el mtodo Statement.executeUpdate para insertar filas, invoque uno de estos formatos del mtodo Statement.executeUpdate: Utilice el formato siguiente para una tabla de un servidor de bases de datos cualquiera que d soporte a las columnas de identidad.Utilice este formato slo para sentencias INSERT de una fila.
Statement.executeUpdate(sentencia_sql, Statement.RETURN_GENERATED_KEYS);

Utilice uno de los formatos siguientes slo para una tabla de cualquier servidor de bases de datos que d soporte a las columnas de identidad y a INSERT dentro de SELECT. Utilice uno de los formatos siguientes para sentencias INSERT de una fila o sentencias INSERT de varias filas.
Statement.executeUpdate(sentencia-sql, String [] nombresColumnas); Statement.executeUpdate(sentencia-sql, int [] ndicescolumna);

v Si utiliza el mtodo Statement.execute para insertar filas, invoque uno de estos formatos del mtodo Statement.execute: Utilice el formato siguiente para una tabla de un servidor de bases de datos cualquiera que d soporte a las columnas de identidad. Utilice este formato slo para sentencias INSERT de una fila.
Statement.execute(sentencia_sql, Statement.RETURN_GENERATED_KEYS);

Utilice uno de los formatos siguientes slo para una tabla de cualquier servidor de bases de datos que d soporte a las columnas de identidad y a INSERT dentro de SELECT. Utilice uno de los formatos siguientes para sentencias INSERT de una fila o sentencias INSERT de varias filas.
Statement.execute(sentencia-sql, String [] Nombrescolumna); Statement.execute(sentencia-sql, int [] ndicescolumna);

2. Invoque el mtodo PreparedStatement.getGeneratedKeys o el mtodo Statement.getGeneratedKeys para recuperar un objeto ResultSet que contiene los valores de claves generadas automticamente.

Captulo 2. Programacin de aplicaciones JDBC

71

El tipo de datos de las claves generadas automticamente del objeto ResultSet es DECIMAL, con independencia del tipo de datos de la columna correspondiente. El cdigo siguiente crea una tabla con una columna de identidad, inserta una fila en la tabla y recupera el valor de la clave generada automticamente para la columna de identidad. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
import java.sql.*; import java.math.*; import com.ibm.db2.jcc.*; Connection con; Statement stmt; ResultSet rs; java.math.BigDecimal iDColVar; ... stmt = con.createStatement();

// Crear un objeto Statement

stmt.executeUpdate( "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " + "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)"); // Crear tabla con columna de identidad stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO) " + 1 "VALUES (000010, "5555")", // Insertar una fila Statement.RETURN_GENERATED_KEYS); // Indicar que desea claves // generadas automticamente rs = stmt.getGeneratedKeys(); // Recuperar el valor de la clave 2 // generado automticamente en un ResultSet. // Se devuelve una sola fila. // Crear ResultSet para consulta while (rs.next()) { java.math.BigDecimal idColVar = rs.getBigDecimal(1); // Obtener claves generadas // automticamente System.out.println("valor de clave generada automticamente = " + idColVar); } rs.close(); // Cerrar ResultSet stmt.close(); // Cerrar Statement Figura 24. Recuperacin de claves generadas automticamente

El cdigo siguiente crea una tabla con una columna de identidad, inserta dos filas en la tabla mediante una sentencia INSERT de varias filas y recupera los valores de clave generados automticamente para la columna de identidad. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

72

Desarrollo de aplicaciones Java

import java.sql.*; import java.math.*; import com.ibm.db2.jcc.*; Connection con; Statement stmt; ResultSet rs; ... stmt = con.createStatement(); stmt.executeUpdate( "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " + "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)"); // Crear tabla con columna de identidad String[] id_col = {"IDENTCOL"}; int updateCount = 1 stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO)" + "VALUES (000010, 5555), (000020, 5556)", id_col); // Insertar dos filas // Indicar que se desean claves // generadas automticamente rs = stmt.getGeneratedKeys(); // Recuperar los valores de clave 2 // generados automticamente en un ResultSet. // Se devuelven dos filas. // Crear ResultSet para consulta while (rs.next()) { java.math.BigDecimal idColVar = rs.getBigDecimal(1); // Obtener valores de claves // generadas automticamente System.out.println("valor de clave generada automticamente = " + idColVar); } stmt.close(); con.close(); Figura 25. Recuperacin de claves generadas automticamente despus de una sentencia INSERT de varias filas

Conceptos relacionados: v Columnas de identidad en Desarrollo de SQL y rutinas externas Tareas relacionadas: v Actualizacin de datos de tablas DB2 mediante el mtodo PreparedStatement.executeUpdate en la pgina 44 v Creacin y modificacin de objetos DB2 mediante el mtodo Statement.executeUpdate en la pgina 43 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264

Suministro de informacin ampliada sobre el cliente al servidor DB2 con el Controlador IBM DB2 para JDBC y SQLJ
El Controlador IBM DB2 para JDBC y SQLJ proporciona mtodos exclusivos de DB2 que el usuario puede utilizar para proporcionar informacin adicional sobre el cliente al servidor. Esta informacin se puede utilizar con fines contables, de gestin de la carga de trabajo o de depuracin. La informacin se enva al servidor DB2 cuando la aplicacin ejecuta una accin por la que se accede al servidor como, por ejemplo, ejecutar SQL.

Captulo 2. Programacin de aplicaciones JDBC

73

Los mtodos aparecen listados en la Tabla 10.


Tabla 10. Mtodos que proporcionan informacin al servidor DB2. Mtodo setDB2ClientAccountingInformation setDB2ClientApplicationInformation setDB2ClientDebugInfo setDB2ClientProgramId setDB2ClientUser setDB2ClientWorkstation Nombre de usuario para una conexin Nombre de estacin de trabajo del cliente para una conexin Informacin proporcionada Informacin contable Nombre de la aplicacin que est trabajando con una conexin El atributo de conexin CLIENT DEBUGINFO para el depurador unificado

Para establecer el suministro de informacin ampliada: 1. Cree un objeto Connection. 2. Convierta el objeto java.sql.Connection en un objeto com.ibm.db2.jcc.DB2Connection. 3. Invoque cualquiera de los mtodos mostrados en la Tabla 10. 4. Ejecute una sentencia de SQL para hacer que la informacin se enve al servidor DB2. El cdigo siguiente ejecuta los pasos anteriores para pasar un nombre de usuario y un nombre de estacin de trabajo al servidor DB2. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
public class ClientInfoTest { public static void main(String[] args) { String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose"; try { Class.forName("com.ibm.db2.jcc.DB2Driver"); String user = "db2adm"; String password = "db2adm"; Connection conn = DriverManager.getConnection(url, 1 user, password); if (conn instanceof DB2Connection) { DB2Connection db2conn = (DB2Connection) conn; 2 db2conn.setDB2ClientUser("Michael L Thompson"); 3 db2conn.setDB2ClientWorkstation("sjwkstn1"); // Ejecutar SQL para forzar el envo de informacin // ampliada sobre el cliente al servidor conn.prepareStatement("SELECT * FROM SYSIBM.SYSDUMMY1" + "WHERE 0 = 1").executeQuery(); 4 } } catch (Throwable e) { e.printStackTrace(); } } } Figura 26. Ejemplo de la transferencia de informacin ampliada sobre el cliente a un servidor DB2

Informacin relacionada: v Resumen de las extensiones de JDBC del Controlador IBM DB2 para JDBC y SQLJ en la pgina 321

74

Desarrollo de aplicaciones Java

Trabajo con datos XML en aplicaciones JDBC


Los temas siguientes contienen informacin sobre la actualizacin y recuperacin de datos XML en aplicaciones JDBC. v Datos XML en aplicaciones JDBC v Actualizacin de columnas XML en aplicaciones JDBC en la pgina 76 v Recuperacin de datos XML en aplicaciones JDBC en la pgina 77 v Invocacin de rutinas con parmetros XML en aplicaciones Java en la pgina 80 v Soporte de Java para el registro y la eliminacin de esquemas XML en la pgina 81

Datos XML en aplicaciones JDBC


En las tablas DB2, el tipo de datos integrados XML se utiliza para almacenar datos XML en una columna en forma de un conjunto estructurado de nodos en un formato de rbol. En las aplicaciones, los datos XML se encuentran en formato de serie serializada. En las aplicaciones JDBC, puede: v Almacenar un documento XML completo en una columna XML mediante los mtodos setXXX. v Recuperar un documento XML completo de una columna XML mediante los mtodos getXXX. v Recuperar una secuencia de un documento en una columna XML mediante la funcin XMLQUERY de SQL para recuperar la secuencia en una serie XML serializada en la base de datos y, a continuacin, utilizar mtodos getXXX para recuperar los datos en una variable de aplicacin. v Recuperar una secuencia de un documento en una columna XML mediante una expresin XQuery, a la que se aade la serie 'XQUERY' como prefijo, para recuperar los elementos de la secuencia en una tabla de resultados de la base de datos. En dicha base de datos, cada fila de la tabla de resultados representa un elemento de la secuencia. A continuacin, se utilizan los mtodos getXXX para recuperar los datos en variables de la aplicacin. v Recuperar una secuencia de un documento en una columna XML en forma de una tabla definida por el usuario mediante la funcin XMLTABLE de SQL para definir la tabla de resultados y recuperarla. A continuacin, se utilizan los mtodos getXXX para recuperar los datos de la tabla de resultados en variables de la aplicacin. Java no tiene tipos de datos XML ni invocaciones de mtodos de metadatos como, por ejemplo, ResultSetMetaData.getColumnTypeName, el cual devuelve un tipo de java.sql.Types.OTHER para un tipo de columna XML. Conceptos relacionados: v Actualizacin de columnas XML en aplicaciones JDBC en la pgina 76 v Recuperacin de datos XML en aplicaciones JDBC en la pgina 77 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Captulo 2. Programacin de aplicaciones JDBC

75

Actualizacin de columnas XML en aplicaciones JDBC


Cuando actualiza o inserta datos en columnas XML de una tabla de DB2, los datos de entrada deben estar en formato de serie serializado. Tabla 11 lista los mtodos y los tipos de entrada correspondientes que puede utilizar para dejar los datos en columnas XML.
Tabla 11. Mtodos y tipos de datos para actualizar columnas XML Mtodo PreparedStatement.setAsciiStream PreparedStatement.setBinaryStream PreparedStatement.setBlob PreparedStatement.setBytes PreparedStatement.setCharacterStream PreparedStatement.setClob PreparedStatement.setObject PreparedStatement.setString Tipo de datos de entrada InputStream InputStream Blob byte[] Reader Clob byte[], Blob, Clob, DB2Xml, InputStream, Reader, String String

La codificacin de los datos XML se puede derivar de los datos mismos, conocidos como datos codificados internamente; si se derivan de fuentes externas se conocen como datos codificados externamente. Los datos XML que se envan al servidor de bases de datos como datos binarios se consideran datos codificados internamente. Los datos XML que se envan al servidor de bases de datos como datos de caracteres se consideran datos codificados externamente. La codificacin externa de las aplicaciones Java siempre es Unicode. Los datos codificados externamente pueden tener una codificacin interna. Es decir, los datos se pueden enviar al servidor de bases de datos como datos de caracteres, pero los datos contienen informacin sobre la codificacin. El servidor de bases de datos maneja las incompatibilidades entre la codificacin interna y la externa, del modo siguiente: v Si el servidor de bases de datos es DB2 Database para Linux, UNIX y Windows, genera un error si las codificaciones interna y externa son incompatibles, a menos que ambas sean Unicode. Si las codificaciones interna y externa son Unicode, el servidor de bases de datos pasa por alto la interna. v Si el servidor de bases de datos es DB2 para z/OS, pasa por alto la codificacin interna. Los datos de las columnas XML se almacenan con codificacin UTF-8. El servidor de bases de datos maneja la conversin de datos desde su codificacin interna o externa a UTF-8. Ejemplo: el ejemplo siguiente demuestra la insercin de datos de un archivo en una columna XML. Los datos se insertan como datos binarios, de manera que el servidor de bases de datos respeta la codificacin interna.
public void insertBinStream() { PreparedStatement insertStmt = null; String sqls = null; int cid = 0; ResultSet rs=null;

76

Desarrollo de aplicaciones Java

Statement stmt=null; try { sqls = "INSERT INTO CUSTOMER (CID, INFO) VALUES (?, ?)"; insertStmt = conn.prepareStatement(sqls); insertStmt.setInt(1, cid); File file = new File(fn); insertStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length()); if (insertStmt.executeUpdate() != 1) { System.out.println("insertBinStream: No record inserted."); } } catch (IOException ioe) { ioe.printStackTrace(); } catch (SQLException sqle) { System.out.println("insertBinStream: SQL Exception: " + sqle.getMessage()); System.out.println("insertBinStream: SQL State: " + sqle.getSQLState()); System.out.println("insertBinStream: SQL Error Code: " + sqle.getErrorCode()); } }

Conceptos relacionados: v Encoding considerations for XML data in JDBC, SQLJ, and .NET applications en XML Guide Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Recuperacin de datos XML en aplicaciones JDBC


Al recuperar datos de columnas XML de una tabla de DB2, los datos de salida se encuentran en formato de serie serializada. Esto ocurre independientemente de que se recupere todo el contenido de una columna XML o de una secuencia de la columna. Puede utilizar una de las tcnicas siguientes para recuperar datos XML: v Utilice un mtodo ResultSet.getXXX que no sea ResultSet.getObject para recuperar los datos en un tipo que sea compatible. v Utilice el mtodo ResultSet.getObject para recuperar los datos y, a continuacin, convirtalos al tipo DB2Xml y asgnelos a un objeto DB2Xml. A continuacin, utilice un mtodo DB2Xml.getDB2XXX o DB2Xml.getDB2XmlXXX para recuperar los datos en un tipo de datos de salida compatible. Los mtodos DB2Xml.getDB2XmlXXX aaden declaraciones XML con especificaciones de codificacin para los datos de salida. Los mtodos DB2Xml.getDB2XXX no aaden declaraciones XML con especificaciones de codificacin para los datos de salida. En la Tabla 12 en la pgina 78, se listan los mtodos ResultSet y los tipos de datos de salida correspondientes para recuperar datos XML.

Captulo 2. Programacin de aplicaciones JDBC

77

Tabla 12. Mtodos ResultSet y tipos de datos para recuperar datos XML Mtodo ResultSet.getAsciiStream ResultSet.getBinaryStream ResultSet.getBytes ResultSet.getCharacterStream ResultSet.getObject ResultSet.getString Tipo de datos de salida InputStream InputStream byte[] Reader DB2Xml String

En la Tabla 13, se listan los mtodos y los tipos de datos de salida correspondientes para recuperar datos de un objeto DB2Xml, as como el tipo de codificacin de la declaracin XML que el controlador aade a los datos de salida.
Tabla 13. Mtodos DB2Xml, tipos de datos y especificaciones de codificacin aadidas Mtodo DB2Xml.getDB2AsciiStream DB2Xml.getDB2BinaryStream DB2Xml.getDB2Bytes DB2Xml.getDB2CharacterStream DB2Xml.getDB2String DB2Xml.getDB2XmlAsciiStream DB2Xml.getDB2XmlBinaryStream DB2Xml.getDB2XmlBytes DB2Xml.getDB2XmlCharacterStream DB2Xml.getDB2XmlString Tipo de datos de salida InputStream InputStream byte[] Reader String InputStream InputStream byte[] Reader String Tipo de declaracin de codificacin interna XML aadida Ninguno Ninguno Ninguno Ninguno Ninguno US-ASCII Especificado por el parmetro getDB2XmlBinaryStream targetEncoding Especificado por el parmetro DB2Xml.getDB2XmlBytes targetEncoding ISO-10646-UCS-2 ISO-10646-UCS-2

Si la aplicacin ejecuta la funcin XMLSERIALIZE en los datos que deben devolverse, despus de la ejecucin de la funcin, los datos tendrn el tipo especificado en la funcin XMLSERIALIZE, no el tipo de datos XML. Por lo tanto, el controlador maneja los datos segn el tipo especificado y pasa por alto todas las declaraciones de codificacin internas. Ejemplo: en el ejemplo siguiente, se muestra la recuperacin de datos desde una columna XML a una variable de tipo String.
public void fetchToString() { System.out.println(">> fetchToString: Get XML data " + "using getString"); PreparedStatement selectStmt = null; String sqls = null, stringDoc = null; ResultSet rs = null; try{ sqls = "SELECT info FROM customer WHERE cid = " + cid; selectStmt = conn.prepareStatement(sqls); rs = selectStmt.executeQuery(); // Obtener metadatos. Tipo de la columna XML: java.sql.Types.OTHER

78

Desarrollo de aplicaciones Java

ResultSetMetaData meta = rs.getMetaData(); String colType = meta.getColumnTypeName(1); System.out.println("fetchToString: Column type = " + colType); while (rs.next()) { stringDoc = rs.getString(1); System.out.println("Document contents:"); System.out.println(stringDoc); } catch (SQLException sqle) { System.out.println("fetchToString: SQL Exception: " + sqle.getMessage()); System.out.println("fetchToString: SQL State: " + sqle.getSQLState()); System.out.println("fetchToString: SQL Error Code: " + sqle.getErrorCode()); } }

Ejemplo: en el ejemplo siguiente, se muestra la recuperacin de datos desde una columna XML a un objeto DB2Xml. A continuacin, se utiliza el mtodo DB2Xml.getDB2XmlString para recuperar datos en una serie con una declaracin XML aadida con una especificacin de codificacin ISO-10646-UCS-2.
public void fetchToDB2Xml() { System.out.println(">> fetchToDB2Xml: Get XML data as a DB2XML object " + "using getObject"); PreparedStatement selectStmt = null; String sqls = null, stringDoc = null; ResultSet rs = null; try{ sqls = "SELECT info FROM customer WHERE cid = " + cid; selectStmt = conn.prepareStatement(sqls); rs = selectStmt.executeQuery(); // Obtener metadatos. Tipo de la columna XML: java.sql.Types.OTHER ResultSetMetaData meta = rs.getMetaData(); String colType = meta.getColumnTypeName(1); System.out.println("fetchToObject: Column type = " + colType); if (rs.next() == false) { System.out.println("fetchToObject: " "Cannot read document with cid " + cid); } else { // Recupera los datos XML con getObject y convierte el objeto // como un objeto DB2Xml. Luego, lo escribe en una serie con // codificacin ISO-10646-UCS-2 interna explcita. com.ibm.db2.jcc.DB2Xml xml = (com.ibm.db2.jcc.DB2Xml) rs.getObject(1); System.out.println (xml.getDB2XmlString()); } rs.close(); } catch (SQLException sqle) { System.out.println("fetchToString: SQL Exception: " + sqle.getMessage()); System.out.println("fetchToString: SQL State: " + sqle.getSQLState()); System.out.println("fetchToString: SQL Error Code: " + sqle.getErrorCode()); } }

Conceptos relacionados:
Captulo 2. Programacin de aplicaciones JDBC

79

v Encoding considerations for XML data in JDBC, SQLJ, and .NET applications en XML Guide Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Invocacin de rutinas con parmetros XML en aplicaciones Java


Los procedimientos externos almacenados o SQL y las funciones definidas por el usuario pueden incluir parmetros XML. En el caso de los procedimientos SQL, esos parmetros de la definicin de procedimiento almacenado tienen el tipo XML. En el caso de los procedimientos externos almacenados y las funciones definidas por el usuario, los parmetros XML de la definicin de rutina tienen el tipo XML AS CLOB. Cuando llama un procedimiento almacenado o una funcin definida por el usuario que tenga parmetros XML, necesita utilizar un tipo de datos compatibles en la sentencia que invoca. Para llamar una rutina con parmetros de entrada XML desde un programa JDBC, utilice parmetros del tipo com.ibm.db2.jcc.DB2Xml. Para registrar parmetros de salida XML, hgalo con el tipo com.ibm.db2.jcc.DB2Types.XML. Ejemplo: El programa JDBC que llama un procedimiento almacenado que utiliza tres parmetros XML: un parmetro IN, un parmetro OUT y un parmetro INOUT.
com.ibm.db2.jcc.DB2Xml in_xml = xmlvar; com.ibm.db2.jcc.DB2Xml out_xml = null; com.ibm.db2.jcc.DB2Xml inout_xml = xmlvar; // Declarar un parmetro XML de entrada, // de salida y de entrada/salida Connection con; CallableStatement cstmt; ResultSet rs; ... stmt = con.prepareCall("CALL SP_xml(?,?,?)"); // Crear un objeto CallableStatement cstmt.setObject (1, in_xml); // Establecer parmetro de entrada cstmt.registerOutParameter (2, com.ibm.db2.jcc.DB2Types.XML); // Registrar parmetros de entrada y de salida cstmt.registerOutParameter (3, com.ibm.db2.jcc.DB2Types.XML); cstmt.executeUpdate(); // Invocar el procedimiento almacenado System.out.println("Parameter values from SP_xml call: "); System.out.println("Output parameter value "); printBytes(out_xml.getDB2String()); // Utilizar el mtodo getBytes, exclusivo de DB2, // para convertir el valor a bytes para imprimir System.out.println("Input/output parameter value "); printBytes(inout_xml.getDB2String());

Para llamar una rutina con parmetros XML desde un programa SQLJ, utilice parmetros del tipo com.ibm.db2.jcc.DB2Xml. Ejemplo: El programa SQLJ que llama un procedimiento almacenado que utiliza tres parmetros XML: un parmetro IN, un parmetro OUT y un parmetro INOUT.
com.ibm.db2.jcc.DB2Xml in_xml = xmlvar; com.ibm.db2.jcc.DB2Xml out_xml = null; com.ibm.db2.jcc.DB2Xml inout_xml = xmlvar;

80

Desarrollo de aplicaciones Java

// Declarar un parmetro XML de entrada, // de salida y de entrada/salida ... #sql [myConnCtx] {CALL SP_xml(:IN in_xml, :OUT out_xml, :INOUT inout_xml)}; // Invocar el procedimiento almacenado System.out.println("Parameter values from SP_xml call: "); System.out.println("Output parameter value "); printBytes(out_xml.getDB2String()); // Utilizar el mtodo getBytes, exclusivo de DB2, // para convertir el valor a bytes para imprimir System.out.println("Input/output parameter value "); printBytes(inout_xml.getDB2String());

Tareas relacionadas: v Invocacin de procedimientos almacenados en una aplicacin SQLJ en la pgina 132 v Llamada a procedimientos almacenados mediante mtodos CallableStatement en la pgina 58 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243 v Interfaz DB2Xml en la pgina 355

Soporte de Java para el registro y la eliminacin de esquemas XML


DB2 proporciona los procedimientos almacenados SYSPROC.XSR_REGISTER, SYSPROC.XSR_ADDSCHEMADOC, SYSPROC.XSR_COMPLETE y SYSPROC.XSR_REMOVE, que permiten registrar y eliminar esquemas XML y sus componentes. El Controlador IBM DB2 para JDBC y SQLJ proporciona mtodos que permiten realizar las mismas funciones desde un programa de aplicacin Java. Estos mtodos son los siguientes: DB2Connection.registerDB2XMLSchema Registra un esquema XML en DB2, con uno o varios documentos de esquema XML. Existen dos variantes de este mtodo: una para los documentos de esquema XML que llegan procedentes de los objetos InputStream y otra para los documentos de esquema XML que estn en un objeto String. DB2Connection.deregisterDB2XMLObject Elimina una definicin de esquema XML de DB2. Para poder invocar estos mtodos, los procedimientos almacenados subyacentes deben estar instalados en el servidor de bases de datos DB2. Ejemplo - registro de un esquema XML: en el ejemplo siguiente se ilustra el uso de registerDB2XmlSchema para registrar un esquema XML en DB2 utilizando un solo documento de esquema XML (customer.xsd) que se lee en una corriente de entrada. El nombre de esquema SQL correspondiente al esquema registrado es SYSXSR. El valor xmlSchemaLocations es nulo, por lo que DB2 no encontrar este esquema XML en una invocacin de DSN_XMLVALIDATE que proporcione un

Captulo 2. Programacin de aplicaciones JDBC

81

valor de ubicacin de esquema XML que no sea nulo. No se registran propiedades adicionales.
public static void registerSchema( Connection con, String schemaName) throws SQLException { // Definir parmetros de registerDB2XmlSchema String[] xmlSchemaNameQualifiers = new String[1]; String[] xmlSchemaNames = new String[1]; String[] xmlSchemaLocations = new String[1]; InputStream[] xmlSchemaDocuments = new InputStream[1]; int[] xmlSchemaDocumentsLengths = new int[1]; java.io.InputStream[] xmlSchemaDocumentsProperties = new InputStream[1]; int[] xmlSchemaDocumentsPropertiesLengths = new int[1]; InputStream xmlSchemaProperties; int xmlSchemaPropertiesLength; //Establecer valores de parmetros xmlSchemaLocations[0] = ""; FileInputStream fi = null; xmlSchemaNameQualifiers[0] = "SYSXSR"; xmlSchemaNames[0] = schemaName; try { fi = new FileInputStream("customer.xsd"); xmlSchemaDocuments[0] = new BufferedInputStream(fi); } catch (FileNotFoundException e) { e.printStackTrace(); } try { xmlSchemaDocumentsLengths[0] = (int) fi.getChannel().size(); System.out.println(xmlSchemaDocumentsLengths[0]); } catch (IOException e1) { e1.printStackTrace(); } xmlSchemaDocumentsProperties[0] = null; xmlSchemaDocumentsPropertiesLengths[0] = 0; xmlSchemaProperties = null; xmlSchemaPropertiesLength = 0; DB2Connection ds = (DB2Connection) con; // Invocar registerDB2XmlSchema ds.registerDB2XmlSchema( xmlSchemaNameQualifiers, xmlSchemaNames, xmlSchemaLocations, xmlSchemaDocuments, xmlSchemaDocumentsLengths, xmlSchemaDocumentsProperties, xmlSchemaDocumentsPropertiesLengths, xmlSchemaProperties, xmlSchemaPropertiesLength, false); } Figura 27. Ejemplo de registro de un esquema XML con DB2 utilizando un documento XML procedente de una corriente de entrada

Ejemplo - eliminacin de un esquema XML: en el ejemplo siguiente se muestra el uso de deregisterDB2XmlObject para eliminar un esquema XML de DB2. El nombre de esquema SQL correspondiente al esquema registrado es SYSXSR.

82

Desarrollo de aplicaciones Java

public static void deregisterSchema( Connection con, String schemaName) throws SQLException { // Definir y asignar valores a parmetros de deregisterDB2XmlObject String xmlSchemaNameQualifier = "SYSXSR"; String xmlSchemaName = schemaName; DB2Connection ds = (DB2Connection) con; // Invocar deregisterDB2XmlObject ds.deregisterDB2XmlObject( xmlSchemaNameQualifier, xmlSchemaName); } Figura 28. Ejemplo de eliminacin de un esquema XML de DB2

Conceptos relacionados: v XML schema, DTD, and external entity management using the XML schema repository (XSR) en XML Guide v XSR object registration en XML Guide

Control de transacciones en aplicaciones JDBC


Los temas siguientes tratan los mtodos de JDBC para controlar las transacciones de DB2. v Establecimiento del nivel de aislamiento para una transaccin de JDBC v Confirmacin o retrotraccin de transacciones JDBC

Establecimiento del nivel de aislamiento para una transaccin de JDBC


Para establecer el nivel de aislamiento para una unidad de trabajo dentro de un programa JDBC, utilice el mtodo Connection.setTransactionIsolation(int nivel). La Tabla 14 muestra los valores de nivel que puede especificar en el mtodo Connection.setTransactionIsolation y los valores equivalentes en DB2.
Tabla 14. Niveles de aislamiento equivalentes de JDBC y DB2 Valor de JDBC TRANSACTION_SERIALIZABLE TRANSACTION_REPEATABLE_READ TRANSACTION_READ_COMMITTED TRANSACTION_READ_UNCOMMITTED Nivel de aislamiento de DB2 Lectura repetible Estabilidad de lectura Estabilidad del cursor Lectura no confirmada

Conceptos relacionados: v Objetos de conexin JDBC en la pgina 36

Confirmacin o retrotraccin de transacciones JDBC


En JDBC, para confirmar o retrotraer explcitamente transacciones, utilice los mtodos commit o rollback. Por ejemplo:
Connection con; ... con.commit();

Captulo 2. Programacin de aplicaciones JDBC

83

Si la modalidad de confirmacin automtica est activada, el gestor de bases de datos de DB2 realiza una operacin de confirmacin despus de que se completa cada sentencia de SQL. Para activar la modalidad de confirmacin automtica, invoque el mtodo Connection.setAutoCommit(true). Para desactivar la modalidad de confirmacin automtica, invoque el mtodo Connection.setAutoCommit(false). Para determinar si la modalidad de confirmacin automtica est activa, invoque el mtodo Connection.getAutoCommit. Cuando la modalidad de confirmacin automtica est activada, los mtodos commit y rollback no se pueden ejecutar. Las conexiones que intervienen en transacciones distribuidas no pueden invocar el mtodo setAutoCommit(true). Cuando se cambia el estado de confirmacin automtica, el gestor de bases de datos de DB2 ejecuta una operacin de confirmacin, si la aplicacin an no se encuentra en un lmite de transaccin. Mientras una conexin participa en una transaccin distribuida, la aplicacin asociada no puede emitir los mtodos commit o rollback. Conceptos relacionados: v Puntos de salvaguarda en aplicaciones JDBC en la pgina 69 Tareas relacionadas: v Desconexin de servidores de bases de datos en aplicaciones JDBC en la pgina 96 v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46

Manejo de errores y avisos en aplicaciones JDBC


Los temas siguientes explican cmo manejar los errores y avisos de SQL en aplicaciones JDBC. v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ v Manejo de un aviso de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 88 v Recuperacin de informacin de una excepcin BatchUpdateException en la pgina 90 v Manejo de una excepcin de SQL cuando se utiliza el controlador JDBC de DB2 de tipo 2 en la pgina 91 v Manejo de un aviso de SQL con el controlador JDBC de DB2 de tipo 2 en la pgina 92

Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ
Al igual que en todos los programas Java, el manejo de errores se realiza mediante bloques try/catch. Los mtodos emiten excepciones cuando se producen errores, y el cdigo contenido en el bloque catch maneja esas excepciones. JDBC proporciona la clase SQLException para manejar errores. Todos los mtodos de JDBC emiten una instancia de SQLException cuando se produce un error

84

Desarrollo de aplicaciones Java

durante la ejecucin del mtodo. De acuerdo con la especificacin JDBC, un objeto SQLException contiene la informacin siguiente: v Un objeto String que contiene una descripcin del error o el valor nulo v Un objeto String que contiene el SQLSTATE o el valor nulo v Un valor int que contiene un cdigo de error v Un puntero que indica la ubicacin del objeto SQLException siguiente o un valor nulo El Controlador IBM DB2 para JDBC y SQLJ proporciona una interfaz com.ibm.db2.jcc.DB2Diagnosable por la que se ampla la clase SQLException. La interfaz DB2Diagnosable le proporciona ms informacin sobre los errores que se producen al acceder a DB2. Si el controlador JDBC detecta un error, DB2Diagnosable le proporciona la misma informacin que la clase SQLException estndar. Sin embargo, si DB2 detecta el error, DB2Diagnosable aade los mtodos siguientes, que le proporcionan informacin adicional sobre el error: getSqlca Devuelve un objeto DB2Sqlca con la informacin siguiente: v Un cdigo de error de SQL v Los valores SQLERRMC v El valor SQLERRP v Los valores SQLERRD v Los valores SQLWARN v El SQLSTATE getThrowable Devuelve el objeto java.lang.Throwable que caus la excepcin SQLException o un valor nulo si ese objeto no existe. printTrace Imprime informacin de diagnstico. Estos son los pasos bsicos para el manejo de una excepcin SQLException en un programa JDBC que se ejecuta con el Controlador IBM DB2 para JDBC y SQLJ: 1. Proporcione al programa acceso a la interfaz com.ibm.db2.jcc.DB2Diagnosable y a la clase com.ibm.db2.jcc.DB2Sqlca. Puede calificar al completo todas las referencias a esos elementos o puede importarlos:
import com.ibm.db2.jcc.DB2Diagnosable; import com.ibm.db2.jcc.DB2Sqlca;

2. Coloque cdigo que pueda generar una excepcin SQLException en un bloque try. 3. En el bloque catch, ejecute los pasos siguientes en un bucle: a. Determine si ha recuperado la ltima excepcin SQLException. Si no la ha recibido, contine en el paso siguiente. b. Compruebe si existe informacin slo de DB2 comprobando si SQLException es una instancia de DB2Diagnosable. En caso afirmativo: 1) Difunda el objeto a un objeto DB2Diagnosable. 2) Opcional: invoque el mtodo DB2Diagnosable.printTrace para grabar toda la informacin sobre SQLException en un objeto java.io.PrintWriter. 3) Invoque el mtodo DB2Diagnosable.getThrowable para determinar si un objeto java.lang.Throwable asociado ha causado la excepcin SQLException. 4) Invoque el mtodo DB2Diagnosable.getSqlca para recuperar el objeto DB2Sqlca.
Captulo 2. Programacin de aplicaciones JDBC

85

5) Invoque el mtodo DB2Sqlca.getSqlCode para recuperar un valor de cdigo de error de SQL. 6) Invoque el mtodo DB2Sqlca.getSqlErrmc para recuperar una serie de caracteres que contiene todos los valores SQLERRMC, o invoque el mtodo DB2Sqlca.getSqlErrmcTokens para recuperar los valores SQLERRMC dentro de una matriz. 7) Invoque el mtodo DB2Sqlca.getSqlErrp para recuperar el valor SQLERRP. 8) Invoque el mtodo DB2Sqlca.getSqlErrd para recuperar los valores SQLERRD dentro de una matriz. 9) Invoque el mtodo DB2Sqlca.getSqlWarn para recuperar los valores SQLWARN dentro de una matriz. 10) Invoque el mtodo DB2Sqlca.getSqlState para recuperar el valor SQLSTATE. 11) Invoque el mtodo DB2Sqlca.getMessage para recuperar texto de mensajes de error del servidor de bases de datos. c. Invoque el mtodo SQLException.getNextException para recuperar la excepcin SQLException siguiente. El cdigo siguiente muestra cmo obtener informacin de la versin DB2 de una SQLException que se proporciona con el Controlador IBM DB2 para JDBC y SQLJ. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

86

Desarrollo de aplicaciones Java

import java.sql.*; import com.ibm.db2.jcc.DB2Diagnosable; import com.ibm.db2.jcc.DB2Sqlca; java.io.PrintWriter printWriter;

// // // // //

Importar paquete de la API de JDBC Importar paquetes de DB2 1 Soporte de SQLException Para volcar toda la informacin de SQLException

... try { 2 // Cdigo que podra generar excepciones de SQL ... } catch(SQLException sqle) { while(sqle != null) { // Comprobar si hay ms excepciones 3a // Excepciones de SQL para procesar //=====> Proceso opcional de errores slo de DB2 if (sqle instanceof DB2Diagnosable) { 3b // Comprobar si existe informacin especfica de DB2 com.ibm.db2.jcc.DB2Diagnosable diagnosable = (com.ibm.db2.jcc.DB2Diagnosable)sqle; 3b1 diagnosable.printTrace (printWriter, ""); 3b2 java.lang.Throwable throwable = diagnosable.getThrowable(); 3b3 if (throwable != null) { // Extraer informacin sobre java.lang.Throwable, // tal como mensaje o rastreo de pila. ... } DB2Sqlca sqlca = diagnosable.getSqlca(); 3b4 // Obtener objeto DB2Sqlca if (sqlca != null) { // Comprobar que DB2Sqlca no es nulo int sqlCode = sqlca.getSqlCode(); // Obtener cdigo de error // de SQL 3b5 String sqlErrmc = sqlca.getSqlErrmc(); 3b6 // Obtener el valor SQLERRMC completo String[] sqlErrmcTokens = sqlca.getSqlErrmcTokens(); // Tambin se pueden recuperar // seales SQLERRMC individuales String sqlErrp = sqlca.getSqlErrp(); 3b7 // Obtener el valor SQLERRP int[] sqlErrd = sqlca.getSqlErrd(); 3b8 // Obtener campos SQLERRD char[] sqlWarn = sqlca.getSqlWarn(); 3b9 // Obtener campos SQLWARN String sqlState = sqlca.getSqlState(); 3b10 // Obtener SQLSTATE String errMessage = sqlca.getMessage(); 3b11 // Obtener mensaje de error System.err.println ("Mensaje de error de servidor: " + errMessage); System.err.println ("--------------- SQLCA ---------------"); System.err.println ("Cdigo de error: " + sqlCode); System.err.println ("SQLERRMC: " + sqlErrmc); for (int i=0; i< sqlErrmcTokens.length; i++) { System.err.println (" token " + i + ": " + sqlErrmcTokens[i]); } Figura 29. Proceso de una excepcin SQLException cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ (Parte 1 de 2)

Captulo 2. Programacin de aplicaciones JDBC

87

System.err.println ( "SQLERRP: " + sqlErrp ); System.err.println ( "SQLERRD(1): " + sqlErrd[0] + "\n" + "SQLERRD(2): " + sqlErrd[1] + "\n" + "SQLERRD(3): " + sqlErrd[2] + "\n" + "SQLERRD(4): " + sqlErrd[3] + "\n" + "SQLERRD(5): " + sqlErrd[4] + "\n" + "SQLERRD(6): " + sqlErrd[5] ); System.err.println ( "SQLWARN1: " + sqlWarn[0] + "\n" + "SQLWARN2: " + sqlWarn[1] + "\n" + "SQLWARN3: " + sqlWarn[2] + "\n" + "SQLWARN4: " + sqlWarn[3] + "\n" + "SQLWARN5: " + sqlWarn[4] + "\n" + "SQLWARN6: " + sqlWarn[5] + "\n" + "SQLWARN7: " + sqlWarn[6] + "\n" + "SQLWARN8: " + sqlWarn[7] + "\n" + "SQLWARN9: " + sqlWarn[8] + "\n" + "SQLWARNA: " + sqlWarn[9] ); System.err.println ("SQLSTATE: " + sqlState); // Porcin de excepcin de SQL } sqle=sqle.getNextException(); } } Figura 29. Proceso de una excepcin SQLException cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ (Parte 2 de 2) // Recuperar excepcin de SQL siguiente 3c

Informacin relacionada: v Cdigos de error emitidos por el controlador IBM DB2 para JDBC y SQLJ en la pgina 368

Manejo de un aviso de SQL en el controlador IBM DB2 para JDBC y SQLJ


A diferencia de los errores de SQL, los avisos de SQL no hacen que los mtodos de JDBC emitan excepciones. En lugar de ello, las clases Connection, Statement, PreparedStatement, CallableStatement y ResultSet contienen mtodos getWarnings, que es necesario invocar despus de ejecutar sentencias de SQL para determinar si se han producido avisos de SQL. La invocacin de getWarnings hace que se recupere un objeto SQLWarning. Importante: Cuando una llamada a Statement.executeUpdate o PreparedStatement.executeUpdate no repercute sobre las filas, el Controlador IBM DB2 para JDBC y SQLJ genera un SQLWarning con el cdigo de error +100. Cuando una llamada a ResultSet.next no devuelve ninguna fila, el Controlador IBM DB2 para JDBC y SQLJ no genera un SQLWarning. Un objeto SQLWarning genrico contiene la informacin siguiente: v Un objeto String que contiene una descripcin del aviso o el valor nulo v Un objeto String que contiene el SQLSTATE o el valor nulo v Un valor int que contiene un cdigo de error v Un puntero que indica la ubicacin del objeto SQLWarning siguiente o un valor nulo

88

Desarrollo de aplicaciones Java

Cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ, al igual que ocurre con un objeto SQLException, un objeto SQLWarning puede contener tambin informacin especfica de DB2. La informacin especfica de DB2 correspondiente a un objeto SQLWarning es la misma que la informacin especfica de DB2 correspondiente a un objeto SQLException. Los pasos bsicos para recuperar informacin de avisos de SQL son los siguientes: 1. Inmediatamente despus de invocar un mtodo por el que se ejecuta una sentencia de SQL, invoque el mtodo getWarnings para obtener un objeto SQLWarning. 2. Ejecute en bucle los pasos siguientes: a. Determine si el objeto SQLWarning es nulo. Si no lo es, prosiga en el paso siguiente. b. Invoque el mtodo SQLWarning.getMessage para obtener la descripcin del aviso. c. Invoque el mtodo SQLWarning.getSQLState para obtener el valor SQLSTATE. d. Invoque el mtodo SQLWarning.getErrorCode para obtener el valor del cdigo de error. e. Si desea obtener informacin de aviso especfica de DB2, ejecute los mismos pasos realizados para obtener informacin especfica de DB2 para un objeto SQLException. f. Invoque el mtodo SQLWarning.getNextWarning para obtener el objeto SQLWarning siguiente. El cdigo siguiente muestra cmo obtener informacin genrica sobre SQLWarning. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Connection con; Statement stmt; ResultSet rs; SQLWarning sqlwarn; ... stmt = con.createStatement(); // Crear un objeto Statement rs = stmt.executeQuery("SELECT * FROM EMPLOYEE"); // Obtener tabla de resultados de la consulta sqlwarn = stmt.getWarnings(); // Obtener los avisos generados 1 while (sqlwarn != null) { // Mientras existan avisos, obtener e 2a // imprimir informacin de aviso System.out.println ("Descripcin del aviso: " + sqlwarn.getMessage()); 2b System.out.println ("SQLSTATE: " + sqlwarn.getSQLState()); 2c System.out.println ("Cdigo de error: " + sqlwarn.getErrorCode()); 2d sqlwarn=sqlwarn.getNextWarning(); // Obtener aviso de SQL siguiente 2f } Figura 30. Proceso de un aviso de SQL

Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84

Captulo 2. Programacin de aplicaciones JDBC

89

Recuperacin de informacin de una excepcin BatchUpdateException


Cuando se produce un error durante la ejecucin de una sentencia de un lote de sentencias, el proceso contina. Pero executeBatch emite una excepcin BatchUpdateException. El objeto BatchUpdateException contiene los elementos siguientes: v Un objeto String que contiene una descripcin del error, o bien null. v Un objeto String que contiene el estado de SQL (SQLSTATE) de la sentencia de SQL anmala, o el valor null v Un valor entero que contiene el cdigo de error o cero v Una matriz entera de cuentas de actualizacin para las sentencias de SQL del lote o el valor null v Un puntero que apunta a un objeto SQLException o el valor null Se emite una sola excepcin BatchUpdateException para el lote completo. Como mnimo un objeto SQLException est encadenado al objeto BatchUpdateException. Los objetos SQLException estn encadenados en el mismo orden que las sentencias correspondientes que se aadieron al lote. Para ayudarle a asociar los objetos SQLException con las sentencias del lote, el campo descriptivo del error de cada objeto SQLException comienza con este texto:
Error para elemento del lote #n:

n es el nmero de la sentencia dentro del lote. Para recuperar informacin de la excepcin BatchUpdateException, siga estos pasos: 1. Utilice el mtodo BatchUpdateException.getUpdateCounts para determinar el nmero de filas que cada sentencia de SQL del lote ha actualizado antes de que se produjera la excepcin. getUpdateCount devuelve una matriz con un elemento por cada sentencia del lote. Un elemento tiene uno de los valores siguientes: n El nmero de filas que la sentencia ha actualizado.

Statement.SUCCESS_NO_INFO Este valor se devuelve si no se puede determinar el nmero de filas actualizado. Statement.EXECUTE_FAILED Este valor se devuelve si la sentencia no se ha ejecutado satisfactoriamente. 2. Utilice los mtodos getMessage, getSQLState y getErrorCode de SQLException para obtener la descripcin del error, el estado de SQL y el cdigo de error correspondientes al primer error. 3. Utilice el mtodo BatchUpdateException.getNextException para obtener una excepcin SQLException encadenada. 4. Ejecute en bucle las llamadas de mtodo getMessage, getSQLState, getErrorCode y getNextException para obtener informacin sobre una excepcin SQLException y obtener la siguiente excepcin SQLException. Ejemplo de obtencin de informacin de una excepcin BatchUpdateException: el fragmento de cdigo siguiente muestra cmo obtener los campos de una excepcin BatchUpdateException y los objetos SQLException encadenados. Los nmeros que

90

Desarrollo de aplicaciones Java

aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.


try { // Actualizaciones por lotes } catch(BatchUpdateException buex) { System.err.println("Contents of BatchUpdateException:"); System.err.println(" Update counts: "); int [] updateCounts = buex.getUpdateCounts(); 1 for (int i = 0; i < updateCounts.length; i++) { System.err.println(" Statement " + i + ":" + updateCounts[i]); } System.err.println(" Message: " + buex.getMessage()); 2 System.err.println(" SQLSTATE: " + buex.getSQLState()); System.err.println(" Error code: " + buex.getErrorCode()); SQLException ex = buex.getNextException(); 3 while (ex != null) { 4 System.err.println("SQL exception:"); System.err.println(" Message: " + ex.getMessage()); System.err.println(" SQLSTATE: " + ex.getSQLState()); System.err.println(" Error code: " + ex.getErrorCode()); ex = ex.getNextException(); } } Figura 31. Recuperacin de los campos de una excepcin BatchUpdateException

Para obtener informacin sobre avisos, utilice el mtodo Statement.getWarnings para el objeto en el que ejecut el mtodo executeBatch. Luego puede obtener una descripcin de error, el estado de SQL y el cdigo de error correspondientes a cada objeto SQLWarning. Restricciones sobre la ejecucin de sentencias en un lote: v Si intenta ejecutar una sentencia SELECT en un lote, se emite una excepcin BatchUpdateException. v Un objeto CallableStatement que ejecute en un lote puede contener parmetros de salida. Sin embargo, no puede recuperar los valores de los parmetros de salida. Si intenta hacerlo, se emite una excepcin BatchUpdateException. v No puede recuperar objetos ResultSet de un objeto CallableStatement que ejecute en un lote. En ese caso no se emite una excepcin BatchUpdateException, pero la invocacin del mtodo getResultSet devuelve un valor nulo. Tareas relacionadas: v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46

Manejo de una excepcin de SQL cuando se utiliza el controlador JDBC de DB2 de tipo 2
Al igual que en todos los programas Java, el manejo de errores se realiza mediante bloques try/catch. Los mtodos emiten excepciones cuando se producen errores, y el cdigo contenido en el bloque catch maneja esas excepciones. JDBC proporciona la clase SQLException para manejar errores. Todos los mtodos de JDBC emiten una instancia de SQLException cuando se produce un error durante la ejecucin del mtodo. De acuerdo con la especificacin JDBC, un objeto SQLException contiene la informacin siguiente: v Un objeto String que contiene una descripcin del error o el valor nulo v Un objeto String que contiene el SQLSTATE o el valor nulo
Captulo 2. Programacin de aplicaciones JDBC

91

v Un valor int que contiene un cdigo de error v Un puntero que indica la ubicacin del objeto SQLException siguiente o un valor nulo Los pasos bsicos para manejar una excepcin de SQLE en un programa JDBC que se ejecuta con el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2: 1. Coloque cdigo que pueda generar una excepcin SQLException en un bloque try. 2. En el bloque catch, ejecute los pasos siguientes en un bucle: a. Determine si ha recuperado la ltima excepcin SQLException. Si no la ha recibido, contine en el paso siguiente. b. Recupere la informacin de error procedente de SQLException. c. Invoque el mtodo SQLException.getNextException para recuperar la excepcin SQLException siguiente. El cdigo siguiente muestra un bloque catch que utiliza la versin de DB2 de la excepcin de SQL que se proporciona con el controlador JDBC de DB2 de tipo 2. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
import java.sql.*; // Importar paquete de la API de JDBC ... try { // Cdigo que podra generar excepciones de SQL ... } catch(SQLException sqle) { while(sqle != null) { // Comprobar si hay ms excepciones 1 System.out.println("Message: " + sqle.getMessage()); 2 System.out.println("SQLSTATE: " + sqle.getSQLState()); System.out.println("Cdigo de error SQL: " + sqle.getErrorCode()); sqle=sqle.getNextException(); // Recuperar excepcin de SQL siguiente 3 } } Figura 32. Proceso de una excepcin SQLException cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ

Tareas relacionadas: v Manejo de un aviso de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 88

Manejo de un aviso de SQL con el controlador JDBC de DB2 de tipo 2


A diferencia de los errores de SQL, los avisos de SQL no hacen que los mtodos de JDBC emitan excepciones. En lugar de ello, las clases Connection, Statement, PreparedStatement, CallableStatement y ResultSet contienen mtodos getWarnings, que es necesario invocar despus de ejecutar sentencias de SQL para determinar si se han producido avisos de SQL. La invocacin de getWarnings hace que se recupere un objeto SQLWarning. El controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2) genera objetos SQLWarning genricos. Un objeto SQLWarning genrico contiene la informacin siguiente: v Un objeto String que contiene una descripcin del aviso o el valor nulo v Un objeto String que contiene el SQLSTATE o el valor nulo

92

Desarrollo de aplicaciones Java

v Un valor int que contiene un cdigo de error v Un puntero que indica la ubicacin del objeto SQLWarning siguiente o un valor nulo Estos son los pasos bsicos para recuperar informacin sobre avisos de SQL: 1. Inmediatamente despus de invocar un mtodo por el que se ejecuta una sentencia de SQL, invoque el mtodo getWarnings para obtener un objeto SQLWarning. 2. Ejecute en bucle los pasos siguientes: a. Determine si el objeto SQLWarning es nulo. Si no es nulo, contine en el paso siguiente. b. Invoque el mtodo SQLWarning.getMessage para obtener la descripcin del aviso. c. Invoque el mtodo SQLWarning.getSQLState para obtener el valor SQLSTATE. d. Invoque el mtodo SQLWarning.getErrorCode para obtener el valor del cdigo de error. e. Invoque el mtodo SQLWarning.getNextWarning para obtener el objeto SQLWarning siguiente. El cdigo siguiente muestra cmo obtener informacin genrica sobre SQLWarning. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
Connection con; Statement stmt; ResultSet rs; SQLWarning sqlwarn; ... stmt = con.createStatement(); // Crear un objeto Statement rs = stmt.executeQuery("SELECT * FROM EMPLOYEE"); // Obtener tabla de resultados de la consulta sqlwarn = stmt.getWarnings(); // Obtener los avisos generados 1 while (sqlwarn != null) { // Mientras existan avisos, obtener e 2a // imprimir informacin de aviso System.out.println ("Descripcin del aviso: " + sqlwarn.getMessage()); 2b System.out.println ("SQLSTATE: " + sqlwarn.getSQLState()); 2c System.out.println ("Cdigo de error: " + sqlwarn.getErrorCode()); 2d sqlwarn=sqlwarn.getNextWarning(); // Obtener aviso de SQL siguiente 2f } Figura 33. Proceso de un aviso de SQL

Tareas relacionadas: v Manejo de una excepcin de SQL cuando se utiliza el controlador JDBC de DB2 de tipo 2 en la pgina 91

Controlador IBM DB2 para soporte de redireccionamiento de cliente de JDBC y SQLJ


La funcin de redireccionamiento de cliente automtico de DB2 Database para Linux, UNIX y Windows permite a las aplicaciones de cliente recuperarse de una prdida de comunicacin con el servidor con el fin de que puedan continuar trabajando con el mnimo de interrupciones posible.

Captulo 2. Programacin de aplicaciones JDBC

93

Cuando se bloquea un servidor, cada cliente que est conectado a dicho servidor recibe un error de comunicacin que finaliza la conexin y provoca un error de la aplicacin. Si la disponibilidad es importante, deber implementar una configuracin redundante o contar con soporte para la funcin de gestin de anomalas. La gestin de anomalas es la capacidad de un servidor para asumir operaciones cuando falla otro servidor. En cualquier caso, el cliente de Controlador IBM DB2 para JDBC y SQLJ intenta restablecer la conexin con el servidor original o con un servidor nuevo. Una vez restablecida la conexin, la aplicacin recibir una excepcin SQLException que le notificar el error de la transaccin; sin embargo, la aplicacin podr seguir con la transaccin siguiente. El soporte de redireccionamiento de cliente del Controlador IBM DB2 para JDBC y SQLJ slo est disponible para conexiones que se obtienen mediante una interfaz DataSource. La interfaz DriverManager no es compatible. Para que una aplicacin de cliente se recupere de una prdida de comunicacin, deber especificarse una ubicacin de servidor alternativa en el servidor. El administrador de base de datos especifica el servidor alternativo con el mandato UPDATE ALTERNATE SERVER FOR DATABASE. Una vez que el administrador de base de datos haya especificado la ubicacin de servidor alternativa en una base de datos determinada y en una instancia de servidor, el cliente obtendr las ubicaciones de servidor principal y alternativa en el momento en el que se conecte. El Controlador IBM DB2 para JDBC y SQLJ crea una instancia de la clase DB2ClientRerouteServerList, la cual implementa la interfaz javax.naming.Referenceable y almacena dicha instancia en su memoria temporal. Si se pierde la comunicacin, el Controlador IBM DB2 para JDBC y SQLJ intentar restablecer la conexin mediante la informacin de ubicacin del servidor que el servidor devuelve. DB2ClientRerouteServerList es un bean de Java serializable con las propiedades siguientes:
Nombre de propiedad com.ibm.db2.jcc.DB2ClientRerouteServerList.alternateServerName com.ibm.db2.jcc.DB2ClientRerouteServerList.alternatePortNumber com.ibm.db2.jcc.DB2ClientRerouteServerList.primaryServerName com.ibm.db2.jcc.DB2ClientRerouteServerList.primaryPortNumber Tipo de datos String[] int[] String[] int[]

Para cada propiedad se definen los mtodos getXXX y setXXX. La propiedad clientRerouteServerListJNDIName de un DataSource proporciona soporte de redireccionamiento de cliente adicional en el sistema cliente. clientRerouteServerListJNDIName tiene dos funciones: v Permite conservar la informacin sobre servidores de redireccionamiento en todas las JVM. v Proporciona una ubicacin de servidor alternativa en el caso de que la primera conexin con el servidor de la base de datos falle. clientRerouteServerListJNDIName identifica una referencia JNDI para una instancia de DB2ClientRerouteServerList en un depsito JNDI de informacin del servidor de redireccionamiento. Despus de que se haya establecido la conexin con el servidor principal correctamente, la informacin del servidor sobrescribir la informacin del servidor alternativo proporcionada por clientRerouteServerListJNDIName.

94

Desarrollo de aplicaciones Java

Si la propiedad clientRerouteServerListJNDIName est definida: v El Controlador IBM DB2 para JDBC y SQLJ intenta propagar la informacin actualizada al almacn de JNDI despus de una anomala. v Los valores primaryServerName y primaryPortNumber que se especifican en DB2ClientRerouteServerList se utilizan para la conexin. Si no se especifica el valor primaryServerName, se utilizar el valor serverName de la instancia de DataSource. Cuando se establece una conexin de gestin de anomalas, se utilizarn todas las propiedades originales de DataSource, excepto el nombre de servidor y el nmero de puerto. Adems, los registros especiales de DB2 que se han modificado durante la conexin original son restablecidos en la conexin de gestin de anomalas por el Controlador IBM DB2 para JDBC y SQLJ. Cuando se produce un error de comunicaciones, el Controlador IBM DB2 para JDBC y SQLJ primero intenta recuperar el servidor original. La reconexin con el servidor original se denomina recuperacin. Si la recuperacin falla, el controlador intentar conectar con la ubicacin alternativa. Una vez que se haya restablecido la conexin, el controlador emitir una excepcin java.sql.SQLException a la aplicacin con el cdigo SQLCODE -4498, para indicar a la aplicacin de que la conexin con el servidor alternativo se ha restablecido automticamente y que la transaccin se ha retrotrado de forma implcita. A continuacin, la aplicacin puede intentar su transaccin sin realizar una retroaccin en primer lugar. Para configurar el almacenamiento de modo que DB2ClientRerouteServerList sea permanente, siga los pasos siguientes: 1. Cree una instancia de DB2ClientRerouteServerList y vincule esa instancia con el registro de JNDI. Ejemplo:
// Crear un contexto inicial para operaciones de asignacin de nombres InitialContext registry = new InitialContext(); // Crear un objeto DB2ClientRerouteServerList DB2ClientRerouteServerList address = new DB2ClientRerouteServerList(); // Definir el nmero de puerto y nombre de servidor para el servidor principal address.setPrimaryPortNumber(50000); address.setPrimaryServerName("mvs1.sj.ibm.com"); // Definir el nmero de puerto y nombre de servidor para el servidor alternativo int[] port = {50002}; String[] server = {"mvs3.sj.ibm.com"}; address.setAlternatePortNumber(port); address.setAlternateServerName(server); registry.rebind("serverList", address);

2. Asigne el nombre de JNDI del objeto DB2ClientRerouteServerList a la propiedad clientRerouteServerListJNDIName. Ejemplo:


datasource.setClientRerouteServerListJNDIName("serverList");

Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249 v Resumen de las extensiones de JDBC del Controlador IBM DB2 para JDBC y SQLJ en la pgina 321

Captulo 2. Programacin de aplicaciones JDBC

95

Desconexin de servidores de bases de datos en aplicaciones JDBC


Una vez finalizada una conexin con una fuente de datos, es esencial que cierre la conexin con la fuente de datos. De esta forma se liberan inmediatamente los recursos del objeto Connection de DB2 y JDBC. Para cerrar la conexin con la fuente de datos, utilice el mtodo close. Por ejemplo:
Connection con; ... con.close();

Si la modalidad de confirmacin automtica no est activa, es necesario que la conexin se encuentre en los lmites de una unidad de trabajo antes de cerrar la conexin. Conceptos relacionados: v Conexin de las aplicaciones JDBC a una fuente de datos en la pgina 26

96

Desarrollo de aplicaciones Java

Captulo 3. Programacin de aplicaciones SQLJ


Los temas siguientes contienen informacin bsica sobre la escritura de aplicaciones SQLJ. v Pasos bsicos para grabar una aplicacin SQLJ v Conexin a una fuente de datos utilizando SQLJ en la pgina 100 v Paquetes Java para el soporte SQLJ en la pgina 106 v Variables en aplicaciones SQLJ en la pgina 106 v Comentarios en una aplicacin SQLJ en la pgina 108 v Ejecucin de sentencias de SQL en aplicaciones SQLJ en la pgina 108 v Trabajo con datos XML en aplicaciones SQLJ en la pgina 144 v Control de transacciones en aplicaciones SQLJ en la pgina 149 v Manejo de errores y avisos en aplicaciones SQLJ en la pgina 150 v Cierre de una conexin a una fuente de datos en una aplicacin SQLJ en la pgina 151

Pasos bsicos para grabar una aplicacin SQLJ


La escritura de una aplicacin JDBC es muy similar a la escritura de una aplicacin SQL en cualquier otro lenguaje: en general, es necesario seguir los pasos siguientes: v Importar los paquetes Java donde estn contenidos los mtodos de JDBC y SQLJ. v Declarar variables para enviar datos a tablas de DB2 o recuperar datos de las mismas. v Conectar con una fuente de datos. v Ejecutar sentencias de SQL. v Manejar los errores y avisos de SQL. v Desconectar de la fuente de datos. Aunque las tareas necesarias son similares a las que se ejecutan para otros lenguajes, la forma de ejecutarlas y el orden de ejecucin es algo diferente. La Figura 34 en la pgina 98 es un programa sencillo que muestra la ejecucin de cada tarea.

Copyright IBM Corp. 2006

97

import sqlj.runtime.*; import java.sql.*; #sql context EzSqljCtx; #sql iterator EzSqljNameIter (String LASTNAME);

1 3a 4a

public class EzSqlj { public static void main(String args[]) throws SQLException { EzSqljCtx ctx = null; String URLprefix = "jdbc:db2:"; String url; url = new String(URLprefix + args[0]); // El nombre de ubicacin es un parmetro de entrada String hvmgr="000010"; 2 String hvdeptno="A00"; try { 3b Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (Exception e) { throw new SQLException("Error en EzSqlj: no se pudo cargar controlador"); } try { System.out.println("Se va a conectar utilizando el url: " + url); Connection con0 = DriverManager.getConnection(url); 3c // Crear una conexin JDBC con0.setAutoCommit(false); // Desactivar la confirmacin automtica ctx = new EzSqljCtx(con0); 3d try { EzSqljNameIter iter; int count=0; #sql [ctx] iter = {SELECT LASTNAME FROM EMPLOYEE}; 4b // Crear tabla de resultados de SELECT while (iter.next()) { 4c System.out.println(iter.LASTNAME()); // Obtener filas de tabla de resultados count++; } System.out.println("Recuperadas " + count + " filas de datos"); }

Figura 34. Aplicacin SQLJ sencilla (Parte 1 de 2)

98

Desarrollo de aplicaciones Java

catch( SQLException e ) 5 { System.out.println ("**** Excepcin de SQL de SELECT..."); while(e!=null) { System.out.println ("Mensaje de error: " + e.getMessage()); System.out.println ("SQLSTATE: " + e.getSQLState()); System.out.println ("Cdigo de error: " + e.getErrorCode()); e = e.getNextException(); // Buscar excepciones encadenadas } } catch (Exception e) { System.out.println("**** Excepcin no de SQL = " + e); e.printStackTrace(); } try { #sql [ctx] 4d {UPDATE DEPARTMENT SET MGRNO=:hvmgr WHERE DEPTNO=:hvdeptno}; // Actualizar datos para un departamento 6 #sql [ctx] {COMMIT}; // Confirmar actualizacin } catch (SQLException e) { System.out.println ("**** Excepcin de SQL de UPDATE..."); System.out.println ("Mensaje de error: " + e.getMessage() + ". SQLSTATE=" + e.getSQLState() + "Cdigo de error=" + e.getErrorCode()); e.printStackTrace(); } catch (Exception e) { System.out.println("**** Excepcin no de SQL = " + e); e.printStackTrace(); } iter.close(); // Cerrar el iterador ctx.close(); 7 } catch (SQLException e) { System.out.println ("**** Excepcin de SQL ..."); System.out.println ("Mensaje de error: " + e.getMessage() + ". SQLSTATE=" + e.getSQLState() + "Cdigo de error=" + e.getErrorCode()); e.printStackTrace(); } catch (Exception e) { System.out.println("**** Excepcin no de SQL = " + e); e.printStackTrace(); } }

Figura 34. Aplicacin SQLJ sencilla (Parte 2 de 2)

Notas para la Figura 34 en la pgina 98:


Nota 1 Descripcin Estas sentencias importan el paquete java.sql, que contiene la API bsica de JDBC, y el paquete sqlj.runtime, que contiene la API de SQLJ. Para obtener informacin acerca de otros paquetes o clases a los que pueda necesitar acceder, consulte el tema Acceso a paquetes Java para soporte de SQLJ. 2 Las variables String hvmgr y hvdeptno son identificadores del lenguaje principal, que son equivalentes a las variables del lenguaje principal de DB2. Consulte el tema Declaracin de variables en aplicaciones SQLJ para obtener ms informacin. 3a , 3b , Estas sentencias muestran cmo conectar con una fuente de datos utilizando 3c y una de las tres tcnicas disponibles. Consulte el tema Conectar a una fuente de 3d datos utilizando SQLJ para obtener ms informacin.

Captulo 3. Programacin de aplicaciones SQLJ

99

Nota Descripcin 4a , 4b , Estas sentencias muestran cmo ejecutar sentencias de SQL en SQLJ. La 4c y sentencia 4a es el equivalente de SQLJ para declarar un cursor de SQL. Las 4d sentencias 4b y 4c son un equivalente de SQLJ para ejecutar sentencias FETCH de SQL. La sentencia 4d es el equivalente de SQLJ para ejecutar una sentencia UPDATE de SQL. Para obtener ms informacin, consulte el tema Ejecucin de SQL en una aplicacin SQLJ. 5 Este bloque try/catch muestra el uso de la clase SQLException para el manejo de errores de SQL. Para obtener ms informacin sobre el manejo de errores de SQL, consulte el tema Manejo de errores en una aplicacin SQLJ. Para obtener ms informacin sobre el manejo de avisos de SQL, consulte el tema Manejo de avisos de SQL en una aplicacin SQLJ. 6 Esto es un ejemplo de un comentario. Para conocer las reglas sobre la inclusin de comentarios en programas SQLJ, consulte el tema Inclusin de comentarios en una aplicacin SQLJ. 7 Esta sentencia cierra la conexin con la fuente de datos. Consulte el tema Cierre de la conexin con la fuente de datos en una aplicacin SQLJ.

Conceptos relacionados: v Paquetes Java para el soporte SQLJ en la pgina 106 v Variables en aplicaciones SQLJ en la pgina 106 v Sentencias de SQL en una aplicacin SQLJ en la pgina 109 Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Conexin a una fuente de datos utilizando SQLJ


En una aplicacin SQLJ, al igual que en cualquier otra aplicacin DB2, debe estar conectado a un servidor de bases de datos antes de ejecutar sentencias de SQL. En SQLJ, como en JDBC, un servidor de bases de datos se denomina fuente de datos. Puede utilizar una de las tcnicas siguientes para conectarse a una fuente de datos. Tcnica de conexin 1: esta tcnica utiliza la interfaz DriverManager de JDBC como mecanismo subyacente para crear la conexin. sela con cualquier nivel de controlador JDBC. 1. Ejecute una clusula de declaracin de conexin de SQLJ. Esto genera una clase de contexto de conexin. El formato ms sencillo de la clusula de declaracin de conexin es el siguiente:
#sql context nombre_clase_contexto;

El nombre de la clase de contexto de conexin que se genera es nombre_clase_contexto. 2. Cargue un controlador JDBC invocando el mtodo Class.forName: v Para el Controlador IBM DB2 para JDBC y SQLJ, invoque Class.forName del modo siguiente:
Class.forName("com.ibm.db2.jcc.DB2Driver");

v Para el controlador DB2 JDBC de tipo 2, invoque Class.forName de esta forma:


Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");

100

Desarrollo de aplicaciones Java

3. Invoque el constructor para la clase de contexto de conexin que cre en el paso 1 en la pgina 100. Esto crea un objeto de contexto de conexin que especificar en cada sentencia de SQL que ejecute en la fuente de datos asociada. La sentencia de invocacin del constructor debe tener uno de los formatos siguientes:
clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin (String url, boolean confirmacin_automtica); clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin(String url, String usuario, String contrasea, boolean confirmacin_automtica); clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin(String url, Properties info, boolean confirmacin_automtica);

Estos son los significados de los parmetros: url Es una cadena de caracteres que especifica el nombre de ubicacin correspondiente a la fuente de datos. Este argumento tiene uno de los formatos especificados en Conectar a una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ. El formato depende del controlador JDBC que est utilizando. usuario y contrasea Especifique un ID de usuario y una contrasea para conectarse a la fuente de datos, si sta los requiere. info Especifica un objeto de tipo java.util.Properties que contiene un conjunto de propiedades de controlador correspondientes a la conexin. Para el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2), debe especificar nicamente las propiedades user y password. Para el Controlador IBM DB2 para JDBC y SQLJ, puede especificar cualquiera de las propiedades que figuran en Propiedades del controlador IBM DB2 para JDBC y SQLJ. confirmacin_automtica Especifica si el gestor de bases de datos debe emitir una operacin de confirmacin despus de cada sentencia. Los valores posibles son true o false. Si especifica false, necesitar realizar operaciones de confirmacin explcitas. El cdigo siguiente utiliza la tcnica de conexin 1 para crear una conexin con la ubicacin NEWYORK. La conexin exige especificar un ID de usuario y contrasea, y no necesita confirmacin automtica. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

Captulo 3. Programacin de aplicaciones SQLJ

101

#sql context Ctx; // Crear la clase de contexto de conexin Ctx 1 String userid="dbadm"; // Declarar variables para ID de usuario y contrasea String password="dbadm"; String empname; // Declarar una variable de lenguaje principal ... try { // Cargar el controlador JDBC Class.forName("com.ibm.db2.jcc.DB2Driver"); 2 } catch (ClassNotFoundException e) { e.printStackTrace(); } Ctx myConnCtx= 3 new Ctx("jdbc:db2: //sysmvs1.stl.ibm.com:5021/NEWYORK", userid,password,false); // Crear objeto contexto conexin myConnCtx // para la conexin con NEWYORK #sql [myConnCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; // Usar myConnCtx para ejecutar una sentencia de SQL Figura 35. Uso de la tcnica de conexin 1 para conectar con una fuente de datos

Tcnica de conexin 2: esta tcnica utiliza la interfaz DriverManager de JDBC para crear la conexin. sela con cualquier nivel de controlador JDBC. 1. Ejecute una clusula de declaracin de conexin de SQLJ. Esto es lo mismo que el paso 1 en la pgina 100 en la tcnica de conexin 1. 2. Cargue el controlador. Esto es lo mismo que el paso 2 en la pgina 100 en la tcnica de conexin 1. 3. Invoque el mtodo DriverManager.getConnection de JDBC. Esto crea un objeto de conexin de JDBC para la conexin con la fuente de datos. Puede utilizar cualquiera de los formatos de getConnection que se especifican en Conectar a una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ. Los significados de los parmetros url, usuario y contrasea son iguales que los significados de los parmetros del paso 3 en la pgina 101 de la tcnica de conexin 1. 4. Invoque el constructor para la clase de contexto de conexin que cre en el paso 1. Esto crea un objeto de contexto de conexin que especificar en cada sentencia de SQL que ejecute en la fuente de datos asociada. La sentencia de invocacin del constructor debe tener el formato siguiente:
clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin(Connection objeto_conexin_JDBC);

El parmetro objeto_conexin_JDBC es el objeto Connection que cre en el paso 3. El cdigo siguiente utiliza la tcnica de conexin 2 para crear una conexin con la ubicacin NEWYORK. La conexin exige especificar un ID de usuario y contrasea, y no necesita confirmacin automtica. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

102

Desarrollo de aplicaciones Java

#sql context Ctx; // Crear clase de contexto de conexin Ctx 1 String userid="dbadm"; // Declarar variables para ID de usuario y contrasea String password="dbadm"; String empname; // Declarar una variable de lenguaje principal ... try { // Cargar el controlador JDBC Class.forName("com.ibm.db2.jcc.DB2Driver"); 2 } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection jdbccon= 3 DriverManager.getConnection("jdbc:db2://sysmvs1.stl.ibm.com:5021/NEWYORK", userid,password); // Crear objeto de conexin JDBC jdbccon jdbccon.setAutoCommit(false); // No realizar confirmacin automtica 4 Ctx myConnCtx=new Ctx(jdbccon); 5 // Crear objeto contexto conexin myConnCtx // para la conexin con NEWYORK #sql [myConnCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; // Usar myConnCtx para ejecutar una sentencia de SQL Figura 36. Uso de la tcnica de conexin 2 para conectar con una fuente de datos

Tcnica de conexin 3: esta tcnica utiliza la interfaz DataSource de JDBC para crear la conexin. 1. Ejecute una clusula de declaracin de conexin de SQLJ. Esto es lo mismo que el paso 1 en la pgina 100 en la tcnica de conexin 1. 2. Si el administrador del sistema ha creado un objeto DataSource en un programa diferente: a. Obtenga el nombre lgico de la fuente de datos con la que necesita conectar. b. Cree un contexto para utilizarlo en el paso siguiente. c. En el programa de aplicacin, utilice Java Naming and Directory Interface (JNDI) para obtener el objeto DataSource asociado al nombre lgico de fuente de datos. En otro caso, cree un objeto DataSource y asgnele propiedades, tal como se muestra en el tema Creacin y utilizacin de objeto DataSource en la misma aplicacin en Conexin a una fuente de datos utilizando la interfaz DataSource. 3. Invoque el mtodo DataSource.getConnection de JDBC. Esto crea un objeto de conexin de JDBC para la conexin con la fuente de datos. Puede utilizar uno de los formatos siguientes de getConnection:
getConnection(); getConnection(usuario, contrasea);

Los significados de los parmetros usuario y contrasea son los mismos que para los parmetros del paso 3 en la pgina 101 en la tcnica de conexin 1. 4. Si el valor por omisin para la confirmacin automtica no es apropiado, invoque el mtodo Connection.setAutoCommit. De esta forma especifica si el gestor de bases de datos debe emitir una operacin de confirmacin despus de cada sentencia. El formato de este mtodo es:
setAutoCommit(boolean confirmacin_automtica);

5. Invoque el constructor para la clase de contexto de conexin que cre en el paso 1.

Captulo 3. Programacin de aplicaciones SQLJ

103

Esto crea un objeto de contexto de conexin que especificar en cada sentencia de SQL que ejecute en la fuente de datos asociada. La sentencia de invocacin del constructor debe tener el formato siguiente:
clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin(Connection objeto_conexin_JDBC);

El parmetro objeto_conexin_JDBC es el objeto Connection que cre en el paso 3 en la pgina 103. El cdigo siguiente utiliza la tcnica de conexin 3 para crear una conexin con una ubicacin cuyo nombre lgico es jdbc/sampledb. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
import java.sql.*; import javax.naming.*; import javax.sql.*; ... #sql context CtxSqlj; // Crear la clase de contexto de conexin CtxSqlj 1 Context ctx=new InitialContext(); 2b DataSource ds=(DataSource)ctx.lookup("jdbc/sampledb"); 2c Connection con=ds.getConnection(); 3 String empname; // Declarar una variable de lenguaje principal ... con.setAutoCommit(false); // No realizar confirmacin automtica 4 CtxSqlj myConnCtx=new CtxSqlj(con); 5 // Crear objeto contexto conexin myConnCtx #sql [myConnCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; // Usar myConnCtx para ejecutar una sentencia de SQL Figura 37. Uso de la tcnica de conexin 3 para conectar con una fuente de datos

Tcnica de conexin 4 (slo Controlador IBM DB2 para JDBC y SQLJ): esta tcnica utiliza la interfaz DataSource de JDBC para crear la conexin. Esta tcnica exige que DataSource est registrado en JNDI. 1. Consulte al administrador del sistema para conocer el nombre lgico de la fuente de datos con la que necesita conectar. 2. Ejecute una clusula de declaracin de conexin de SQLJ. Para este tipo de conexin, la clusula de declaracin de conexin debe tener este formato:
#sql public static context nombre_clase_contexto with (dataSource="nombre_lgico");

El contexto de conexin debe estar declarado como public y static. nombre_lgico es el nombre de fuente de datos que obtuvo en el paso 1. 3. Invoque el constructor para la clase de contexto de conexin que cre en el paso 2. Esto crea un objeto de contexto de conexin que especificar en cada sentencia de SQL que ejecute en la fuente de datos asociada. La sentencia de invocacin del constructor debe tener uno de los formatos siguientes:
clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin(); clase_contexto_conexin objeto_contexto_conexin= new clase_contexto_conexin (String usuario, String contrasea);

Los significados de los parmetros usuario y contrasea son los mismos que para los parmetros del paso 3 en la pgina 101 en la tcnica de conexin 1.

104

Desarrollo de aplicaciones Java

El cdigo siguiente utiliza la tcnica de conexin 4 para crear una conexin con una ubicacin cuyo nombre lgico es jdbc/sampledb. La conexin exige utilizar un ID de usuario y contrasea.
#sql public static context Ctx with (dataSource="jdbc/sampledb"); 2 // Crear la clase de contexto de conexin Ctx String userid="dbadm"; // Declarar variables para ID de usuario y contrasea String password="dbadm"; String empname; // Declarar una variable del lenguaje principal ... Ctx myConnCtx=new Ctx(userid, password); 3 // Crear objeto contexto conexin myConnCtx // para la conexin con jdbc/sampledb #sql [myConnCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; // Usar myConnCtx para ejecutar una sentencia de SQL Figura 38. Uso de la tcnica de conexin 4 para conectar con una fuente de datos

Tcnica de conexin 5: esta tcnica utiliza una conexin creada con anterioridad para conectarse a una fuente de datos. En general, un programa declara una clase de contexto de conexin, crea contextos de conexin y los pasa como parmetros a otros programas. Un programa que utiliza el contexto de conexin invoca un constructor con el objeto de contexto de conexin pasado como argumento. Ejemplo: el programa CtxGen.sqlj declara el contexto de conexin Ctx y crea la instancia de oldCtx:
#sql context Ctx; ... // Crear objeto contexto conexin oldCtx

El programa test.sqlj recibe oldCtx como parmetro y utiliza oldCtx como argumento de su constructor de contexto de conexin:
void useContext(sqlj.runtime.ConnectionContext oldCtx) // oldCtx se cre en CtxGen.sqlj { Ctx myConnCtx= new Ctx(oldCtx); // Crear objeto contexto conexin myConnCtx // a partir de oldCtx #sql [myConnCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO=000010}; // Usar myConnCtx para ejecutar una sentencia de SQL ... }

Tcnica de conexin 6: esta tcnica utiliza la conexin por omisin para conectar con la fuente de datos. Slo debe utilizarse en situaciones en las que la hebra de la base de datos est controlada por otro gestor de recursos, como el entorno de procedimientos almacenados de Java. Utilice la conexin por omisin especificando sus sentencias de SQL sin un objeto de contexto de conexin. Cuando utiliza esta tcnica, no es necesario cargar un controlador JDBC a menos que utilice explcitamente interfaces de JDBC en su programa. Por ejemplo:
#sql {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; // Utilizar conexin por omisin // para ejecutar una sentencia de SQL

Para crear un contexto de conexin por omisin, SQLJ busca jdbc/ defaultDataSource en JNDI. Si no hay nada registrado, se emite una excepcin de contexto nulo cuando SQLJ intenta acceder al contexto.
Captulo 3. Programacin de aplicaciones SQLJ

105

Conceptos relacionados: v Conexin de las aplicaciones JDBC a una fuente de datos en la pgina 26 Tareas relacionadas: v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Paquetes Java para el soporte SQLJ


Para ejecutar sentencias de SQLJ o invocar mtodos de JDBC en un programa de SQLJ, necesita poder acceder a todos o a partes de diversos paquetes Java que contengan soporte para dichas sentencias. Puede hacerlo importando los paquetes o clases especficas, o bien utilizando nombres de clase totalmente calificados. Puede necesitar los paquetes o clases siguientes para su programa de SQLJ: sqlj.runtime Contiene la API de ejecucin de SQLJ. java.sql Contiene la API bsica de JDBC. com.ibm.db2.jcc Contiene la implementacin especfica de DB2 de JDBC y SQLJ. javax.naming Contiene clases e interfaces para la Java Naming and Directory Interface (JNDI), que se utiliza a menudo para implementar un DataSource. javax.sql Contiene mtodos para producir aplicaciones de servidor mediante Java. Conceptos relacionados: v Pasos bsicos para grabar una aplicacin SQLJ en la pgina 97

Variables en aplicaciones SQLJ


En los programas DB2 en otros lenguajes, se utilizan variables del lenguaje principal para pasar datos entre el programa de aplicacin y DB2. En los programas SQLJ, las variables del lenguaje principal son conocidas como expresiones de lenguaje principal. Una expresin de lenguaje principal puede ser un simple identificador Java o una expresin compleja. Cada expresin de lenguaje principal debe comenzar con dos puntos (:) cuando se utiliza en una sentencia de SQL. Las expresiones de lenguaje principal distinguen entre letras maysculas y minsculas. Un identificador Java puede tener cualquiera de los tipos de datos que se listan en la columna de tipos de datos Java de tipos de datos tipos de datos Java, JDBC y SQLJ. Los tipos de datos que se especifican en un iterador pueden ser cualquiera de los tipos de la columna de tipos de datos Java de de tipos de datos Java, JDBC Y SQLJ.

106

Desarrollo de aplicaciones Java

Una expresin compleja es un elemento de matriz o expresin Java cuya evaluacin da como resultado un valor individual. Las expresiones complejas contenidas en una clusula de SQLJ deben estar delimitadas por parntesis. Los ejemplos siguientes muestran cmo utilizar expresiones de lenguaje principal. Ejemplo: declaracin de un identificador Java y su utilizacin en una sentencia SELECT: En este ejemplo, la sentencia que comienza con #sql tiene la misma funcin que una sentencia SELECT en otros lenguajes de programacin. Esta sentencia asigna el identificador Java empname al apellido del empleado cuyo nmero de empleado es 000010.
String empname; ... #sql [ctxt] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'};

Ejemplo: declaracin de un identificador Java y su utilizacin en una llamada de procedimiento almacenado: En este ejemplo, la sentencia que comienza con #sql tiene la misma funcin que una sentencia CALL de SQL en otros lenguajes de programacin. Esta sentencia utiliza el identificador Java empno como parmetro de entrada del procedimiento almacenado A. El valor IN, que precede a empno, especifica que empno es un parmetro de entrada. Para un parmetro de una sentencia CALL, el valor por omisin es IN. El calificador explcito o por omisin que indica cmo se utiliza el parmetro (IN, OUT o INOUT) debe coincidir con el valor correspondiente contenido en la definicin de parmetro que ha especificado en la sentencia CREATE PROCEDURE para el procedimiento almacenado.
String empno = "0000010"; ... #sql [ctxt] {CALL A (:IN empno)};

Ejemplo: uso de una expresin compleja como identificador de lenguaje principal: Este ejemplo utiliza la expresin compleja (((int)yearsEmployed++/5)*500) como expresin de lenguaje principal.
#sql [ctxt] {UPDATE EMPLOYEE SET BONUS=:(((int)yearsEmployed++/5)*500) WHERE EMPNO=:empID};

SQLJ ejecuta las acciones siguientes cuando procesa una expresin de lenguaje principal compleja: v Evala cada una de las expresiones de lenguaje principal, de izquierda a derecha, antes de asignar sus respectivos valores a la base de datos. v Evala los efectos secundarios, tales como operaciones con operadores sufijos, de acuerdo con las normas normales de Java. Todas las expresiones de lenguaje principal se evalan antes de pasar cualquiera de sus valores a DB2. v Utiliza normas de Java para el redondeo y truncamiento de datos. Por tanto, si el valor de yearsEmployed es 6 antes de ejecutar la sentencia UPDATE, el valor que la sentencia UPDATE asigna a la columna BONUS es ((int)6/5)*500, lo que equivale a 500. Despus de asignar 500 a BONUS, el valor de yearsEmployed se incrementa.

Captulo 3. Programacin de aplicaciones SQLJ

107

Restricciones para nombres de variables: existen dos cadenas de caracteres con significados especiales en los programas SQLJ. Tenga en cuenta las restricciones siguientes cuando utilice esas cadenas de caracteres en sus programas SQLJ: v La cadena __sJT_ es un prefijo reservado que se utiliza para los nombres de variables generados por SQLJ. No comience los siguientes tipos de nombres con __sJT_: Nombres de expresiones de lenguaje principal Nombres de variables Java declarados en bloques que incluyan sentencias de SQL ejecutables Nombres de parmetros para mtodos que contienen sentencias ejecutables de SQL Nombres de campos en clases que contienen sentencias ejecutables de SQL, o en clases con subclases o clases incluidas que contienen sentencias ejecutables de SQL v La cadena _SJ es un sufijo reservado que se utiliza para archivos de recursos y clases que han sido creados por SQLJ. Evite utilizar la cadena _SJ en nombres de clases y nombres de archivos fuente de entrada. Conceptos relacionados: v Pasos bsicos para grabar una aplicacin SQLJ en la pgina 97 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Comentarios en una aplicacin SQLJ


Para documentar su programa es necesario que incluya comentarios. Para ello, utilice comentarios de Java. Los comentarios Java estn indicados mediante /* */ o //. Puede incluir comentarios Java fuera de las clusulas SQLJ all donde el lenguaje Java lo permita. Dentro de una clusula SQLJ, puede utilizar comentarios Java en los lugares siguientes: v Dentro de una expresin de sistema principal (/* */ o //). v Dentro de una sentencia de SQL en una clusula ejecutable, siempre que el servidor de bases de datos admita comentarios en la sentencia de SQL (slo /* */). slo Conceptos relacionados: v Pasos bsicos para escribir una aplicacin JDBC en la pgina 23

Ejecucin de sentencias de SQL en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la ejecucin de sentencias de SQL en aplicaciones SQLJ. v Sentencias de SQL en una aplicacin SQLJ en la pgina 109 v Actualizacin de tablas de DB2 en aplicaciones SQLJ en la pgina 110 v Recuperacin de datos de tablas de DB2 en aplicaciones SQLJ en la pgina 120 v Llamada a procedimientos almacenados en aplicaciones SQLJ en la pgina 132 v Trabajo con LOB en aplicaciones SQLJ en la pgina 134 v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141

108

Desarrollo de aplicaciones Java

v Uso de valores ROWID en SQLJ con el controlador IBM DB2 para JDBC y SQLJ en la pgina 141 v Tipos diferenciados en aplicaciones SQLJ en la pgina 143 v Puntos de salvaguarda en aplicaciones SQLJ en la pgina 143

Sentencias de SQL en una aplicacin SQLJ


En un programa SQL normal, puede ejecutar sentencias de SQL para crear tablas, insertar, actualizar, suprimir, o fusionar datos de tablas, recuperar datos de tablas, invocar procedimientos almacenados o confirmar o retrotraer transacciones. En un programa SQLJ, puede tambin ejecutar esas sentencias, dentro de clusulas ejecutables de SQLJ. Una clusula ejecutable puede tener uno de los formatos generales siguientes:
#sql [contexto-conexin] {sentencia-sql}; #sql [contexto-conexin,contexto-ejecucin] {sentencia-sql}; #sql [contexto-ejecucin] {sentencia-sql};

especificacin de contexto-ejecucin En una clusula ejecutable, debe especificar siempre un contexto de conexin explcito, con una sola excepcin: no es necesario especificar un contexto de conexin explcito para una sentencia FETCH. Slo debe incluir un contexto de ejecucin para casos especficos. Consulte el tema Control de la ejecucin de sentencias de SQL en SQLJ para obtener informacin sobre cundo es necesario un contexto de ejecucin. especificacin contexto-conexin Si no especifica explcitamente un contexto de conexin en una clusula ejecutable, la clusula ejecutable utilizar DefaultContext. Esto significa que ya debe haber definido un contexto como DefaultContext. El uso de DefaultContext no est a salvo de hebras y no se recomienda. Conceptos relacionados: v Comentarios en una aplicacin SQLJ en la pgina 108 v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120 v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ en la pgina 133 v LOB en aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ en la pgina 134 v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 Tareas relacionadas: v Invocacin de procedimientos almacenados en una aplicacin SQLJ en la pgina 132 v Confirmacin o retrotraccin de transacciones SQLJ en la pgina 149 v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141 v Creacin y modificacin de objetos DB2 en una aplicacin SQLJ en la pgina 110 v Manejo de errores de SQL en una aplicacin SQLJ en la pgina 150 v Manejo de avisos de SQL en una aplicacin SQLJ en la pgina 150 v Realizacin de actualizaciones por lotes en aplicaciones SQLJ en la pgina 116 v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110
Captulo 3. Programacin de aplicaciones SQLJ

109

v Establecimiento del nivel de aislamiento para una transaccin SQLJ en la pgina 149 v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123 v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128 Informacin relacionada: v Clusula ejecutable de SQLJ en la pgina 290

Actualizacin de tablas de DB2 en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la creacin y modificacin de tablas de DB2 en aplicaciones SQLJ. v Creacin y modificacin de objetos DB2 en una aplicacin SQLJ v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ v Uso de iteradores pasados como variables en operaciones UPDATE o DELETE de posicin de una aplicacin SQLJ en la pgina 115 v Realizacin de actualizaciones por lotes en aplicaciones SQLJ en la pgina 116

Creacin y modificacin de objetos DB2 en una aplicacin SQLJ


Utilice clusulas ejecutables de SQLJ para realizar lo siguiente: v Ejecutar sentencias de definicin de datos (CREATE, ALTER, DROP, GRANT, REVOKE) v Ejecute las sentencias INSERT, UPDATE de bsqueda o de posicin y DELETE de bsqueda o de posicin Por ejemplo, las sentencias ejecutables siguientes muestran una sentencia INSERT, una sentencia UPDATE de bsqueda y una sentencia DELETE de bsqueda:
#sql [myConnCtx] {INSERT INTO DEPARTMENT VALUES ("X00","Operations 2","000030","E01",NULL)}; #sql [myConnCtx] {UPDATE DEPARTMENT SET MGRNO="000090" WHERE MGRNO="000030"}; #sql [myConnCtx] {DELETE FROM DEPARTMENT WHERE DEPTNO="X00"};

Para obtener informacin acerca de las sentencias UPDATE y DELETE de posicin, consulte Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ. Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110

Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ


Al igual que ocurre con las aplicaciones DB2 escritas en otros lenguajes, la ejecucin de operaciones UPDATE y DELETE es un caso ampliado de la recuperacin de filas de una tabla de resultados. Los pasos bsicos son: 1. Declare el iterador. El iterador puede ser de posicin o de nombre. Para las operaciones UPDATE o DELETE de posicin, el iterador se debe declarar como actualizable. Para ello, la declaracin debe incluir las clusulas siguientes:

110

Desarrollo de aplicaciones Java

implements sqlj.runtime.ForUpdate Esta clusula hace que la clase de iterador creada incluya mtodos para utilizar iteradores actualizables. Esta clusula es necesaria para los programas con operaciones UPDATE o DELETE de posicin. with (updateColumns=lista-columnas) Esta clusula especifica una lista de las columnas, separadas por comas, de la tabla de resultados que sern actualizadas por el iterador. Esta clusula es opcional. Es necesario declarar el iterador como public, por lo que es preciso seguir las normas de declaracin y utilizacin de iteradores public en el mismo archivo o en archivos diferentes. Si declara el iterador en un archivo separado, cualquier archivo fuente SQLJ que pueda acceder al iterador e importe la clase generada puede recuperar datos y ejecutar sentencias UPDATE o DELETE de posicin utilizando el iterador. El ID de autorizacin utilizado para ejecutar la sentencia UPDATE o DELETE de posicin depende de si la sentencia se ejecuta de forma esttica o dinmica. Si la sentencia se ejecuta de forma esttica, el ID de autorizacin es el propietario del plan o paquete DB2 donde est incluida la sentencia. Si la sentencia se ejecuta de forma dinmica, el ID de autorizacin est determinado por la accin de DYNAMICRULES que est en vigor. Para el Controlador IBM DB2 para JDBC y SQLJ, el comportamiento es siempre DYNAMICRULES BIND. Inhabilite la modalidad de confirmacin automtica (autocommit) para la conexin. Cuando la modalidad de confirmacin automtica est habilitada, se ejecuta una operacin COMMIT cada vez que se ejecuta una sentencia UPDATE de posicin, lo que provoca la destruccin del iterador a menos que el iterador tenga el atributo with (holdability=true). Por tanto, es necesario desactivar la confirmacin automtica para evitar que se ejecuten operaciones COMMIT hasta que haya terminado de utilizar el iterador. Si desea que se ejecute una operacin COMMIT despus de cada actualizacin, una forma alternativa de impedir la destruccin del iterador despus de cada operacin COMMIT es declarar el iterador con el atributo with (holdability=true). Cree una instancia de la clase de iterador. Este paso es el mismo que para un iterador no actualizable. Asigne la tabla de resultados de una sentencia SELECT a una instancia del iterador. Este paso es el mismo que para un iterador no actualizable. La sentencia SELECT no debe incluir una clusula FOR UPDATE. Recupere y actualice filas. Para un iterador de posicin, ejecute las acciones siguientes en bucle: a. Ejecute una sentencia FETCH en una clusula ejecutable para obtener la fila actual. b. Invoque el mtodo PositionedIterator.endFetch para determinar si el iterador est apuntando a una fila de la tabla de resultados. c. Si el iterador est apuntando a una fila de la tabla de resultados, ejecute una sentencia UPDATE... WHERE CURRENT OF :objeto-iterador de SQL en una clusula ejecutable para actualizar las columnas de la fila actual. Ejecute una sentencia DELETE... WHERE CURRENT OF :objeto-iterador de SQL en una clusula ejecutable para suprimir la fila actual. Para un iterador de nombre, ejecute las acciones siguientes en bucle: a. Invoque el mtodo next para avanzar el iterador.
Captulo 3. Programacin de aplicaciones SQLJ

2.

3. 4.

5.

111

b. Determine si el iterador est apuntando a una fila de la tabla de resultados; para ello compruebe si next devuelve el valor true. c. Ejecute una sentencia UPDATE... WHERE CURRENT OF :objeto-iterador de SQL en una clusula ejecutable para actualizar las columnas de la fila actual. Ejecute una sentencia DELETE... WHERE CURRENT OF :objeto-iterador de SQL en una clusula ejecutable para suprimir la fila actual. 6. Cierre el iterador. Para ello utilice el mtodo close. El cdigo siguiente muestra cmo declarar un iterador de posicin y utilizarlo para operaciones UPDATE de posicin. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente. En primer lugar, en un archivo individual, declare un iterador de posicin UpdByPos, y especifique que desea utilizar el iterador para actualizar la columna SALARY:
import java.math.*; // Importar esta clase para el tipo de datos BigDecimal #sql public iterator UpdByPos implements sqlj.runtime.ForUpdate 1 with(updateColumns="SALARY") (String, BigDecimal); Figura 39. Declaracin de un iterador de posicin para una operacin UPDATE de posicin

A continuacin, en otro archivo, utilice UpdByPos para un UPDATE de posicin, tal como se muestra en el fragmento de cdigo siguiente:

112

Desarrollo de aplicaciones Java

import sqlj.runtime.*; import java.sql.*; import java.math.*;

// Importar archivos para las API de SQLJ y JDBC

// Importar esta clase para el tipo de datos // BigDecimal import UpdByPos; // Importar clase de reiterador generada que se ha // creado mediante la clusula de declaracin de // reiterador para UpdByName en otro archivo #sql context HSCtx; // Crear la clase de contexto de conexin HSCtx public static void main (String args[]) { try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection HSjdbccon= DriverManager.getConnection("jdbc:db2:SANJOSE"); // Crear un objeto de conexin de JDBC HSjdbccon.setAutoCommit(false); // Desactivar confirm. automticas para que las // confirmaciones automticas 2 // no destruyan el cursor entre actualizaciones HSCtx myConnCtx=new HSCtx(HSjdbccon); // Crear un objeto de contexto de conexin UpdByPos upditer; // Declarar un objeto de iterador de clase // UpdByPos class 3 String enum; // Declarar variable de lenguaje principal para contener BigDecimal sal; // los valores de las columnas EMPNO y SALARY #sql [myConnCtx] upditer = {SELECT EMPNO, SALARY FROM EMPLOYEE 4 WHERE WORKDEPT='D11'}; // Asignar tabla de resultados a objeto de iterador #sql {FETCH :upditer INTO :enum,:sal}; 5a // Avanzar cursor hasta la fila siguiente while (!upditer.endFetch()) 5b // Determinar si iterador apunta a una fila { #sql [myConnCtx] {UPDATE EMPLOYEE SET SALARY=SALARY*1.05 WHERE CURRENT OF :upditer}; 5c // Ejecutar actualizacin de posicin System.out.println("Updating row for " + enum); #sql {FETCH :upditer INTO :enum,:sal}; // Avanzar cursor hasta la fila siguiente } upditer.close(); // Cerrar el iterador 6 #sql [myConnCtx] {COMMIT}; // Confirmar los cambios myConnCtx.close(); // Cerrar el contexto de conexin } Figura 40. Ejecucin de un UPDATE de posicin con un iterador de posicin

El cdigo siguiente muestra cmo declarar un iterador de nombre y utilizarlo para operaciones UPDATE de posicin. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente. En primer lugar, en un archivo individual, declare el iterador de nombre UpdByName, y especifique que desea utilizar el iterador para actualizar la columna SALARY:

Captulo 3. Programacin de aplicaciones SQLJ

113

import java.math.*; // Importar esta clase para el tipo de datos BigDecimal #sql public iterator UpdByName implements sqlj.runtime.ForUpdate 1 with(updateColumns="SALARY") (String EmpNo, BigDecimal Salary); Figura 41. Declaracin de un iterador de nombre para una operacin UPDATE de posicin

A continuacin, en otro archivo, utilice UpdByName para un UPDATE de posicin, tal como se muestra en el fragmento de cdigo siguiente:
import sqlj.runtime.*; import java.sql.*; import java.math.*; // Importar archivos para las API de SQLJ y JDBC

// Importar esta clase para el tipo de datos // BigDecimal import UpdByName; // Importar la clase de reiterador generada que se // creado mediante la clusula de declaracin de // reiterador para UpdByName en otro archivo #sql context HSCtx; // Crear la clase de contexto de conexin HSCtx public static void main (String args[]) { try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection HSjdbccon= DriverManager.getConnection("jdbc:db2:SANJOSE"); // Crear un objeto de conexin de JDBC HSjdbccon.setAutoCommit(false); // Desactivar confirm. automticas para que las // confirmaciones automticas 2 // no destruyan el cursor entre actualizaciones HSCtx myConnCtx=new HSCtx(HSjdbccon); // Crear un objeto de contexto de conexin UpdByName upditer; 3 // Declarar objeto de iterador de clase UpdByName String enum; // Declarar variable lenguaje principal para // recibir valores de la columnas EmpNo #sql [myConnCtx] upditer = {SELECT EMPNO, SALARY FROM EMPLOYEE 4 WHERE WORKDEPT='D11'}; // Asignar tabla de resultados a objeto de iterador while (upditer.next()) 5a, 5b // Avanzar cursor hasta la fila siguiente // Determinar si iterador apunta a una fila { enum = upditer.EmpNo(); // Obtener nmero de empleado en la fila actual #sql [myConnCtx] {UPDATE EMPLOYEE SET SALARY=SALARY*1.05 WHERE CURRENT OF :upditer}; 5c // Ejecutar actualizacin de posicin System.out.println("Updating row for " + enum); } upditer.close(); // Cerrar el iterador 6 #sql [myConnCtx] {COMMIT}; // Confirmar los cambios myConnCtx.close(); // Cerrar el contexto de conexin } Figura 42. Ejecucin de un UPDATE de posicin con un iterador de nombre

Conceptos relacionados: v Uso de iteradores pasados como variables en operaciones UPDATE o DELETE de posicin de una aplicacin SQLJ en la pgina 115

114

Desarrollo de aplicaciones Java

v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120 Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Uso de iteradores pasados como variables en operaciones UPDATE o DELETE de posicin de una aplicacin SQLJ
SQLJ permite pasar iteradores entre mtodos en calidad de variables. Un iterador que se utilice para una sentencia UPDATE o DELETE de posicin slo se puede identificar durante el tiempo de ejecucin. La misma sentencia UPDATE o DELETE de posicin de SQLJ se puede utilizar con iteradores diferentes durante la ejecucin. Si especifica el valor YES para -staticpositioned cuando personaliza su aplicacin SQLJ como parte del proceso de preparacin del programa, el personalizador de SQLJ prepara sentencias UPDATE o DELETE de posicin para su ejecucin esttica. . En este caso, el personalizador debe determinar qu iteradores pertenecen a cada sentencia UPDATE o DELETE de posicin. Para ello, el personalizador de SQLJ asocia tipos de datos de iterador con tipos de datos de las sentencias UPDATE o DELETE. Sin embargo, no existe una correspondencia unvoca entre las tablas de las sentencias UPDATE o DELETE y las clases de iterador, el personalizador de SQLJ no puede determinar exactamente qu iterador pertenece a cada sentencia UPDATE o DELETE. En este caso, el personalizador de SQLJ debe asociar arbitrariamente iteradores con sentencias UPDATE o DELETE, lo cual puede a veces producir errores de SQL. Esto se muestra en los fragmentos de cdigo siguientes.
#sql iterator GeneralIter implements sqlj.runtime.ForUpdate ( String ); public static void main ( String args[] ) { ... GeneralIter iter1 = null; #sql [ctxt] iter1 = { SELECT CHAR_COL1 FROM TABLE1 }; GeneralIter iter2 = null; #sql [ctxt] iter2 = { SELECT CHAR_COL2 FROM TABLE2 }; ... doUpdate ( iter1 ); } public static void doUpdate ( GeneralIter iter ) { #sql [ctxt] { UPDATE TABLE1 ... WHERE CURRENT OF :iter }; } Figura 43. UPDATE de posicin esttica que ejecuta incorrectamente

En este ejemplo slo se define un iterador. Se definen dos instancias de ese iterador, y cada una de ellas se asocia a una sentencia SELECT diferente que recupera datos de una tabla diferente. Durante la personalizacin y vinculacin con -staticpositioned YES, SQLJ crea dos sentencias DECLARE CURSOR, una para cada sentencia SELECT e intenta vincular una sentencia UPDATE para cada cursor. Sin embargo, el proceso de vinculacin no se consigue con SQLCODE -509 cuando UPDATE TABLE1 ... WHERE CURRENT OF :iter est vinculado para el cursor para SELECT CHAR_COL2 FROM TABLE2, ya que la tabla de UPDATE no coincide con la tabla del cursor.

Captulo 3. Programacin de aplicaciones SQLJ

115

Puede evitar un error de tiempo de vinculacin para un programa como el de la Figura 43 en la pgina 115 especificando la opcin de vinculacin SQLERROR(CONTINUE). Sin embargo, est tcnica tiene el inconveniente de que hace que el gestor de bases de datos DB2 cree un paquete, con independencia de los errores de SQL que hay en el programa. Una tcnica mejor consiste en grabar el programa de forma que exista una correspondencia unvoca entre las tablas de las sentencias UPDATE o DELETE de posicin y las clases de iterador. La Figura 44 muestra un ejemplo de cmo hacerlo.
#sql iterator Table2Iter(String); #sql iterator Table1Iter(String); public static void main ( String args[] ) { ... Table2Iter iter2 = null; #sql [ctxt] iter2 = { SELECT CHAR_COL2 FROM TABLE2 }; Table1Iter iter1 = null; #sql [ctxt] iter1 = { SELECT CHAR_COL1 FROM TABLE1 }; ... doUpdate(iter1); } public static void doUpdate ( Table1Iter { ... #sql [ctxt] { UPDATE TABLE1 ... WHERE ... } public static void doUpdate ( Table2Iter { ... #sql [ctxt] { UPDATE TABLE2 ... WHERE ... } iter ) CURRENT OF :iter }; iter ) CURRENT OF :iter };

Figura 44. Sentencia UPDATE esttica de posicin que se ejecuta satisfactoriamente

Con esta forma de codificacin, cada clase de iterador se asocia a una sola tabla. Por tanto, el proceso de vinculacin de DB2 puede siempre asociar la sentencia UPDATE de posicin con un iterador vlido. Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110 Informacin relacionada: v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375

Realizacin de actualizaciones por lotes en aplicaciones SQLJ


El Controlador IBM DB2 para JDBC y SQLJ soporta la realizacin de actualizaciones por lotes en SQLJ. Mediante las actualizaciones por lotes, en lugar de actualizar las filas de una tabla DB2 de una en una, se puede indicar a SQLJ que ejecute un grupo de actualizaciones a la vez. Puede incluir los tipos siguientes de sentencias en una actualizacin por lotes: v Sentencias INSERT, UPDATE y DELETE de bsqueda v Sentencias CREATE, ALTER, DROP, GRANT y REVOKE v Sentencias CALL con parmetros de entrada solamente

116

Desarrollo de aplicaciones Java

A diferencia de JDBC, SQLJ permite utilizar lotes heterogneos que contienen sentencias con parmetros de entrada o expresiones de lenguaje principal. Por consiguiente, puede combinar cualquiera de los elementos siguientes en un proceso por lotes SQLJ: v Instancias de la misma sentencia v Sentencias diferentes v Sentencias con nmeros de parmetros de entrada o expresiones de lenguaje principal diferentes v Sentencias con tipos de datos diferentes para parmetros de entrada o expresiones de lenguaje principal v Sentencias sin parmetros de entrada ni expresiones de lenguaje principal Estos son los pasos bsicos para crear, ejecutar y suprimir un lote de sentencias: 1. Inhabilite AutoCommit (confirmacin automtica) para la conexin. 2. Obtenga un contexto de ejecucin. Todas las sentencias que se ejecutan en un lote deben utilizar este contexto de ejecucin. 3. Invoque el mtodo ExecutionContext.setBatching(true) para crear un lote. Las subsiguientes sentencias procesables por lotes que estn asociadas al contexto de ejecucin creado en el paso 2 se aaden al lote para su ejecucin posterior. Si desea procesar por lotes conjuntos de sentencias que no son compatibles respecto al proceso por lotes en paralelo, debe crear un contexto de ejecucin para cada conjunto de sentencias compatibles respecto al proceso por lotes. 4. Incluya clusulas ejecutables de SQLJ para las sentencias de SQL que desee procesar por lotes. Estas clusulas deben incluir el contexto de ejecucin que cre en el paso 2. Si una clusula ejecutable de SQLJ tiene parmetros de entrada o expresiones de lenguaje principal, puede incluir la sentencia en el lote varias veces con valores diferentes para los parmetros de entrada o expresiones de lenguaje principal. Para determinar si una sentencia se aadi a un lote existente, si era la primera sentencia de un nuevo lote, o si se ejecut dentro o fuera de un lote, invoque el mtodo ExecutionContext.getUpdateCount. Este mtodo devuelve uno de los valores siguientes: ExecutionContext.ADD_BATCH_COUNT Se devuelve esta constante si la sentencia se aadi a un lote existente. ExecutionContext.NEW_BATCH_COUNT Se devuelve esta constante si la sentencia era la primera sentencia de un nuevo lote. ExecutionContext.EXEC_BATCH_COUNT Se devuelve esta constante si la sentencia formaba parte de un lote que se ejecut. Otro valor entero Este valor es el nmero de filas que fueron actualizadas por la sentencia. Se devuelve este valor si se ejecut la sentencia en lugar de aadirla a un lote. 5. Ejecute el lote explcita o implcitamente. v Invoque el mtodo ExecutionContext.executeBatch para ejecutar el lote explcitamente.
Captulo 3. Programacin de aplicaciones SQLJ

117

executeBatch devuelve una matriz entera que contiene el nmero de filas que fueron actualizadas por cada sentencia del lote. El orden de los elementos de la matriz corresponde al orden en el que se aadieron las sentencias al lote. v Como alternativa, un lote se ejecuta implcitamente en las condiciones siguientes: Cuando incluye en su programa una sentencia procesable por lotes que no es compatible con sentencias ya existentes en el lote. En este caso, SQLJ ejecuta las sentencias que ya existen en el lote y crea un nuevo lote donde se incluye la sentencia incompatible. SQLJ tambin ejecuta la sentencia que no es compatible con las sentencias del lote. Cuando incluye en su programa una sentencia que no es ejecutable por lotes. En este caso, SQLJ ejecuta las sentencias que ya existen en el lote. SQLJ tambin ejecuta la sentencia que no es procesable por lotes. Cuando despus de invocar el mtodo ExecutionContext.setBatchLimit(n), aade una sentencia al lote que hace que el nmero de sentencias del lote sea igual o mayor que n. n puede tener uno de los valores siguientes: ExecutionContext.UNLIMITED_BATCH Esta constante indica que la ejecucin implcita solo se produce cuando SQLJ encuentra una sentencia que es procesable por lotes pero incompatible, o que no es procesable por lotes. Establecer este valor es lo mismo que no invocar setBatchLimit. ExecutionContext.AUTO_BATCH Esta constante indica que la ejecucin implcita se produce cuando el nmero de sentencias del lote alcanza un valor definido por SQLJ. Entero positivo Cuando el nmero de sentencias aadidas al lote alcanza este valor, SQLJ ejecuta el lote implcitamente. Sin embargo, el proceso por lotes debera ejecutarse antes de que estas muchas sentencias se hayan aadido en el caso de que SQLJ encuentre una sentencia que se pueda procesar por lotes pero que sea incompatible o bien que la sentencia no se pueda procesar por lotes. Para determinar el nmero de filas que fueron actualizadas por las sentencias de un lote que se ejecut implcitamente, invoque el mtodo ExecutionContext.getBatchUpdateCounts. getBatchUpdateCounts devuelve una matriz entera que contiene el nmero de filas que fueron actualizadas por cada sentencia del lote. El orden de los elementos de la matriz corresponde al orden en el que se aadieron las sentencias al lote. Cada elemento de la matriz puede ser uno de los valores siguientes: -2 Este valor indica que la sentencia de SQL se ejecut satisfactoriamente, pero no se pudo determinar el nmero de filas que fueron actualizadas. -3 Este valor indica que la sentencia de SQL fall. Otro valor entero Este valor es el nmero de filas que fueron actualizadas por la sentencia. 6. Opcionalmente, una vez aadidas todas las sentencias al lote, puede inhabilitar el proceso por lotes. Para ello invoque el mtodo ExecutionContext.setBatching(false). Cuando inhabilita el proceso por lotes, puede todava ejecutar el lote implcita o explcitamente, pero no se aaden ms sentencias al lote. Inhabilitar el proceso

118

Desarrollo de aplicaciones Java

por lotes es til cuando ya existe un lote y desea ejecutar una sentencia compatible de proceso por lotes, en lugar de aadirla al lote. Si desea eliminar un lote sin ejecutarlo, invoque el mtodo ExecutionContext.cancel. 7. Si la ejecucin por lotes era implcita, realice una ejecucin final, explcita de executeBatch para asegurarse de que se hayan ejecutado todas las sentencias. Ejemplo de actualizacin por lotes: el fragmento de cdigo siguiente asigna aumentos de salario a todos los directores de departamento mediante la ejecucin de actualizaciones por lotes. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
#sql iterator GetMgr(String); // Declarar iterador de posicin { GetMgr deptiter; // Declarar objeto de la clase GetMgr String mgrnum = null; // Declarar variable de lenguaje principal // para nmero de director de departamento int raise = 400; // Declarar el importe del aumento int currentSalary; // Declarar salario actual String url, username, password; // Declarar url, ID de usuario, contrasea ... TestContext c1 = new TestContext (url, username, password, false); 1 ExecutionContext ec = new ExecutionContext(); 2 ec.setBatching(true); 3 #sql [c1] deptiter = {SELECT MGRNO FROM DEPARTMENT}; // Asignar tabla resultados de SELECT // al objeto reiterador deptiter #sql {FETCH :deptiter INTO :mgrnum}; // Recuperar el primer nmero del gestor while (!deptiter.endFetch()) { // Comprobar si FETCH ha devuelto una fila #sql [c1] {SELECT SALARY INTO :currentSalary FROM EMPLOYEE WHERE EMPNO=:mgrnum}; #sql [c1, ec] 4 {UPDATE EMPLOYEE SET SALARY=:(currentSalary+raise) WHERE EMPNO=:mgrnum}; #sql {FETCH :deptiter INTO :mgrnum }; // Obtener la fila siguiente } ec.executeBatch(); 5 ec.setBatching(false); 6 #sql [c1] {COMMIT}; deptiter.close(); // Cerrar el iterador ec.close(); // Cerrar el contexto de ejecucin c1.close(); // Cerrar la conexin } Figura 45. Realizacin de una actualizacin por lotes

Cuando se produce un error durante la ejecucin de una sentencia de un proceso por lotes, se ejecutan las sentencias y se emite una excepcin BatchUpdateException una vez ejecutadas todas las sentencias del proceso por lotes. Consulte el tema Realizacin de actualizaciones por lotes en una aplicacin JDBC para conocer cmo procesar una excepcin BatchUpdateException. Para obtener informacin sobre avisos, utilice el mtodo Statement.getWarnings para el objeto en el que ejecut el mtodo executeBatch. Luego puede obtener una descripcin de error, el estado de SQL y el cdigo de error correspondientes a cada objeto SQLWarning.

Captulo 3. Programacin de aplicaciones SQLJ

119

Cuando un proceso por lotes se ejecuta implcitamente debido a que el programa contiene una sentencia que no se puede aadir a dicho proceso por lotes, el proceso por lotes se ejecutar antes de procesar la nueva sentencia. Si se produce un error al ejecutar el proceso por lotes, la sentencia que provoc la ejecucin del proceso por lotes no se ejecutar. Recomendacin: desactive la confirmacin automtica (autocommit) cuando realice actualizaciones por lotes para que pueda controlar si se deben confirmar los cambios en sentencias ya ejecutadas cuando se produzca un error durante la ejecucin del proceso por lotes. Tareas relacionadas: v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46 v Conexin a una fuente de datos utilizando SQLJ en la pgina 100 v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141 Informacin relacionada: v Clase sqlj.runtime.SQLNullException en la pgina 319

Recuperacin de datos de tablas de DB2 en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la recuperacin de datos de tablas de DB2 en aplicaciones SQLJ. v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123 v Varios iteradores abiertos para una misma sentencia de SQL en una aplicacin SQLJ en la pgina 126 v Uso de varias instancias abiertas de un iterador en una aplicacin SQLJ en la pgina 127 v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128

Recuperacin de datos de tablas DB2 por una aplicacin SQLJ


Al igual que ocurre con las aplicaciones DB2 escritas en otros lenguajes, si desea recuperar una fila individual de una tabla DB2 en una aplicacin SQLJ, puede grabar una sentencia SELECT INTO con una clusula WHERE que defina una tabla de resultados que contenga slo esa fila:
#sql [myConnCtx] {SELECT DEPTNO INTO :hvdeptno FROM DEPARTMENT WHERE DEPTNAME="OPERATIONS"};

Sin embargo, las mayora de las sentencias SELECT que utiliza producen tablas de resultados que contienen muchas filas. En las aplicaciones DB2 escritas en otros lenguajes, se utiliza un cursor para seleccionar filas individuales de la tabla de resultados. Ese cursor puede ser no desplazable, lo que significa que cuando lo utiliza para recuperar filas, desplaza el cursor secuencialmente desde el principio de la tabla de resultados hasta el final. Como alternativa, el cursor puede ser desplazable, lo que significa que cuando lo utiliza para recuperar filas, puede desplazar el cursor hacia delante y atrs o situarlo en una fila cualquiera de la tabla de resultados. En SQLJ, el equivalente de un cursor es un iterador de conjunto de resultados. Al igual que un cursor, un iterador de conjunto de resultados puede ser desplazable o no desplazable. El presente tema describe cmo utilizar iteradores no desplazables.

120

Desarrollo de aplicaciones Java

Para obtener informacin sobre el uso de iteradores desplazables, consulte el tema Utilizacin de iteradores desplazables en una aplicacin SQLJ. Un iterador de conjunto de resultados es un objeto Java que se utiliza para recuperar filas de una tabla de resultados. A diferencia de un cursor, un iterador de conjunto de resultados se puede pasar como parmetro a un mtodo. Estos son los pasos bsicos para utilizar un iterador de conjunto de resultados: 1. Declare el iterador, con lo que se crear una clase de iterador 2. Defina una instancia de la clase de iterador. 3. Asigne la tabla de resultados de una sentencia SELECT a una instancia del iterador. 4. Recupere filas. 5. Cierre el iterador. Existen dos tipos de iteradores: iteradores de posicin e iteradores de nombre. Los iteradores de posicin amplan la interfaz sqlj.runtime.PositionedIterator. Los iteradores de posicin identifican las columnas de una tabla de resultados por la posicin que ocupan en la tabla de resultados. Los iteradores de nombre amplan la interfaz sqlj.runtime.NamedIterator. Los iteradores de nombre identifican las columnas de la tabla de resultados por su nombre. Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110 v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123 Informacin relacionada: v Clusula de declaracin de iterador de SQLJ en la pgina 288

Utilizacin de un iterador de nombre en una aplicacin SQLJ


Estos son los pasos para utilizar un iterador de nombre: 1. Declare el iterador. Utilice una clusula de declaracin de iterador para declarar un iterador de conjunto de resultados. Esto hace que se cree una clase de iterador que tiene el mismo nombre que el iterador. Para un iterador de nombre, la clusula de declaracin de iterador especifica la informacin siguiente: v El nombre del iterador v Una lista de nombres de columnas y tipos de datos Java v Informacin para una declaracin de clase Java, tal como la indicacin de si el iterador es public o static v Un conjunto de atributos, tales como si el iterador se puede retener o si sus columnas se pueden actualizar. Cuando declara un iterador de nombre para una consulta, especifica nombres para cada columna del iterador. Estos nombres deben coincidir con los nombres de las columnas de la tabla de resultados para la consulta. Un nombre de columna de reiterador y un nombre de columna de tabla de resultados que slo difieran en el aspecto de que contengan maysculas o minsculas se consideran nombres coincidentes. La clase de iterador de nombre generada por la clusula de declaracin de iterador contiene mtodos accesores. Existe un mtodo accesor para cada columna del iterador. Cada mtodo accesor tiene el mismo nombre
Captulo 3. Programacin de aplicaciones SQLJ

121

que la columna correspondiente del iterador. Los mtodos accesores se utilizan para recuperar datos contenidos en columnas de la tabla de resultados. Es necesario que en los iteradores especifique tipos de datos Java que se correspondan estrechamente con los correspondientes tipos de datos de columnas DB2. Consulte el tema Tipos de datos Java, JDBC y SQL para obtener una lista de las mejores correlaciones entre los tipos de datos Java y los tipos de datos de DB2. Puede declarar un iterador de varias maneras. Sin embargo, debido a que cada iterador est asociado a una clase Java, cuando declare un iterador, la clase subyacente debe cumplir las normas de Java. Por ejemplo, los reiteradores que contienen una clusula-with se deben declarar como public. Por lo tanto, si es necesario que un reiterador sea public, slo se puede declarar donde se admita una clase public. La lista siguiente describe algunos mtodos alternativos para declarar un iterador: v Como public, en un archivo fuente separado Este mtodo le permite utilizar la declaracin de iterador en otros mdulos de cdigo, y proporciona un iterador que es efectivo para todas las aplicaciones SQLJ. Adems, no existen las cuestiones derivadas de tener otras clases de nivel superior o clases public en el mismo archivo fuente. v Como clase de nivel superior en un archivo fuente que contiene otras definiciones de clases de nivel superior Java permite una sola clase pblica, de nivel superior, en un mdulo de cdigo. Por tanto, si necesita declarar el iterador como pblico, tal como cuando el iterador incluye una clusula with, ninguna otra clase contenida en el mdulo de cdigo puede estar declarada como pblica. v Como clase esttica anidada dentro de otra clase Esta alternativa le permite combinar la declaracin de iterador con otras declaraciones de clases en el mismo archivo fuente, declarar el iterador y otras clases como pblicos y hacer que la clase de iterador sea visible para otros mdulos de cdigo o paquetes. Si embargo, si especifica el iterador desde fuera de la clase anidadora debe calificar por completo el nombre de iterador con el nombre de la clase anidadora. v Como clase interna dentro de otra clase Cuando declara un iterador de esta manera, puede crear una instancia del iterador solo dentro de una instancia de la clase anidadora. Sin embargo, puede declarar como pblicos el iterador y otras clases contenidas en el archivo. No puede convertir un conjunto de resultados de JDBC en un iterador si el iterador est declarado como clase interna. Esta restriccin no es aplicable si el iterador est declarado como clase anidada esttica. Consulte el tema Utilizacin de SQLJ y JDBC en la misma aplicacin para obtener ms informacin sobre la conversin de un conjunto de resultados en un iterador. 2. Cree una instancia de la clase de iterador. Debe declarar un objeto de la clase de iterador de nombre para recuperar filas de una tabla de resultados. 3. Asigne la tabla de resultados de una sentencia SELECT a una instancia del iterador. Para asignar la tabla de resultados de una sentencia SELECT a un iterador, utilice una clusula de asignacin de SQLJ. Este es el formato de la clusula de asignacin para un iterador de nombre:
#sql clusula-contexto objeto-iterador={sentencia-select};

122

Desarrollo de aplicaciones Java

Consulte los temas Clusula de asignacin de SQLJ y Clusula de contexto de SQLJ para obtener ms informacin. 4. Recupere filas. Para ello invoque mtodos accesores en un bucle. Los mtodos accesores tienen los mismos nombres que las columnas correspondientes del iterador, y carecen de parmetros. Un mtodo accesor devuelve el valor de la columna correspondiente de la fila actual de la tabla de resultados. Utilice el mtodo NamedIterator.next() para avanzar el cursor por la tabla de resultados. Para determinar si ha recuperado todas las filas, examine el valor devuelto al invocar el mtodo next. next devuelve el valor booleano false si no existe ninguna fila siguiente. 5. Cierre el iterador. Para ello utilice el mtodo NamedIterator.close. El cdigo siguiente muestra cmo declarar y utilizar un iterador de nombre. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
#sql { ByName nameiter; // Declarar objeto de la clase ByName 2 #sql [ctxt] nameiter={SELECT LASTNAME, HIREDATE FROM EMPLOYEE}; 3 // Asignar tabla de resultados de SELECT // al objeto reiterador nameiter while (nameiter.next()) // Mover el iterador por la tabla de // resultados 4 // y ver si se han recuperado todas las filas { System.out.println( nameiter.LastName() + " was hired on " + nameiter.HireDate()); // Usar mtodos de acceso LastName y // HireDate para recuperar valores de columnas } nameiter.close(); // Cerrar el iterador 5 } Figura 46. Utilizacin de un iterador de nombre iterator ByName(String LastName, Date HireDate); 1 // Declarar iterador de nombre ByName

Conceptos relacionados: v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243 v Clusula de asignacin de SQLJ en la pgina 294 v Clusula context de SQLJ en la pgina 291

Utilizacin de un iterador de posicin en una aplicacin SQLJ


Estos son los pasos para utilizar un iterador de posicin: 1. Declare el iterador.
Captulo 3. Programacin de aplicaciones SQLJ

123

Utilice una clusula de declaracin de iterador para declarar un iterador de conjunto de resultados. Esto hace que se cree una clase de iterador que tiene el mismo nombre y atributos que el iterador. Para un iterador de posicin, la clusula de declaracin de iterador especifica la informacin siguiente: v El nombre del iterador v Una lista de tipos de datos Java v Informacin para una declaracin de clase Java, tal como la indicacin de si el iterador es public o static v Un conjunto de atributos, tales como si el iterador se puede retener o si sus columnas se pueden actualizar. Las declaraciones de tipos de datos representan columnas de la tabla de resultados y se especifican como columnas del iterador del conjunto de resultados. Las columnas del iterador del conjunto de resultados se corresponden con las columnas de la tabla de resultados, en el orden de izquierda a derecha. Por ejemplo, si una clusula de declaracin de iterador tiene dos declaraciones de tipos de datos, la primera declaracin corresponde a la primera columna de la tabla de resultados, y la segunda declaracin corresponde a la segunda columna de la tabla de resultados. Es necesario que en los iteradores especifique tipos de datos Java que se correspondan estrechamente con los correspondientes tipos de datos de columnas DB2. Consulte el tema Tipos de datos Java, JDBC y SQL para obtener una lista de las mejores correlaciones entre los tipos de datos Java y los tipos de datos de DB2. Puede declarar un iterador de varias maneras. Sin embargo, debido a que cada iterador est asociado a una clase Java, cuando declare un iterador, la clase subyacente debe cumplir las normas de Java. Por ejemplo, los reiteradores que contienen una clusula-with se deben declarar como public. Por lo tanto, si es necesario que un reiterador sea public, slo se puede declarar donde se admita una clase public. La lista siguiente describe algunos mtodos alternativos para declarar un iterador: v Como public, en un archivo fuente separado Este es el mtodo ms verstil de declarar un iterador. Este mtodo le permite utilizar la declaracin de iterador en otros mdulos de cdigo, y proporciona un iterador que es efectivo para todas las aplicaciones SQLJ. Adems, no existen las cuestiones derivadas de tener otras clases de nivel superior o clases public en el mismo archivo fuente. v Como clase de nivel superior en un archivo fuente que contiene otras definiciones de clases de nivel superior Java permite una sola clase pblica, de nivel superior, en un mdulo de cdigo. Por tanto, si necesita declarar el iterador como pblico, tal como cuando el iterador incluye una clusula with, ninguna otra clase contenida en el mdulo de cdigo puede estar declarada como pblica. v Como clase esttica anidada dentro de otra clase Esta alternativa le permite combinar la declaracin de iterador con otras declaraciones de clases en el mismo archivo fuente, declarar el iterador y otras clases como pblicos y hacer que la clase de iterador sea visible para otros mdulos de cdigo o paquetes. Si embargo, si especifica el iterador desde fuera de la clase anidadora debe calificar por completo el nombre de iterador con el nombre de la clase anidadora. v Como clase interna dentro de otra clase

124

Desarrollo de aplicaciones Java

Cuando declara un iterador de esta manera, puede crear una instancia del iterador solo dentro de una instancia de la clase anidadora. Sin embargo, puede declarar como pblicos el iterador y otras clases contenidas en el archivo. No puede convertir un conjunto de resultados de JDBC en un iterador si el iterador est declarado como clase interna. Esta restriccin no es aplicable si el iterador est declarado como clase anidada esttica. Consulte el tema Utilizacin de SQLJ y JDBC en la misma aplicacin para obtener ms informacin sobre la conversin de un conjunto de resultados en un iterador. 2. Cree una instancia de la clase de iterador. Debe declarar un objeto de la clase de iterador de posicin para recuperar filas de una tabla de resultados. 3. Asigne la tabla de resultados de una sentencia SELECT a una instancia del iterador. Para asignar la tabla de resultados de una sentencia SELECT a un iterador, utilice una clusula de asignacin de SQLJ. Este es el formato de la clusula de asignacin para un iterador de posicin:
#sql clusula-contexto objeto-iterador={sentencia-select};

4. Recupere filas. Para ello ejecute en bucle sentencias FETCH en clusulas ejecutables. Las sentencias FETCH son iguales a las utilizadas en otros lenguajes de programacin. Para determinar si ha recuperado todas las filas, invoque el mtodo PositionedIterator.endFetch despus de cada FETCH. endFetch devuelve el valor booleano true si no hay ms filas para recuperar mediante FETCH. 5. Cierre el iterador. Para ello utilice el mtodo PositionedIterator.close. El cdigo siguiente muestra cmo declarar y utilizar un iterador de posicin. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
#sql iterator ByPos(String,Date); // Declarar iterador de posicin // ByPos 1 { ByPos positer; // Declarar objeto de la clase ByPos 2 String name = null; // Declarar variables de lenguaje principal Date hrdate; #sql [ctxt] positer = {SELECT LASTNAME, HIREDATE FROM EMPLOYEE}; 3 // Asignar tabla resultados de SELECT // al objeto reiterador positer #sql {FETCH :positer INTO :name, :hrdate }; 4 // Recuperar primera fila while (!positer.endFetch()) // Determinar si FETCH ha devuelto una fila { System.out.println(name + " was hired in " + hrdate); #sql {FETCH :positer INTO :name, :hrdate }; // Obtener la fila siguiente } positer.close(); // Cerrar el iterador 5 } Figura 47. Utilizacin de un iterador de posicin

Conceptos relacionados:
Captulo 3. Programacin de aplicaciones SQLJ

125

v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120 Tareas relacionadas: v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Varios iteradores abiertos para una misma sentencia de SQL en una aplicacin SQLJ
Con el Controlador IBM DB2 para JDBC y SQLJ, la aplicacin puede tener varios iteradores abiertos a la vez para una nica sentencia de SQL de una aplicacin SQLJ. Esta caracterstica le permite efectuar una operacin en una tabla utilizando un iterador mientras ejecuta una operacin diferente en la misma tabla utilizando otro iterador. Cuanto utilice simultneamente varios iteradores abiertos en una aplicacin, es conveniente que cierre los iteradores que ya no necesite, a fin de evitar un consumo excesivo de espacio de almacenamiento en la pila de Java. Los ejemplos siguientes muestran la ejecucin de unas mismas operaciones en una tabla con y sin operadores abiertos simultneamente para una misma sentencia de SQL. Estos ejemplos utilizan la siguiente declaracin de iterador:
import java.math.*; #sql public iterator MultiIter(String EmpNo, BigDecimal Salary);

Si no se utiliza la capacidad de tener abiertos a la vez varios iteradores para una misma sentencia de SQL, si desea seleccionar valores de empleado y salario para un nmero de empleado determinado, debe definir una sentencia de SQL diferente para cada nmero de empleado, tal como muestra la Figura 48.
MultiIter iter1 = null; // Instancia de iterador para // recuperar datos para el primer empleado // Nmero de empleado del primer empleado

String EmpNo1 = "000100"; #sql [ctx] iter2 = {SELECT EMPNO, SALARY FROM EMPLOYEE WHERE EMPNO = :EmpNo1}; // Asignar tabla de resultados a primer iterador MultiIter iter2 = null; // Instancia de iterador para recuperar // datos para el segundo empleado String EmpNo2 = "000200"; // Nmero de empleado del segundo empleado #sql [ctx] iter2 = {SELECT EMPNO, SALARY FROM EMPLOYEE WHERE EMPNO = :EmpNo2}; // Asignar tabla de resultados a segundo iterador // Procesar con iter1 // Procesar con iter2 iter1.close(); // Cerrar los iteradores iter2.close(); Figura 48. Ejemplo de operaciones de tabla simultneas utilizando iteradores con sentencias de SQL diferentes

La Figura 49 en la pgina 127 muestra cmo ejecutar las mismas operaciones cuando existe la capacidad de tener abiertos a la vez varios iteradores para una misma sentencia de SQL.

126

Desarrollo de aplicaciones Java

... MultiIter iter1 = openIter("000100"); // Invocar openIter para asignar // la tabla de resultados // (para el empleado 100) al primer // iterador MultiIter iter2 = openIter("000200"); // Invocar openIter para asignar la // tabla de resultados al segundo // iterador. // iter1 permanece abierto cuando // se abre iter2 // Procesar con iter1 // Procesar con iter2 ... iter1.close(); // Cerrar los iteradores iter2.close(); ... public MultiIter openIter(String EmpNo) // Mtodo para asignar una tabla de // resultados a una instancia de iterador { MultiIter iter; #sql [ctxt] iter = {SELECT EMPNO, SALARY FROM EMPLOYEE WHERE EMPNO = :EmpNo}; return iter; // El mtodo devuelve una instancia de iterador } Figura 49. Ejemplo de operaciones de tabla simultneas utilizando iteradores con la misma sentencia de SQL

Conceptos relacionados: v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120

Uso de varias instancias abiertas de un iterador en una aplicacin SQLJ


Pueden estar abiertas simultneamente varias instancias de un iterador en una misma aplicacin SQLJ. Una utilizacin de esta capacidad es abrir varias instancias de un iterador que hace uso de expresiones de lenguaje principal. Cada instancia puede utilizar un conjunto diferente de valores para una expresin de lenguaje principal. El ejemplo siguiente muestra una aplicacin con dos instancias abiertas simultneamente de un iterador.

Captulo 3. Programacin de aplicaciones SQLJ

127

... ResultSet myFunc(String empid) {

// Mtodo para abrir un iterador y // obtener un conjunto de resultados

MyIter iter; #sql iter = {SELECT * FROM EMPLOYEE WHERE EMPNO = :empid}; return iter.getResultSet(); } // Una aplicacin puede invocar este mtodo para obtener un conjunto // de resultados para cada ID de empleado. La aplicacin puede // procesar cada conjunto de resultados por separado. ... ResultSet rs1 = myFunc("000100"); // Obtener registro del ID de empleado 000100 ... ResultSet rs2 = myFunc("000200"); // Obtener registro del ID de empleado 000200 Figura 50. Ejemplo de apertura de ms de una instancia de un iterador en una misma aplicacin

Al igual que ocurre con cualquier otro iterador, es necesario cerrar este iterador cuando termine de utilizarlo para evitar un uso excesivo de espacio de almacenamiento. Conceptos relacionados: v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120

Utilizacin de iteradores desplazables en una aplicacin SQLJ


Adems de avanzar fila a fila por una tabla de resultados, puede desear ir hacia atrs o directamente a una fila determinada. El Controlador IBM DB2 para JDBC y SQLJ proporciona esta capacidad. Un iterador en el que se puede desplazar hacia delante, hacia atrs o hasta una fila determinada se denomina iterador desplazable. Un iterador desplazable de SQLJ es equivalente a la tabla de resultados de un cursor DB2 que est declarado como SCROLL. Al igual que un cursor desplazable, un iterador desplazable puede ser sensible o insensible. Un iterador desplazable sensible puede ser esttico o dinmico. Insensible significa que los cambios hechos en la tabla subyacente despus de abrir el iterador no son visibles para el iterador. Los iteradores insensibles son de solo lectura. Sensible significa que los cambios que el iterador u otros procesos realizan en la tabla subyacente son visibles para el iterador. Insensible significa que si el cursor es de slo lectura, se comportar como un cursor no sensible. Si no se trata de un cursor insensible, se comportar como un cursor sensible. Si un iterador desplazable es esttico, el tamao de la tabla de resultados y el orden de las filas en la tabla de resultados no cambian despus de abrir el iterador. Esto significa que no puede insertar datos en tablas de resultados, y si suprime una fila de una tabla de resultados, se produce un hueco por supresin. Si actualiza una fila de la tabla de resultados y como consecuencia la fila deja de ser apropiada para la tabla de resultados, se produce un hueco por actualizacin. Una operacin de recuperacin de datos realizada en un hueco produce una excepcin de SQL. Si un iterador desplazable es dinmico, el tamao de la tabla de resultados y el orden de las filas en la tabla de resultados pueden cambiar despus de abrir el

128

Desarrollo de aplicaciones Java

iterador. Las filas que se insertan o suprimen con sentencias INSERT y DELETE ejecutadas por el mismo proceso de aplicacin son visibles inmediatamente. Las filas que se insertan o suprimen con sentencias INSERT y DELETE ejecutadas por otros procesos de aplicacin son visibles una vez confirmados los cambios. Importante: Los servidores de DB2 Database para Linux, UNIX y Windows no ofrecen soporte a los cursores desplazables dinmicos. Puede utilizar iteradores desplazables dinmicos en las aplicaciones SQLJ slo si dichas aplicaciones acceden a datos de servidores DB2 para z/OS en la versin 9 o la versin posterior. Para crear y utilizar un iterador desplazable, debe seguir estos pasos: 1. Especifique una clusula de declaracin de iterador que incluya las clusulas siguientes: v implements sqlj.runtime.Scrollable Esto indica que el iterador es desplazable. v with (sensitivity=INSENSITIVE|SENSITIVE|ASENSITIVE) or with (sensitivity=SENSITIVE, dynamic=true|false) sensitivity=INSENSITIVE|SENSITIVE|ASENSITIVE indica si las operaciones de actualizacin o eliminacin de la tabla subyacente pueden ser visibles para el iterador. El valor por omisin del atributo sensitivity es INSENSITIVE. dynamic=true|false indica si el tamao de la tabla de resultados o el orden de las filas en la tabla puede cambiar despus de abrir el iterador. El valor por omisin del atributo dynamic es false. El iterador puede ser un iterador de nombre o de posicin. Por ejemplo, la siguiente clusula de declaracin de iterador declara un iterador de posicin que es sensible, dinmico y desplazable:
#sql public iterator ByPos implements sqlj.runtime.Scrollable with (sensitivity=SENSITIVE, dynamic=true)

(String);

La siguiente clusula de declaracin de iterador declara un iterador de nombre que es insensible y desplazable:
#sql public iterator ByName implements sqlj.runtime.Scrollable with (sensitivity=INSENSITIVE) (String EmpNo);

Restriccin: No puede utilizar un iterador desplazable para seleccionar columnas con los tipos de datos siguientes en una tabla de un servidor DB2 Database para Linux, UNIX y Windows: v LONG VARCHAR v LONG VARGRAPHIC v DATALINK v BLOB v CLOB v Un tipo diferenciado que est basado en cualquiera de los tipos de datos anteriores de esta lista v Un tipo estructurado 2. Cree un objeto de iterador, que es una instancia de la clase de iterador utilizada. 3. Si desea indicar al entorno de ejecucin de SQLJ la direccin inicial de la recuperacin de datos, utilice el mtodo setFetchDirection(int direccin). direccin puede ser FETCH_FORWARD o FETCH_REVERSE. Si no invoca setFetchDirection, la direccin de recuperacin de datos es FETCH_FORWARD. 4. Para cada fila a la que desee acceder:
Captulo 3. Programacin de aplicaciones SQLJ

129

v En el caso de un iterador con nombre, siga estos pasos: a. Posicione el cursor utilizando uno de los mtodos listados en la Tabla 15.
Tabla 15. Mtodos sqlj.runtime.Scrollable para posicionar un cursor desplazable Mtodo first() last() previous() next() absolute(int n)
2 1

Posiciona el cursor En la primera fila de la tabla de resultados En la ltima fila de la tabla de resultados En la fila anterior de la tabla de resultados En la fila siguiente de la tabla de resultados Si n>0, en la fila n de la tabla de resultados. Si n<0 y m es el nmero de filas de la tabla de resultados, sita el iterador en la fila m+n+1 de la tabla de resultados. Si n>0, en la fila que est situada n filas despus de la fila actual. Si n<0, en la fila que est situada n filas antes de la fila actual. Si n=0, en la fila actual. Despus de la ltima fila de la tabla de resultados Antes de la primera fila de la tabla de resultados

relative(int n)3

afterLast() beforeFirst() Notas:

1. Si el cursor est situado despus de la ltima fila de la tabla de resultados, este mtodo posiciona el cursor en la ltima fila. 2. Si el valor absoluto de n es mayor que el nmero de filas de la tabla de resultados, este mtodo posiciona el cursor despus de la ltima fila si n es positivo, o antes de la primera fila si n es negativo. 3. Suponga que m es el nmero de filas de la tabla de resultados y x es el nmero de fila actual de la tabla de resultados. Si n>0 y x+n>m, el iterador se sita despus de la ltima fila. Si n<0 y x+n<1, el iterador se sita antes de la primera fila.

b. Si necesita conocer la posicin actual del cursor, utilice el mtodo getRow, isFirst, isLast, isBeforeFirst o isAfterLast para obtener esa informacin. Si necesita conocer la direccin actual de recuperacin de datos, invoque el mtodo getFetchDirection. c. Utilice mtodos accesores para recuperar la fila actual de la tabla de resultados. d. Si las operaciones de actualizacin o supresin realizadas por el iterador o por otros medios son visibles en la tabla de resultados, invoque el mtodo getWarnings para determinar si la fila actual es un hueco. v En el caso de un iterador de posicin, siga estos pasos: a. Utilice una sentencia FETCH con una clusula de direccin de la recuperacin de datos para posicionar el iterador y recuperar la fila actual de la tabla de resultados. La Tabla 16 lista las clusulas que puede utilizar para posicionar el cursor.
Tabla 16. Clusulas de FETCH para posicionar un cursor desplazable Mtodo FIRST LAST PRIOR NEXT
1

Posiciona el cursor En la primera fila de la tabla de resultados En la ltima fila de la tabla de resultados En la fila anterior de la tabla de resultados En la fila siguiente de la tabla de resultados

130

Desarrollo de aplicaciones Java

Tabla 16. Clusulas de FETCH para posicionar un cursor desplazable (continuacin) Mtodo ABSOLUTE(n)
2

Posiciona el cursor Si n>0, en la fila n de la tabla de resultados. Si n<0 y m es el nmero de filas de la tabla de resultados, sita el iterador en la fila m+n+1 de la tabla de resultados. Si n>0, en la fila que est situada n filas despus de la fila actual. Si n<0, en la fila que est situada n filas antes de la fila actual. Si n=0, en la fila actual. Despus de la ltima fila de la tabla de resultados
4

RELATIVE(n)3

AFTER4 BEFORE Notas:

Antes de la primera fila de la tabla de resultados

1. Si el cursor est situado despus de la ltima fila de la tabla de resultados, este mtodo posiciona el cursor en la ltima fila. 2. Si el valor absoluto de n es mayor que el nmero de filas de la tabla de resultados, este mtodo posiciona el cursor despus de la ltima fila si n es positivo, o antes de la primera fila si n es negativo. 3. Suponga que m es el nmero de filas de la tabla de resultados y x es el nmero de fila actual de la tabla de resultados. Si n>0 y x+n>m, el iterador se sita despus de la ltima fila. Si n<0 y x+n<1, el iterador se sita antes de la primera fila. 4. No se asignan valores a las expresiones de lenguaje principal.

b. Si las operaciones de actualizacin o supresin realizadas por el iterador o por otros medios son visibles en la tabla de resultados, invoque el mtodo getWarnings para determinar si la fila actual es un hueco. 5. Invoque el mtodo close para cerrar el iterador. Por ejemplo, el cdigo siguiente muestra cmo utilizar un iterador de nombre para recuperar el nmero de empleado y apellido en todas las filas de la tabla EMPLOYEE en orden inverso. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
#sql iterator ScrollIter implements sqlj.runtime.Scrollable (String EmpNo, String LastName); { ScrollIter scrliter; #sql [ctxt] scrliter={SELECT EMPNO, LASTNAME FROM EMPLOYEE}; scrliter.afterLast(); while (scrliter.previous()) { System.out.println(scrliter.EmpNo() + " " + scrliter.LastName()); } scrliter.close(); } Figura 51. Utilizacin de iteradores desplazables 1 2

4a 4c 5

Conceptos relacionados: v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120 Tareas relacionadas: v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123

Captulo 3. Programacin de aplicaciones SQLJ

131

Llamada a procedimientos almacenados en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la llamada a procedimientos almacenados en aplicaciones SQLJ. v Invocacin de procedimientos almacenados en una aplicacin SQLJ v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ en la pgina 133

Invocacin de procedimientos almacenados en una aplicacin SQLJ


Para invocar un procedimiento almacenado, utilice una clusula ejecutable que contenga una sentencia CALL de SQL. Puede ejecutar la sentencia CALL con parmetros de identificador de lenguaje principal. La sentencia CALL se puede ejecutar slo con parmetros literales si el servidor DB2 en el que se ejecuta la sentencia CALL da soporte a la ejecucin de la sentencia CALL dinmicamente. Estos son los pasos bsicos para invocar un procedimiento almacenado: 1. Asigne valores a los parmetros de entrada (IN o INOUT). 2. Invoque el procedimiento almacenado. 3. Procese los parmetros de salida (OUT o INOUT). 4. Si el procedimiento almacenado devuelve varios conjuntos de resultados, obtenga esos resultados. Consulte el tema Recuperar varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ. El cdigo siguiente muestra la invocacin de un procedimiento almacenado que tiene tres parmetros de entrada y tres parmetros de salida. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.
String FirstName="TOM"; // Parmetros de entrada 1 String LastName="NARISINST"; String Address="IBM"; int CustNo; // Parmetros de salida String Mark; String MarkErrorText; ... #sql [myConnCtx] {CALL ADD_CUSTOMER(:IN FirstName, 2 :IN LastName, :IN Address, :OUT CustNo, :OUT Mark, :OUT MarkErrorText)}; // Invocar el procedimiento almacenado System.out.println("Output parameters from ADD_CUSTOMER call: "); System.out.println("Customer number for " + LastName + ": " + CustNo); 3 System.out.println(Mark); If (MarkErrorText != null) System.out.println(" Error messages:" + MarkErrorText); Figura 52. Invocacin de un procedimiento almacenado en una aplicacin SQLJ

Conceptos relacionados: v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ en la pgina 133

132

Desarrollo de aplicaciones Java

Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ


Algunos procedimientos almacenados devuelven uno o ms conjuntos de resultados al programa solicitante. Para recuperar las filas de esos conjuntos de resultados, siga estos pasos: 1. Adquiera un contexto de ejecucin para recuperar el conjunto de resultados del procedimiento almacenado. 2. Asocie el contexto de ejecucin con la sentencia CALL para el procedimiento almacenado. No utilice este contexto de ejecucin para ninguna otra finalidad hasta que haya recuperado y procesado el ltimo conjunto de resultados. 3. Para cada conjunto de resultados: a. Utilice el mtodo getNextResultSet del contexto de ejecucin para recuperar el conjunto de resultados. b. Si no conoce el contenido del conjunto de resultados, utilice el mtodo ResultSetMetaData para obtener esta informacin. c. Utilice un iterador de conjunto de resultados de SQLJ o un conjunto de resultados de JDBC para recuperar las filas del conjunto de resultados. Los conjuntos de resultados se devuelven al programa solicitante en el mismo orden en el que se abren los cursores del programa en el procedimiento almacenado. Cuando no existen ms conjuntos de resultados para recuperar, getNextResultSet devuelve un valor nulo. Existen dos formatos de getNextResultSet:
getNextResultSet(); getNextResultSet(int actual);

Cuando invoca el primer formato de getNextResultSet, SQLJ cierra el conjunto de resultados que est abierto actualmente y pasa al conjunto de resultados siguiente. Cuando invoca el segundo formato de getNextResultSet, el valor de actual indica lo que SQLJ realiza con el conjunto de resultados abierto actualmente antes de pasar al conjunto de resultados siguiente: java.sql.Statement.CLOSE_CURRENT_RESULT Especifica que el objeto ResultSet actual se cierra cuando se devuelve el objeto ResultSet siguiente. java.sql.Statement.KEEP_CURRENT_RESULT Especifica que el objeto ResultSet actual permanece abierto cuando se devuelve el objeto ResultSet siguiente. java.sql.Statement.CLOSE_ALL_RESULTS Especifica que todos los objetos ResultSet abiertos se cierran cuando se devuelve el objeto ResultSet siguiente. El cdigo siguiente invoca un procedimiento almacenado que devuelve varios conjuntos de resultados. En este ejemplo, se supone que el llamador no conoce el nmero de conjuntos de resultados que se devolver ni el contenido de dichos conjuntos de resultados.Se supone tambin que autoCommit tiene el valor false. Los nmeros que aparecen a la derecha de las sentencias seleccionadas corresponden a los pasos descritos previamente.

Captulo 3. Programacin de aplicaciones SQLJ

133

ExecutionContext execCtx=myConnCtx.getExecutionContext(); 1 #sql [myConnCtx, execCtx] {CALL MULTRSSP()}; 2 // MULTRSSP devuelve varios conjuntos de resultados ResultSet rs; while ((rs = execCtx.getNextResultSet()) != null) 3a { ResultSetMetaData rsmeta=rs.getMetaData(); 3b int numcols=rsmeta.getColumnCount(); while (rs.next()) 3c { for (int i=1; i<=numcols; i++) { String colval=rs.getString(i); System.out.println("Column " + i + "value is " + colval); } } } Figura 53. Recuperacin de conjuntos de resultados de un procedimiento almacenado

Trabajo con LOB en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la actualizacin y recuperacin de datos LOB en aplicaciones SQLJ. v LOB en aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ v Tipos de datos Java para recuperar o actualizar datos de columnas LOB en aplicaciones SQLJ en la pgina 135

LOB en aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ
Con el Controlador IBM DB2 para JDBC y SQLJ, puede insertar datos LOB en expresiones Clob o Blob de lenguaje principal o actualizar columnas CLOB, BLOB o DBCLOB a partir de expresiones Clob o Blob de lenguaje principal. Puede tambin declarar iteradores con tipos de datos Clob o Blob para recuperar datos de columnas CLOB, BLOB o DBCLOB. Recuperacin o actualizacin de datos LOB: para recuperar datos de una columna BLOB, declare un iterador que incluya el tipo de datos Blob o byte[]. Para recuperar datos de una columna CLOB o DBCLOB, declare un iterador en el que la correspondiente columna tenga un tipo de datos Clob. Para actualizar datos de una columna BLOB, utilice una expresin de lenguaje principal cuyo tipo de datos sea Blob. Para actualizar datos de una columna CLOB o DBCLOB, utilice una expresin de lenguaje principal cuyo tipo de datos sea Clob. Soporte a la modalidad continua progresiva: si el servidor de bases de datos admite la modalidad continua progresiva, el Controlador IBM DB2 para JDBC y SQLJ podr utilizarla para recuperar datos en las columnas LOB o XML. Con la modalidad continua progresiva, el servidor de bases de datos determina de manera dinmica el modo ms eficaz para devolver datos LOB o XML en funcin del tamao de los objetos de LOB o XML. Para que SQLJ utilice la modalidad continua progresiva para recuperar datos, debe definir la propiedad progressiveStreaming como DB2DatabaseMetaData.YES. Cuando se utiliza la modalidad continua progresiva, puede controlar el momento en que el controlador JDBC materializa los LOB con la propiedad streamBufferSize. Si un objeto LOB o XML es menor que o igual al valor streamBufferSize, el objeto se materializa.

134

Desarrollo de aplicaciones Java

El uso de la modalidad continua progresiva es el mtodo ms recomendado para la recuperacin de datos LOB o XML. Para determinar si un servidor de bases de datos admite la modalidad continua progresiva, invoque el mtodo DB2DatabaseMetaData.supportsDB2ProgressiveStreaming. Soporte de localizador de LOB: el Controlador IBM DB2 para JDBC y SQLJ puede utilizar localizadores de LOB para recuperar datos de columnas LOB. Debe utilizar localizadores de LOB nicamente si el servidor de bases de datos no admite la modalidad continua progresiva. Para que SQLJ utilice localizadores de LOB para recuperar datos de las columnas LOB, debe definir la propiedad fullyMaterializeLobData con el valor false y la propiedad progressiveStreaming con el valor DB2BaseDataSource.NO. Si no define la propiedad progressiveStreaming con el valor DB2BaseDataSource.NO, y el servidor de bases de datos admite la modalidad continua progresiva, el controlador JDBC pasar por alto el valor fullyMaterializeLobData. fullyMaterializeLobData no tiene ningn efecto para parmetros de salida de procedimiento almacenado ni datos LOB que se recuperan utilizando cursores desplazables. No puede invocar un procedimiento almacenado que tenga parmetros de localizador de LOB. Cuando se captan datos de cursores desplazables, SQLJ siempre utiliza localizadores de LOB para recuperar datos de las columnsa LOB. Al igual que ocurre en cualquier otro lenguaje, un localizador de LOB de una aplicacin Java se asocia a una sola base de datos. No puede utilizar un nico localizador de LOB para mover datos entre dos bases de datos diferentes. Para mover los datos LOB entre dos bases de datos, es necesario materializar los datos LOB cuando los recupera de una tabla de la primera base de datos y luego insertar dichos datos en la tabla de la segunda base de datos. Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243 v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Tipos de datos Java para recuperar o actualizar datos de columnas LOB en aplicaciones SQLJ
Cuando la propiedad deferPrepares tiene el valor true, y el Controlador IBM DB2 para JDBC y SQLJ procesa una sentencia de SQLJ no personalizada que incluye expresiones de lenguaje principal, el controlador puede necesitar realizar tareas adicionales de proceso para determinar los tipos de datos. Estas tareas adicionales de proceso pueden afectar al rendimiento del sistema. Cuando el controlador JDBC no puede determinar inmediatamente el tipo de datos de un parmetro que se utiliza con una columna LOB, es necesario elegir un tipo de datos para el parmetro que sea compatible con el tipo de datos LOB. Parmetros de entrada para columnas BLOB: Para los parmetros de entrada de columnas BLOB, puede utilizar cualquiera de las dos tcnicas siguientes: v Utilice una variable de entrada java.sql.Blob, que se corresponde exactamente con una columna BLOB:

Captulo 3. Programacin de aplicaciones SQLJ

135

java.sql.Blob blobData; #sql {CALL STORPROC(:IN blobData)};

Para poder utilizar una variable de entrada java.sql.Blob, es necesario crear un objeto java.sql.Blob y luego llenar con datos ese objeto. Por ejemplo, si est utilizando el Controlador IBM DB2 para JDBC y SQLJ, puede utilizar el mtodo com.ibm.db2.jcc.t2zos.DB2LobFactory.createBlob, exclusivo de DB2, para llenar el objeto con datos de tipo byte[]:
byte[] byteArray = {0, 1, 2, 3}; java.sql.Blob blobData = com.ibm.db2.jcc.t2zos.DB2LobFactory.createBlob(byteArray);

v Utilice un parmetro de entrada de tipo sqlj.runtime.BinaryStream. Un objeto sqlj.runtime.BinaryStream es compatible con un tipo de datos BLOB. Para esta llamada es necesario especificar la longitud exacta de los datos de entrada:
java.io.ByteArrayInputStream byteStream = new java.io.ByteArrayInputStream(byteData); int numBytes = byteData.length; sqlj.runtime.BinaryStream binStream = new sqlj.runtime.BinaryStream(byteStream, numBytes); #sql {CALL STORPROC(:IN binStream)};

No puede utilizar esta tcnica para parmetros de entrada/salida. Parmetros de salida para columnas BLOB: Para los parmetros de salida o entrada/salida de columnas BLOB, puede utilizar la tcnica siguiente: v Declare el parmetro de salida o variable de entrada/salida con un tipo de datos java.sql.Blob:
java.sql.Blob blobData = null; #sql CALL STORPROC (:OUT blobData)}; java.sql.Blob blobData = null; #sql CALL STORPROC (:INOUT blobData)};

Parmetros de entrada para columnas CLOB: Para los parmetros de entrada de columnas CLOB, puede utilizar una de las tcnicas siguientes: v Utilice una variable de entrada java.sql.Clob, que se corresponde exactamente con una columna CLOB:
#sql CALL STORPROC(:IN clobData)};

Para poder utilizar una variable de entrada java.sql.Clob, es necesario crear un objeto java.sql.Clob y luego llenar con datos ese objeto. Por ejemplo, si est utilizando el Controlador IBM DB2 para JDBC y SQLJ, puede utilizar el mtodo com.ibm.db2.jcc.t2zos.DB2LobFactory.createClob, exclusivo de DB2, para llenar el objeto con datos de tipo String:
String stringVal = "Algunos datos"; java.sql.Clob clobData = com.ibm.db2.jcc.t2zos.DB2LobFactory.createClob(stringVal);

v Utilice uno de los tipos siguientes de parmetros de entrada: Un parmetro de entrada sqlj.runtime.CharacterStream:

136

Desarrollo de aplicaciones Java

java.lang.String charData; java.io.StringReader reader = new java.io.StringReader(charData); sqlj.runtime.CharacterStream charStream = new sqlj.runtime.CharacterStream (reader, charData.length); #sql {CALL STORPROC(:IN charStream)};

Un parmetro sqlj.runtime.UnicodeStream, para datos Unicode UTF-16:


byte[] charDataBytes = charData.getBytes("UnicodeBigUnmarked"); java.io.ByteArrayInputStream byteStream = new java.io.ByteArrayInputStream(charDataBytes); sqlj.runtime.UnicodeStream uniStream = new sqlj.runtime.UnicodeStream(byteStream, charDataBytes.length ); #sql {CALL STORPROC(:IN uniStream)};

Un parmetro sqlj.runtime.AsciiStream, para datos ASCII:


byte[] charDataBytes = charData.getBytes("US-ASCII"); java.io.ByteArrayInputStream byteStream = new java.io.ByteArrayInputStream (charDataBytes); sqlj.runtime.AsciiStream asciiStream = new sqlj.runtime.AsciiStream (byteStream, charDataBytes.length); #sql {CALL STORPROC(:IN asciiStream)};

Para estas llamadas es necesario especificar la longitud exacta de los datos de entrada. No puede utilizar esta tcnica para parmetros de entrada/salida. v Utilice un parmetro de entrada java.lang.String:
java.lang.String charData; #sql {CALL STORPROC(:IN charData)};

Parmetros de salida para columnas CLOB: Para los parmetros de salida o entrada/salida de columnas CLOG, puede utilizar una de las tcnicas siguientes: v Utilice una variable de salida java.sql.Clob, que se corresponde exactamente con una columna CLOB:
java.sql.Clob clobData = null; #sql CALL STORPROC(:OUT clobData)};

v Utilice una variable de salida java.lang.String:


java.lang.String charData = null; #sql CALL STORPROC(:OUT charData)};

Esta tcnica solo se debe utilizar si conoce que la longitud de los datos recuperados es menor o igual que 32 KB. En otro caso, los datos se truncan. Parmetros de salida para columnas DBCLOB: Los parmetros de salida o entrada/salida de DBCLOB para procedimientos almacenados no estn soportados. Conceptos relacionados: v LOB en aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ en la pgina 134 Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Captulo 3. Programacin de aplicaciones SQLJ

137

Uso de SQLJ y JDBC en la misma aplicacin


Puede combinar clusulas SQLJ y llamadas JDBC en un mismo programa. Para ello, debe seguir estos pasos: v Utilice una conexin JDBC para crear contexto de conexin SQLJ u obtenga una conexin JDBC a partir de un contexto de conexin SQLJ. v Utilice un iterador SQLJ para obtener datos a partir de un conjunto de resultados JDBC o genere un conjunto de resultados JDBC a partir de un iterador SQLJ. Creacin de un contexto de conexin SQLJ a partir de una conexin JDBC - Siga estos pasos: 1. Ejecute una clusula de declaracin de conexin SQLJ para crear una clase ConnectionContext. 2. Cargue el controlador u obtenga una instancia de DataSource. 3. Invoque el mtodo DriverManager.getConnection o DataSource.getConnection de JDBC para obtener una conexin JDBC. 4. Invoque el constructor ConnectionContext con el objeto Connection como argumento para crear el objeto ConnectionContext. Obtencin de una conexin JDBC a partir de una contexto de conexin SQLJ - Siga estos pasos: 1. Ejecute una clusula de declaracin de conexin SQLJ para crear una clase ConnectionContext. 2. Cargue el controlador u obtenga una instancia de DataSource. 3. Invoque el constructor ConnectionContext con el URL del controlador y cualquier otro parmetro necesario como argumentos para crear el objeto ConnectionContext. 4. Invoque el mtodo ConnectionContext.getConnection de JDBC para crear el objeto Connection de JDBC. Consulte el tema Conectar a una fuente de datos utilizando SQLJ para obtener ms informacin sobre las conexiones SQLJ. Obtencin de conjuntos de resultados JDBC utilizando iteradores SQLJ: Utilice la sentencia de conversin a iterador para manejar un conjunto de resultados JDBC como un iterador SQLJ. Este es el formato general de una sentencia de conversin a iterador:
#sql iterador={CAST :conjunto-resultados};

Para convertir satisfactoriamente un conjunto de resultados en un iterador, ste debe cumplir las reglas siguientes: v El iterador debe estar declarado como pblico. v Si el iterador es un iterador de posicin, el nmero de columnas del conjunto de resultados debe coincidir con el nmero de columnas del iterador. Adems, el tipo de datos de cada columna del conjunto de resultados debe coincidir con el tipo de datos de la columna correspondiente del iterador. v Si el iterador es un iterador de nombre, el nombre de cada mtodo accesor debe coincidir con el nombre de una columna del conjunto de resultados. Adems, el tipo de datos del objeto devuelto por un mtodo accesor debe coincidir con el tipo de datos de la columna correspondiente del conjunto de resultados.

138

Desarrollo de aplicaciones Java

El cdigo mostrado en la Figura 54 crea y ejecuta una consulta utilizando una llamada JDBC, ejecuta una sentencia de conversin a iterador para convertir el conjunto de resultados JDBC en un iterador SQLJ y obtiene filas del conjunto de resultados utilizando el iterador.
#sql public iterator ByName(String LastName, Date HireDate); 1 public void HireDates(ConnectionContext connCtx, String whereClause) { ByName nameiter; // Declarar objeto de la clase ByName Connection conn=connCtx.getConnection(); // Crear la conexin JDBC Statement stmt = conn.createStatement(); String query = "SELECT LASTNAME, HIREDATE FROM EMPLOYEE"; query+=whereClause; // Crear la consulta ResultSet rs = stmt.executeQuery(query); #sql [connCtx] nameiter = {CAST :rs}; while (nameiter.next()) { System.out.println( nameiter.LastName() + " was hired on " + nameiter.HireDate()); } nameiter.close(); stmt.close(); } Figura 54. Conversin de un conjunto de resultados JDBC en un iterador SQLJ

2 3 4

Notas para la Figura 54:


Nota 1 Descripcin Este clusula de SQLJ crea la clase de iterador de nombre ByName, cuyos mtodos accesores LastName() y HireDate() obtienen datos de las columnas LASTNAME y HIREDATE de la tabla de resultados. Esta sentencia y las dos sentencias que le siguen crean y preparan una consulta para su ejecucin dinmica mediante JDBC. Esta sentencia de JDBC ejecuta la sentencia SELECT y asigna la tabla de resultados al conjunto de resultados rs. Esta clusula de conversin a iterador convierte el conjunto de resultados rs de JDBC en el iterador nameiter de SQLJ y las sentencias que siguen utilizan nameiter para obtener valores de la tabla de resultados. El mtodo nameiter.close() cierra el iterador de SQLJ y el conjunto de resultados rs de JDBC.

2 3 4

Generacin de conjuntos de resultados de JDBC a partir de iteradores de SQLJ: utilice el mtodo getResultSet para generar un conjunto de resultados a partir de un iterador de SQLJ. Cada iterador de SQLJ tiene un mtodo getResultSet. Despus de convertir un iterador en un conjunto de resultados, necesita recuperar filas utilizando solamente el conjunto de resultados. El cdigo mostrado en la Figura 55 en la pgina 140 genera un iterador de posicin para una consulta, convierte el iterador en un conjunto de resultados y utiliza mtodos de JDBC para recuperar filas de la tabla.

Captulo 3. Programacin de aplicaciones SQLJ

139

#sql iterator EmpIter(String, java.sql.Date); { ... EmpIter iter=null; #sql [connCtx] iter= {SELECT LASTNAME, HIREDATE FROM EMPLOYEE}; ResultSet rs=iter.getResultSet(); while (rs.next()) { System.out.println(rs.getString(1) + " was hired in " + rs.getDate(2)); } rs.close(); }

1 2 3

Figura 55. Conversin de un iterador SQLJ en un conjunto de resultados JDBC

Notas para la Figura 55:


Nota 1 Descripcin Esta clusula de SQLJ ejecuta la sentencia SELECT, construye un objeto iterador que contiene la tabla de resultados correspondiente a la sentencia SELECT y asigna el objeto iterador a la variable iter. El mtodo getResultSet() convierte el iterador iter en el conjunto de resultados rs. Los mtodos getString() y getDate() de JDBC obtienen valores a partir del conjunto de resultados. El mtodo next() coloca el cursor en la fila siguiente del conjunto de resultados. El mtodo rs.close() cierra el iterador de SQLJ y el conjunto de resultados.

2 3

Reglas y restricciones para utilizar conjuntos de resultados de JDBC en aplicaciones SQLJ: tenga en cuenta las reglas y restricciones siguientes al escribir aplicaciones de SQLJ que incluyen conjuntos de resultados de JDBC: v No puede convertir un conjunto de resultados en un iterador de SQLJ si el conjunto de resultados y el iterador tienen valores diferentes para el atributo de capacidad de retencin del cursor. Un conjunto de resultados de JDBC o iterador de SQLJ pueden permanecer abiertos despus de una operacin COMMIT. Para un ResultSet de JDBC, esta caracterstica se controla mediante la propiedad resultSetHoldability del Controlador IBM DB2 para JDBC y SQLJ. Para un iterador de SQLJ, esta caracterstica est controlada por el parmetro with holdability de la sentencia de declaracin del iterador. No est soportada la conversin de un conjunto de resultados con capacidad de retencin en un iterador de SQLJ que no tenga esa capacidad, ni la conversin de un conjunto de resultados sin capacidad de retencin en un iterador que s la tenga. v Cierre el objeto ResultSet generado o el iterador subyacente al final del programa. Cuando cierra el objeto iterador utilizado para crear un objeto ResultSet, tambin se cierra el objeto ResultSet. Cuando cierra el objeto ResultSet generado, tambin se cierra el objeto iterador. En general, es mejor cerrar el objeto que se ha utilizado en ltimo lugar. v Para el Controlador IBM DB2 para JDBC y SQLJ, que da soporte a iteradores desplazables y a conjuntos de resultados desplazables y actualizables, son aplicables las restricciones siguientes: Los iteradores desplazables tienen las mismas restricciones que sus conjuntos de resultados de JDBC subyacentes. Por ejemplo, debido a que los conjuntos de resultados desplazables no dan soporte a las operaciones INSERT, los iteradores desplazables no dan soporte a las operaciones INSERT.

140

Desarrollo de aplicaciones Java

No puede convertir un conjunto de resultados de JDBC que no sea actualizable en un iterador SQLJ que sea actualizable. Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Control de la ejecucin de sentencias de SQL en SQLJ


Puede utilizar determinados mtodos de la clase ExecutionContext de SQLJ para controlar o supervisar la ejecucin de sentencias de SQL. Siga estos pasos para utilizar mtodos de ExecutionContext: 1. Adquiera un contexto de ejecucin. Existen dos formas de adquirir un contexto de ejecucin: v Adquiera el contexto de ejecucin por omisin a partir del contexto de conexin. Por ejemplo:
ExecutionContext execCtx = connCtx.getExecutionContext();

v Cree un nuevo contexto de ejecucin invocando el constructor de ExecutionContext. Por ejemplo:


ExecutionContext execCtx=new ExecutionContext();

2. Asocie el contexto de ejecucin a una sentencia de SQL. Para ello, especifique un contexto de ejecucin a continuacin del contexto de conexin en la clusula de ejecucin donde reside la sentencia de SQL. Por ejemplo:
#sql [connCtx, execCtx] {DELETE FROM EMPLOYEE WHERE SALARY > 10000};

3. Invoque mtodos de ExecutionContext. Algunos mtodos de ExecutionContext son aplicables antes de ejecutar la sentencia de SQL asociada, mientras que otros son aplicables solo despus de ejecutar su sentencia de SQL asociada. Por ejemplo, puede utilizar el mtodo getUpdateCount para contar el nmero de filas suprimidas por una sentencia DELETE despus de ejecutar esa sentencia:
#sql [connCtx, execCtx] {DELETE FROM EMPLOYEE WHERE SALARY > 10000}; System.out.println("Deleted " + execCtx.getUpdateCount() + " rows");

Uso de valores ROWID en SQLJ con el controlador IBM DB2 para JDBC y SQLJ
DB2 para z/OS y DB2 UDB para iSeries dan soporte al tipo de datos ROWID para una columna de una tabla DB2. Un ROWID es un valor que identifica una fila de una tabla de una forma exclusiva. Si utiliza valores ROWID en programas SQLJ, es necesario que personalice esos programas. El Controlador IBM DB2 para JDBC y SQLJ proporciona la clase com.ibm.db2.jcc.DB2RowID, exclusiva de DB2, que puede utilizar en iteradores y en parmetros de sentencias CALL. En el caso de un iterador, puede tambin utilizar el tipo de objeto byte[] para recuperar valores ROWID. La Figura 56 en la pgina 142 muestra un ejemplo de un iterador que se utiliza para seleccionar valores de una columna ROWID:

Captulo 3. Programacin de aplicaciones SQLJ

141

#sql iterator PosIter(int,String,com.ibm.db2.jcc.DB2RowId); // Declarar un iterador de posicin para // recuperar valores ITEM_ID (INTEGER), // ITEM_FORMAT (VARCHAR) y ITEM_ROWID (ROWID) // de la tabla ROWIDTAB { PosIter positrowid; // Declarar objeto de la clase PosIter com.ibm.db2.jcc.DB2RowId rowid = null; int id = 0; String i_fmt = null; // Declarar expresiones de lenguaje principal #sql [ctxt] positrowid = {SELECT ITEM_ID, ITEM_FORMAT, ITEM_ROWID FROM ROWIDTAB WHERE ITEM_ID=3}; // Asignar tabla de resultados de SELECT // al objeto de iterador positrowid #sql {FETCH :positrowid INTO :id, :i_fmt, :rowid}; // Recuperar primera fila while (!positrowid.endFetch()) // Determinar si FETCH devolvi una fila {System.out.println("Item ID " + id + " Item format " + i_fmt + " Item ROWID "); printBytes(rowid.getBytes()); // Utilizar el mtodo getBytes, exclusivo de DB2, // para convertir el valor a bytes para imprimir #sql {FETCH :positrowid INTO :id, :i_fmt, :rowid}; // Recuperar la fila siguiente } positrowid.close(); // Cerrar el iterador } Figura 56. Ejemplo de utilizacin de un iterador para recuperar valores ROWID

La Figura 57 muestra un ejemplo de invocacin de un procedimiento almacenado que utiliza tres parmetros ROWID: un parmetro de entrada (IN), un parmetro de salida (OUT) y un parmetro de entrada/salida (INOUT).
com.ibm.db2.jcc.DB2RowId in_rowid = rowid; com.ibm.db2.jcc.DB2RowId out_rowid = null; com.ibm.db2.jcc.DB2RowId inout_rowid = rowid; // Declarar un parmetro ROWID de entrada, // de salida y de entrada/salida ... #sql [myConnCtx] {CALL SP_ROWID(:IN in_rowid, :OUT out_rowid, :INOUT inout_rowid)}; // Invocar el procedimiento almacenado System.out.println("Parameter values from SP_ROWID call: "); System.out.println("Output parameter value "); printBytes(out_rowid.getBytes()); // Utilizar el mtodo getBytes, exclusivo de DB2, // para convertir el valor a bytes para imprimir System.out.println("Input/output parameter value "); printBytes(inout_rowid.getBytes()); Figura 57. Ejemplo de invocacin de un procedimiento almacenado con un parmetro ROWID

Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

142

Desarrollo de aplicaciones Java

Tipos diferenciados en aplicaciones SQLJ


En DB2, un tipo diferenciado es un tipo de datos definido por el usuario cuya representacin interna es un tipo de datos SQL incorporado. Un tipo diferenciado se crea ejecutando la sentencia CREATE DISTINCT TYPE de SQL. En un programa SQLJ, puede crear un tipo diferenciado utilizando la sentencia CREATE DISTINCT TYPE en una clusula ejecutable. Puede tambin utilizar CREATE TABLE en una clusula ejecutable para crear una tabla que incluya una columna de ese tipo. Cuando se recuperan datos de una columna del tipo mencionado, o se actualiza una columna de dicho tipo, se utilizan identificadores Java con tipos de datos que corresponden a los tipos incorporados en que se basan los tipos diferenciados. El ejemplo siguiente crea un tipo diferenciado que est basado en un tipo INTEGER, crea una tabla con una columna de ese tipo, inserta una fila en la tabla y recupera la fila de la tabla:
String empNumVar; int shoeSizeVar; ... #sql [myConnCtx] {CREATE DISTINCT TYPE SHOESIZE AS INTEGER WITH COMPARISONS}; // Crear tipo diferenciado #sql [myConnCtx] {COMMIT}; // Confirmar la creacin #sql [myConnCtx] {CREATE TABLE EMP_SHOE (EMPNO CHAR(6), EMP_SHOE_SIZE SHOESIZE)}; // Crear tabla utilizando tipo diferenciado #sql [myConnCtx] {COMMIT}; // Confirmar la creacin #sql [myConnCtx] {INSERT INTO EMP_SHOE VALUES(000010,6)}; // Insertar una fila en la tabla #sql [myConnCtx] {COMMIT}; // Confirmar la insercin #sql [myConnCtx] {SELECT EMPNO, EMP_SHOE_SIZE INTO :empNumVar, :shoeSizeVar FROM EMP_SHOE}; // Recuperar la fila System.out.println("Employee number: " + empNumVar + " Shoe size: " + shoeSizeVar); Figura 58. Definicin y utilizacin de un tipo diferenciado

Informacin relacionada: v Sentencia CREATE DISTINCT TYPE en Consulta de SQL, Volumen 2

Puntos de salvaguarda en aplicaciones SQLJ


Un punto de salvaguarda de SQL representa el estado que tienen datos y esquemas en un momento determinado dentro de una unidad de trabajo. Existen sentencias de SQL para establecer un punto de salvaguarda, liberar un punto de salvaguarda y para restaurar datos y esquemas al estado representado por el punto de salvaguarda. Cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ, puede incluir en su programa SQLJ cualquier formato de la sentencia SAVEPOINT de SQL. El ejemplo siguiente muestra cmo establecer un punto de salvaguarda, retrotraer trabajos hasta un punto de salvaguarda y liberar el punto de salvaguarda.

Captulo 3. Programacin de aplicaciones SQLJ

143

#sql context Ctx; // Crear la clase de contexto de conexin Ctx String empNumVar; int shoeSizeVar; ... try { // Cargar el controlador JDBC Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection jdbccon= DriverManager.getConnection("jdbc:db2://sysmvs1.stl.ibm.com:5021/NEWYORK", userid,password); // Crear el objeto de conexin jdbccon de JDBC jdbccon.setAutoCommit(false); // No realizar confirmacin automtica Ctx ctxt=new Ctx(jdbccon); // Crear el objeto de contexto de conexin myConnCtx // para la conexin con NEWYORK ... // Realizar operaciones SQL #sql [ctxt] {COMMIT}; // Confirmar la transaccin // Confirmar la creacin #sql [ctxt] {INSERT INTO EMP_SHOE VALUES (000010, 6)}; // Insertar una fila #sql [ctxt] {SAVEPOINT SVPT1 ON ROLLBACK RETAIN CURSORS}; // Crear un punto de salvaguarda ... #sql [ctxt] {INSERT INTO EMP_SHOE VALUES (000020, 10)}; // Insertar otra fila #sql [ctxt] {ROLLBACK TO SAVEPOINT SVPT1}; // Retrotraer trabajo hasta el punto // despus de la primera insercin ... #sql [ctxt] {RELEASE SAVEPOINT SVPT1}; // Liberar el punto de salvaguarda ctx.close(); // Cerrar el contexto de conexin Figura 59. Establecimiento, retrotraccin y liberacin de un punto de salvaguarda en una aplicacin SQLJ

Tareas relacionadas: v Confirmacin o retrotraccin de transacciones SQLJ en la pgina 149 Informacin relacionada: v Sentencia RELEASE SAVEPOINT en Consulta de SQL, Volumen 2 v Sentencia ROLLBACK en Consulta de SQL, Volumen 2 v Sentencia SAVEPOINT en Consulta de SQL, Volumen 2

Trabajo con datos XML en aplicaciones SQLJ


Los temas siguientes contienen informacin sobre la actualizacin y recuperacin de datos XML en aplicaciones SQLJ. v Datos XML en aplicaciones SQLJ en la pgina 145 v Actualizaciones de columnas XML en aplicaciones SQLJ en la pgina 145 v Recuperacin de datos XML en aplicaciones SQLJ en la pgina 147

144

Desarrollo de aplicaciones Java

Datos XML en aplicaciones SQLJ


En las tablas DB2, el tipo de datos integrados XML se utiliza para almacenar datos XML en una columna en forma de un conjunto estructurado de nodos en un formato de rbol. En las aplicaciones, los datos XML se encuentran en formato de serie serializada. En las aplicaciones SQLJ, se puede realizar lo siguiente: v Almacenar un documento XML completo en una columna XML mediante sentencias INSERT o UPDATE. v Recuperar un documento XML completo de una columna XML mediante iteradores o sentencias SELECT de una sola fila. v Recuperar una secuencia de un documento en una columna XML mediante la funcin XMLQUERY de SQL para recuperar la secuencia en una serie XML serializada en la base de datos y, a continuacin, utilizar iteradores o sentencias SELECT de una sola fila para recuperar los datos en una variable de aplicacin. v Recuperar una secuencia de un documento en una columna XML mediante una expresin XQuery, a la que se aade la serie 'XQUERY' como prefijo, para recuperar los elementos de la secuencia en una tabla de resultados de la base de datos. En dicha base de datos, cada fila de la tabla de resultados representa un elemento de la secuencia. A continuacin, se utilizan iteradores o sentencias SELECT de una sola fila para recuperar los datos en variables de aplicacin. v Recuperar una secuencia de un documento en una columna XML en forma de una tabla definida por el usuario mediante la funcin XMLTABLE de SQL para definir la tabla de resultados y recuperarla. A continuacin, se utilizan iteradores o sentencias SELECT de una sola fila para recuperar los datos de la tabla de resultados en variables de la aplicacin. Java no tiene tipos de datos XML ni invocaciones de mtodos de metadatos como, por ejemplo, ResultSetMetaData.getColumnTypeName, el cual devuelve un tipo de java.sql.Types.OTHER para un tipo de columna XML. Conceptos relacionados: v Encoding considerations for XML data in JDBC, SQLJ, and .NET applications en XML Guide v Actualizaciones de columnas XML en aplicaciones SQLJ en la pgina 145 v Recuperacin de datos XML en aplicaciones SQLJ en la pgina 147

Actualizaciones de columnas XML en aplicaciones SQLJ


Al actualizar o insertar datos en columnas XML de una tabla de DB2, los datos de entrada debe estar en formato de serie serializada. Los tipos de datos de expresin de lenguaje principal que se pueden utilizar para actualizar las columnas XML son: v com.ibm.db2.jcc.DB2Xml v String v byte v Blob v Clob v sqlj.runtime.AsciiStream v sqlj.runtime.BinaryStream v sqlj.runtime.CharacterStream

Captulo 3. Programacin de aplicaciones SQLJ

145

Para los tipos de corrientes, debe utilizarse la expresin de lenguaje principal sqlj.runtime.tipoStream, en lugar de la expresin de lenguaje principal java.io.tipoInputStream, de modo que se pueda pasar la longitud de la corriente al controlador JDBC. La codificacin de datos XML puede derivarse de los datos en s, los cuales se conocen como datos codificados internamente o bien desde fuentes externas. En este ltimo caso, son datos codificados externamente. Los datos XML que se envan al servidor de bases de datos con formato binario, se tratan como datos codificados internamente. Los datos XML que se envan al servidor de bases de datos como datos de tipo carcter, se tratan como datos codificados externamente. Para JVM, se utiliza la codificacin externa por omisin. La codificacin externa de aplicaciones Java siempre incluye codificacin Unicode. Los datos codificados externamente pueden tener una codificacin interna. Es decir, los datos se pueden enviar al servidor de bases de datos como datos de tipo carcter, pero los datos contienen informacin de codificacin. El servidor de bases de datos maneja las incompatibilidades entre las codificaciones interna y externa del modo siguiente: v Si el servidor de bases de datos es DB2 Database para Linux, UNIX y Windows, el servidor de bases de datos generar un error si las codificaciones externa e interna son incompatibles, a menos que dichas codificaciones sean Unicode. Si las codificaciones externa e interna son Unicode, el servidor de bases de datos pasar por alto la codificacin interna. v Si el servidor de bases de datos es DB2 para z/OS, dicho servidor pasar por alto la codificacin interna. Los datos de las columnas XML se almacenan en codificacin UTF-8. Ejemplo: suponga que utiliza la sentencia siguiente para insertar datos de la expresin de lenguaje principal de tipo String xmlString en una columna XML de una tabla de un servidor de bases de datos DB2. xmlString es un tipo de carcter, por lo cual, se utiliza su codificacin externa, independientemente de que tenga una especificacin de codificacin interna.
#sql [ctx] {INSERT INTO CUSTACC VALUES (1, :xmlString)};

Ejemplo: suponga que copia los datos de xmlString en una matriz de bytes con la codificacin CP500. Los datos contienen una declaracin XML con una declaracin de codificacin para Cp500. A continuacin, inserta los datos de la expresin de lenguaje principal de bytes[] en una columna XML de una tabla de un servidor de bases de datos DB2.
byte[] xmlBytes = xmlString.getBytes("CP500"); #sql[ctx] {INSERT INTO CUSTACC VALUES (4, :xmlBytes)};

Se considera que los datos de una serie de bytes se han codificado internamente. Los datos se convierte de su esquema de codificacin interna a UTF-8, en caso necesario, y se almacenan en su formato de jerarqua en el servidor de bases de datos DB2. Ejemplo: suponga que copia los datos de xmlString en una matriz de bytes con la codificacin US-ASCII. A continuacin, crea una expresin de lenguaje principal sqlj.runtime.AsciiStream e inserte los datos de la expresin de lenguaje principal sqlj.runtime.AsciiStream en una columna XML de una tabla de un servidor de bases de datos DB2.

146

Desarrollo de aplicaciones Java

byte[] b = xmlString.getBytes("US-ASCII"); java.io.ByteArrayInputStream xmlAsciiInputStream = new java.io.ByteArrayInputStream(b); sqlj.runtime.AsciiStream sqljXmlAsciiStream = new sqlj.runtime.AsciiStream(xmlAsciiInputStream, b.length); #sql[ctx] {INSERT INTO CUSTACC VALUES (4, :sqljXmlAsciiStream)};

sqljXmlAsciiStream es un tipo de corriente, por lo cual, se utiliza su codificacin interna. Los datos se convierte de su codificacin interna a la codificacin UTF-8 y se almacenan en su formato de jerarqua en el servidor de bases de datos. Ejemplo: expresin de lenguaje principal sqlj.runtime.CharacterStream: suponga que crea una expresin de lenguaje principal sqlj.runtime.CharacterStream y que inserta los datos de la expresin de lenguaje principal sqlj.runtime.CharacterStream en una columna XML de una tabla de un servidor de bases de datos DB2.
java.io.StringReader xmlReader = new java.io.StringReader(xmlString); sqlj.runtime.CharacterStream sqljXmlCharacterStream = new sqlj.runtime.CharacterStream(xmlReader, xmlString.length()); #sql [ctx] {INSERT INTO CUSTACC VALUES (4, :sqljXmlCharacterStream)};

sqljXmlCharacterStream es un tipo de carcter, por lo cual, se utiliza su codificacin externa, independientemente de que tenga una especificacin de codificacin interna. Ejemplo: suponga que recupera un documento de una columna XML y lo convierte en una expresin de lenguaje principal com.ibm.db2.jcc.DB2Xml y que, a continuacin, inserta los datos en una columna XML de una tabla de un servidor de bases de datos DB2.
java.sql.ResultSet rs = s.executeQuery ("SELECT * FROM CUSTACC"); rs.next(); com.ibm.db2.jcc.DB2Xml xmlObject = (com.ibm.db2.jcc.DB2Xml)rs.getObject(2); #sql [ctx] {INSERT INTO CUSTACC VALUES (6, :xmlObject)};

Una vez que haya recuperado los datos, seguirn estando codificados en UTF-8. En consecuencia, cuando inserte los datos en otra columna XML, no se llevar a cabo ninguna conversin.

Recuperacin de datos XML en aplicaciones SQLJ


Cuando recupera datos de las columnas XML de una tabla de DB2, los datos de salida estn en formato de serie serializado. Los tipos de datos de iterador o expresin de lenguaje principal que puede utilizar para recuperar datos de las columnas XML son: v com.ibm.db2.jcc.DB2Xml v String v byte[] v sqlj.runtime.AsciiStream v sqlj.runtime.BinaryStream v sqlj.runtime.CharacterStream Si la aplicacin no llama a la funcin XMLSERIALIZE antes de la recuperacin de datos, los datos se convierten de UTF-8 a la codificacin de aplicacin externa para los tipos de datos de caracteres o la codificacin interna para los tipos de datos binarios. No se ha aadido una declaracin XML. Si la expresin de lenguaje principal es un objeto del tipo com.ibm.db2.jcc.DB2Xml, necesita llamar a un mtodo adicional para recuperar los datos de este objeto. El mtodo al que llama
Captulo 3. Programacin de aplicaciones SQLJ

147

determina la codificacin de los datos de salida y si se aade una declaracin XML con una especificacin de la codificacin. Tabla 17 enumera los mtodos a los que puede llamar para recuperar datos desde un objeto com.ibm.db2.jcc.DB2Xml, as como los tipos de datos de salida correspondientes y el tipo de codificacin en las declaraciones XML.
Tabla 17. Mtodos DB2Xml, tipos de datos y especificaciones de codificacin aadidas Mtodo DB2Xml.getDB2AsciiStream DB2Xml.getDB2BinaryStream DB2Xml.getDB2Bytes DB2Xml.getDB2CharacterStream DB2Xml.getDB2String DB2Xml.getDB2XmlAsciiStream DB2Xml.getDB2XmlBinaryStream DB2Xml.getDB2XmlBytes DB2Xml.getDB2XmlCharacterStream DB2Xml.getDB2XmlString Tipo de datos de salida InputStream InputStream byte[] Reader String InputStream InputStream byte[] Reader String Tipo de declaracin de codificacin interna XML aadida Ninguno Ninguno Ninguno Ninguno Ninguno US-ASCII Especificado por el parmetro getDB2XmlBinaryStream targetEncoding Especificado por el parmetro DB2Xml.getDB2XmlBytes targetEncoding ISO-10646-UCS-2 ISO-10646-UCS-2

Si la aplicacin ejecuta la funcin XMLSERIALIZE en los datos que se deben devolver, despus de la ejecucin de la funcin, los datos tendrn el tipo especificado en la funcin XMLSERIALIZE, no el tipo de datos XML. Por consiguiente, el controlador maneja los datos como el tipo especificado y pasa por alto cualquier declaracin de codificacin interna. Ejemplo: Supongamos que recupera datos de una columna XML en una expresin de lenguaje principal de tipo String.
#sql iterator XmlStringIter (int, String); #sql [ctx] siter = {SELECT C1, CADOC from CUSTACC}; #sql {FETCH :siter INTO :row, :outString};

String es un tipo de caracteres, de manera que los datos se convierten de UTF-8 a la codificacin externa, la cual es la codificacin JVM por omisin, y se devuelve sin ninguna declaracin XML. Ejemplo: Supongamos que recupera datos de una columna XML en una expresin de lenguaje principal de byte[].
#sql iterator XmlByteArrayIter (int, byte[]); XmlByteArrayIter biter = null; #sql [ctx] biter = {SELECT c1, CADOC from CUSTACC}; #sql {FETCH :biter INTO :row, :outBytes};

Byte[] es un tipo binario, de manera que los datos se convierten de UTF-8 a la codificacin interna, y se devuelven sin ninguna declaracin XML. Ejemplo: Supongamos que recupera un documento de una columna XML en la expresin de lenguaje principal com.ibm.db2.jcc.DB2Xml, pero necesita los datos de una serie de bytes con una declaracin XML que incluya una especificacin de codificacin interna para UTF-8.

148

Desarrollo de aplicaciones Java

#sql iterator DB2XmlIter (int, com.ibm.db2.jcc.DB2Xml); DB2XmlIter db2xmliter = null; com.ibm.db2.jcc.DB2Xml outDB2Xml = null; #sql [ctx] db2xmliter = {SELECT c1, CADOC from CUSTACC}; #sql {FETCH :db2xmliter INTO :row, :outDB2Xml}; byte[] byteArray = outDB2XML.getDB2XmlBytes("UTF-8");

La sentencia FETCH recupera los datos en el objeto DB2Xml con codificacin UTF-8. El mtodo getDB2XmlBytes con el argumento UTF-8 aade una declaracin XML con una especificacin de codificacin UTF-8 y almacena los datos en una matriz de bytes.

Control de transacciones en aplicaciones SQLJ


Los temas siguientes tratan el control de transacciones de DB2 en aplicaciones SQLJ. v Establecimiento del nivel de aislamiento para una transaccin SQLJ v Confirmacin o retrotraccin de transacciones SQLJ

Establecimiento del nivel de aislamiento para una transaccin SQLJ


Para establecer el nivel de aislamiento de una unidad de trabajo dentro de un programa SQLJ, utilice la clusula SET TRANSACTION ISOLATION LEVEL. La Tabla 18 muestra los valores que puede especificar en la clusula SET TRANSACTION ISOLATION LEVEL y los valores equivalentes para DB2.
Tabla 18. Niveles de aislamiento equivalentes de SQLJ y DB2 Valor de SET TRANSACTION SERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED Nivel de aislamiento de DB2 Lectura repetible Estabilidad de lectura Estabilidad del cursor Lectura no confirmada

El nivel de aislamiento afecta a la conexin JDBC subyacente as como a la conexin SQLJ. Conceptos relacionados: v Niveles de aislamiento en Consulta de SQL, Volumen 1

Confirmacin o retrotraccin de transacciones SQLJ


Si inhabilita la confirmacin automtica para una conexin SQLJ, ser necesario realizar operaciones explcitas de confirmacin o retrotraccin. Para ello utiliza clusulas de ejecucin que contienen sentencias COMMIT o ROLLBACK de SQL:
#sql [myConnCtx] {COMMIT}; #sql [myConnCtx] {ROLLBACK};

Conceptos relacionados: v Puntos de salvaguarda en aplicaciones SQLJ en la pgina 143 Tareas relacionadas:

Captulo 3. Programacin de aplicaciones SQLJ

149

v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Manejo de errores y avisos en aplicaciones SQLJ


Los temas siguientes explican cmo manejar los errores y avisos de SQL en aplicaciones SQLJ. v Manejo de errores de SQL en una aplicacin SQLJ v Manejo de avisos de SQL en una aplicacin SQLJ

Manejo de errores de SQL en una aplicacin SQLJ


Las clusulas de SQLJ utilizan la clase java.sql.SQLException de JDBC para el manejo de errores. SQLJ genera una excepcin SQLException en las condiciones siguientes: v Cuando una sentencia cualquiera de SQL devuelve un cdigo de error SQL negativo v Cuando una sentencia SELECT INTO de SQL devuelve el cdigo de error +100 de SQL Puede utilizar el mtodo getErrorCode para obtener los cdigos de error SQL, y el mtodo getSQLState para obtener los SQLSTATE (estados de SQL). Para el manejo de errores SQL en la aplicacin SQLJ, importe la clase java.sql.SQLException y utilice los bloques try/catch de manejo de errores de Java para modificar el flujo del programa cuando se produzca un error de SQL. Por ejemplo:
try { #sql [ctxt] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; } catch (SQLException e) { System.out.println("Cdigo de error devuelto: " + e.getErrorCode()); }

Cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ, puede recuperar el contenido de la SQLCA. Para obtener informacin acerca de cmo grabar cdigo para recuperar el SQLCA con el Controlador IBM DB2 para JDBC y SQLJ, consulte el tema Manejo de una excepcin de SQL bajo el controlador IBM DB2 para JDBC y SQLJ. Para el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2), utilice la excepcin de SQL estndar para recuperar informacin sobre errores de SQL. Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84

Manejo de avisos de SQL en una aplicacin SQLJ


Excepto el cdigo de error +100 de SQL para una sentencia SELECT INTO, los avisos de DB2 no emiten excepciones de SQL. Para manejar avisos de DB2, es necesario dar al programa acceso a la clase java.sql.SQLWarning. Si desea recuperar informacin especfica de DB2 sobre un aviso, tambin deber dar al programa acceso a la interfaz com.ibm.db2.jcc.DB2Diagnosable y a la clase com.ibm.db2.jcc.DB2Sqlca. Para comprobar si hay un aviso de DB2, invoque el

150

Desarrollo de aplicaciones Java

mtodo getWarnings despus de ejecutar una clusula SQLJ. getWarnings devuelve el primer objeto SQLWarning generado por una sentencia de SQL. Los objetos SQLWarning subsiguientes se encadenan al primero de ellos. Para recuperar informacin especfica de DB2 del objeto SQLWarning con el Controlador IBM DB2 para JDBC y SQLJ, siga las instrucciones indicadas en Manejo de una excepcin de SQL bajo el controlador IBM DB2 para JDBC y SQLJ. Para ejecutar getWarnings para una clusula de SQL, es necesario que defina un contexto de ejecucin para esa clusula de SQL. Consulte el tema Control de la ejecucin de sentencias de SQL en SQLJ para obtener informacin sobre cmo definir un contexto de ejecucin. El ejemplo siguiente muestra cmo recuperar un objeto SQLWarning para una clusula de SQL con el contexto de ejecucin execCtx:
ExecutionContext execCtx=myConnCtx.getExecutionContext(); // Obtener contexto ejecucin por omisin // del contexto de conexin SQLWarning sqlWarn; ... #sql [myConnCtx,execCtx] {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'}; if ((sqlWarn = execCtx.getWarnings()) != null) System.out.println("SQLWarning " + sqlWarn);

Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141 v Manejo de errores de SQL en una aplicacin SQLJ en la pgina 150

Cierre de una conexin a una fuente de datos en una aplicacin SQLJ


Una vez finalizada una conexin con una fuente de datos, es necesario que cierre la conexin con la fuente de datos. De esta forma se liberan inmediatamente los recursos SQLJ y DB2 de los objetos del contexto de conexin. Para cerrar la conexin a la fuente de datos, utilice uno de los mtodos ConnectionContext.close. Si ejecuta ConnectionContext.close() o ConnectionContext.close(ConnectionContext.CLOSE_CONNECTION), se cerrar el contexto de conexin y la conexin a la fuente de datos. Si ejecuta ConnectionContext.close(ConnectionContext.KEEP_CONNECTION) se cerrar el contexto de conexin, no as la conexin a la fuente de datos. Por ejemplo:
... ctx = new EzSqljctx(con0); // Crear un objeto de contexto de conexin // a partir de la conexin JDBC con0 ... // Realizar diversas operaciones de SQL EzSqljctx.close(ConnectionContext.KEEP_CONNECTION); // Cerrar el contexto de conexin pero mantener // abierta la conexin a la fuente de datos

Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Captulo 3. Programacin de aplicaciones SQLJ

151

152

Desarrollo de aplicaciones Java

Captulo 4. Seguridad en JDBC y SQLJ


Las secciones siguientes contienen informacin sobre los mecanismos de seguridad que estn disponibles para los controladores JDBC. v Seguridad cuando se utiliza el controlador JDBC de DB2 de tipo 2 v Seguridad en el controlador IBM DB2 para JDBC y SQLJ en la pgina 154 v Seguridad basada en el ID de usuario y la contrasea bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 156 v Seguridad basada slo en el ID de usuario bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 158 v Seguridad de contrasea cifrada o ID de usuario cifrado y seguridad de contrasea cifrada en el controlador IBM DB2 para JDBC y SQLJ en la pgina 158 v Seguridad Kerberos en el controlador IBM DB2 para JDBC y SQLJ en la pgina 160 v Soporte de plugin de seguridad del Controlador IBM DB2 para JDBC y SQLJ en la pgina 163 v Controlador IBM DB2 para soporte de contexto fiable de JDBC y SQLJ en la pgina 165 v Seguridad para la preparacin de aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ en la pgina 167

Seguridad cuando se utiliza el controlador JDBC de DB2 de tipo 2


El controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (controlador JDBC de DB2 de tipo 2) da soporte a la seguridad basada en ID de usuario y contrasea. Debe establecer el ID de usuario y la contrasea o no definir ninguno de ellos. Si no define un ID de usuario y contrasea, el controlador utiliza el ID de usuario y contrasea del usuario que est conectado actualmente al sistema operativo. Para especificar la seguridad basada en un ID de usuario y una contrasea para una conexin JDBC, utilice una de las tcnicas siguientes. Para la interfaz DriverManager: puede especificar el ID de usuario y la contrasea directamente en la invocacin de DriverManager.getConnection. Por ejemplo:
import java.sql.*; // Base JDBC ... String id = "db2adm"; // Definir ID de usuario Sring pw = "db2adm"; // Definir contrasea String url = "jdbc:db2:toronto"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, id, pw); // Crear conexin

Como alternativa, puede establecer el ID de usuario y la contrasea definiendo las propiedades user y password en un objeto Properties, y luego invocar la modalidad del mtodo getConnection que hace uso del objeto Properties como parmetro. Por ejemplo:
import java.sql.*; // Base JDBC import COM.ibm.db2.jdbc.*; // Implementacin de DB2 de JDBC ... Properties properties = new java.util.Properties(); // Crear objeto Properties
Copyright IBM Corp. 2006

153

properties.put("user", "db2adm"); properties.put("password", "db2adm"); String url = "jdbc:db2:toronto";

// Definir ID de usuario para conexin // Definir contrasea para conexin

// Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear conexin

Para la interfaz DataSource: puede especificar el ID de usuario y la contrasea directamente en la invocacin de DataSource.getConnection. Por ejemplo:
import java.sql.*; // Base JDBC import COM.ibm.db2.jdbc.*; // Implementacin de DB2 de JDBC ... Context ctx=new InitialContext(); // Crear contexto para JNDI DataSource ds=(DataSource)ctx.lookup("jdbc/sampledb"); // Obtener objeto DataSource String id = "db2adm"; // Definir ID de usuario Sring pw = "db2adm"; // Definir contrasea Connection con = ds.getConnection(id, pw); // Crear conexin

Como alternativa, si crea y despliega el objeto DataSource, puede establecer el ID de usuario y la contrasea invocando los mtodos DataSource.setUser y DataSource.setPassword despus de crear el objeto DataSource. Por ejemplo:
import java.sql.*; // Base JDBC import COM.ibm.db2.jdbc.*; // Implementacin de DB2 de JDBC ... DB2DataSource db2ds = new DB2DataSource(); // Crear el objeto DataSource db2ds.setDatabaseName("toronto"); // Definir la ubicacin db2ds.setUser("db2adm"); // Definir el ID de usuario db2ds.setPassword("db2adm"); // Definir la contrasea

Conceptos relacionados: v Conexin de aplicaciones DB2 a una fuente de datos utilizando la interfaz DriverManager con el controlador JDBC de DB2 de tipo 2 en la pgina 28 Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Creacin y despliegue de objetos DataSource en la pgina 37

Seguridad en el controlador IBM DB2 para JDBC y SQLJ


Cuando utiliza el Controlador IBM DB2 para JDBC y SQLJ, puede seleccionar un mecanismo de seguridad especificando un valor para la propiedad securityMechanism. Puede definir esta propiedad de una de las maneras siguientes: v Si utiliza la interfaz DriverManager, defina securityMechanism en un objeto java.util.Properties antes de invocar la modalidad del mtodo getConnection que hace uso del parmetro java.util.Properties. v Si utiliza la interfaz DataSource, y est creando y desplegando sus propios objetos DataSource, invoque el mtodo DataSource.setSecurityMechanism despus de crear un objeto DataSource. La Tabla 19 en la pgina 155 muestra los mecanismos de seguridad soportados por el Controlador IBM DB2 para JDBC y SQLJ, y el valor que debe especificar para la propiedad securityMechanism al seleccionar cada uno de los mecanismos de seguridad.

154

Desarrollo de aplicaciones Java

El mecanismo de seguridad por omisin es CLEAR_TEXT_PASSWORD_SECURITY. Si el servidor no admite CLEAR_TEXT_PASSWORD_SECURITY pero s admite ENCRYPTED_USER_AND_PASSWORD_SECURITY, el Controlador IBM DB2 para JDBC y SQLJ actualiza el mecanismo de seguridad a ENCRYPTED_USER_AND_PASSWORD_SECURITY y trata de conectarse al servidor. Cualquier otra discrepancia en el soporte del mecanismo de seguridad entre el solicitante y el servidor da como resultado un error.
Tabla 19. Mecanismos de seguridad soportados por el Controlador IBM DB2 para JDBC y SQLJ Mecanismo de seguridad ID de usuario y contrasea ID de usuario solamente ID de usuario y contrasea cifrada ID de usuario cifrado y contrasea cifrada Valor de la propiedad securityMechanism DB2BaseDataSource.CLEAR_TEXT_PASSWORD_SECURITY DB2BaseDataSource.USER_ONLY_SECURITY DB2BaseDataSource.ENCRYPTED_PASSWORD_SECURITY DB2BaseDataSource.ENCRYPTED_USER_AND_PASSWORD_SECURITY

ID de usuario cifrado y datos cifrados DB2BaseDataSource.ENCRYPTED_USER_AND_DATA_SECURITY sensibles a la seguridad ID de usuario cifrado, contrasea cifrada y datos cifrados sensibles a la seguridad Kerberos1 Plugin Nota: 1. Disponible solo para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. 2. Disponible para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 slo en servidores DB2 Database para Linux, UNIX y Windows.
2

DB2BaseDataSource.ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY

DB2BaseDataSource.KERBEROS_SECURITY DB2BaseDataSource.PLUGIN_SECURITY

Tabla 20Muestra los tipos de autenticacin posibles del servidor DB2 Database para Linux, UNIX y Windows y los valores compatibles de la propiedad securityMechanism del Controlador IBM DB2 para JDBC y SQLJ.
Tabla 20. Tipos de autenticacin del servidor DB2 Database para Linux, UNIX y Windows y valores de securityMechanism del Controlador IBM DB2 para JDBC y SQLJ compatibles Tipo de autenticacin del servidor DB2 Database para Linux, UNIX y Windows CLIENT SERVER SERVER_ENCRYPT Valor de securityMechanism USER_ONLY_SECURITY CLEAR_TEXT_PASSWORD_SECURITY CLEAR_TEXT_PASSWORD_SECURITY, ENCRYPTED_PASSWORD_SECURITY, o ENCRYPTED_USER_AND_PASSWORD_SECURITY ENCRYPTED_USER_AND_DATA_SECURITY o ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY KERBEROS_SECURITY o PLUGIN_SECURITY2 KERBEROS_SECURITY , PLUGIN_SECURITY1, ENCRYPTED_PASSWORD_SECURITY o ENCRYPTED_USER_AND_PASSWORD_SECURITY PLUGIN_SECURITY1 o KERBEROS_SECURITY

DATA_ENCRYPT KERBEROS KRB_SERVER_ENCRYPT

GSSPLUGIN

Captulo 4. Seguridad en JDBC y SQLJ

155

Tabla 20. Tipos de autenticacin del servidor DB2 Database para Linux, UNIX y Windows y valores de securityMechanism del Controlador IBM DB2 para JDBC y SQLJ compatibles (continuacin) Tipo de autenticacin del servidor DB2 Database para Linux, UNIX y Windows GSS_SERVER_ENCRYPT
3

Valor de securityMechanism CLEAR_TEXT_PASSWORD_SECURITY, ENCRYPTED_PASSWORD_SECURITY, ENCRYPTED_USER_AND_PASSWORD_SECURITY, PLUGIN_SECURITY o KERBEROS_SECURITY

Notas: 1. Para PLUGIN_SECURITY, debe tratarse de un Kerberos. 2. Para PLUGIN_SECURITY, uno de los plugins del servidor se identifica a s mismo con capacidad para dar soporte a Kerberos. 3. GSS_SERVER_ENCRYPT es una combinacin de GSSPLUGIN y SERVER_ENCRYPT.

Conceptos relacionados: v Seguridad de contrasea cifrada o ID de usuario cifrado y seguridad de contrasea cifrada en el controlador IBM DB2 para JDBC y SQLJ en la pgina 158 v Seguridad Kerberos en el controlador IBM DB2 para JDBC y SQLJ en la pgina 160 v Seguridad basada en el ID de usuario y la contrasea bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 156 v Seguridad basada slo en el ID de usuario bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 158 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Seguridad basada en el ID de usuario y la contrasea bajo el controlador IBM DB2 para JDBC y SQLJ
Para especificar la seguridad basada en un ID de usuario y una contrasea para una conexin JDBC, utilice una de las tcnicas siguientes. Para la interfaz DriverManager: puede especificar el ID de usuario y la contrasea directamente en la invocacin de DriverManager.getConnection. Por ejemplo:
import ... String String String java.sql.*; // Base JDBC

id = "db2adm"; // Definir ID de usuario pw = "db2adm"; // Definir contrasea url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, id, pw); // Crear conexin

Otro mtodo consiste en definir el ID de usuario y la contrasea directamente en la serie de caracteres del URL. Por ejemplo:
import java.sql.*; // Base JDBC ... String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose:user=db2adm;password=db2adm;"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url); // Crear conexin

156

Desarrollo de aplicaciones Java

Como alternativa, puede establecer el ID de usuario y la contrasea definiendo las propiedades user y password en un objeto Properties, y luego invocar la modalidad del mtodo getConnection que hace uso del objeto Properties como parmetro. Opcionalmente, puede definir la propiedad securityMechanism para indicar que est utilizando la seguridad basada en un ID de usuario y contrasea. Por ejemplo:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new java.util.Properties(); // Crear objeto Properties properties.put("user", "db2adm"); // Definir ID de usuario para conexin properties.put("password", "db2adm"); // Definir contrasea para conexin properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.CLEAR_TEXT_PASSWORD_SECURITY + "")); // Establecer mecanismo de seguridad // de ID usuario y contrasea String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear conexin

Para la interfaz DataSource: puede especificar el ID de usuario y la contrasea directamente en la invocacin de DataSource.getConnection. Por ejemplo:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Context ctx=new InitialContext(); // Crear contexto para JNDI DataSource ds=(DataSource)ctx.lookup("jdbc/sampledb"); // Obtener objeto DataSource String id = "db2adm"; // Definir ID de usuario String pw = "db2adm"; // Definir contrasea Connection con = ds.getConnection(id, pw); // Crear conexin

Como alternativa, si crea y despliega el objeto DataSource, puede establecer el ID de usuario y la contrasea invocando los mtodos DataSource.setUser y DataSource.setPassword despus de crear el objeto DataSource. Opcionalmente, puede invocar el mtodo DataSource.setSecurityMechanism para indicar que est utilizando la seguridad basada en un ID de usuario y contrasea. Por ejemplo:
... com.ibm.db2.jcc.DB2SimpleDataSource db2ds = // Crear objeto DB2SimpleDataSource new com.ibm.db2.jcc.DB2SimpleDataSource(); db2ds.setDriverType(4); // Definir tipo de controlador db2ds.setDatabaseName("san_jose"); // Definir la ubicacin db2ds.setServerName("mvs1.sj.ibm.com");// Definir nombre de servidor db2ds.setPortNumber(5021); // Definir el nmero de puerto db2ds.setUser("db2adm"); // Definir el ID de usuario db2ds.setPassword("db2adm"); // Definir la contrasea db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.CLEAR_TEXT_PASSWORD_SECURITY); // Establecer mecanismo de seguridad // de ID usuario y contrasea

Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 v Creacin y despliegue de objetos DataSource en la pgina 37
Captulo 4. Seguridad en JDBC y SQLJ

157

Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Seguridad basada slo en el ID de usuario bajo el controlador IBM DB2 para JDBC y SQLJ
Para especificar la seguridad basada en un ID de usuario para una conexin JDBC, utilice una de las tcnicas siguientes. Para la interfaz DriverManager: establezca el ID de usuario y el mecanismo de seguridad definiendo las propiedades user y securityMechanism en un objeto Properties, y luego invoque la modalidad del mtodo getConnection que hace uso del objeto Properties como parmetro. Por ejemplo:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new Properties(); // Crear un objeto Properties properties.put("user", "db2adm"); // Definir ID de usuario para conexin properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY + "")); // Establecer mecanismo seguridad // slo de ID de usuario String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Definir URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear la conexin

Para la interfaz DataSource: si crea y despliega el objeto DataSource, establezca el ID de usuario y el mecanismo de seguridad invocando los mtodos DataSource.setUser y DataSource.setSecurityMechanism despus de crear el objeto DataSource. Por ejemplo:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... com.ibm.db2.jcc.DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); // Crear objeto DB2SimpleDataSource db2ds.setDriverType(4); // Definir el tipo de controlador db2ds.setDatabaseName("san_jose"); // Definir la ubicacin db2ds.setServerName("mvs1.sj.ibm.com"); // Definir el nombre de servidor db2ds.setPortNumber(5021); // Definir el nmero de puerto db2ds.setUser("db2adm"); // Definir el ID de usuario db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY); // Establecer mecanismo seguridad // slo de ID de usuario

Seguridad de contrasea cifrada o ID de usuario cifrado y seguridad de contrasea cifrada en el controlador IBM DB2 para JDBC y SQLJ
Si utiliza seguridad de contrasea cifrada o seguridad de ID de usuario cifrado y de contrasea cifrada, es necesario que IBM Java Cryptography Extension (ibmjceprovidere.jar) est instalado en el cliente. Tambin puede utilizar los datos cifrados sensibles a la seguridad adems de la seguridad de ID de usuario cifrado o la seguridad de contrasea cifrada cuando acceda a un servidor DB2 para z/OS. Debe especificar el cifrado de los datos sensibles a la seguridad a travs del valor ENCRYPTED_USER_AND_DATA_SECURITY o

158

Desarrollo de aplicaciones Java

ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY de securityMechanism. DB2 para z/OS cifra los datos siguientes cuando se especifica el cifrado de los datos sensibles a la seguridad. v Sentencias de SQL que se preparan, ejecutan o vinculan a un paquete DB2 v Informacin de parmetros de entrada y de salida v Conjuntos de resultados v datos LOB v Resultados de operaciones de descripcin Para especificar el mecanismo de seguridad basado en un ID de usuario cifrado o contrasea cifrada para una conexin JDBC, utilice una de las tcnicas siguientes. Para la interfaz DriverManager: establezca el ID de usuario, la contrasea y el mecanismo de seguridad definiendo las propiedades user, password y securityMechanism en un objeto Properties, y luego invoque la modalidad del mtodo getConnection que hace uso del objeto Properties como parmetro. Por ejemplo, utilice un cdigo como el siguiente para establecer el mecanismo de seguridad basado en un ID de usuario y una contrasea cifrada:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new Properties(); // Crear un objeto Properties properties.put("user", "db2adm"); // Establecer ID usuario para conexin properties.put("password", "db2adm"); // Establecer contrasea para conexin properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.ENCRYPTED_PASSWORD_SECURITY + "")); // Definir mecanismo de seguridad // de ID usuario y contrasea cifrada String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Establecer URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear la conexin

Para la interfaz DataSource: si crea y despliega el objeto DataSource, puede definir el ID de usuario, contrasea y mecanismo de seguridad invocando los mtodos DataSource.setUser, DataSource.setPassword y DataSource.setSecurityMechanism despus de crear el objeto DataSource. Por ejemplo, utilice un cdigo como el siguiente para establecer el mecanismo de seguridad basado en un ID de usuario cifrado y una contrasea cifrada:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... com.ibm.db2.jcc.DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); // Crear el objeto DataSource db2ds.setDriverType(4); // Definir el tipo de controlador db2ds.setDatabaseName("san_jose"); // Definir la ubicacin db2ds.setServerName("mvs1.sj.ibm.com"); // Definir el nombre de servidor db2ds.setPortNumber(5021); // Definir el nmero de puerto db2ds.setUser("db2adm"); // Definir el ID de usuario db2ds.setPassword("db2adm"); // Definir la contrasea db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.ENCRYPTED_PASSWORD_SECURITY); // Definir mecanismo de seguridad // de ID usuario y contrasea cifrada

Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33
Captulo 4. Seguridad en JDBC y SQLJ

159

v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 v Creacin y despliegue de objetos DataSource en la pgina 37 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Seguridad Kerberos en el controlador IBM DB2 para JDBC y SQLJ


El soporte de JDBC para la seguridad Kerberos slo est disponible para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. Para habilitar el soporte de JDBC para la seguridad Kerberos, tambin necesita habilitar los componentes siguientes del kit de desarrollo de software (SDK) para Java: v Java Cryptography Extension v JGSS (servicio de seguridad genrica de Java) v JAAS (servicio de autenticacin y autorizacin de Java) Consulte la documentacin de SDK para Java si desea informacin sobre cmo habilitar estos componentes. Existen tres formas de especificar la seguridad Kerberos para una conexin: v Con un ID de usuario y contrasea v Sin un ID de usuario ni contrasea v Con una credencial delegada Utilizacin de la seguridad Kerberos con un ID de usuario y contrasea: Para este caso, Kerberos utiliza el ID de usuario y la contrasea especificados para obtener un TGT (certificado de otorgamiento de certificados) que permite autentificarse ante el servidor DB2. Es necesario que defina las propiedades user, password, kerberosServerPrincipal y securityMechanism. La propiedad kerberosServerPrincipal especifica el nombre principal que el servidor DB2 registra con un Centro de distribucin de claves (KCD) de Kerberos. Para la interfaz DriverManager: establezca el ID de usuario, la contrasea, el servidor Kerberos y el mecanismo de seguridad definiendo las propiedades user, password, kerberosServerPrincipal y securityMechanism en un objeto Properties, y luego invoque la modalidad del mtodo getConnection que hace uso del objeto Properties como parmetro. Por ejemplo, utilice un cdigo como el siguiente para establecer el mecanismo de seguridad Kerberos con un ID de usuario y contrasea:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new Properties(); // Crear un objeto Properties properties.put("user", "db2adm"); // Establecer ID de usuario para conexin properties.put("password", "db2adm"); // Establecer contrasea para conexin properties.put("kerberosServerPrincipal", "sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY + "")); // Establecer mecanismo de seguridad en // Kerberos

160

Desarrollo de aplicaciones Java

String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Establecer URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear la conexin

Para la interfaz DataSource: si crea y despliega el objeto DataSource, establezca el servidor Kerberos y el mecanismo de seguridad invocando los mtodos DataSource.setKerberosServerPrincipal y DataSource.setSecurityMechanism despus de crear el objeto DataSource. Por ejemplo:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... com.ibm.db2.jcc.DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); // Crear el objeto DataSource db2ds.setDriverType(4); // Establecer tipo de controlador db2ds.setDatabaseName("san_jose"); // Establecer ubicacin db2ds.setUser("db2adm"); // Establecer usuario db2ds.setPassword("db2adm"); // Establecer contrasea db2ds.setServerName("mvs1.sj.ibm.com"); // Establecer nombre de servidor db2ds.setPortNumber(5021); // Establecer nmero de puerto db2ds.setKerberosServerPrincipal("sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY); // Establecer mecanismo de seguridad en // Kerberos

Utilizacin de la seguridad Kerberos sin un ID de usuario ni contrasea: Para este caso, la antememoria de credenciales por omisin de Kerberos debe contener un TGT (certificado de otorgamiento de certificados) que permita autentificarse ante el servidor DB2. Es necesario establecer las propiedades kerberosServerPrincipal y securityMechanism. Para la interfaz DriverManager: Defina el servidor Kerberos y el mecanismo de seguridad estableciendo las propiedades kerberosServerPrincipal y securityMechanism en un objeto Properties, e invocando a continuacin el formato del mtodo getConnection que incluye el objeto Properties como parmetro. Por ejemplo, utilice un cdigo como el siguiente para establecer el mecanismo de seguridad Kerberos sin un ID de usuario ni contrasea:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new Properties(); // Crear un objeto Properties properties.put("kerberosServerPrincipal", sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY + "")); // Establecer mecanismo de seguridad en // Kerberos String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Establecer URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear la conexin

Para la interfaz DataSource: si crea y despliega el objeto DataSource, establezca el servidor Kerberos y el mecanismo de seguridad invocando los mtodos
Captulo 4. Seguridad en JDBC y SQLJ

161

DataSource.setKerberosServerPrincipal y DataSource.setSecurityMechanism despus de crear el objeto DataSource. Por ejemplo:


import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); // Crear el objeto DataSource db2ds.setDriverType(4); // Establecer tipo de controlador db2ds.setDatabaseName("san_jose"); // Establecer ubicacin db2ds.setServerName("mvs1.sj.ibm.com"); // Establecer nombre de servidor db2ds.setPortNumber(5021); // Establecer nmero de puerto db2ds.setKerberosServerPrincipal("sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY); // Establecer mecanismo de seguridad en // Kerberos

Utilizacin de la seguridad Kerberos con una credencial delegada procedente de otro principal: Para este caso, se autentifica ante el servidor DB2 mediante una credencial delegada que le pasa otro principal. Es necesario establecer las propiedades kerberosServerPrincipal, gssCredential , y securityMechanism. Para la interfaz DriverManager: Defina el servidor Kerberos, la credencial delegada y el mecanismo de seguridad estableciendo las propiedades kerberosServerPrincipal y securityMechanism en un objeto Properties. A continuacin, invoque el formato del mtodo getConnection que incluye el objeto Properties como parmetro. Por ejemplo, utilice un cdigo como el siguiente para establecer el mecanismo de seguridad Kerberos sin un ID de usuario ni contrasea:
import java.sql.*; // Base JDBC import com.ibm.db2.jcc.*; // Implementacin de DB2 de JDBC ... Properties properties = new Properties(); // Crear un objeto Properties properties.put("kerberosServerPrincipal", sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos properties.put("gssCredential",delegatedCredential); // Establecer credencial delegada properties.put("securityMechanism", new String("" + com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY + "")); // Establecer mecanismo de seguridad en // Kerberos String url = "jdbc:db2://mvs1.sj.ibm.com:5021/san_jose"; // Establecer URL para fuente de datos Connection con = DriverManager.getConnection(url, properties); // Crear la conexin

Para la interfaz DataSource: Si crea y despliega el objeto DataSource, defina el servidor Kerberos, la credencial delegada y el mecanismo de seguridad invocando los parmetros DataSource.setKerberosServerPrincipal, DataSource.setGssCredential y DataSource.setSecurityMechanism despus de crear el objeto DataSource. Por ejemplo:
DB2SimpleDataSource db2ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); // Crear el objeto DataSource db2ds.setDriverType(4); // Establecer tipo de controlador

162

Desarrollo de aplicaciones Java

db2ds.setDatabaseName("san_jose"); // Establecer ubicacin db2ds.setServerName("mvs1.sj.ibm.com"); // Establecer nombre de servidor db2ds.setPortNumber(5021); // Establecer nmero de puerto db2ds.setKerberosServerPrincipal("sample/srvlsj.ibm.com@SRVLSJ.SJ.IBM.COM"); // Establecer servidor Kerberos db2ds.setGssCredential(delegatedCredential); // Establecer credencial delegada db2ds.setSecurityMechanism( com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY); // Establecer mecanismo de seguridad en // Kerberos

Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 v Creacin y despliegue de objetos DataSource en la pgina 37 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Soporte de plugin de seguridad del Controlador IBM DB2 para JDBC y SQLJ
Puede crear mecanismos de autentificacin propios en forma de bibliotecas de carga o plugins que DB2 Database para Linux, UNIX y Windows carga para llevar a cabo la autentificacin del usuario. Para soportar el desarrollo de plugins de seguridad en Java, el Controlador IBM DB2 para JDBC y SQLJ proporciona soporte de plugin de seguridad. Este soporte se encuentra disponible para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 con servidores DB2 Database para Linux, UNIX y Windows solamente. Para utilizar la seguridad del plugin, es necesario disponer de un plugin de seguridad en el cliente y otro en el servidor de la base de datos. Los plugins de seguridad deben incluir los elementos siguientes: v Una clase que ample la clase abstracta com.ibm.db2.jcc.DB2JCCPlugin. La clase abstracta com.ibm.db2.jcc.DB2JCCPlugin se proporciona con el Controlador IBM DB2 para JDBC y SQLJ. v En la clase com.ibm.db2.jcc.DB2JCCPlugin, un mtodo com.ibm.db2.jcc.DB2JCCPlugin.getTicket Este mtodo recupera un certificado Kerberos para un usuario y devuelve informacin de contexto de seguridad en una matriz de bytes. El Controlador IBM DB2 para JDBC y SQLJ utiliza la informacin de matriz para acceder al servidor de bases de datos DB2. v Implementaciones de varios mtodos que se definen en las interfaces org.ietf.jgss.GSSContext y org.ietf.jgss.GSSCredential Estas implementaciones de mtodos deben seguir las especificaciones siguientes: Generic Security Service Application Program Interface, Versin 2 (IETF RFC2743) y Generic Security Service API Versin 2: Java-Bindings (IETF RFC2853). El plugin debe implementar y llamar a los mtodos siguientes:

Captulo 4. Seguridad en JDBC y SQLJ

163

GSSContext.dispose Libera cualquier informacin criptogrfica y de recursos del sistema que se almacena en un objeto de contexto e invalida el contexto. GSSContext.getCredDelegState Determina si se habilita la delegacin de credenciales en un contexto. GSSContext.getMutualAuthState Determina si se habilita la autentificacin mutua en el contexto. GSSContext.initSecContext Inicia la fase de creacin del contexto y procesa todos los smbolos que se generan mediante el mtodo acceptSecContext de la entidad homloga. GSSContext.requestCredDeleg Solicita que las credenciales del iniciador se deleguen a la persona que acepte la credencial cuando se establezca una conexin. GSSContext.requestMutualAuth Solicita la autentificacin mutua cuando se establece un contexto. GSSCredential.dispose Libera toda la informacin confidencial que contiene el objeto GSSCredential. En sqllib/samples/java/jdbc, se proporcionan dos ejemplos de plugin de Java para ayudar al usuario a crear plugins de seguridad de Java: JCCSimpleGSSPlugin.java Implementacin de un plugin GSS-API para el servidor de bases de datos, el cual realiza la comprobacin de la contrasea y del ID de usuario. Este ejemplo es una versin Java de un ejemplo del programa en lenguaje C program gssapi_simple.c. JCCKerberosPlugin.java Plugin de seguridad de Kerberos para el cliente. Este ejemplo es una versin Java de un ejemplo del programa en lenguaje C IBMkrb5.c. Cuando un programa de aplicacin obtiene una conexin mediante la seguridad de plugin JDBC, deber establecer las propiedades Connection y DataSource siguientes:
Tabla 21. Configuracin de la propiedad Connection o DataSource para utilizar plugins de seguridad de Java Propiedad com.ibm.db2.jcc.DB2BaseDataSource.user com.ibm.db2.jcc.DB2BaseDataSource.password com.ibm.db2.jcc.DB2BaseDataSource.securityMechanism com.ibm.db2.jcc.DB2BaseDataSource.pluginName com.ibm.db2.jcc.DB2BaseDataSource.plugin Valor ID de usuario utilizado para obtener la conexin. Contrasea para el ID de usuario. com.ibm.db2.jcc.DB2BaseDataSource.PLUGIN_SECURITY Nombre del mdulo de plugin para un plugin de seguridad de servidor. Objeto del plugin para un plugin de seguridad del servidor

Ejemplo: mediante los cdigos siguientes se establecen las propiedades para un conexin que utiliza la seguridad de plugin GSS-API. La conexin utiliza el plugin JCCSimpleGSSPlugin de ejemplo en el cliente y el plugin gssapi_simple de ejemplo en el servidor.

164

Desarrollo de aplicaciones Java

java.util.Properties properties = new java.util.Properties(); properties.put("user", "db2admin"); properties.put("password", "admindb2"); properties.put("pluginName", "gssapi_simple"); properties.put("securityMechanism", new String(""+com.ibm.db2.jcc.DB2BaseDataSource.PLUGIN_SECURITY+"")); com.ibm.db2.jcc.DB2JCCPlugin plugin = new com.ibm.db2.jcc.samples.plugins.JCCSimpleGSSplugin(); properties.put("plugin", plugin); Connection con = java.sql.DriverManager.getConnection(url, properties);

Conceptos relacionados: v Kerberos authentication details en Administration Guide: Implementation v Conectores de seguridad en Consulta de las API administrativas Informacin relacionada: v Clase DB2JCCPlugin en la pgina 343 v Ejemplos de plugins de Java en la pgina 191

Controlador IBM DB2 para soporte de contexto fiable de JDBC y SQLJ


Un modelo de aplicacin de tres niveles consta de un servidor de bases de datos, un servidor de middleware como, por ejemplo, WebSphere Application Server y usuarios finales. Con este modelo, el servidor de middleware tiene la funcin de acceder al servidor de bases de datos en nombre de los usuarios finales. El soporte de contexto fiable garantiza la utilizacin de los privilegios de base de datos y de la identidad de base de datos del usuario final cuando se servidor de middleware realiza peticiones de base de datos en nombre del usuario final. Un contexto fiable es un objeto que el administrador de la base de datos define y que contiene un ID de autorizacin del sistema y un conjunto de atributos de confianza. Actualmente, en el caso de los servidores de bases de datos de DB2, la conexin de base de datos es el nico tipo de contexto compatible. Los atributos de confianza identifican un conjunto de caractersticas de una conexin que son necesarias para que la conexin se considere fiable. La relacin entre una conexin de base de datos y un contexto fiable se establece cuando se crea por primera vez la conexin con el servidor de bases de datos. Dicha relacin es permanente durante todo el tiempo que dure la conexin de la base de datos. Una vez que se haya definido un contexto fiable y que se haya establecido una conexin fiable inicial con el servidor de bases de datos de DB2, el servidor de middleware puede utilizar dicha conexin de base de datos como un usuario diferente sin tener que volver a autentificar el usuario nuevo en el servidor de bases de datos. El Controlador IBM DB2 para JDBC y SQLJ proporciona mtodos que permiten establecer y utilizar conexiones fiables en programas Java. Para evitar que un servidor de aplicaciones que utilice estos mtodos de fiables sea vulnerable a violaciones de seguridad, no debe utilizar mtodos de conexin no fiables. La clase DB2ConnectionPoolDataSource proporciona varias versiones del mtodo getDB2TrustedPooledConnection y la clase DB2XADataSource proporciona varias versiones del mtodo getDB2XAConnection. Dichas versiones permiten a un
Captulo 4. Seguridad en JDBC y SQLJ

165

servidor de aplicaciones establecer una conexin inicial fiable. Puede seleccionar un mtodo basado en los tipos de propiedades de conexin que se pasan y si se va a utilizar la seguridad Kerberos. Cuando un servidor de aplicaciones llama a uno de estos mtodos, el Controlador IBM DB2 para JDBC y SQLJ devuelve una matriz de objetos Object[] con dos elementos: v El primer elemento contiene una instancia de conexin para la conexin inicial. v El segundo elemento contiene una sola cookie para la instancia de conexin. El controlador JDBC genera la cookie y la utiliza para la autentificacin durante la reutilizacin posterior de la conexin. La clase DB2PooledConnection proporciona varias versiones del mtodo getDB2Connection y la clase DB2Connection proporciona varias versiones del mtodo reuseDB2Connection. Ello permite que un servidor de aplicaciones pueda reutilizar una conexin fiable existente en nombre de un usuario nuevo. El servidor de aplicaciones utiliza el mtodo para pasar los elementos siguientes al usuario nuevo: v La cookie de la conexin inicial v Las propiedades de conexin nuevas de la conexin reutilizadas El controlador JDBC comprueba que la cookie proporcionada coincide con la cookie de la conexin fsica fiable subyacente con el fin de garantizar que la peticin de conexin provienen del servidor de aplicaciones que ha establecido la conexin fsica fiable. Si la cookie coincide, el usuario nuevo podr utilizar la conexin con las nuevas propiedades. Ejemplo: obtencin de la conexin fiable inicial:
// Crear una instancia DB2ConnectionPoolDataSource com.ibm.db2.jcc.DB2ConnectionPoolDataSource dataSource = new com.ibm.db2.jcc.DB2ConnectionPoolDataSource(); // Definir propiedades para esta instancia dataSource.setDatabaseName ("STLEC1"); dataSource.setServerName ("v7ec167.svl.ibm.com"); dataSource.setDriverType (4); dataSource.setPortNumber(446); java.util.Properties properties = new java.util.Properties(); // Definir otras propiedades mediante // properties.put("propiedad", " valor"); // Suministrar ID de usuario y contrasea para la conexin String user = "user"; String password = "password"; // Llamar a getDB2TrustedPooledConnection para conseguir una // instancia de conexin fiable y la cookie para la conexin Object[] objects = dataSource.getDB2TrustedPooledConnection( user,password, properties);

Ejemplo: Reutilizacin de una conexin fiable existente:


// El primer elemento que se ha obtenido de la llamada getTrustedPooledConnection // anterior es un objeto de conexin. Convertir en un objeto PooledConnection. javax.sql.PooledConnection pooledCon = (javax.sql.PooledConnection)objects[0]; properties = new java.util.Properties(); // Definir propiedades nuevas para el objeto reutilizado mediante // properties.put("propiedad", "valor"); // El segundo elemento que se ha obtenido de la llamada getTrustedPooledConnection // es la cookie de la conexin. Convertirla en una matriz de bytes. byte[] cookie = ((byte[])(objects[1]); // Suministrar el ID de usuario para la conexin nueva. String newuser = "newuser"; // Suministrar el nombre de un servicio de correlacin que correlacione // el ID de usuario de estacin de una estacin de trabajo

166

Desarrollo de aplicaciones Java

// con un ID de z/OS RACF String userRegistry = "registry"; // No suministrar ningn dato de smbolo de seguridad que deba rastrearse. byte[] userSecTkn = null; // No suministrar ningn ID de usuario anterior. String originalUser = null; // Llamar a getDB2Connection para obtener un objeto de conexin para el // usuario nuevo. java.sql.Connection con = ((com.ibm.db2.jcc.DB2PooledConnection)pooledCon).getDB2Connection( cookie,newuser,password,userRegistry,userSecTkn,originalUser,properties);

Informacin relacionada: v Clase DB2PooledConnection en la pgina 343 v Clase DB2XADataSource en la pgina 353 v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249 v Interfaz DB2Connection en la pgina 326 v Clase DB2ConnectionPoolDataSource en la pgina 339

Seguridad para la preparacin de aplicaciones SQLJ con el controlador IBM DB2 para JDBC y SQLJ
Este tema contiene informacin sobre los siguientes aspectos de la seguridad en SQLJ: v Permitir a los usuarios slo la personalizacin v Limitar el acceso a un conjunto especfico de tablas durante la personalizacin Permitir a los usuarios slo la personalizacin: Puede utilizar una de las tcnicas siguientes para permitir a un conjunto de usuarios personalizar las aplicaciones SQLJ, pero no vincular ni ejecutar esas aplicaciones: v Cree un sistema DB2 para la personalizacin solamente (solucin recomendada): Siga estos pasos: 1. Cree una nueva instancia del gestor de bases de datos. ste es el sistema de slo personalizacin. 2. En el sistema de slo personalizacin, defina todas las tablas y vistas a las que acceden las aplicaciones SQLJ. Las definiciones de tabla o de vista deben ser iguales que en la instancia del gestor de bases de datos donde la aplicacin se vincular y se ejecutar (sistema de vinculacin y ejecucin). La ejecucin de la sentencia DESCRIBE en las tablas o vistas debe dar los mismos resultados en el sistema de slo personalizacin y en el sistema de vinculacin y ejecucin. 3. En el sistema de slo personalizacin, otorgue los privilegios necesarios de vista o tabla a los usuarios que personalizarn las aplicaciones SQLJ. 4. En el sistema de slo personalizacin, los usuarios ejecutan el mandato sqlj con la opcin -compile=true para crear perfiles serializados y cdigos de bytes de Java para sus programas. A continuacin ejecutan el mandato db2sqljcustomize con la opcin -automaticbind NO para crear los perfiles serializados personalizados. 5. Copie los perfiles serializados personalizados y los archivos de cdigo de bytes de java en el sistema de vinculacin y ejecucin.

Captulo 4. Seguridad en JDBC y SQLJ

167

6. Un usuario con autorizacin para vincular paquetes en el sistema de vinculacin y ejecucin ejecuta el mandato db2sqljbind en los perfiles serializados personalizados que se han copiado desde el sistema de slo personalizacin. v Utilice un procedimiento almacenado para la personalizacin: Grabe un procedimiento almacenado de Java que personalice los perfiles serializados y vincule paquetes para las aplicaciones SQLJ en beneficio del usuario final. Este procedimiento almacenado de Java necesita el uso de un paquete del controlador JDBC que se ha vinculado con una de las opciones DYNAMICRULES que provoca la ejecucin de SQL dinmico bajo un ID de usuario diferente desde el ID de autorizacin del usuario final. Por ejemplo, puede utilizar la opcin DYNAMICRULES con DEFINEBIND o DEFINERUN para ejecutar SQL dinmico bajo el ID de autorizacin del creador del procedimiento almacenado de Java. Debe otorgar la autorizacin EXECUTE en el procedimiento almacenado a los usuarios que necesiten realizar la personalizacin de SQLJ. El procedimiento almacenado hace lo siguiente: 1. Recibe el programa SQLJ compilado y los perfiles serializados en los parmetros de entrada BLOB 2. Copia los parmetros de entrada en su sistema de archivos 3. Ejecuta db2sqljcustomize para personalizar los perfiles serializados y vincular los paquetes para el programa SQLJ 4. Devuelve los perfiles serializados personalizados en los parmetros de salida v Utilice un programa autnomo para la personalizacin: Esta tcnica implica la grabacin de un programa que ejecuta los mismos pasos que un procedimiento almacenado de Java, que personaliza los perfiles serializados y vincula paquetes para las aplicaciones SQLJ en beneficio del usuario final. Sin embargo, en lugar de ejecutar el programa como procedimiento almacenado, ejecuta el programa como autnomo, bajo un servidor de bibliotecas. Restriccin del acceso a las tablas durante la personalizacin: Cuando personalice perfiles serializados, debe efectuar comprobaciones en lnea, para proporcionar al programa de aplicacin informacin sobre los tipos de datos y longitudes de las columnas de las tablas a las que accede el programa. Por omisin, la personalizacin incluye la comprobacin en lnea. La comprobacin en lnea requiere que el usuario que personaliza un perfil serializado tenga autorizacin para ejecutar sentencias PREPARE y DESCRIBE con sentencias de SQL en el programa SQLJ. Esa autorizacin incluye el privilegio SELECT en las tablas y vistas a las que acceden las sentencias de SQL. Si las sentencias de SQL contienen nombres de tablas sin calificar, el calificador que se utiliza durante la comprobacin en lnea es el valor del parmetro db2sqljcustomize -qualifier. Por consiguiente, para la comprobacin en lnea de tablas y vistas con nombres sin calificar en una aplicacin SQLJ, slo puede otorgar el privilegio SELECT en las tablas y vistas con un calificador que coincida con el valor del parmetro -qualifier. Informacin relacionada: v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385 v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375

168

Desarrollo de aplicaciones Java

Captulo 5. Creacin de aplicaciones de bases de datos Java


Los siguientes temas contienen informacin sobre la creacin de aplicaciones JDBC y SQLJ. v Creacin de applets JDBC v Creacin de aplicaciones JDBC en la pgina 170 v Creacin de rutinas JDBC en la pgina 171 v Creacin de applets SQLJ en la pgina 173 v Creacin de aplicaciones SQLJ en la pgina 174 v Consideraciones sobre los applets Java en la pgina 175 v Opciones de aplicaciones y applets SQLJ para UNIX en la pgina 176 v Opciones de aplicaciones y applets SQLJ para Windows en la pgina 177 v Creacin de rutinas SQLJ en la pgina 177 v Opciones de rutinas SQLJ para UNIX en la pgina 179 v Opciones de rutinas SQLJ para Windows en la pgina 180

Creacin de applets JDBC


Applt muestra el uso de un applet Java de SQL dinmico para acceder a un servidor de bases de datos DB2. Procedimiento: Para crear y ejecutar el applet JDBC, Applt, mediante mandatos entrados en la lnea de mandatos, asegrese de tener un servidor Web instalado y en ejecucin en su base de datos DB2 (servidor o cliente), o utilice el visor de applets incluido con el kit de desarrollo de software para Java entrando el mandato siguiente desde el directorio de trabajo de la mquina cliente:
appletviewer Applt.html

Conexin con el Controlador IBM DB2 para JDBC y SQLJ: Para conectar con el Controlador IBM DB2 para JDBC y SQLJ, modifique el archivo Applt.html segn las instrucciones contenidas en el mismo. Como nmero de puerto TCP/IP, puede utilizar el nmero de puerto de la base de datos, 50000. Creacin del applet: 1. Compile Applt.java para obtener el archivo Applt.class mediante este mandato:
javac Applt.java

Puede tambin utilizar el makefile de Java para crear este programa. 2. Compruebe que su navegador Web puede acceder a su directorio de trabajo. Si el directorio no es accesible, copie Applt.class y Applt.html en un directorio que sea accesible. 3. Copie sqllib\java\db2jcc.jar en Windows o sqllib/java/db2jcc.jar en UNIX, en el mismo directorio que Applt.class y Applt.html . 4. En la mquina cliente, inicie el navegador Web y cargue Applt.html. Conceptos relacionados: v Consideraciones sobre los applets Java en la pgina 175
Copyright IBM Corp. 2006

169

Tareas relacionadas: v Creacin de aplicaciones JDBC en la pgina 170 v Creacin de rutinas JDBC en la pgina 171 v Creacin de applets SQLJ en la pgina 173 Informacin relacionada: v Ejemplos de JDBC en la pgina 181 Ejemplos relacionados: v Applt.java -- A Java applet that use JDBC applet driver to access a database (JDBC)

Creacin de aplicaciones JDBC


DbInfo muestra una aplicacin Java de SQL dinmico que accede a un servidor de bases de datos DB2. Procedimiento: Para crear y ejecutar esta aplicacin mediante mandatos entrados en la lnea de mandatos: 1. Compile DbInfo.java para obtener el archivo DbInfo.class mediante este mandato:
javac DbInfo.java

2. Ejecute el intrprete de Java en la aplicacin con este mandato:


java DbInfo

Tambin puede utilizar el makefile de Java para crear este programa. Si est ejecutando una aplicacin Java en UNIX en una instancia de DB2 de 64 bits, pero el kit de desarrollo de software de Java es de 32 bits, deber cambiar la va de acceso de la biblioteca de DB2 antes de ejecutar la aplicacin. Por ejemplo, en AIX: v En el shell bash o Korn:
export LIBPATH=$HOME/sqllib/lib32

v En el shell C:
setenv LIBPATH $HOME/sqllib/lib32

Tareas relacionadas: v Creacin de applets JDBC en la pgina 169 v Creacin de rutinas JDBC en la pgina 171 v Creacin de aplicaciones SQLJ en la pgina 174 Informacin relacionada: v Ejemplos de JDBC en la pgina 181 Ejemplos relacionados: v DbInfo.java -- How to get/set info in a database (JDBC)

170

Desarrollo de aplicaciones Java

Creacin de rutinas JDBC


DB2 proporciona programas de ejemplo para mostrar el uso de rutinas JDBC (procedimientos almacenados y funciones definidas por el usuario) contenidas en el directorio samples/java/jdbc (para UNIX) o en el directorio samples\java\jdbc (para Windows). Las rutinas se compilan y almacenan en un servidor. Cuando una aplicacin cliente llama a una rutina, sta accede al servidor de bases de datos y devuelve datos a la aplicacin cliente. Procedimiento: Los ejemplos siguientes muestran cmo crear rutinas, las cuales pueden ser: v procedimientos almacenados v funciones definidas por el usuario sin sentencias de SQL v funciones definidas por el usuario con sentencias de SQL Procedimientos almacenados SpServer muestra procedimientos almacenados PARAMETER STYLE JAVA de SQL dinmico. Para crear y ejecutar este programa desde la lnea de mandatos del servidor: 1. Compile SpServer.java para obtener el archivo SpServer.class, mediante este mandato:
javac SpServer.java

2. Copie SpServer.class en el directorio sqllib\function (en sistemas operativos Windows) o en el directorio sqllib/function (en UNIX). 3. A continuacin, catalogue las rutinas ejecutando el script spcat en el servidor. Escriba:
spcat

Este script conecta con la base de datos sample, descataloga mediante SpDrop.db2 las rutinas que se hubieran catalogado previamente, luego las cataloga llamando a SpCreate.db2, y finalmente desconecta de la base de datos. Tambin puede ejecutar los scripts SpDrop.db2 y SpCreate.db2 por separado. 4. A continuacin, detenga y rearranque la base de datos para que se reconozca el nuevo archivo de clase. Si es necesario, defina la modalidad de archivo del archivo de clase como read para que pueda ser ledo por el usuario. 5. Compile y ejecute la aplicacin cliente SpClient para acceder a la clase del procedimiento almacenado. Funciones definidas por el usuario sin sentencias de SQL UDFsrv es una biblioteca de funciones definidas por el usuario que no contiene sentencias de SQL. DB2 proporciona una aplicacin cliente JDBC, UDFcli, y una aplicacin cliente SQLJ, UDFcli, que pueden acceder a la biblioteca UDFsrv. Para crear y ejecutar el programa UDF desde la lnea de mandatos del servidor: 1. Compile UDFsrv.java para obtener el archivo UDFsrv.class, mediante este mandato:
javac UDFsrv.java

Captulo 5. Creacin de aplicaciones de bases de datos Java

171

2. Copie UDFsrv.class en el directorio sqllib\function (en sistemas operativos Windows) o en el directorio sqllib/function (en UNIX). 3. Para acceder a la biblioteca UDFsrv, puede utilizar aplicaciones cliente JDBC o SQLJ. Ambas versiones del programa cliente contienen la sentencia de SQL CREATE FUNCTION, que puede utilizar para registrar en la base de datos las UDF (funciones definidas por el usuario) contenidas en UDFsrv. Los programas cliente tambin contienen sentencias de SQL que hacen uso de las UDF, una vez que stas se han registrado. Funciones definidas por el usuario con sentencias de SQL UDFsqlsv es una biblioteca de funciones definidas por el usuario que contiene sentencias de SQL. DB2 proporciona una aplicacin cliente JDBC, UDFsqlcl, para acceder a la biblioteca UDFsqlsv. Para crear y ejecutar el programa UDF desde la lnea de mandatos del servidor: 1. Compile UDFsqlsv.java para obtener el archivo UDFsqlsv.class, mediante este mandato:
javac UDFsqlsv.java

2. Copie UDFsqlsv.class en el directorio sqllib\function (en sistemas operativos Windows) o en el directorio sqllib/function (en UNIX). 3. Para acceder a la biblioteca UDFsqlsv, utilice el programa cliente, UDFsqlcl, el cual contiene la sentencia de SQL CREATE FUNCTION, que puede utilizar para registrar en la base de datos las UDF (funciones definidas por el usuario) contenidas en UDFsqlsv. El programa cliente tambin contiene sentencias de SQL que hacen uso de las UDF, una vez que stas se han registrado. Puede tambin utilizar el makefile de Java para crear los programas anteriores. Tareas relacionadas: v Creacin de applets JDBC en la pgina 169 v Creacin de aplicaciones JDBC en la pgina 170 v Creacin de rutinas SQLJ en la pgina 177 Informacin relacionada: v Ejemplos de JDBC en la pgina 181 Ejemplos relacionados: v spcat -- To catalog SQLj stored procedures on UNIX v SpClient.java -- Call a variety of types of stored procedures from SpServer.java (JDBC) v SpCreate.db2 -- How to catalog the stored procedures contained in SpServer.java v SpDrop.db2 -- How to uncatalog the stored procedures contained in SpServer.java v SpServer.java -- Provide a variety of types of stored procedures to be called from (JDBC) v UDFcli.java -- Call the UDFs in UDFsrv.java (JDBC) v UDFCreate.db2 -- How to catalog the Java UDFs contained in UDFsrv.java v UDFDrop.db2 -- How to uncatalog the Java UDFs contained in UDFsrv.java v UDFsCreate.db2 -- How to catalog the UDFs contained in UDFsqlsv.java

172

Desarrollo de aplicaciones Java

v v v v

UDFsDrop.db2 -- How to uncatalog the UDFs contained in UDFsqlsv.java UDFsqlcl.java -- Call the UDFs in UDFsqlsv.java (JDBC) UDFsqlsv.java -- Provide UDFs to be called by UDFsqlcl.java (JDBC) UDFsrv.java -- Provide UDFs to be called by UDFcli.java (JDBC)

Creacin de applets SQLJ


Los pasos siguientes describen cmo crear el programa de ejemplo Applt que muestra el uso de un applet SQLJ para acceder a una base de datos DB2. Estos pasos utilizan el archivo de creacin bldsqlj (UNIX), o bldsqlj.bat (Windows), el cual contiene mandatos para crear un applet o aplicacin SQLJ. El archivo de creacin utiliza como entrada un mximo de seis parmetros: $1, $2, $3, $4, $5 y $6 en UNIX y %1, %2, %3, %4, %5 y %6 en Windows. El primer parmetro especifica el nombre del programa. El segundo parmetro especifica el ID de usuario correspondiente a la instancia de base de datos; el tercer parmetro especifica la contrasea. El cuarto parmetro especifica el nombre del servidor. El quinto parmetro especifica el nmero de puerto. Finalmente, el sexto parmetro especifica el nombre de la base de datos. Se pueden utilizar valores por omisin para todos los parmetros, excepto para el primero, el nombre del programa. Consulte el archivo de creacin para conocer detalles sobre la utilizacin de valores de parmetro por omisin. Procedimiento: Para ejecutar este applet, asegrese de tener un servidor Web instalado y en ejecucin en su mquina DB2 (servidor o cliente), o utilice el visor de applets incluido con el kit de desarrollo de Java entrando el mandato siguiente desde el directorio de trabajo de la mquina cliente:
appletviewer Applt.html

Conexin con el controlador IBM DB2 para JDBC y SQLJ Para conectar mediante el Controlador IBM DB2 para JDBC y SQLJ, modifique el archivo Applt.html segn las instrucciones contenidas en el mismo. Como nmero de puerto TCP/IP debe utilizar el nmero de puerto de la base de datos, 50000. Creacin del applet 1. Cree el applet, utilizando este mandato:
bldsqlj Applt <IDusuario> <ctrsa> <nomb_servidor> <nm_puerto> <nomb_bd>

donde todos los parmetros, salvo el nombre del programa, pueden utilizar valores por omisin, tal como se explica en el archivo de creacin. 2. Compruebe que su navegador Web o visor de applets Java (si lo utiliza) pueda acceder a su directorio de trabajo. Si su directorio no es accesible, copie los archivos siguientes en un directorio que sea accesible: v Applt.html v Applt.class v Applt_Cursor1.class v Applt_Cursor2.class v Applt_SJProfileKeys.class v Applt_SJProfile0.ser

Captulo 5. Creacin de aplicaciones de bases de datos Java

173

3. Copie sqllib\java\db2jcc.jar en Windows o sqllib/java/db2jcc.jar en UNIX, en el mismo directorio que Applt.class y Applt.html. 4. En la mquina cliente, inicie el navegador Web o visor de applets Java y cargue Applt.html. Tambin puede utilizar el makefile de Java para crear este programa. Conceptos relacionados: v Consideraciones sobre los applets Java en la pgina 175 Tareas relacionadas: v Creacin de applets JDBC en la pgina 169 v Creacin de aplicaciones SQLJ en la pgina 174 v Creacin de rutinas SQLJ en la pgina 177 Informacin relacionada: v Opciones de aplicaciones y applets SQLJ para UNIX en la pgina 176 v Opciones de aplicaciones y applets SQLJ para Windows en la pgina 177 v Ejemplos de SQLJ en la pgina 187 Ejemplos relacionados: v bldsqlj.bat -- Builds a Java embedded SQL (SQLJ) application or applet on Windows v Applt.sqlj -- An SQLJ applet that uses a JDBC applet driver to access a database (SQLj) v bldsqlj -- Builds Java embedded SQL (SQLJ) applications and applets on UNIX

Creacin de aplicaciones SQLJ


Los pasos siguientes describen cmo crear el programa de ejemplo TbMod que muestra el uso de una aplicacin SQLJ para acceder a una base de datos DB2. Estos pasos utilizan el archivo de creacin bldsqlj (UNIX), o bldsqlj.bat (Windows), el cual contiene mandatos para crear un applet o aplicacin SQLJ. El archivo de creacin utiliza como entrada un mximo de seis parmetros: $1, $2, $3, $4, $5 y $6 en UNIX y %1, %2, %3, %4, %5 y %6 en Windows. El primer parmetro especifica el nombre del programa. El segundo parmetro especifica el ID de usuario correspondiente a la instancia de base de datos; el tercer parmetro especifica la contrasea. El cuarto parmetro especifica el nombre del servidor. El quinto parmetro especifica el nmero de puerto. Finalmente, el sexto parmetro especifica el nombre de la base de datos. Se pueden utilizar valores por omisin para todos los parmetros, excepto para el primero, el nombre del programa. Consulte el archivo de creacin para conocer detalles sobre la utilizacin de valores de parmetro por omisin. Procedimiento: Para crear TbMod mediante el archivo de creacin bldsqlj (UNIX) o bldsqlj.bat (Windows), entre este mandato:
bldsqlj TbMod <IDusuario> <ctrsa> <nomb_servidor> <nm_puerto> <nomb_bd>

174

Desarrollo de aplicaciones Java

donde todos los parmetros, salvo el nombre del programa, pueden utilizar valores por omisin, tal como se explica en el archivo de creacin. Ejecute el intrprete de Java en la aplicacin con este mandato:
java TbMod

Tambin puede utilizar el makefile de Java para crear este programa. Si est ejecutando una aplicacin Java en UNIX en una instancia de DB2 de 64 bits, pero el kit de desarrollo de software de Java es de de 32 bits, deber cambiar la va de acceso de la biblioteca de DB2 antes de ejecutar la aplicacin. Por ejemplo, en AIX: v En el shell bash o Korn:
export LIBPATH=$HOME/sqllib/lib32

v En el shell C:
setenv LIBPATH $HOME/sqllib/lib32

Tareas relacionadas: v Creacin de aplicaciones JDBC en la pgina 170 v Creacin de applets SQLJ en la pgina 173 v Creacin de rutinas SQLJ en la pgina 177 Informacin relacionada: v Opciones de aplicaciones y applets SQLJ para UNIX en la pgina 176 v Opciones de aplicaciones y applets SQLJ para Windows en la pgina 177 v Ejemplos de SQLJ en la pgina 187 Ejemplos relacionados: v bldsqlj.bat -- Builds a Java embedded SQL (SQLJ) application or applet on Windows v TbMod.sqlj -- How to modify table data (SQLj) v bldsqlj -- Builds Java embedded SQL (SQLJ) applications and applets on UNIX

Consideraciones sobre los applets Java


Se puede acceder a las bases de datos DB2 utilizando applets Java. Tenga en cuenta lo siguiente cuando utilice applets Java: v En el caso de un applet JDBC o SQLJ de mayor tamao que conste de varias clases Java, puede elegir empaquetar todas sus clases en un archivo JAR. Para un applet SQLJ, tambin tendra que empaquetar sus perfiles serializados junto con sus clases. Si decide hacer esto, aada el archivo JAR al parmetro archive en el cdigo applet. Para ver detalles, consulta la documentacin del kit de desarrollo de software para Java. Para los applets SQLJ, algunos navegadores no tienen todava soporte para cargar un objeto serializado desde un archivo de recursos asociado al applet. Por ejemplo, obtendr el mensaje de error siguiente si intenta cargar el applet de ejemplo proporcionado Applt en esos navegadores:
java.lang.ClassNotFoundException: Applt_SJProfile0

Para evitar este problema, existe un programa de utilidad que convierte un perfil serializado en un perfil que est almacenado en formato de clase Java. El
Captulo 5. Creacin de aplicaciones de bases de datos Java

175

programa de utilidad es una clase Java llamada sqlj.runtime.profile.util.SerProfileToClass. Este programa utiliza como entrada un archivo de recursos de un perfil serializado y produce como resultado una clase Java donde est contenido el perfil. El perfil se puede convertir utilizando uno de estos mandatos:
profconv Applt_SJProfile0.ser

o
java sqlj.runtime.profile.util.SerProfileToClass Applt_SJProfile0.ser

Como resultado se crea la clase Applt_SJProfile0.class. Normalmente el problema se resuelve sustituyendo todos los perfiles con formato .ser utilizados por el applet por perfiles con formato .class. v Puede colocar el archivo db2jcc.jar en un directorio compartido por varios applets que se pueden cargar desde su sitio Web. db2jcc.jar es para los applets que utilizan el controlador IBM DB2 para JDBC y SQLJ o para cualquier applet SQLJ. Este archivo est en el directorio sqllib\java de los sistemas operativos Windows y en el directorio sqllib/java de UNIX. Puede ser necesario aadir un parmetro codebase al cdigo applet del archivo HTML para identificar el directorio. Para ver detalles, consulte la documentacin del kit de desarrollo de software para Java. v El servidor de applet JDBC (receptor), db2jd, contiene un manejo de seales para hacerlo ms robustos. Como consecuencia de ello, no se puede utilizar la secuencia clave CTRL-C para terminar db2jd. Por tanto, la nica forma de cerrar el receptor consiste en eliminar el proceso utilizando kill -9 (para UNIX) o el gestor de tareas (para Windows). Tareas relacionadas: v Creacin de applets JDBC en la pgina 169 v Creacin de applets SQLJ en la pgina 173

Opciones de aplicaciones y applets SQLJ para UNIX


Las opciones de conversin y personalizacin de SQLJ se utilizan en el script de creacin bldsqlj en UNIX. Estas son las opciones que DB2 recomienda que utilice para crear aplicaciones y applets de SQLJ en las plataformas UNIX. sqlj El conversor SQLJ (tambin compila el programa).

"${nombreprog}.sqlj" El archivo fuente de SQLJ. El mandato progname=${1%.sqlj} elimina la extensin si se ha incluido en el nombre de archivo de entrada, por lo que cuando se vuelve a aadir la extensin no est duplicado. db2sqljcustomize El personalizador de perfiles SQLJ. -url -user Especifica un URL de JDBC para establecer una conexin de base de datos, tal como jdbc:db2://nombreServidor:50000/sample. Especifica un ID de usuario.

-password Especifica una contrasea. "${nombreprog}_SJProfile0" Especifica un perfil serializado para el programa.

176

Desarrollo de aplicaciones Java

Tareas relacionadas: v Creacin de applets SQLJ en la pgina 173 v Creacin de aplicaciones SQLJ en la pgina 174 Informacin relacionada: v Opciones de rutinas SQLJ para UNIX en la pgina 179 Ejemplos relacionados: v bldsqlj -- Builds Java embedded SQL (SQLJ) applications and applets on UNIX

Opciones de aplicaciones y applets SQLJ para Windows


Las opciones siguientes del personalizador y el conversor SQLJ se utilizan en el archivo por lotes bldsqlj.bat en los sistemas operativos Windows. stas son opciones que DB2 recomienda que utilice para crear aplicaciones y applets de SQLJ en Windows. sqlj %1.sqlj El archivo fuente de SQLJ. db2sqljcustomize El personalizador de perfiles de DB2 para Java. -url -user Especifica un URL de JDBC para establecer una conexin de base de datos, tal como jdbc:db2://nombreServidor:50000/sample. Especifica un ID de usuario. El conversor SQLJ (tambin compila el programa).

-password Especifica una contrasea. %1_SJProfile0 Especifica un perfil serializado para el programa. Tareas relacionadas: v Creacin de applets SQLJ en la pgina 173 v Creacin de aplicaciones SQLJ en la pgina 174 Informacin relacionada: v Opciones de rutinas SQLJ para Windows en la pgina 180 Ejemplos relacionados: v bldsqlj.bat -- Builds a Java embedded SQL (SQLJ) application or applet on Windows

Creacin de rutinas SQLJ


DB2 proporciona programas de ejemplo para mostrar el uso de rutinas SQLJ (procedimientos almacenados y funciones definidas por el usuario) contenidas en el directorio samples/java/sqlj (para UNIX) o en el directorio samples\java\sqlj (para Windows). Las rutinas se compilan y almacenan en un servidor. Cuando una aplicacin cliente llama a una rutina, sta accede al servidor de bases de datos y devuelve datos a la aplicacin cliente.

Captulo 5. Creacin de aplicaciones de bases de datos Java

177

En el mismo directorio, DB2 tambin proporciona el archivo de creacin bldsqljs (UNIX) o bldsqljs.bat (Windows), que contiene mandatos para crear rutinas. El archivo de creacin utiliza como entrada un mximo de seis parmetros: $1, $2, $3, $4, $5 y $6 en UNIX y %1, %2, %3, %4, %5 y %6 en Windows. El primer parmetro especifica el nombre del programa. El segundo parmetro especifica el ID de usuario correspondiente a la instancia de base de datos; el tercer parmetro especifica la contrasea. El cuarto parmetro especifica el nombre del servidor. El quinto parmetro especifica el nmero de puerto. Finalmente, el sexto parmetro especifica el nombre de la base de datos. Se pueden utilizar valores por omisin para todos los parmetros, excepto para el primero, el nombre del programa. Consulte el archivo de creacin para conocer detalles sobre la utilizacin de valores de parmetro por omisin. Procedimiento: El ejemplo siguiente muestra cmo crear un archivo de clase con procedimientos almacenados. SpServer muestra procedimientos almacenados PARAMETER STYLE JAVA que hacen uso del controlador de aplicaciones JDBC para acceder a una base de datos DB2. Para crear esta clase de procedimiento almacenado con el archivo de creacin bldsqljs (UNIX) o bldsqljs.bat (Windows): 1. Entre el mandato siguiente:
bldsqljs SpServer <IDusuario> <contrasea> <nombre_servidor> \ <nmero_puerto> <nombre_bd>

donde todos los parmetros, salvo el nombre del programa, pueden utilizar valores por omisin, tal como se explica en el archivo de creacin. 2. A continuacin, catalogue las rutinas ejecutando el script spcat en el servidor. Escriba:
spcat

Este script conecta con la base de datos sample, descataloga mediante SpDrop.db2 las rutinas que se hubieran catalogado previamente, luego las cataloga llamando a SpCreate.db2, y finalmente desconecta de la base de datos. Tambin puede ejecutar los scripts SpDrop.db2 y SpCreate.db2 por separado. 3. A continuacin, detenga y rearranque la base de datos para que se reconozca el nuevo archivo de clase. Si es necesario, defina la modalidad de archivo del archivo de clase como read para que pueda ser ledo por el usuario. 4. Cree y ejecute la aplicacin cliente SpClient para invocar los procedimientos almacenados. Puede crear SpClient mediante el archivo de creacin de aplicaciones bldsqlj (UNIX) o bldsqlj.bat (Windows). Tambin puede utilizar el makefile de Java para crear los programas anteriores. Tareas relacionadas: v Creacin de rutinas JDBC en la pgina 171 v Creacin de applets SQLJ en la pgina 173 v Creacin de aplicaciones SQLJ en la pgina 174 Informacin relacionada:

178

Desarrollo de aplicaciones Java

v Ejemplos de SQLJ en la pgina 187 v Opciones de rutinas SQLJ para UNIX en la pgina 179 v Opciones de rutinas SQLJ para Windows en la pgina 180 Ejemplos relacionados: v bldsqljs.bat -- Builds a Java embedded SQL (SQLJ) stored procedure on Windows v SpClient.sqlj -- Call a variety of types of stored procedures from SpServer.sqlj (SQLj) v SpCreate.db2 -- How to catalog the stored procedures contained in SpServer.sqlj v SpDrop.db2 -- How to uncatalog the stored procedures contained in SpServer.sqlj v SpServer.sqlj -- Provide a variety of types of stored procedures to be called from (SQLj) v SpIterat.sqlj -- Iterator class file for SpServer.sqlj (SQLj) v bldsqljs -- Builds Java embedded SQL (SQLJ) stored procedures on UNIX v spcat -- To catalog SQLj stored procedures on UNIX

Opciones de rutinas SQLJ para UNIX


Las siguientes opciones de conversin y personalizacin de SQLJ se utilizan en el script de creacin bldsqljs en UNIX. Estas son las opciones recomendadas para crear rutinas SQLJ (procedimientos almacenados y funciones definidas por el usuario) en las plataformas UNIX. Opciones de conversin y personalizacin para bldsqljs: sqlj El conversor SQLJ (tambin compila el programa).

"${nombreprog}.sqlj" El archivo fuente de SQLJ. El mandato progname=${1%.sqlj} elimina la extensin si se ha incluido en el nombre de archivo de entrada, por lo que cuando se vuelve a aadir la extensin no est duplicado. db2sqljcustomize El personalizador de perfiles de DB2 para Java. -url -user Especifica un URL de JDBC para establecer una conexin de base de datos, tal como jdbc:db2://nombreServidor:50000/sample. Especifica un ID de usuario.

-password Especifica una contrasea. "${nombreprog}_SJProfile0" Especifica un perfil serializado para el programa. Tareas relacionadas: v Creacin de rutinas SQLJ en la pgina 177 Informacin relacionada: v Opciones de aplicaciones y applets SQLJ para UNIX en la pgina 176 Ejemplos relacionados:
Captulo 5. Creacin de aplicaciones de bases de datos Java

179

v bldsqljs -- Builds Java embedded SQL (SQLJ) stored procedures on UNIX

Opciones de rutinas SQLJ para Windows


Las opciones siguientes del personalizador y el conversor SQLJ se utilizan en el archivo por lotes bldsqljs.bat en los sistemas operativos Windows. Estas son las opciones que DB2 recomienda que utilice para crear rutinas SQLJ (procedimientos almacenados y funciones definidas por el usuario). sqlj %1.sqlj El archivo fuente de SQLJ. db2sqljcustomize El personalizador de perfiles de DB2 para Java. -url -user Especifica un URL de JDBC para establecer una conexin de base de datos, tal como jdbc:db2://nombreServidor:50000/sample. Especifica un ID de usuario. El conversor SQLJ (tambin compila el programa).

-password Especifica una contrasea. %1_SJProfile0 Especifica un perfil serializado para el programa. Tareas relacionadas: v Creacin de rutinas SQLJ en la pgina 177 Informacin relacionada: v Opciones de aplicaciones y applets SQLJ para Windows en la pgina 177 Ejemplos relacionados: v bldsqljs.bat -- Builds a Java embedded SQL (SQLJ) stored procedure on Windows

180

Desarrollo de aplicaciones Java

Captulo 6. Aplicaciones Java de ejemplo


Los siguientes temas contienen informacin sobre las aplicaciones Java de ejemplo que se proporcionan con DB2 Database para Linux, UNIX y Windows. v Ejemplos de JDBC v Ejemplos de SQLJ en la pgina 187 v Ejemplos de plugins de Java en la pgina 191 v Ejemplos de Java WebSphere en la pgina 192

Ejemplos de JDBC
Directorio UNIX: sqllib/samples/java/jdbc. Directorio Windows: sqllib\samples\java\jdbc. Los ejemplos de JDBC incluyen los siguientes tipos de programas: Ejemplos de rutinas ADMIN_CMD Ejemplos que muestran la utilizacin del procedimiento almacenado ADMIN_CMD para tareas de administracin mediante la interfaz SQL Ejemplos de nivel de imagen de instalacin Programas referentes al nivel de imagen de instalacin del producto de bases de datos. Ejemplos de nivel de base de datos Programas referentes a objetos de bases de datos. Ejemplos de nivel de tabla Programas referentes a objetos de tabla. Ejemplos de tipos de datos Programas referentes a tipos de datos. Ejemplos de applets Ejemplos que muestran applets de Java. Ejemplos de procedimientos almacenados Ejemplos que muestran procedimientos almacenados. Ejemplos de funciones definidas por el usuario Ejemplos que muestran funciones definidas por el usuario. Ejemplos de beans de Java Ejemplos que muestran clases de beans de Java. Ejemplos de plugins GSS-API de Java Ejemplos que muestran plugins JCC GCC_API Otros ejemplos Ejemplos que no pertenecen a ninguna de las categoras anteriores.

Copyright IBM Corp. 2006

181

Tabla 22. archivos de programas de ejemplo JDBC Tipo de ejemplo Nombre del programa de ejemplo Descripcin del programa Cmo autoconfigurar una base de datos mediante la rutina ADMIN_CMD. Cmo aadir, actualizar y descartar contactos y grupos de contactos mediante la rutina ADMIN_CMD. Cmo efectuar una cpia de seguridad en lnea mediante la rutina ADMIN_CMD. Cmo actualizar y restablecer la configuracin de bases de datos y los parmetros de configuracin del Gestor de bases de datos mediante la rutina ADMIN_CMD. Cmo exportar datos mediante la rutina ADMIN_CMD. Cmo importar datos mediante la rutina ADMIN_CMD. Cmo inmovilizar espacios de tabla y bases de datos mediante la rutina ADMIN_CMD. Cmo describir tablas e ndices mediante la rutina ADMIN_CMD. Cmo obtener y definir informacin a nivel de instalacin.

Ejemplos de AdmCmdAutoCfg.java procedimientos almacenados de ADMIN_CMD AdmCmdContacts.java

AdmCmdOnlineBackup.java

AdmCmdUpdateCfg.java

AdmCmdExport.java AdmCmdImport.java AdmCmdQuiesce.java

AdmCmdDescribe.java Ejemplos de IlInfo.java nivel de imagen de instalacin

182

Desarrollo de aplicaciones Java

Tabla 22. archivos de programas de ejemplo JDBC (continuacin) Tipo de ejemplo Nombre del programa de ejemplo Descripcin del programa Cmo visualizar/otorgar/revocar autorizaciones a nivel de base de datos. Cmo conectar y desconectar con respecto de una base de datos. Cmo obtener y definir informacin a nivel de base de datos. Cmo conectar y desconectar con respecto a varias bases de datos. Cmo convertir una sentencia que contiene una clusula de escape ODBC en un formato especfico de la fuente de datos. Cmo utilizar la posibilidad de contencin del cursor en el controlador JDBC de tipo 2 de DB2 para Linux, UNIX y Windows y el Controlador IBM DB2 para JDBC y SQLJ. Para compilar este ejemplo, necesita Java Developer Kit 1.4 o superior. Para ejecutar este ejemplo, necesita Java Runtime Environment 1.4 o superior. Cmo crear, modificar y eliminar una secuencia en una base de datos. Cmo utilizar objetos de base de datos. Cmo obtener los parmetros de configuracin de bases de datos. Cmo obtener los parmetros de configuracin del Gestor de bases de datos. Cmo obtener una vista de cliente de entradas de archivo de anotaciones cronolgicas de diagnstico.

Ejemplos de DbAuth.java nivel de base de datos DbConn.java DbInfo.java DbMCon.java DbNative.java

DbRsHold.java

DbSeq.java DbUse.java GetDBCfgParams.java GetDBMCfgParams.java

GetLogs.java

Captulo 6. Aplicaciones Java de ejemplo

183

Tabla 22. archivos de programas de ejemplo JDBC (continuacin) Tipo de ejemplo Ejemplos de nivel de tabla Nombre del programa de ejemplo GetMessage.java Descripcin del programa Cmo obtener un mensaje de error en el entorno local necesario con sustitucin de smbolos. Cmo ampliar el soporte a RID grandes en tablas/espacios de tabla nuevos y existentes. Cmo ejecutar SET INTEGRITY en lnea sobre una tabla. Cmo utilizar la tabla de etapas para actualizar AST diferido. Cmo crear tablas con opcin de compresin de valores por omisin y nulos. Cmo trabajar con restricciones de tabla. Cmo crear, modificar y eliminar tablas. Cmo utilizar columnas generadas. Cmo utilizar columnas de identidad. Cmo obtener y definir informacin a nivel de tabla. Cmo utilizar un desencadenante INSTEAD OF en una vista. Cmo utilizar la sentencia MERGE. Cmo modificar informacin de una tabla. Cmo crear y reorganizar ndices en una tabla. Cmo visualizar/otorgar/revocar privilegios a nivel de tabla. Cmo leer informacin de una tabla. Cmo ejecutar la compresin de filas sobre una tabla. Cmo seleccionar de entre: insercin, actualizacin, supresin. Cmo utilizar tablas temporales declaradas. Cmo utilizar un desencadenante en una tabla. Cmo utilizar tablas de consultas materializadas (tablas de resumen). Cmo insertar utilizando una vista UNION ALL.

LargeRid.java

SetIntegrity.java TbAST.java TbCompress.java

TbConstr.java TbCreate.java TbGenCol.java TbIdent.java TbInfo.java TbInTrig.java TbMerge.java TbMod.java TbOnlineInx.java TbPriv.java TbRead.java TbRowcompress.java TbSel.java TbTemp.java TbTrig.java TbUMQT.java TbUnion.java

184

Desarrollo de aplicaciones Java

Tabla 22. archivos de programas de ejemplo JDBC (continuacin) Tipo de ejemplo Tipos de datos Nombre del programa de ejemplo DtInfo.java DtLob.java DtUdt.java Ejemplos de applet Ejemplos de procedimientos almacenados Applt.java spcat Descripcin del programa Cmo obtener informacin sobre tipos de datos. Cmo leer y escribir datos de LOB. Cmo crear, utilizar y eliminar tipos diferenciados definidos por el usuario. Cmo utilizar applets. Script del catlogo de procedimientos almacenados para el programa spserver. Este script llama a SpDrop.db2 y SpCreate.db2. Script de CLP para emitir sentencias CREATE PROCEDURE. Script de CLP para eliminar procedimientos almacenados del catlogo. Programa cliente utilizado para llamar a las funciones de servidor declaradas en SpServer.java. Funciones de procedimiento almacenado creadas y ejecutadas en el servidor.

SpCreate.db2 SpDrop.db2

SpClient.java

SpServer.java

Captulo 6. Aplicaciones Java de ejemplo

185

Tabla 22. archivos de programas de ejemplo JDBC (continuacin) Tipo de ejemplo Nombre del programa de ejemplo Descripcin del programa Aplicacin cliente que llama a la biblioteca de funciones definidas por el usuario, UDFsrv. Funciones definidas por el usuario llamadas por UDFcli.java. Script de catlogo de funciones definidas por el usuario para el programa UDFsrv. Este script llama a UDFDrop.db2 y UDFCreate.db2. Script de CLP para eliminar funciones definidas por el usuario (UDF) del catlogo. Script de CLP para emitir sentencias CREATE PROCEDURE. Aplicacin cliente que llama a la biblioteca de funciones definidas por el usuario, UDFjsrv. Funciones definidas por el usuario llamadas por UDFjcli.java. Script de catlogo de funciones definidas por el usuario (UDF) para el programa UDFjsrv. Este script llama a UDFjDrop.db2 y UDFjCreate.db2. Script de CLP para eliminar funciones definidas por el usuario (UDF) del catlogo. Script de CLP para emitir sentencias CREATE PROCEDURE. Cmo catalogar las UDF contenidas en UDFsqlsv.java Cmo descatalogar las UDF contenidas en UDFsqlsv.java Llamar a las UDF contenidas en UDFsqlsv.java Funciones definidas por el usuario que contienen sentencias de SQL y son llamadas por UDFsqlcl.java Cmo crear un registro de empleado. Cmo crear informes de clculo de nminas para cada departamento.

Ejemplos de UDFcli.java funciones definidas por el usuario UDFsrv.java udfcat

UDFDrop.db2

UDFCreate.db2 UDFjcli.java

UDFjsrv.java udfjcat

UDFjDrop.db2

UDFjCreate.db2 UDFsCreate.db2 UDFsDrop.db2 UDFsqlcl.java UDFsqlsv.java

Ejemplos de beans de Java

CreateEmployee.java GeneratePayroll.java

186

Desarrollo de aplicaciones Java

Tabla 22. archivos de programas de ejemplo JDBC (continuacin) Tipo de ejemplo Ejemplos de plugins GSS-API de Java Nombre del programa de ejemplo JCCKerberosPlugin.java Descripcin del programa Implemente un plugin GSS-API que efecte la autenticacin de Kerberos mediante IBM DB2 Universal Driver. Utilice JCCKerberosPlugin para obtener una conexin de DB2 mediante IBM DB2 Universal Driver. Implemente un plugin GSS-API que efecte la comprobacin de ID de usuario y de contrasea mediante IBM DB2 Universal Driver. Implemente un GSSContext para que JCCSimpleGSSPlugin pueda utilizarlo Implemente una GSSCredential para que JCCSimpleGSSPlugin pueda utilizarlo Implemente una GSSException para que JCCSimpleGSSPlugin pueda utilizarlo Implemente un GSSName para que JCCSimpleGSSPlugin pueda utilizarlo Utilice JCCSimpleGSSPlugin para obtener una conexin de DB2 mediante IBM DB2 Universal Driver. Programas de utilidad para programas de ejemplo de JDBC.

JCCKerberosPluginTest.java

JCCSimpleGSSPlugin.java

JCCSimpleGSSContext.java JCCSimpleGSSCredential.java

JCCSimpleGSSException.java

JCCSimpleGSSName.java JCCSimpleGSSPluginTest.java

Otros ejemplos

Util.java

Conceptos relacionados: v Programas de ejemplo Java en Temas de ejemplos v Archivos de ejemplo en Temas de ejemplos Informacin v Ejemplos v Ejemplos v Ejemplos relacionada: de plugins de Java en la pgina 191 de Java WebSphere en la pgina 192 de SQLJ en la pgina 187

Ejemplos de SQLJ
Directorio UNIX: sqllib/samples/java/sqlj. Directorio Windows: sqllib\samples\java\sqlj. Los ejemplos de SQLJ incluyen los siguientes tipos de programas: Ejemplos de nivel de base de datos Programas referentes a objetos de bases de datos. Ejemplos de nivel de tabla Programas referentes a objetos de tabla.

Captulo 6. Aplicaciones Java de ejemplo

187

Ejemplos de tipo de datos Programas referentes a tipos de datos. Ejemplos de applet Ejemplos que muestran applets de Java. Ejemplos de procedimientos almacenados Ejemplos que muestran procedimientos almacenados. Ejemplos de funciones definidas por el usuario Ejemplos que muestran funciones definidas por el usuario. Ejemplos de beans de Java Ejemplos que muestran clases de beans de Java. Ejemplos de fuentes de datos Ejemplos que muestran fuentes de datos. Otros ejemplos Ejemplos que no pertenecen a ninguna de las categoras anteriores.
Tabla 23. archivos de programas de ejemplo SQLJ Tipo de ejemplo Ejemplo de nivel de base de datos Nombre del programa de ejemplo DbAuth.sqlj DbConn.sqlj DbMCon.sqlj DbUse.sqlj Descripcin del programa Cmo visualizar/otorgar/revocar autorizaciones a nivel de base de datos. Cmo conectar y desconectar con respecto de una base de datos. Cmo conectar y desconectar con respecto a varias bases de datos. Cmo utilizar objetos de base de datos.

188

Desarrollo de aplicaciones Java

Tabla 23. archivos de programas de ejemplo SQLJ (continuacin) Tipo de ejemplo Ejemplo de nivel de tabla Nombre del programa de ejemplo LargeRid.sqlj Descripcin del programa Cmo ampliar el soporte a RID grandes en tablas/espacios de tabla nuevos y existentes. Cmo ejecutar SET INTEGRITY en lnea sobre una tabla. Cmo utilizar la tabla de etapas para actualizar AST diferido. Cmo crear tablas con opcin de compresin de valores por omisin y nulos. Cmo trabajar con restricciones de tabla. Cmo crear, modificar y eliminar tablas. Cmo utilizar columnas de identidad. Cmo obtener y definir informacin a nivel de tabla. Cmo modificar informacin de una tabla. Cmo crear y reorganizar ndices en una tabla. Cmo visualizar/otorgar/revocar privilegios a nivel de tabla. Cmo ejecutar la compresin de filas sobre una tabla. Cmo ejecutar runstats sobre una tabla. Cmo leer informacin de una tabla. Cmo seleccionar de entre: insercin, actualizacin, supresin. Cmo utilizar un desencadenante en una tabla. Cmo utilizar tablas de consultas materializadas (tablas de resumen). Cmo crear, utilizar y eliminar tipos diferenciados definidos por el usuario. Cmo utilizar applets.

SetIntegrity.sqlj TbAST.sqlj TbCompress.sqlj

TbConstr.sqlj TbCreate.sqlj TbIdent.sqlj TbInfo.sqlj TbMod.sqlj TbOnlineInx.sqlj TbPriv.sqlj TbRowcompress.sqlj TbRunstats.sqlj TbRead.sqlj TbSel.sqlj TbTrig.sqlj TbUMQT.sqlj Ejemplo de tipo de datos Ejemplo de applet DtUdt.sqlj Applt.sqlj

Captulo 6. Aplicaciones Java de ejemplo

189

Tabla 23. archivos de programas de ejemplo SQLJ (continuacin) Tipo de ejemplo Ejemplo de procedimiento almacenado Nombre del programa de ejemplo spcat Descripcin del programa Script del catlogo de procedimientos almacenados para el programa SpServer. Este script llama a SpDrop.db2 y SpCreate.db2. Script de CLP para emitir sentencias CREATE PROCEDURE. Script de CLP para eliminar procedimientos almacenados del catlogo. Programa cliente utilizado para llamar a las funciones de servidor declaradas en SpServer.sqlj. Funciones de procedimiento almacenado creadas y ejecutadas en el servidor. Archivo de clase de iterador para SpServer.sqlj. Aplicacin cliente que llama a la biblioteca de funciones definidas por el usuario, UDFsrv. Funciones definidas por el usuario llamadas por UDFcli. Script de catlogo de funciones definidas por el usuario para el programa UDFsrv. Este script llama a UDFDrop.db2 y UDFCreate.db2. Script de CLP para eliminar funciones definidas por el usuario (UDF) del catlogo. Script de CLP para emitir sentencias CREATE PROCEDURE. Aplicacin cliente que llama a la biblioteca de funciones definidas por el usuario, UDFjsrv. Funciones definidas por el usuario llamadas por UDFjcli. Script de catlogo de funciones definidas por el usuario (UDF) para el programa UDFjsrv. Este script llama a UDFjDrop.db2 y UDFjCreate.db2. Script de CLP para eliminar funciones definidas por el usuario (UDF) del catlogo. Script de CLP para emitir sentencias CREATE PROCEDURE. Cmo crear un registro de empleado. Cmo crear informes de clculo de nminas para cada departamento.

SpCreate.db2 SpDrop.db2

SpClient.sqlj

SpServer.sqlj SpIterat.sqlj Ejemplo de funcin definida por el usuario UDFcli.sqlj

UDFsrv.java udfcat

UDFDrop.db2

UDFCreate.db2 UDFjcli.sqlj

UDFjsrv.java udfjcat

UDFjDrop.db2

UDFjCreate.db2 Ejemplo de bean de Java CreateEmployee.sqlj GeneratePayroll.sqlj

190

Desarrollo de aplicaciones Java

Tabla 23. archivos de programas de ejemplo SQLJ (continuacin) Tipo de ejemplo Nombre del programa de ejemplo Descripcin del programa Proceso por lotes SQLJ - Cmo funciona el proceso por lotes SQLJ. Proceso por lotes SQLJ - Asociacin de ExecutionContext con BatchContext. Proceso por lotes SQLJ - Cundo es necesario ejecutar un proceso por lotes implcitamente. Cmo acceder a campos Blob o Clob en las tablas de DB2. Crear y registrar fuentes de datos tal como especifican los archivos de propiedades DataSource. Este programa crea el esquema para los programas de demostracin de DataSource. Cmo conectar a una base de datos utilizando DataSource con el controlador de DB2 de IBM para JDBC y SQLJ. Cmo conectar a una base de datos utilizando varios DataSource con el controlador de DB2 de IBM para JDBC y SQLJ. Cmo utilizar iteradores con nombre y posicionales desplazables en SQLJ. Programas de utilidad para programas de ejemplo de SQLJ.

Ejemplo de Batch1Demo.sqlj fuente de datos Batch2Demo.sqlj Batch3Demo.sqlj

BlobClobDemo.sqlj createRegisterDS.java

CreateDemoSchema.sqlj

DbConnDataSource.sqlj

DbConMDataSources.sqlj

ScrollIterDemo.sqlj Otro ejemplo Util.sqlj

Conceptos relacionados: v Programas de ejemplo Java en Temas de ejemplos v Archivos de ejemplo en Temas de ejemplos Informacin v Ejemplos v Ejemplos v Ejemplos relacionada: de plugins de Java en la pgina 191 de Java WebSphere en la pgina 192 de JDBC en la pgina 181

Ejemplos de plugins de Java


Directorio UNIX: sqllib/samples/java/plugin. Directorio Windows: sqllib\samples\java\plugin.
Tabla 24. Archivos de ejemplo de plugins del Centro de control de Java Nombre del programa de ejemplo Descripcin del programa Example1.java Cmo aadir un nuevo botn a la barra de herramientas del Centro de Control.

Captulo 6. Aplicaciones Java de ejemplo

191

Tabla 24. Archivos de ejemplo de plugins del Centro de control de Java (continuacin) Nombre del programa de ejemplo Descripcin del programa Example2.java Example3.java Example3Child.java Example3Folder.java Cmo aadir nuevas acciones de men a objetos de base de datos del Centro de Control. Cmo aadir nuevos objetos de base de datos al rbol del Centro de Control. Cmo aadir objetos de plugin bajo los objetos de Base de datos del rbol del Centro de Control. Cmo aadir nuevos objetos de base de datos al rbol del Centro de Control.

Conceptos relacionados: v Compiling and running the example plugins en Administration Guide: Implementation v Introducing the plug-in architecture for the Control Center en Administration Guide: Implementation v Writing plugins as Control Center extensions en Administration Guide: Implementation v Programas de ejemplo Java en Temas de ejemplos v Archivos de ejemplo en Temas de ejemplos Tareas relacionadas: v Creating a plugin that adds a toolbar button en Administration Guide: Implementation v Setting attributes for a plugin tree object en Administration Guide: Implementation Informacin v Ejemplos v Ejemplos v Ejemplos relacionada: de Java WebSphere en la pgina 192 de JDBC en la pgina 181 de SQLJ en la pgina 187

Ejemplos de Java WebSphere


Directorio UNIX: sqllib/samples/java/Websphere. Directorio Windows: sqllib\samples\java\Websphere.
Tabla 25. Archivos de ejemplo de Java WebSphere Nombre del programa de ejemplo AccessEmployee.ear

Descripcin del programa Este archivo de Enterprise ARchive (.EAR) consta de cuatro mdulos que contienen 32 archivos diferentes .class, .JSP y .HTML. Este archivo EAR, que se despliega con facilidad utilizando IBM WebSphere Application Server, muestra cmo los clientes Java pueden interaccionar con Enterprise Java Beans(EJB) para acceder a datos almacenados en DB2.

Conceptos relacionados:

192

Desarrollo de aplicaciones Java

v Programas de ejemplo Java en Temas de ejemplos v Archivos de ejemplo en Temas de ejemplos Informacin v Ejemplos v Ejemplos v Ejemplos relacionada: de plugins de Java en la pgina 191 de JDBC en la pgina 181 de SQLJ en la pgina 187

Captulo 6. Aplicaciones Java de ejemplo

193

194

Desarrollo de aplicaciones Java

Captulo 7. Diagnstico de problemas de JDBC y SQLJ


Los temas siguientes contienen informacin sobre el diagnstico problemas en JDBC y SQLJ. v Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ v Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador JDBC de DB2 de tipo 2 en la pgina 206

Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ
Los temas siguientes contienen informacin sobre el diagnstico problemas en JDBC y SQLJ cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ. v Diagnstico de problemas de JDBC y SQLJ en el controlador IBM DB2 para JDBC y SQLJ v Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC en la pgina 198 v Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 199 v Supervisin del sistema del controlador IBM DB2 para JDBC y SQLJ en la pgina 203

Diagnstico de problemas de JDBC y SQLJ en el controlador IBM DB2 para JDBC y SQLJ
Para obtener datos a fin de diagnosticar problemas de SQLJ o JDBC con el Controlador IBM DB2 para JDBC y SQLJ, debe recoger datos de rastreo y ejecutar programas de utilidad para formatear los datos de rastreo. Debe ejecutar los programas de utilidad de rastreo y diagnstico slo bajo la direccin del soporte de software de IBM. Si la aplicacin conecta con un servidor DB2 para z/OS, para poder recopilar datos de rastreo antes es necesario instalar varios procedimientos almacenados en dicho servidor. Esos procedimientos almacenados son tambin utilizados para algunas llamadas DatabaseMetaData. Los procedimientos almacenados son: v SQLCOLPRIVILEGES v SQLCOLUMNS v SQLFOREIGNKEYS v SQLGETTYPEINFO v SQLPRIMARYKEYS v SQLPROCEDURECOLS v SQLPROCEDURES v SQLSPECIALCOLUMNS v SQLSTATISTICS v SQLTABLEPRIVILEGES v SQLTABLES v SQLUDTS v SQLCAMESSAGE Para DB2 UDB para OS/390 y z/OS, Versin 7, los procedimientos almacenados se proporcionan en los PTF. El PTF se puede solicitar mediante los canales normales
Copyright IBM Corp. 2006

195

de servicio utilizando los nmeros PFT siguientes:


Tabla 26. PTF para DB2 para z/OS Versin de DB2 para z/OS Versin 7 Nmero de PTF UQ72083

Pregunte al administrador del sistema de DB2 para z/OS si estos procedimientos almacenados estn instalados. Recogida de datos de rastreo de JDBC: Utilice uno de los procedimientos siguientes para iniciar el rastreo: Procedimiento 1: Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 o el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 para DB2 para Linux, UNIX y Windows , el mtodo recomendado consiste en iniciar el rastreo configurando las propiedades db2.jcc.override.traceFile o db2.jcc.override.traceDirectory en el archivo de propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ. Procedimiento 2: 1. Si utiliza la interfaz DataSource para conectar con una fuente de datos, invoque el mtodo DB2BaseDataSource.setTraceLevel para definir el tipo de rastreo que necesite. El nivel de rastreo por omisin es TRACE_ALL. Consulte el tema Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener informacin acerca de cmo especificar ms de un tipo de rastreo. 2. Invoque el mtodo DB2BaseDataSource.setJccLogWriter para especificar el destino del rastreo y activar el rastreo. Procedimiento 3: Si utiliza la interfaz DataSource para conectar con una fuente de datos, invoque el mtodo javax.sql.DataSource.setLogWriter para activar el rastreo. Con este mtodo, TRACE_ALL es el nico nivel de rastreo disponible. Si utiliza la interfaz DriverManager para conectar con una fuente de datos, lleve a cabo el procedimiento siguiente para iniciar el rastreo: 1. Invoque el mtodo DriverManager.getConnection con la propiedad traceLevel establecida en el parmetro info o en el parmetro url para el tipo de rastreo que necesita. El nivel de rastreo por omisin es TRACE_ALL. Consulte el tema Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener informacin acerca de cmo especificar ms de un tipo de rastreo. 2. Invoque el mtodo DriverManager.setLogWriter para especificar el destino del rastreo y activar el rastreo. Despus de que se establezca una conexin, puede desactivar el rastreo o volverlo a activar, cambiar el destino del rastreo o cambiar el nivel de rastreo mediante el mtodo DB2Connection.setJccLogWriter. Para desactivar el rastreo, establezca el valor de logWriter en null. La propiedad logWriter es un objeto de tipo java.io.PrintWriter. Si la aplicacin no puede manejar objetos java.io.PrintWriter, puede utilizar la propiedad traceFile para especificar el destino de la salida del rastreo. Para utilizar la propiedad traceFile, establezca la propiedad logWriter en null y establezca la propiedad traceFile con el nombre del archivo en que el controlador graba los

196

Desarrollo de aplicaciones Java

datos del rastreo. Se tiene que poder grabar en este archivo y en el directorio en que reside. Si el archivo ya existe, el controlador lo sobregraba. Procedimiento 4: Si est utilizando la interfaz DriverManager, especifique las propiedades traceFile y traceLevel como parte del URL cuando cargue el controlador. Por ejemplo:
String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose" + ":traceFile=/u/db2p/jcctrace;" + "traceLevel=" + com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRDA_FLOWS + ";";

Ejemplo de inicio de rastreo mediante propiedades de la configuracin: Para ver un ejemplo completo de cmo utilizar los parmetros de configuracin para recopilar datos de rastreo, consulte Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC. Programa de rastreo de ejemplo: para obtener un programa completo de ejemplo para el rastreo cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ, consulte el tema Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ. Recopilacin de datos de rastreo de SQLJ: Para recopilar datos de rastreo con el fin de diagnosticar problemas durante el proceso de personalizacin o vinculacin de SQLJ, especifique las opciones -tracelevel y -tracefile cuando ejecute db2sqljcustomize o el programa de utilidad de vinculacin db2sqljbind. Formato de informacin sobre un perfil serializado de SQLJ: El programa de utilidad profp formatea la informacin sobre cada una de las clusulas SQLJ de un perfil serializado. El formato del programa de utilidad profp es:
profp nombre-perfil-serializado

Ejecute el programa de utilidad profp sobre el perfil serializado correspondiente a la conexin donde se produzca el error. Si se emite una excepcin, se genera un rastreo de Java. A partir del rastreo de pila, puede determinar qu perfil serializado se estaba utilizando cuando se emiti la excepcin. Formato de informacin sobre un perfil serializado personalizado de SQLJ: El programa de utilidad db2sqljprint da formato a la informacin sobre cada clusula de SQLJ contenida en un perfil serializado que est personalizado para el Controlador IBM DB2 para JDBC y SQLJ. Ejecute el programa de utilidad db2sqljprint sobre el perfil serializado personalizado correspondiente a la conexin donde se produzca el error. Conceptos relacionados: v Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 199 v Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC en la pgina 198
Captulo 7. Diagnstico de problemas de JDBC y SQLJ

197

Informacin relacionada: v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385 v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375 v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC


Suponga que desea reunir datos de rastreo para un programa llamado Test.java, el cual utiliza el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. Test.java no realiza ningn rastreo y no es recomendable modificar el programa. Por lo tanto, el rastreo se habilita mediante las propiedades de configuracin. Suponga que desea que la salida del rastreo tenga las caractersticas siguientes: v La informacin de rastreo de cada conexin del mismo DataSource se graba en un archivo de rastreo diferente. La salida se coloca en un directorio llamado /Trace. v El nombre de cada fichero de rastreo empieza por jccTrace1. v Si los archivos de rastreo que tienen los mismos nombres ya existen, los datos del rastreo se aadirn a stos. Aunque Test1.java no contenga ningn cdigo para llevar a cabo el rastreo, es recomendable definir las propiedades de configuracin de modo que si la aplicacin se modifica en el futuro para llevar a cabo el rastreo, los valores del programa prevalecern sobre los valores de las propiedades de configuracin. Para ello, utilice el conjunto de propiedades de configuracin que empiezan por db2.jcc, no por db2.jcc.override. Los valores de las propiedades de configuracin tienen el aspecto siguiente: v db2.jcc.traceDirectory=/Trace v db2.jcc.traceFile=jccTrace1 v db2.jcc.traceFileAppend=true Es recomendable que los valores del rastreo se apliquen solamente al programa autnomo denominado Test1.java. Por lo tanto, cree un archivo con dichos valores y, a continuacin, haga referencia al archivo al invocar el programa de Java especificando la opcin -Ddb2.jcc.propertiesFile. Suponga que el archivo que contiene los valores es /Test/jcc.properties. Para habilitar el rastreo al ejecutar Test1.java, deber emitir un mandato como el siguiente:
java -Ddb2.jcc.propertiesFile=/Test/jcc.properties Test1

Suponga que Test1.java crea dos conexiones para un DataSource. El programa no define ningn objeto logWriter; por lo tanto, el controlador crea un objeto logWriter global para la salida del rastreo. Cuando el programa finaliza, los archivos siguientes contienen los datos del rastreo: v /Trace/jccTrace1_global_0 v /Trace/jccTrace1_global_1 Conceptos relacionados: v Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ en la pgina 11 v Diagnstico de problemas de JDBC y SQLJ en el controlador IBM DB2 para JDBC y SQLJ en la pgina 195

198

Desarrollo de aplicaciones Java

Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ
El ejemplo siguiente muestra el uso de una clase para establecer una conexin mediante el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 y recoger y mostrar datos de rastreo cuando se utiliza el Controlador IBM DB2 para JDBC y SQLJ. La clase incluye un mtodo para la interfaz DriverManager y un mtodo para la interfaz DataSource.
public class TraceExample { public static void main(String[] args) { sampleConnectUsingSimpleDataSource(); sampleConnectWithURLUsingDriverManager(); } private static void sampleConnectUsingSimpleDataSource() { java.sql.Connection c = null; java.io.PrintWriter printWriter = new java.io.PrintWriter(System.out, true); // Imprime en consola, true significa // desecho automtico para // no perder rastreo try { javax.sql.DataSource ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setServerName("sysmvs1.stl.ibm.com"); ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setPortNumber(5021); ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setDatabaseName("san_jose"); ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setDriverType(4); ds.setLogWriter(printWriter); // Esto activa el rastreo

// Refinar el nivel de detalle del rastreo ((com.ibm.db2.jcc.DB2BaseDataSource) ds). setTraceLevel(com.ibm.db2.jcc.DB2SimpleDataSource.TRACE_CONNECTS | com.ibm.db2.jcc.DB2SimpleDataSource.TRACE_DRDA_FLOWS); // Esta peticin de conexin se rastrear utilizando el nivel de rastreo // TRACE_CONNECTS | TRACE_DRDA_FLOWS c = ds.getConnection("myname", "mypass"); // Cambiar el nivel de rastreo a TRACE_ALL // para todas las peticiones subsiguientes de la conexin ((com.ibm.db2.jcc.DB2Connection) c).setJccLogWriter(printWriter, com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL); Figura 60. Ejemplo de rastreo para el Controlador IBM DB2 para JDBC y SQLJ (Parte 1 de 5)

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

199

// La sentencia INSERT siguiente se rastrea // utilizando el nivel de rastreo TRACE_ALL java.sql.Statement s1 = c.createStatement(); s1.executeUpdate("INSERT INTO sampleTable(sampleColumn) VALUES(1)"); s1.close(); // El cdigo siguiente inhabilita todo el rastreo de la conexin ((com.ibm.db2.jcc.DB2Connection) c).setJccLogWriter(null); // La sentencia INSERT siguiente no se rastrea java.sql.Statement s2 = c.createStatement(); s2.executeUpdate("INSERT INTO sampleTable(sampleColumn) VALUES(1)"); s2.close(); c.close(); } catch(java.sql.SQLException e) { com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); } finally { cleanup(c, printWriter); printWriter.flush(); } } // // // // // Si el cdigo se ha ejecutado satisfactoriamente, la conexin ya debe estar cerrada. Comprobar si lo est. Si la conexin est cerrada, simplemente finalice el programa. Si se ha producido un error, intente retrotraer (rollback) y cierre la conexin.

private static void cleanup(java.sql.Connection c, java.io.PrintWriter printWriter) { if(c == null) return; try { if(c.isClosed()) { printWriter.println("[TraceExample] " + "La conexin se ha cerrado satisfactoriamente"); return; } // Si se ha llegado aqu, algo ha ido mal. // Retrotraer y cerrar la conexin. printWriter.println("[TraceExample] Se est retrotrayendo la conexin"); try { c.rollback(); } Figura 60. Ejemplo de rastreo para el Controlador IBM DB2 para JDBC y SQLJ (Parte 2 de 5)

200

Desarrollo de aplicaciones Java

catch(java.sql.SQLException e) { printWriter.println("[TraceExample] " + "Se captur la siguiente java.sql.SQLException al intentar retrotraer:"); com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); printWriter.println("[TraceExample] " + "No se puede retrotraer la conexin"); } catch(java.lang.Throwable e) { printWriter.println("[TraceExample] Se captur " + "la siguiente java.lang.Throwable al intentar retrotraer:"); com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); printWriter.println("[TraceExample] No se puede " + "roll back the connection"); } // Cierre la conexin printWriter.println("[TraceExample] Se est cerrando la conexin"); try { c.close(); } catch(java.sql.SQLException e) { printWriter.println("[TraceExample] Excepcin al " + "intentar cerrar la conexin"); printWriter.println("[TraceExample] Pueden producirse " + "puntos muertos si no se cierra la conexin."); com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); } catch(java.lang.Throwable e) { printWriter.println("[TraceExample] Se ha emitido Throwable " + "al intentar cerrar la conexin"); printWriter.println("[TraceExample] Pueden producirse " + "puntos muertos si no se cierra la conexin."); com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); } } catch(java.lang.Throwable e) { printWriter.println("[TraceExample] No se puede " + "forzar el cierre de la conexin"); printWriter.println("[TraceExample] Pueden producirse " + "puntos muertos si no se cierra la conexin."); com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); } } Figura 60. Ejemplo de rastreo para el Controlador IBM DB2 para JDBC y SQLJ (Parte 3 de 5)

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

201

private static void sampleConnectWithURLUsingDriverManager() { java.sql.Connection c = null; // Esta vez, enviar printWriter a un archivo. java.io.PrintWriter printWriter = null; try { printWriter = new java.io.PrintWriter( new java.io.BufferedOutputStream( new java.io.FileOutputStream("/temp/driverLog.txt"), 4096), true); } catch(java.io.FileNotFoundException e) { java.lang.System.err.println ("No se puede definir un transcriptor de impresin para el rastreo"); java.lang.System.err.flush(); return; } try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch(ClassNotFoundException e) { printWriter.println("[TraceExample] Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 " + "no est en classpath de la aplicacin. No se puede cargar el controlador."); printWriter.flush(); return; } // Este URL describe fuente de datos de destino para conectividad de tipo 4. // La propiedad traceLevel se establece mediante la sintaxis de URL y // el rastreo del controlador se dirige al archivo "/temp/driverLog.txt" String databaseURL = "jdbc:db2://sysmvs1.stl.ibm.com:5021" + "/sample:traceFile=/temp/driverLog.txt;traceLevel=" + (com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRDA_FLOWS | com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTS) + ";"; // Definir otras propiedades java.util.Properties properties = new java.util.Properties(); properties.setProperty("user", "myname"); properties.setProperty("password", "mypass"); Figura 60. Ejemplo de rastreo para el Controlador IBM DB2 para JDBC y SQLJ (Parte 4 de 5)

202

Desarrollo de aplicaciones Java

try { // Esta peticin de conexin se rastrear utilizando el nivel de rastreo // TRACE_CONNECTS | TRACE_DRDA_FLOWS c = java.sql.DriverManager.getConnection(databaseURL, properties); // Cambiar el nivel de rastreo para todas las peticiones posteriores // de la conexin por TRACE_ALL ((com.ibm.db2.jcc.DB2Connection) c).setJccLogWriter(printWriter, com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL); // La sentencia INSERT siguiente se rastrea // utilizando el nivel de rastreo TRACE_ALL java.sql.Statement s1 = c.createStatement(); s1.executeUpdate("INSERT INTO sampleTable(sampleColumn) VALUES(1)"); s1.close(); // Inhabilite todo el rastreo de la conexin ((com.ibm.db2.jcc.DB2Connection) c).setJccLogWriter(null); // El siguiente cdigo de insercin de SQL no se rastrea java.sql.Statement s2 = c.createStatement(); s2.executeUpdate("insert into sampleTable(sampleColumn) values(1)"); s2.close(); c.close(); } catch(java.sql.SQLException e) { com.ibm.db2.jcc.DB2ExceptionFormatter.printTrace(e, printWriter, "[TraceExample]"); } finally { cleanup(c, printWriter); printWriter.flush(); } } } Figura 60. Ejemplo de rastreo para el Controlador IBM DB2 para JDBC y SQLJ (Parte 5 de 5)

Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Supervisin del sistema del controlador IBM DB2 para JDBC y SQLJ
Para ayudarle a supervisar el rendimiento de las aplicaciones con el Controlador IBM DB2 para JDBC y SQLJ, el controlador suministra dos mtodos para recoger la informacin siguiente acerca de una conexin: Tiempo del controlador bsico La suma de los tiempos transcurridos de API supervisada que se recogieron mientras la supervisin del sistema estaba habilitada, en microsegundos. En general, slo se supervisan las API que puedan producir interaccin con el servidor DB2 o la E/S de red.

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

203

Tiempo de E/S de red La suma de los tiempos transcurridos de E/S de red que se recogieron mientras la supervisin del sistema estaba habilitada, en microsegundos. Tiempo del servidor La suma de todos los tiempos transcurridos notificados del servidor DB2 que se recogieron mientras la supervisin del sistema estaba habilitada, en microsegundos. Actualmente, los servidores DB2 Database para Linux, UNIX y Windows no soportan esta funcin. Tiempo de la aplicacin La suma de los tiempos transcurridos del servidor DB2, de la red E/S, del controlador JDBC y de la aplicacin, en milisegundos. Los dos mtodos son: v La interfaz DB2SystemMonitor v El nivel de rastreo TRACE_SYSTEM_MONITOR Mtodo DB2SystemMonitor: Para recoger los datos de supervisin del sistema mediante la interfaz DB2SystemMonitor, ejecute estos pasos bsicos: 1. Invoque el mtodo DB2Connection.getDB2SystemMonitor para crear un objeto DB2SystemMonitor. 2. Invoque el mtodo DB2SystemMonitor.enable para habilitar el objeto DB2SystemMonitor para la conexin. 3. Invoque el mtodo DB2SystemMonitor.start para iniciar la supervisin del sistema. 4. Cuando la actividad que supervisar se complete, invoque DB2SystemMonitor.stop para detener la supervisin del sistema. 5. Invoque los mtodos DB2SystemMonitor.getCoreDriverTimeMicros, DB2SystemMonitor.getNetworkIOTimeMicros, DB2SystemMonitor.getServerTimeMicros o DB2SystemMonitor.getApplicationTimeMillis para recuperar los datos del tiempo transcurrido. Por ejemplo, el cdigo siguiente demuestra cmo recoger cada tipo de dato de tiempo transcurrido. Los nmeros que aparecen a la derecha de algunas sentencias corresponden a los pasos descritos anteriormente.

204

Desarrollo de aplicaciones Java

import java.sql.*; import com.ibm.db2.jcc.*; public class TestSystemMonitor { public static void main(String[] args) { String url = "jdbc:db2://sysmvs1.svl.ibm.com:5021/san_jose"; String user = "db2adm"; String password = "db2adm"; try { // Cargar el Controlador IBM DB2 para JDBC y SQLJ Class.forName("com.ibm.db2.jcc.DB2Driver"); System.out.println("**** Controlador JDBC cargado"); // Crear la conexin mediante el controlador IBM DB2 para JDBC y SQLJ Connection conn = DriverManager.getConnection (url,user,password); // Confirmar los cambios manualmente conn.setAutoCommit(false); System.out.println("**** Creada una conexin JDBC con la fuente de datos"); DB2SystemMonitor systemMonitor = 1 ((DB2Connection)conn).getDB2SystemMonitor(); systemMonitor.enable(true); 2 systemMonitor.start(DB2SystemMonitor.RESET_TIMES); 3 Statement stmt = conn.createStatement(); int numUpd = stmt.executeUpdate( "UPDATE EMPLOYEE SET PHONENO='4657' WHERE EMPNO='000010'"); systemMonitor.stop(); 4 System.out.println("Tiempo transcurrido de servidor (microsegundos)=" + systemMonitor.getServerTimeMicros()); 5 System.out.println("Tiempo transcurrido de E/S de red (microsegundos)=" + systemMonitor.getNetworkIOTimeMicros()); System.out.println("Tiempo transcurrido de controlador bsico (microsegundos)=" + systemMonitor.getCoreDriverTimeMicros()); System.out.println("Tiempo transcurrido de aplicacin (milisegundos)=" + systemMonitor.getApplicationTimeMillis()); conn.rollback(); stmt.close(); conn.close(); } // Maneje los errores catch (ClassNotFoundException e) { System.err.println("No se puede cargar Controlador IBM DB2 para JDBC y SQLJ, " + e); } catch (SQLException e) { System.out.println("SQLException: " + e); e.printStackTrace(); } } } Figura 61. Ejemplo de utilizacin de mtodos DB2SystemMonitor para recoger datos de supervisin del sistema

Mtodo de rastreo: Inicie un rastreo JDBC utilizando las propiedades de configuracin o las propiedades Connection o DataSource. Incluya TRACE_SYSTEM_MONITOR al establecer la propiedad traceLevel. Por ejemplo:
String url = "jdbc:db2://sysmvs1.stl.ibm.com:5021/san_jose" + ":traceFile=/u/db2p/jcctrace;" + "traceLevel=" + com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SYSTEM_MONITOR + ";";

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

205

Los registros de rastreo con informacin de supervisin del sistema son parecidos a este:
[ibm][db2][jcc][SystemMonitor:start] ... [ibm][db2][jcc][SystemMonitor:stop] core: 565.67ms | network: 211.695ms | server: 207.771ms

Conceptos relacionados: v Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 199 v Ejemplo de utilizacin de propiedades de configuracin para iniciar un rastreo de JDBC en la pgina 198 Informacin relacionada: v Resumen de las extensiones de JDBC del Controlador IBM DB2 para JDBC y SQLJ en la pgina 321

Diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador JDBC de DB2 de tipo 2
Los temas siguientes contienen informacin sobre el diagnstico de problemas de JDBC y SQLJ cuando se utiliza el Controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (Controlador JDBC de DB2 de tipo 2). v Recurso de rastreo de CLI/ODBC/JDBC v Archivos de rastreo de CLI y JDBC en la pgina 212

Recurso de rastreo de CLI/ODBC/JDBC


Este tema trata los siguientes aspectos: v Configuracin del rastreo para CLI de DB2 y JDBC de DB2 en la pgina 207 v Opciones de rastreo de CLI de DB2 y el archivo db2cli.ini en la pgina 208 v Opciones de rastreo de JDBC de DB2 y el archivo db2cli.ini en la pgina 209 v Rastreo del controlador CLI de DB2 y rastreo del gestor de controladores de ODBC en la pgina 210 v Controlador CLI de DB2, Controlador JDBC de DB2 de tipo 2 y rastreos de DB2 en la pgina 211 v Rastreos de CLI de DB2 y de JDBC de DB2, y procedimientos almacenados de CLI o Java en la pgina 211 La CLI de DB2 y el controlador DB2 JDBC de tipo 2 para Linux, UNIX y Windows proporcionan recursos completos de rastreo. Por omisin, estos recursos estn inhabilitados y no utilizan ningn recurso de proceso adicional. Cuando estn habilitados, los recursos de rastreo generan uno o ms archivos de registro de texto cada vez que una aplicacin accede al controlador adecuado (CLI de DB2 o el controlador DB2 JDBC de tipo 2). Estos archivos de registro proporcionan informacin detallada sobre: v el orden en que la aplicacin ha llamado a las funciones CLI o JDBC v el contenido de los parmetros de entrada y salida que se han pasado a las funciones CLI o JDBC y se han recibido de las mismas v los cdigos de retorno y los mensajes de error o de aviso generados por las funciones CLI o JDBC Nota: Este recurso de rastreo no se aplica al controlador JDBC de DB2 Universal.

206

Desarrollo de aplicaciones Java

El anlisis del archivo de rastreo de CLI de DB2 y JDBC de DB2 pueden beneficiar a los programadores de aplicaciones de varias maneras. En primer lugar, los errores sutiles de lgica del programa y de inicializacin de parmetros suelen ser evidentes en los rastreos. En segundo lugar, los rastreo de CLI de DB2 y JDBC de DB2 podran sugerir formas para ajustar mejor una aplicacin o las bases de datos a las que accede. Por ejemplo, si un rastreo de CLI de DB2 muestra una tabla que se consulta varias veces en un determinado grupo de atributos, se puede crear un ndice correspondiente a dichos atributos en la tabla para mejorar el rendimiento de la aplicacin. Finalmente, el anlisis de los archivos de rastreo de CLI de DB2 y JDBC de DB2 pueden ayudar a los programadores de aplicaciones a comprender el comportamiento de una interfaz o aplicacin de otro proveedor. Configuracin del rastreo para CLI de DB2 y JDBC de DB2: Los parmetros de configuracin de los recursos de rastreo de CLI de DB2 y JDBC de DB2 JDBC se leen del archivo de configuracin de CLI de DB2 db2cli.ini. Por omisin, este archivo se encuentra en la va de acceso \sqllib para la plataforma Windows y en la va de acceso /sqllib/cfg para la plataforma UNIX. Puede alterar temporalmente la va de acceso por omisin estableciendo la variable de entorno DB2CLIINIPATH. En la plataforma Windows, puede encontrarse un archivo db2cli.ini adicional en el directorio del perfil (o inicial) del usuario si hay fuentes de datos definidas por el usuario que se han definido mediante el Gestor de controladores de ODBC. Este archivo db2cli.ini alterar temporalmente el archivo por omisin. Para ver los parmetros de configuracin de rastreo actuales de db2cli.ini desde el procesador de lnea de mandatos, emita el siguiente mandato:
db2 GET CLI CFG FOR SECTION COMMON

Hay tres formas de modificar el archivo db2cli.ini para configurar los recursos de rastreo de CLI de DB2 y JDBC de DB2: v utilizar el Asistente de configuracin de DB2 , si est disponible v editar de forma manual el archivo db2cli.ini mediante un editor de texto v emitir el mandato UPDATE CLI CFG desde el procesador de lnea de mandatos Por ejemplo, el siguiente mandato, emitido desde el procesador de lnea de mandatos, actualiza el archivo db2cli.ini y habilita el recurso de rastreo JDBC:
db2 UPDATE CLI CFG FOR SECTION COMMON USING jdbctrace 1

Notas: 1. Normalmente, las opciones de configuracin de rastreo CLI de DB2 y JDBC de DB2 slo se leen desde el archivo de configuracin db2cli.ini en el momento en que se inicializa una aplicacin. Sin embargo, se puede utilizar una opcin de rastreo especial de db2cli.ini, TraceRefreshInterval, para indicar un intervalo en el que se deben volver a leer las opciones especficas de rastreo de CLI de DB2 desde el archivo db2cli.ini. 2. El recurso de rastreo de CLI de DB2 tambin se puede configurar de forma programtica, estableciendo el atributo de entorno SQL_ATTR_TRACE. Este valor alterar temporalmente los valores contenidos en el archivo db2cli.ini. Importante: Inhabilite los recursos de rastreo de CLI de DB2 y JDBC de DB2 cuando no los necesite. El rastreo innecesario puede reducir el rendimiento de la aplicacin y puede generar archivos de registro de

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

207

rastro no deseados. DB2 no suprime los archivos de rastreo generados y agrega la nueva informacin de rastreo a los archivos de rastreo existentes. Opciones de rastreo de CLI de DB2 y el archivo db2cli.ini: Cuando una aplicacin que utiliza el controlador de CLI de DB2 se empieza a ejecutar, el controlador comprueba la existencia de opciones del recurso de rastreo en la seccin [COMMON] del archivo db2cli.ini. Estas opciones de rastreo son palabras clave de rastreo especficas que se establecen en determinados valores en el archivo db2cli.ini bajo la seccin [COMMON]. Nota: Puesto que las palabras clave de rastreo de CLI de DB2 aparecen en la seccin [COMMON] del archivo db2cli.ini, sus valores se aplican a todas las conexiones de bases de datos a travs del controlador de CLI de DB2. Las palabras clave de rastreo de CLI de DB2 que se pueden definir son: v Trace v TraceComm v TraceErrImmediateTraceErrImmediate v TraceFileName v TraceFlush v TraceFlushOnErrorTraceFlushOnError v TraceLocks v TracePathName v TracePIDList v TracePIDTID v TraceRefreshInterval v TraceStmtOnly v TraceTime v TraceTimeStamp Nota: Las palabras clave de rastreo de CLI de DB2 slo se leen del archivo db2cli.ini una sola vez, cuando se inicializa la aplicacin, a no ser que est definida la palabra clave TraceRefreshInterval. Si esta palabra clave est definida, las palabras clave Trace y TracePIDList se vuelven a leer del archivo db2cli.ini de acuerdo con el intervalo especificado y se aplican, segn proceda, a la aplicacin que se est ejecutando en ese momento. A continuacin se muestra un ejemplo de configuracin de rastreo del archivo db2cli.ini en el que se utilizan estas palabras clave y valores de CLI de DB2:
[COMMON] trace=1 TraceFileName=\temp\clitrace.txt TraceFlush=1

Notas: 1. Las palabras clave de rastreo de CLI NO son sensibles a maysculas y minsculas. Sin embargo, puede que los valores de palabras claves correspondientes a nombres de archivos y de vas de acceso sean sensibles a maysculas y minsculas en algunos sistemas operativos (como en UNIX).

208

Desarrollo de aplicaciones Java

2. Si la palabra clave de rastreo de CLI de DB2 o su valor asociado en el archivo db2cli.ini no son vlidos, el recurso de rastreo de CLI de DB2 los pasar por alto y utilizar el valor por omisin correspondiente a dicha palabra clave de rastreo. Opciones de rastreo de JDBC de DB2 y el archivo db2cli.ini: Cuando empieza a ejecutarse una aplicacin que hace uso del Controlador JDBC de DB2 de tipo 2, el controlador tambin comprueba la existencia de opciones de recurso de rastreo en el archivo db2cli.ini. Al igual que sucede con las opciones de rastreo de CLI de DB2, las opciones de rastreo de JDBC de DB2 se especifican como pares palabra clave/valor situados en la seccin [COMMON] del archivo db2cli.ini. Nota: Puesto que las palabras clave de rastreo de JDBC de DB2 aparecen en la seccin [COMMON] del archivo db2cli.ini, sus valores se aplican a todas las conexiones de bases de datos a travs del controlador de JDBC de DB2 de tipo 2. Las palabras clave de rastreo de JDBC de DB2 que se pueden definir son: v JDBCTrace v JDBCTracePathName v JDBCTraceFlush JDBCTrace = 0 | 1 La palabra clave JDBCTrace controla si las otras palabras clave de rastreo de JDBC de DB2 tienen algn efecto en la ejecucin del programa. Si se establece JDBCTrace en su valor por omisin, 0, se inhabilita el recurso de rastreo de JDBC de DB2. Si se establece JDBCTrace en 1, se habilita el rastreo. Por s misma, la palabra clave JDBCTrace tiene poco efecto y no genera datos de rastreo a menos que tambin se especifique la palabra clave JDBCTracePathName. JDBCTracePathName = <va_de_rastreo_completamente_calificada> El valor de JDBCTracePathName es la va de acceso completamente calificada del directorio donde se escribe toda la informacin de rastreo de JDBC de DB2. El recurso de rastreo de JDBC de DB2 intenta generar un nuevo archivo de registro de rastreo cada vez que se ejecuta una aplicacin JDBC que hace uso del Controlador JDBC de DB2 de tipo 2. Si la aplicacin tiene varias hebras, se generar un archivo de registro de rastreo independiente para cada hebra. Se utiliza de forma automtica una concatenacin del ID del proceso de aplicacin, el nmero de secuencia de la hebra y una serie que identifica la hebra para nombrar los archivos de registro de rastreo. No hay ningn nombre de va de acceso por omisin en el que se graben los archivos de registro de salida de rastreo de JDBC de DB2. JDBCTraceFlush = 0 | 1 La palabra clave JDBCTraceFlush especifica la frecuencia con que la informacin de rastreo se escribe en el archivo de registro de rastreo de JDBC de DB2. Por omisin, JDBCTraceFlush tiene el valor 0 y cada archivo de registro de rastreo de JDBC de DB2 se mantiene abierto hasta que la aplicacin o hebra rastreada termina de forma normal. Si la aplicacin termina de forma anmala, se podra perder algo de la informacin de rastreo que no se escribi en el archivo de registro de rastreo.
Captulo 7. Diagnstico de problemas de JDBC y SQLJ

209

Para asegurar la integridad y plenitud de la informacin de rastreo que se escribe en el archivo de registro de rastreo de JDBC de DB2, la palabra clave JDBCTraceFlush se puede establecer en 1. Una vez que se han escrito las entradas de rastreo en el archivo de registro de rastreo, el controlador JDBC de DB2 cierra el archivo y lo reabre, agregando nuevas entradas al final del archivo. Esto garantiza que no se pierde informacin de rastreo. Nota: Cada operacin de cerrar y volver a abrir el archivo de registro de JDBC de DB2 genera una actividad general de entrada/salida significativa y puede reducir considerablemente el rendimiento de la aplicacin. A continuacin se muestra un ejemplo de configuracin de rastreo del archivo db2cli.ini en el que se utilizan estas palabras clave y valores de JDBC de DB2:
[COMMON] jdbctrace=1 JdbcTracePathName=\temp\jdbctrace\ JDBCTraceFlush=1

Notas: 1. Las palabras clave de rastreo de JDBC NO son sensibles a maysculas y minsculas. Sin embargo, puede que los valores de palabras claves correspondientes a nombres de archivos y de vas de acceso sean sensibles a maysculas y minsculas en algunos sistemas operativos (como en UNIX). 2. Si una palabra clave de rastreo de JDBC de DB2 o su valor asociado en el archivo db2cli.ini no son vlidos, el recurso de rastreo de JDBC de DB2 los pasa por alto y utiliza el valor por omisin correspondiente a esa palabra clave. 3. Al habilitar el rastreo de JDBC de DB2 no se habilita el rastreo de CLI de DB2. El Controlador JDBC de DB2 de tipo 2 depende del controlador CLI de DB2 para acceder a la base de datos. Por lo tanto, los programadores de Java podran tambin desear habilitar el rastreo de CLI de DB2 para obtener informacin adicional sobre cmo las aplicaciones interactan con la base de datos a travs de las distintas capas de software. Las opciones de rastreo de JDBC de DB2 y de CLI de DB2 son independientes entre s y se pueden especificar juntas en cualquier orden bajo la seccin [COMMON] del archivo db2cli.ini. Rastreo del controlador CLI de DB2 y rastreo del gestor de controladores de ODBC: Es importante comprender las diferencias entre un rastreo del gestor de controladores de ODBC y un rastreo del controlador de CLI de DB2. Un rastreo del gestor de controladores de ODBC muestra las llamadas de funciones de ODBC realizadas por una aplicacin ODBC a un gestor de controladores de ODBC. Por el contrario, un rastreo del controlador de CLI de DB2 muestra las llamadas de funciones realizadas por el gestor de controladores de ODBC al controlador de CLI de DB2 en nombre de la aplicacin. Un gestor de controladores de ODBC puede reenviar algunas llamadas de funciones directamente desde la aplicacin al controlador de CLI de DB2. Sin embargo, el gestor de controladores de ODBC puede tambin retrasar o evitar el reenvo de algunas llamadas de funciones al controlador. El gestor de controladores de ODBC podra tambin modificar los argumentos de funciones de la aplicacin o correlacionar funciones de la aplicacin con otras funciones antes de reenviar la llamada al controlador de CLI de DB2.

210

Desarrollo de aplicaciones Java

Las razones para la intervencin de llamadas de funciones de aplicacin por parte del gestor de controladores de ODBC incluyen: v Para las aplicaciones escritas con funciones de ODBC 2.0 que ya no se recomiendan en ODBC 3.0, las funciones antiguas se correlacionarn con funciones nuevas. v Los argumentos de funciones de ODBC 2.0 que ya no se recomiendan en ODBC 3.0 se correlacionarn con argumentos equivalentes de ODBC 3.0. v La biblioteca de cursores de Microsoft correlacionar llamadas como SQLExtendedFetch() con varias llamadas a SQLFetch() y a otras funciones soportadas para conseguir el mismo resultado final. v La agrupacin de conexiones del gestor de controladores de ODBC generalmente diferir las peticiones SQLDisconnect() (o las evitar si la conexin se reutiliza). Por esta y por otras razones, los programadores de aplicaciones podran considerar el rastreo del gestor de controladores de ODBC un complemento til al rastreo del controlador de CLI de DB2. Para obtener ms informacin sobre cmo capturar e interpretar rastreo del gestor de controladores de ODBC, consulte la documentacin del gestor de controladores de ODBC. En las plataformas Windows, consulte el manual Microsoft ODBC 3.0 Software Development Kit and Programmers Reference, tambin disponible en lnea en: http://www.msdn.microsoft.com/. Controlador CLI de DB2, Controlador JDBC de DB2 de tipo 2 y rastreos de DB2: Internamente, el Controlador JDBC de DB2 de Tipo 2 hace uso del controlador CLI de DB2 para acceder a la base de datos. Por ejemplo, el mtodo getConnection() de Java lo correlaciona internamente el controlador JDBC de DB2 de tipo 2 con la funcin SQLConnect() de CLI de DB2. Como resultado, el rastreo de CLI de DB2 puede ser un complemento til al rastreo de JDBC de DB2 para los programadores de Java. El controlador CLI de DB2 utiliza muchas funciones internas y especficas de DB2 para realizar su trabajo. Estas llamadas de funcin internas y especficas de DB2 se registran en el recurso de rastreo de DB2. Los programadores de aplicaciones no encontrarn tiles los rastreos de DB2, puesto que slo estn diseados para ayudar al Servicio de IBM en la determinacin y resolucin de problemas. Rastreos de CLI de DB2 y de JDBC de DB2, y procedimientos almacenados de CLI o Java: En todas las plataformas de estacin de trabajo, se pueden utilizar los recursos de rastreo de CLI de DB2 y de JDBC de DB2 para realizar el rastreo de procedimientos almacenados de CLI de DB2 y de JDBC de DB2. La mayor parte de la informacin y las instrucciones sobre rastreo de CLI de DB2 y de JDBC de DB2 proporcionada en anteriores secciones es genrica y se aplica por igual a aplicaciones y a procedimientos almacenados. Sin embargo, a diferencia de las aplicaciones, que son clientes de un servidor de bases de datos (y generalmente se ejecutan en una mquina distinta de la del servidor de bases de datos), los procedimientos almacenados se ejecutan en el servidor de bases de datos. Por lo tanto, debe seguir los siguientes pasos adicionales cuando efecte un rastreo de procedimientos almacenados de CLI de DB2 o de JDBC de DB2:

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

211

v Asegrese de que las opciones de palabras clave de rastreo estn especificadas en el archivo db2cli.ini del servidor DB2. v Si la palabra clave TraceRefreshInterval no tiene un valor positivo distinto de cero, asegrese de que todas las palabras clave estn configuradas correctamente antes del inicio de la base de datos (es decir, cuando se emite el mandato db2start). Si se cambian los valores de rastreo mientras se est ejecutando el servidor de bases de datos se pueden producir resultados inesperados. Por ejemplo, si se cambia el valor de TracePathName mientras se est ejecutando el servidor, la prxima vez que se ejecute un procedimiento almacenado, algunos archivos de rastreo se podran escribir en la nueva va de acceso, mientras que otros se escribirn en la va de acceso original. Para asegurar la coherencia, reinicie el servidor cada vez que se modifique una palabra clave de rastreo que no sea Trace ni TracePIDList. Conceptos relacionados: v Archivos de rastreo de CLI y JDBC en la pgina 212 v db2cli.ini initialization file en Call Level Interface Guide and Reference, Volume 1 Informacin relacionada: v CLI/ODBC configuration keywords listing by category en Call Level Interface Guide and Reference, Volume 1 v db2trc - Mandato Rastrear en Consulta de mandatos v Mandato GET CLI CONFIGURATION en Consulta de mandatos v Miscellaneous variables en Performance Guide v SQLSetEnvAttr function (CLI) - Set environment attribute en Call Level Interface Guide and Reference, Volume 2 v Mandato UPDATE CLI CONFIGURATION en Consulta de mandatos

Archivos de rastreo de CLI y JDBC


Las aplicaciones que acceden a controladores de CLI de DB2 o JDBC de DB2 pueden utilizar los recursos de rastreo de CLI de DB2 o JDBC de DB2. Estos programas de utilidad registran todas las llamadas de funciones realizadas por los controladores de CLI de DB2 o JDBC de DB2 en un archivo de registro que resulta til en la determinacin de problemas. Este tema describe cmo acceder a estos archivos de registro que generan los recursos de rastreo y cmo interpretarlos: v Ubicacin de los archivos de rastreo de CLI y JDBC v Interpretacin del archivo de rastreo de CLI en la pgina 214 v Interpretacin del archivo de rastreo de JDBC en la pgina 218 Ubicacin de los archivos de rastreo de CLI y JDBC: Si se ha utilizado la palabra clave TraceFileName en el archivo db2cli.ini para especificar un nombre de archivo completamente calificado, el archivo de registro de rastreo de CLI de DB2 estar en la ubicacin especificada. Si se ha especificado un nombre de archivo relativo para el archivo de registro de rastreo de CLI de DB2, la ubicacin de dicho archivo depender de lo que el sistema operativo considere que es la va de acceso actual de la aplicacin. Nota: Si el usuario que ejecuta la aplicacin no tiene suficiente autoridad para grabar en el archivo de registro de rastreo de la va de acceso especificada, no se generar ningn archivo ni se proporcionar ningn aviso ni error.

212

Desarrollo de aplicaciones Java

Si se ha utilizado la palabra clave TracePathName o JDBCTracePathName, o ambas, en el archivo db2cli.ini para especificar directorios completamente calificados, los archivos de registro de rastreo de CLI de DB2 y JDBC de DB2 estarn en la ubicacin especificada. Si se ha especificado un nombre de directorio relativo para cualquiera de estos directorios de rastreo, o para ambos, el sistema operativo determinar su ubicacin segn lo que considere que es la va de acceso actual de la aplicacin. Nota: Si el usuario que ejecuta la aplicacin no tiene suficiente autoridad para grabar archivos de rastreo en la va de acceso especificada, no se generar ningn archivo ni se proporcionar ningn aviso ni error. Si la va de acceso de rastreo especificada no existe, no se crear. Los recursos de rastreo de CLI de DB2 y JDBC de DB2 utilizan de forma automtica el ID de proceso y nmero de secuencia de hebra de la aplicacin para nombrar los archivos de registro de rastreo cuando se han definido las palabras clave TracePathName y JDBCTracePathName. Por ejemplo, un rastreo de CLI de DB2 de una aplicacin con tres hebras puede generar los siguientes archivos de registro de rastreo de CLI de DB2: 100390.0, 100390.1, 100390.2. De forma similar, un rastreo de JDBC de DB2 de una aplicacin Java con dos hebras puede generar los siguientes archivos de registro de rastreo de JDBC: 7960main.trc, 7960Thread-1.trc. Nota: Si el directorio de rastreo contiene archivos de registro de rastreo antiguos y nuevos, se puede utilizar la informacin de indicacin horaria y fecha de los archivos para localizar los archivos de rastreo ms recientes. Si parece que no se ha creado ningn archivo de salida de rastreo de CLI de DB2 o JDBC de DB2: v Compruebe que las palabras clave de configuracin de rastreo estn correctamente establecidas en el archivo db2cli.ini. Una forma rpida de hacerlo consiste en emitir el mandato db2 GET CLI CFG FOR SECTION COMMON desde el procesador de lnea de mandatos. v Asegrese de que la aplicacin se vuelve a iniciar despus de actualizar el archivo db2cli.ini. En concreto, los recursos de rastreo de CLI de DB2 y JDBC de DB2 se vuelven a inicializar durante el arranque de la aplicacin. Una vez inicializado, el recurso de rastreo de JDBC de DB2 no se puede volver a configurar. El recurso de rastreo de CLI de DB2 se puede reconfigurar durante la ejecucin, pero slo si se ha especificado debidamente la palabra clave TraceRefreshInterval antes del inicio de la aplicacin. Nota: Slo las palabras clave Trace y TracePIDList de CLI de DB2 se pueden reconfigurar durante la ejecucin. Los cambios realizados en otras palabras clave de CLI de DB2, incluida TraceRefreshInterval, no tienen ningn efecto si no se reinicia la aplicacin. v Si la palabra clave TraceRefreshInterval se ha especificado antes del inicio de la aplicacin y la palabra clave Trace se ha establecido inicialmente en 0, asegrese de que ha transcurrido suficiente tiempo para que el recurso de rastreo de CLI de DB2 haya podido volver a leer el valor de la palabra clave Trace. v Si se utiliza la palabra clave TracePathName o JDBCTracePathName, o ambas, para especificar directorios de rastreo, asegrese de que dichos directorios existen antes de iniciar la aplicacin. v Asegrese de que la aplicacin tiene acceso de grabacin en el archivo de registro de rastreo o en el directorio de rastreo especificados.
Captulo 7. Diagnstico de problemas de JDBC y SQLJ

213

v Compruebe la variable de entorno DB2CLIINIPATH. Si est establecida, los recursos de rastreo de CLI de DB2 y JDBC de DB2 esperan que el archivo db2cli.ini est en la ubicacin especificada por esta variable. v Si la aplicacin utiliza ODBC como interfaz con el controlador de CLI de DB2, compruebe que se ha llamado satisfactoriamente a una de estas funciones: SQLConnect(), SQLDriverConnect() o SQLBrowseConnect(). No se grabar ninguna entrada en los archivos de registro de rastreo de CLI de DB2 hasta que se haya establecido satisfactoriamente una conexin con la base de datos. Interpretacin del archivo de rastreo de CLI: Los rastreos de CLI de DB2 siempre empiezan con una cabecera que identifica el ID de proceso y el ID de hebra de la aplicacin que ha generado el rastreo, la hora en que ha comenzado el rastreo e informacin especfica del producto, como el nivel de build de DB2 y la versin del controlador de CLI de DB2. Por ejemplo:
1 2 3 4 5 6 [ [ [ [ [ [ Process: 1227, Thread: 1024 ] Date, Time: 01-27-2002 13:46:07.535211 ] Product: QDB2/LINUX 7.1.0 ] Level Identifier: 02010105 ] CLI Driver Version: 07.01.0000 ] Informational Tokens: "DB2 v7.1.0","n000510","" ]

Nota: En los ejemplos de rastreo que se muestran en esta seccin se han aadido nmeros de lnea a la izquierda del rastreo. Estos nmeros de lnea se han aadido para clarificar la explicacin y no aparecen en el rastreo de CLI de DB2 real. Inmediatamente despus de la cabecera del rastreo, suele haber varias entradas de rastreo relacionadas con el entorno y la asignacin e inicializacin del descriptor de contexto de la conexin. Por ejemplo:
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SQLAllocEnv( phEnv=&bffff684 ) > Time elapsed - +9.200000E-004 seconds SQLAllocEnv( phEnv=0:1 ) < SQL_SUCCESS Time elapsed - +7.500000E-004 seconds SQLAllocConnect( hEnv=0:1, phDbc=&bffff680 ) > Time elapsed - +2.334000E-003 seconds SQLAllocConnect( phDbc=0:1 ) < SQL_SUCCESS Time elapsed - +5.280000E-004 seconds SQLSetConnectOption( hDbc=0:1, fOption=SQL_ATTR_AUTOCOMMIT, vParam=0 ) > Time elapsed - +2.301000E-003 seconds SQLSetConnectOption( ) < SQL_SUCCESS Time elapsed - +3.150000E-004 seconds SQLConnect( hDbc=0:1, szDSN="SAMPLE", cbDSN=-3, szUID="", cbUID=-3, szAuthStr="", cbAuthStr=-3 ) > Time elapsed - +7.000000E-005 seconds ( DBMS NAME="DB2/LINUX", Version="07.01.0000", Fixpack="0x22010105" ) SQLConnect( ) < SQL_SUCCESS ( DSN=""SAMPLE"" ) ( UID=" " ) ( PWD="*" ) Time elapsed - +5.209880E-001 seconds

214

Desarrollo de aplicaciones Java

En el ejemplo de rastreo anterior, observe que hay dos entradas para cada llamada de funcin de CLI de DB2 (por ejemplo, lneas 19-21 y 22-26 para la llamada de funcin SQLConnect()). Esto siempre es as en los rastreos de CLI de DB2. La primera entrada muestra los valores de los parmetros de entrada que se han pasado a la llamada de funcin, mientras que la segunda entrada muestra los valores de parmetros de salida de funcin y el cdigo de retorno que se ha devuelto a la aplicacin. El ejemplo de rastreo anterior muestra que la funcin SQLAllocEnv() ha asignado satisfactoriamente un descriptor de contexto de entorno ( phEnv=0:1 ) en la lnea 9. Este descriptor de contexto se ha pasado a la funcin SQLAllocConnect(), la cual ha asignado satisfactoriamente un descriptor de contexto de conexin de base de datos ( phDbc=0:1 ) en la lnea 13. Luego, se ha utilizado la funcin SQLSetConnectOption() para establecer el atributo SQL_ATTR_AUTOCOMMIT de la conexin de phDbc=0:1 en SQL_AUTOCOMMIT_OFF ( vParam=0 ) en la lnea 15. Finalmente, se ha llamado a la funcin SQLConnect() para conectar con la base de datos de destino ( SAMPLE ) en la lnea 19. En la entrada de rastreo de entrada de la funcin SQLConnect(), en la lnea 21, se incluye el nivel de build y de FixPak del servidor de la base de datos de destino. Otra informacin que tambin puede aparecen en esta entrada de rastreo incluye palabras claves de la serie de conexin de entrada y las pginas de cdigos del cliente y del servidor. Por ejemplo, supongamos que tambin apareciera la siguiente informacin en la entrada de rastreo de SQLConnect():
( Application Codepage=819, Database Codepage=819, Char Send/Recv Codepage=819, Graphic Send/Recv Codepage=819, Application Char Codepage=819, Application Graphic Codepage=819 )

Esto significara que la aplicacin y el servidor de bases de datos estaran utilizando la misma pgina de cdigos (819). La entrada de rastreo de retorno de la funcin SQLConnect() tambin contiene informacin de conexin importante (lneas 24-26 en el rastreo de ejemplo anterior). Informacin adicional que puede aparecer en la entrada de retorno incluye los valores de la palabra clave PATCH1 o PATCH2 que se aplican a la conexin. Por ejemplo, si se hubiera especificado PATCH2=27,28 en el archivo db2cli.ini bajo la seccin COMMON, tambin aparecera la siguiente lnea en la entrada de retorno de SQLConnect():
( PATCH2="27,28" )

Despus de las entradas de rastreo relacionadas con el entorno y con la conexin se encuentran las entradas de rastreo relacionadas con sentencias. Por ejemplo:
27 28 29 30 31 32 33 34 35 SQLAllocStmt( hDbc=0:1, phStmt=&bffff684 ) > Time elapsed - +1.868000E-003 seconds SQLAllocStmt( phStmt=1:1 ) < SQL_SUCCESS Time elapsed - +6.890000E-004 seconds SQLExecDirect( hStmt=1:1, pszSqlStr="CREATE TABLE GREETING (MSG VARCHAR(10))", cbSqlStr=-3 ) > Time elapsed - +2.863000E-003 seconds ( StmtOut="CREATE TABLE GREETING (MSG VARCHAR(10))" ) SQLExecDirect( ) < SQL_SUCCESS Time elapsed - +2.387800E-002 seconds

En el ejemplo de rastreo anterior, se ha utilizado el descriptor de contexto de la conexin de base de datos ( phDbc=0:1 ) para asignar un descriptor de contexto de
Captulo 7. Diagnstico de problemas de JDBC y SQLJ

215

sentencia ( phStmt=1:1 ) en la lnea 29. Luego se ha ejecutado una sentencia de SQL no preparada en dicho descriptor de contexto de sentencia en la lnea 31. Si se ha definido la palabra clave TraceComm=1 en el archivo db2cli.ini, las entradas de rastreo de la llamada de funcin SQLExecDirect() mostrarn informacin adicional sobre la comunicacin cliente-servidor, de esta manera:
SQLExecDirect( hStmt=1:1, pszSqlStr="CREATE TABLE GREETING (MSG VARCHAR(10))", cbSqlStr=-3 ) > Time elapsed - +2.876000E-003 seconds ( StmtOut="CREATE TABLE GREETING (MSG VARCHAR(10))" ) sqlccsend( sqlccsend( sqlccsend( sqlccrecv( sqlccrecv( ulBytes - 232 ) Handle - 1084869448 ) ) - rc - 0, time elapsed - +1.150000E-004 ) ulBytes - 163 ) - rc - 0, time elapsed - +2.243800E-002 Time elapsed - +2.384900E-002 seconds

SQLExecDirect( ) < SQL_SUCCESS

Observe la informacin adicional de llamada de funciones sqlccsend() y sqlccrecv() de esta entrada de rastreo. La informacin de la llamada sqlccsend() revela la cantidad de datos que se han enviado del cliente al servidor, cunto ha durado la transmisin y el xito de dicha transmisin ( 0 = SQL_SUCCESS ). Luego la informacin de la llamada sqlccrecv() revela el tiempo que el cliente ha esperado una respuesta del servidor y la cantidad de datos incluidos en la respuesta. A menudo aparecern varios descriptores de contexto de sentencias en el rastreo de CLI de DB2. Si presta atencin al identificador del descriptor de contexto de la sentencia, puede seguir fcilmente el mtodo de ejecucin de un descriptor de contexto de sentencia de forma independiente de los dems descriptores de contexto de sentencia que aparecen en el rastreo. Los mtodos de ejecucin de sentencias que aparecen en el rastreo de CLI de DB2 suelen ser ms complicados que el del ejemplo anterior. Por ejemplo:
36 37 38 39 40 41 42 43 44 45 SQLAllocStmt( hDbc=0:1, phStmt=&bffff684 ) > Time elapsed - +1.532000E-003 seconds SQLAllocStmt( phStmt=1:2 ) < SQL_SUCCESS Time elapsed - +6.820000E-004 seconds SQLPrepare( hStmt=1:2, pszSqlStr="INSERT INTO GREETING VALUES ( ? )", cbSqlStr=-3 ) > Time elapsed - +2.733000E-003 seconds ( StmtOut="INSERT INTO GREETING VALUES ( ? )" ) SQLPrepare( ) < SQL_SUCCESS Time elapsed - +9.150000E-004 seconds

46 47 48 49 50 51

SQLBindParameter( hStmt=1:2, iPar=1, fParamType=SQL_PARAM_INPUT, fCType=SQL_C_CHAR, fSQLType=SQL_CHAR, cbColDef=14, ibScale=0, rgbValue=&080eca70, cbValueMax=15, pcbValue=&080eca4c ) > Time elapsed - +4.091000E-003 seconds SQLBindParameter( ) < SQL_SUCCESS Time elapsed - +6.780000E-004 seconds

SQLExecute( hStmt=1:2 ) > Time elapsed - +1.337000E-003 seconds ( iPar=1, fCType=SQL_C_CHAR, rgbValue="Hello World!!!", pcbValue=14, piIndicatorPtr=14 )

216

Desarrollo de aplicaciones Java

52 53

SQLExecute( ) < SQL_ERROR

Time elapsed - +5.951000E-003 seconds

En el ejemplo de rastreo anterior, se ha utilizado el descriptor de contexto de conexin de base de datos ( phDbc=0:1 ) para asignar un segundo descriptor de contexto de sentencia ( phStmt=1:2 ) en la lnea 38. Luego se ha preparado una sentencia de SQL con un marcador de parmetros en dicho descriptor de contexto de sentencia en la lnea 40. Luego, se ha vinculado un parmetro de entrada ( iPar=1 ) del tipo de SQL adecuado ( SQL_CHAR ) con el marcador de parmetros en la lnea 45. Finalmente, se ha ejecutado la sentencia en la lnea 49. Observe que tanto el contenido como la longitud del parmetro de entrada ( rgbValue=Hello World!!!, pcbValue=14 ) se muestran en el rastreo en la lnea 51. La funcin SQLExecute() falla en la lnea 52. Si la aplicacin llama a una funcin de CLI de DB2 de diagnstico, como SQLError(), para diagnosticar la causa del error, dicha causa aparecer en el rastreo. Por ejemplo:
54 55 56 SQLError( hEnv=0:1, hDbc=0:1, hStmt=1:2, pszSqlState=&bffff680, pfNativeError=&bfffee78, pszErrorMsg=&bffff280, cbErrorMsgMax=1024, pcbErrorMsg=&bfffee76 ) > Time elapsed - +1.512000E-003 seconds SQLError( pszSqlState="22001", pfNativeError=-302, pszErrorMsg="[IBM][CLI Driver][DB2/LINUX] SQL0302N El valor de una variable del lenguaje principal de la sentencia EXECUTE u OPEN es demasiado alto para su uso correspondiente. SQLSTATE=22001", pcbErrorMsg=157 ) < SQL_SUCCESS Time elapsed - +8.060000E-004 seconds

57

El mensaje de error que se devuelve en la lnea 56 contiene el cdigo de error nativo de DB2 que se ha generado ( SQL0302N ), el sqlstate correspondiente a dicho cdigo ( SQLSTATE=22001 ) y una breve descripcin del error. En este ejemplo, el origen del error es evidente: en la lnea 49, la aplicacin intenta insertar una serie de 14 caracteres en una columna definida como VARCHAR(10) en la lnea 31. Si la aplicacin no responde a un cdigo de retorno de error o de aviso de una funcin de CLI de DB2 llamando a una funcin de diagnstico como SQLError(), el mensaje de aviso o de error se tiene que grabar igualmente en el rastreo de CLI de DB2. Sin embargo, es posible que la ubicacin de dicho mensaje en el rastreo no est cerca de donde se ha producido realmente el error. Adems, el rastreo indicar que la aplicacin no ha recuperado el mensaje de error o de aviso. Por ejemplo, si no se recupera, es posible que el mensaje de error del ejemplo anterior no aparezca hasta ms adelante y parezca que no est relacionado con la llamada de funcin de CLI de DB2, como en el siguiente caso:
SQLDisconnect( hDbc=0:1 ) > Time elapsed - +1.501000E-003 seconds sqlccsend( ulBytes - 72 ) sqlccsend( Handle - 1084869448 ) sqlccsend( ) - rc - 0, time elapsed - +1.080000E-004 sqlccrecv( ) sqlccrecv( ulBytes - 27 ) - rc - 0, time elapsed - +1.717950E-001 ( Unretrieved error message="SQL0302N El valor de una variable del lenguaje principal en la sentencia EXECUTE u OPEN es demasiado alto para su uso correspondiente. SQLSTATE=22001" )

Captulo 7. Diagnstico de problemas de JDBC y SQLJ

217

SQLDisconnect( ) < SQL_SUCCESS

Time elapsed - +1.734130E-001 seconds

La parte final de un rastreo de CLI de DB2 debe mostrar que la aplicacin libera la conexin de base de datos y los descriptores de contexto de entorno que haba asignado anteriormente en el rastreo. Por ejemplo:
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 SQLTransact( hEnv=0:1, hDbc=0:1, fType=SQL_ROLLBACK ) > Time elapsed - +6.085000E-003 seconds ( ROLLBACK=0 ) SQLTransact( ) < SQL_SUCCESS Time elapsed - +2.220750E-001 seconds

SQLDisconnect( hDbc=0:1 ) > Time elapsed - +1.511000E-003 seconds SQLDisconnect( ) < SQL_SUCCESS Time elapsed - +1.531340E-001 seconds

SQLFreeConnect( hDbc=0:1 ) > Time elapsed - +2.389000E-003 seconds SQLFreeConnect( ) < SQL_SUCCESS Time elapsed - +3.140000E-004 seconds

SQLFreeEnv( hEnv=0:1 ) > Time elapsed - +1.129000E-003 seconds SQLFreeEnv( ) < SQL_SUCCESS Time elapsed - +2.870000E-004 seconds

Interpretacin del archivo de rastreo de JDBC: Los rastreos de JDBC de DB2 siempre comienzan con una cabecera que contiene informacin importante del sistema, como valores de variables clave de entorno, el nivel de SDK para Java o JRE, el nivel del controlador de JDBC de DB2 y el nivel del build de DB2. Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ======================================================== | Trace beginning on 2002-1-28 7:21:0.19 ======================================================== System Properties: -----------------user.language = en java.home = c:\Program Files\SQLLIB\java\jdk\bin\.. java.vendor.url.bug = awt.toolkit = sun.awt.windows.WToolkit file.encoding.pkg = sun.io java.version = 1.1.8 file.separator = \ line.separator = user.region = US file.encoding = Cp1252 java.compiler = ibmjitc java.vendor = IBM Corporation user.timezone = EST user.name = db2user os.arch = x86 java.fullversion = JDK 1.1.8 IBM build n118p-19991124 (JIT ibmjitc V3.5-IBMJDK1.1-19991124) os.name = Windows NT java.vendor.url = http://www.ibm.com/ user.dir = c:\Program Files\SQLLIB\samples\java

218

Desarrollo de aplicaciones Java

25 26 27 28 29 30

java.class.path = .:C:\Program Files\SQLLIB\lib;C:\Program Files\SQLLIB\java; C:\Program Files\SQLLIB\java\jdk\bin\ java.class.version = 45.3 os.version = 5.0 path.separator = ; user.home = C:\home\db2user ----------------------------------------

Nota: En los ejemplos de rastreo que se muestran en esta seccin se han aadido nmeros de lnea a la izquierda del rastreo. Estos nmeros de lnea se han aadido para clarificar la explicacin y no aparecen en el rastreo de JDBC de DB2 real. Inmediatamente despus de la cabecera de rastreo, suele haber varias entradas de rastreo relacionadas con la inicializacin del entorno JDBC y el establecimiento de conexin de base de datos. Por ejemplo:
31 32 33 34 35 36 37 38 39 40 41 jdbc.app.DB2Driver > DB2Driver() (2002-1-28 7:21:0.29) | Loaded db2jdbc from java.library.path jdbc.app.DB2Driver < DB2Driver() [Time Elapsed = 0.01] DB2Driver - connect(jdbc:db2:sample) jdbc.app.DB2ConnectionTrace > connect( sample, info, db2driver, 0, false ) (2002-1-28 7:21:0.59) | 10: connectionHandle = 1 jdbc.app.DB2ConnectionTrace < connect() [Time Elapsed = 0.16] jdbc.app.DB2ConnectionTrace > DB2Connection (2002-1-28 7:21:0.219) | source = sample | Connection handle = 1 jdbc.app.DB2ConnectionTrace < DB2Connection

En el ejemplo de rastreo anterior, se ha efectuado una peticin de carga del controlador de JDBC de DB2 en la lnea 31. Esta peticin ha resultado satisfactoria, tal como se notifica en la lnea 33. El recurso de rastreo de JDBC de DB2 utiliza clases Java especficas para capturar la informacin de rastreo. En el ejemplo de rastreo anterior, una de estas clases de rastreo, DB2ConnectionTrace, ha generado dos entradas de rastreo situadas en las lneas 35-37 y 38-41. La lnea 35 muestra que se invoca el mtodo connect() y los parmetros de entrada de dicha llamada de mtodo. La lnea 37 muestra que la llamada al mtodo connect() ha resultado satisfactoria, mientras que la lnea 36 muestra el parmetro de salida de dicha llamada ( Connection handle = 1 ). Despus de las entradas relacionadas con la conexin se suelen encontrar las entradas relacionadas con sentencias en el rastreo de JDBC. Por ejemplo:
42 43 44 45 46 47 48 49 50 jdbc.app.DB2ConnectionTrace > createStatement() (2002-1-28 7:21:0.219) | Connection handle = 1 | jdbc.app.DB2StatementTrace > DB2Statement( con, 1003, 1007 ) (2002-1-28 7:21:0.229) | jdbc.app.DB2StatementTrace < DB2Statement() [Time Elapsed = 0.0] | jdbc.app.DB2StatementTrace > DB2Statement (2002-1-28 7:21:0.229) | | Statement handle = 1:1 | jdbc.app.DB2StatementTrace < DB2Statement jdbc.app.DB2ConnectionTrace < createStatement - Time Elapsed = 0.01 jdbc.app.DB2StatementTrace > executeQuery(SELECT * FROM EMPLOYEE WHERE empno = 000010) (2002-1-28 7:21:0.269)
Captulo 7. Diagnstico de problemas de JDBC y SQLJ

219

51 52 52 53 54 55 56 57 58 59

| Statement handle = 1:1 | jdbc.app.DB2StatementTrace > execute2( SELECT * FROM EMPLOYEE WHERE empno = 000010 ) (2002-1-28 7:21:0.269) | | jdbc.DB2Exception > DB2Exception() (2002-1-28 7:21:0.729) | | | 10: SQLError = [IBM][CLI Driver][DB2/NT] SQL0401N Los tipos de datos de los operandos de la operacin "=" no son compatibles. SQLSTATE=42818 | | | SQLState = 42818 | | | SQLNativeCode = -401 | | | LineNumber = 0 | | | SQLerrmc = = | | jdbc.DB2Exception < DB2Exception() [Time Elapsed = 0.0] | jdbc.app.DB2StatementTrace < executeQuery - Time Elapsed = 0.0

En las lneas 42 y 43, la clase DB2ConnectionTrace ha notificado que se ha llamado al mtodo de JDBC createStatement() con el descriptor de contexto de conexin 1. Dentro de dicho mtodo, se ha llamado al mtodo interno DB2Statement(), tal como indica otra clase del recurso de rastreo de JDBC de DB2, DB2StatementTrace. Observe que esta llamada al mtodo interno aparece anidada en la entrada de rastreo. Las lneas 47-49 muestran que los mtodos han resultado satisfactorios y que se ha asignado el descriptor de contexto de sentencia 1:1. En la lnea 50, se ha realizado una llamada al mtodo de consulta de SQL en la sentencia 1:1, pero la llamada ha generado una excepcin en la lnea 52. El mensaje de error se notifica en la lnea 53 y contiene el cdigo de error nativo de DB2 que se ha generado ( SQL0401N ), el sqlstate correspondiente a dicho cdigo ( SQLSTATE=42818 ) y una breve descripcin del error. En este ejemplo, el error se debe a que la columna EMPLOYEE.EMPNO est definida como CHAR(6) y no como un valor entero, tal como se supone en la consulta. Conceptos relacionados: v Recurso de rastreo de CLI/ODBC/JDBC en la pgina 206 Informacin relacionada: v Miscellaneous variables en Performance Guide v Trace CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1 v TraceComm CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1 v TraceFileName CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1 v TracePathName CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1 v TracePIDList CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1 v TraceRefreshInterval CLI/ODBC configuration keyword en Call Level Interface Guide and Reference, Volume 1

220

Desarrollo de aplicaciones Java

Captulo 8. Java 2 Platform, Enterprise Edition


Las secciones siguientes describen Java 2 Platform, Enterprise Edition (J2EE). v Visin general de Java 2 Platform Enterprise Edition v Java 2 Platform Enterprise Edition en la pgina 222 v Contenedores de Java 2 Platform Enterprise Edition en la pgina 222 v Servidor Java 2 Platform Enterprise Edition en la pgina 223 v Requisitos de la base de datos de Java 2 Platform Enterprise Edition en la pgina 223 v Java Naming and Directory Interface (JNDI) en la pgina 223 v Gestin de transacciones Java en la pgina 224 v Ejemplo de una transaccin distribuida que utiliza mtodos de JTA en la pgina 225 v Enterprise Java Beans en la pgina 230

Visin general de Java 2 Platform Enterprise Edition


En el entorno empresarial global actual, las organizaciones tienen que ampliar su alcance, reducir sus costes y reducir sus tiempos de respuesta, proporcionando servicios a los que puedan acceder fcilmente sus clientes, empleados, proveedores y otros socios empresariales. Estos servicios deben tener las siguientes caractersticas: v Altamente disponibles, para ajustarse a los requisitos del entorno empresarial global v Seguros, para proteger la privacidad de los usuarios y la integridad de la empresa v Fiables y escalables, de modo que las transacciones empresariales resulten precisas y se procesen con rapidez En la mayora de los casos, estos servicios se suministran con la ayuda de aplicaciones de varios enlaces en las que cada enlace tiene un objetivo especfico. Java 2 Platform Enterprise Edition (J2EE) reduce el coste y la complejidad de desarrollar estos servicios de varios niveles, lo que da lugar a servicios que se pueden desplegar rpidamente y se pueden mejorar fcilmente segn los requisitos de la empresa. J2EE consigue estas ventajas definiendo una arquitectura estndar que se suministra como los siguientes elementos: v J2EE Application Model, un modelo de aplicacin estndar para desarrollar servicios de cliente ligero de varios niveles v J2EE Platform, una plataforma estndar para albergar aplicaciones de J2EE v J2EE Compatibility Test Suite para verificar que un producto de la plataforma J2EE cumple con el estndar de dicha plataforma v J2EE Reference Implementation para demostrar las funciones de J2EE y para proporcionar una definicin operativa de la plataforma J2EE Conceptos relacionados: v Java 2 Platform Enterprise Edition en la pgina 222

Copyright IBM Corp. 2006

221

Java 2 Platform Enterprise Edition


Java 2 Platform Enterprise Edition (J2EE) proporciona el entorno de tiempo de ejecucin para alojar aplicaciones J2EE. El entorno de tiempo de ejecucin define cuatro tipos de componentes de aplicacin a los que un producto J2EE debe dar soporte: v Los clientes de aplicaciones son programas de lenguaje de programacin Java que suelen ser programas GUI que se ejecutan en un sistema de escritorio. Los clientes de aplicaciones tienen acceso a todas las funciones del enlace medio de J2EE. v Los componentes applets y GUI que normalmente se ejecutan en un navegador web pero que se pueden ejecutar en otras aplicaciones o dispositivos que den soporte al modelo de programacin de applets. v Los servlets, JavaServer Pages (JSP), filtros y receptores de sucesos de la web que se suelen ejecutar en un navegador web y que pueden responder a peticiones HTTP procedentes de clientes web. Los servlets, JSP y filtros se pueden utilizar para generar pginas HTML que constituyen la interfaz de usuario de una aplicacin. Tambin se pueden utilizar para generar XML o datos en otro formato que consumen otros componentes de la aplicacin. Los servlets, las pginas creadas con tecnologa JSP, los filtros y los receptores de sucesos de la web reciben conjuntamente en esta especificacin el nombre componentes de la web. Las aplicaciones web constan de componentes de la web y de otros datos como pginas HTML. v Los componentes Enterprise JavaBeans (EJB) se ejecutan en un entorno gestionado que da soporte a transacciones. Los Enterprise Beans suelen contener la lgica empresarial correspondiente a una aplicacin J2EE. Los componentes de aplicaciones listados anteriormente se pueden dividir en tres categoras, segn el modo en que se pueden desplegar y gestionar: v Componentes que se despliegan, gestionan y ejecutan en un servidor J2EE. v Componentes que se despliegan y gestionan en un servidor J2EE pero que se cargan en una mquina cliente y se ejecutan en la misma. v Componentes cuyo despliegue y gestin no estn completamente definidos por esta especificacin. Los clientes de aplicaciones pueden encontrarse en esta categora. El soporte de tiempo de ejecucin correspondiente a estos componentes se proporciona mediante contenedores. Conceptos relacionados: v Enterprise Java Beans en la pgina 230 v Contenedores de Java 2 Platform Enterprise Edition en la pgina 222

Contenedores de Java 2 Platform Enterprise Edition


Un contenedor proporciona una vista federada de las API subyacentes de Java 2 Platform Enterprise Edition (J2EE) a los componentes de la aplicacin. Un producto J2EE tpico proporcionar un contenedor para cada tipo de componente de aplicacin: contenedor de clientes de la aplicacin, contenedor de applets, contenedor de web y contenedor de Enterprise Beans. Las herramientas de contenedor tambin comprenden los formatos de archivo para empaquetar los componentes de la aplicacin para su despliegue.

222

Desarrollo de aplicaciones Java

La especificacin necesita que estos contenedores proporcionen un entorno de tiempo de ejecucin compatible con Java. Esta especificacin define un conjunto de servicios estndares a los que debe dar soporte cada producto J2EE. Estos servicios estndar son: v Servicio HTTP v Servicio HTTPS v API de transacciones Java v Mtodo de invocacin remota v IDL Java v API JDBC v Servicio de mensajes de Java v Java Naming and Directory Interface v JavaMail v Infraestructura de activacin de JavaBeans v API Java para el anlisis XML v Arquitectura de conectores v Servicio de autenticacin y autorizacin de Java Conceptos relacionados: v Enterprise Java Beans en la pgina 230 v Java Naming and Directory Interface (JNDI) en la pgina 223

Servidor Java 2 Platform Enterprise Edition


Como elemento subyacente de un contenedor Java 2 Platform Enterprise Edition (J2EE) se encuentra el servidor del que forma parte el contenedor. Normalmente, un proveedor de productos J2EE implementa la funcionalidad de lado del servidor de J2EE, mientras que la funcionalidad de cliente de J2EE se crea en tecnologa J2SE. IBM WebSphere Application Server es un servidor que cumple las especificaciones de J2EE.

Requisitos de la base de datos de Java 2 Platform Enterprise Edition


Java 2 Platform Enterprise Edition necesita una base de datos a la que se pueda acceder a travs de la API JDBC para el almacenamiento de los datos de la empresa. Se puede acceder a la base de datos desde componentes de la web, Enterprise Beans y componentes cliente de la aplicacin. No hace falta que se pueda acceder a la base de datos desde los applets. Conceptos relacionados: v Controladores soportados por JDBC y SQLJ en la pgina 1

Java Naming and Directory Interface (JNDI)


JNDI permite que las aplicaciones basadas en la plataforma Java accedan a varios servicios de asignacin de nombres y de directorio. Forma parte del conjunto de interfaces de programacin de aplicaciones (API) de Java Enterprise. JNDI permite a los programadores crear aplicaciones portables habilitadas para distintos servicios de nomenclatura y directorio que incluyen sistemas de archivos, servicios de directorio como Lightweight Directory Access Protocol (LDAP), Novell Directory Services y Network Information System (NIS) y sistemas de objetos distribuidos
Captulo 8. Java 2 Platform, Enterprise Edition

223

como Common Object Request Broker Architecture (CORBA), Invocacin a mtodos remotos (RMI) de Java y Enterprise JavaBeans (EJB). La API JNDI tiene dos partes: una interfaz de nivel de aplicacin que utilizan los componentes de la aplicacin para acceder a los servicios de nomenclatura y directorio y una interfaz de proveedor de servicios para conectar con un proveedor de un servicio de nomenclatura y directorio.

Gestin de transacciones Java


Java 2 Platform Enterprise Edition (J2EE) simplifica la programacin de aplicaciones para la gestin de transacciones distribuidas. J2EE incluye soporte para transacciones distribuidas a travs de dos especificaciones, API de transacciones Java (JTA) y Servicio de transacciones Java (JTS). JTA es una API de alto nivel, independiente de la implementacin e independiente del protocolo, que permite a las aplicaciones y a los servidores de aplicaciones acceder a transacciones. Adems, JTA est siempre habilitada. El Controlador IBM DB2 para JDBC y SQLJ y el Controlador DB2 JDBC de Tipo 2 para Linux, UNIX y Windows implementan las especificaciones de JTA y JTS. Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4, se da soporte a las transacciones distribuidas en los servidores DB2 Database para Linux, UNIX y Windows, DB2 para z/OS y DB2 UDB para iSeries. JTA especifica interfaces Java estndares entre un gestor de transacciones y las partes que intervienen en un sistema de transacciones distribuidas: el gestor de recursos, el servidor de aplicaciones y las aplicaciones transaccionales. JTS especifica la implementacin de un Gestor de transacciones que da soporte a JTA e implementa la correlacin Java de la especificacin OMG Object Transaction Service (OTS) 1.1 al nivel que hay bajo la API. JTS propaga transacciones mediante IIOP. JTA y JTS permiten que los servidores J2EE de aplicaciones J2EE eviten al desarrollador de componentes las tareas de gestin de transacciones. Los programadores pueden definir las propiedades transaccionales de la tecnologa EJB basndose en componentes durante el diseo o despliegue mediante sentencias declarativas en el descriptor de despliegue. El servidor de aplicaciones se hace cargo de la responsabilidad de la gestin de transacciones. En el entorno de DB2 y de WebSphere Application Server, WebSphere Application Server asume el papel de gestor de transacciones, y DB2 acta como gestor de recursos. WebSphere Application Server implementa JTS y parte de JTA, y los controladores JDBC tambin implementan parte de JTA para que WebSphere Application Server y DB2 puedan proporcionar transacciones distribuidas coordinadas. No es necesario configurar DB2 de modo que est habilitado para JTA en el entorno de WebSphere Application Server porque los controladores JDBC detectan automticamente ese entorno. El Controlador DB2 JDBC de tipo 2 proporciona dos clases DataSource: v COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource v COM.ibm.db2.jdbc.DB2XADataSource

224

Desarrollo de aplicaciones Java

El Controlador IBM DB2 para JDBC y SQLJ proporciona estas dos clases DataSource: v com.ibm.db2.jcc.DB2ConnectionPoolDataSource v com.ibm.db2.jcc.DB2XADataSource WebSphere Application Server proporciona conexiones de DB2 agrupadas con bases de datos. Si la aplicacin va a participar en una transaccin distribuida, debe utilizarse la clase COM.ibm.db2.jdbc.DB2XADataSource al definir fuentes de datos DB2 dentro de WebSphere Application Server. Para obtener informacin detallada sobre cmo configurar el WebSphere Application Server con DB2, consulte WebSphere Application Server InfoCenter en:
http://www.ibm.com/software/webservers/appserv/library.html

Ejemplo de una transaccin distribuida que utiliza mtodos de JTA


La mejor forma de mostrar la utilizacin de transacciones distribuidas es compararlas con transacciones locales. En las transacciones locales, una aplicacin JDBC confirma los cambios hechos en una base de datos e indica el final de una unidad de trabajo en una de las formas siguientes: v Invocando los mtodos Connection.commit o Connection.rollback despus de ejecutar una o ms sentencias de SQL v Invocando el mtodo Connection.setAutoCommit(true) al inicio de la aplicacin para que los cambios se confirmen despus de cada sentencia de SQL La Figura 62 muestra el cdigo mediante el que se ejecutan transacciones locales.
con1.setAutoCommit(false); // Desactivar la confirmacin automtica // Ejecutar sentencias de SQL ... con1.commit(); // Confirmar la transaccin // Ejecutar ms sentencias de SQL ... con1.rollback(); // Retrotraer la transaccin con1.setAutoCommit(true); // Permitir la confirmacin despus // de cada sentencia de SQL ... // Ejecutar ms sentencias de SQL, que se confirmarn // automticamente despus de cada sentencia de SQL. Figura 62. Ejemplo de transaccin local

En cambio, las aplicaciones que intervienen en transacciones distribuidas no pueden invocar los mtodos Connection.commit, Connection.rollback, ni Connection.setAutoCommit(true) dentro de la transaccin distribuida. En las transacciones distribuidas, los mtodos Connection.commit o Connection.rollback no indican lmites de transaccin. En lugar de ello, las aplicaciones dejan que el servidor de aplicaciones gestione los lmites de transaccin. Normalmente las transacciones distribuidas suponen varias conexiones con una misma fuente de datos o con fuentes de datos diferentes, que pueden ser de fabricantes diversos. La Figura 63 en la pgina 226 muestra una aplicacin que utiliza transacciones distribuidas. Mientras se ejecuta el cdigo mostrado en el ejemplo, el servidor de aplicaciones tambin est ejecutando otros EJB que forman parte de la misma transaccin distribuida. Cuando todos los EJB han invocado utx.commit(), el servidor de aplicaciones confirma la transaccin distribuida completa. Si cualquiera de los EJB no se ejecuta satisfactoriamente, el servidor de aplicaciones retrotrae
Captulo 8. Java 2 Platform, Enterprise Edition

225

todo el trabajo hecho por todos los EJB que estn asociados a la transaccin distribuida.
javax.transaction.UserTransaction utx; // Utilice el mtodo begin sobre un objeto UserTransaction // para indicar el inicio de una transaccin distribuida. utx.begin(); ... // Ejecute sentencias de SQL con un objeto Connection. // No invoque los mtodos commit ni rollback de Connection. ... // Utilice el mtodo commit sobre el objeto UserTransaction // para hacer que se confirmen todas las ramas de transaccin // e indicar el final de la transaccin distribuida. utx.commit(); ... Figura 63. Ejemplo de transaccin distribuida cuando se utiliza un servidor de aplicaciones

La Figura 64 en la pgina 227 muestra un programa que utiliza mtodos de JTA para ejecutar una transaccin distribuida. Este programa acta como gestor de transacciones y aplicacin transaccional. Dos conexiones con dos fuentes de datos diferentes ejecutan tareas de SQL dentro de una sola transaccin distribuida.

226

Desarrollo de aplicaciones Java

class XASample { javax.sql.XADataSource xaDS1; javax.sql.XADataSource xaDS2; javax.sql.XAConnection xaconn1; javax.sql.XAConnection xaconn2; javax.transaction.xa.XAResource xares1; javax.transaction.xa.XAResource xares2; java.sql.Connection conn1; java.sql.Connection conn2; public static void main (String args []) throws java.sql.SQLException { XASample xat = new XASample(); xat.runThis(args); } // En calidad de gestor de transacciones, este programa proporciona // el ID de transaccin global y el calificador de rama. El ID de // transaccin global y el calificador de rama no deben ser iguales // entre s, y la combinacin formada por ambos debe ser exclusiva // para este gestor de transacciones. public void runThis(String[] args) { byte[] gtrid = new byte[] { 0x44, 0x11, 0x55, 0x66 }; byte[] bqual = new byte[] { 0x00, 0x22, 0x00 }; int rc1 = 0; int rc2 = 0; try { javax.naming.InitialContext context = new javax.naming.InitialContext(); /* * Observe la utilizacin de javax.sql.XADataSource en lugar * de utilizar una implementacin de controlador especfica, * tal como com.ibm.db2.jcc.DB2XADataSource, que solo se * puede utilizar para una conexin DB2. */ xaDS1 = (javax.sql.XADataSource)context.lookup("checkingAccounts"); xaDS2 = (javax.sql.XADataSource)context.lookup("savingsAccounts"); // XADatasource contiene el ID de usuario y la contrasea. // Obtener el objeto XAConnection de cada XADataSource xaconn1 = xaDS1.getXAConnection(); xaconn2 = xaDS2.getXAConnection(); // Obtener el objeto java.sql.Connection de cada XAConnection conn1 = xaconn1.getConnection(); conn2 = xaconn2.getConnection(); // Obtener el objeto XAResource de cada XAConnection xares1 = xaconn1.getXAResource(); xares2 = xaconn2.getXAResource(); Figura 64. Ejemplo de transaccin distribuida que hace uso de la JTA (Parte 1 de 4)

Captulo 8. Java 2 Platform, Enterprise Edition

227

// Cree el objeto Xid de la transaccin distribuida. // Este ejemplo utiliza la implementacin com.ibm.db2.jcc.DB2Xid // de la interfaz Xid. Este Xid puede ser utilizado con cualquier // controlador JDBC que d soporte a JTA. javax.transaction.xa.Xid xid1 = new com.ibm.db2.jcc.DB2Xid(100, gtrid, bqual); // Inicie la transaccin distribuida en las dos conexiones. // NO es necesario iniciar y finalizar las dos conexiones juntas. // Esto puede hacerse en hebras diferentes, junto con sus operaciones de SQL. xares1.start(xid1, javax.transaction.xa.XAResource.TMNOFLAGS); xares2.start(xid1, javax.transaction.xa.XAResource.TMNOFLAGS); ... // Ejecute las operaciones de SQL en la conexin 1. // Ejecute las operaciones de SQL en la conexin 2. ... // Ahora finalice la transaccin distribuida en las dos conexiones. xares1.end(xid1, javax.transaction.xa.XAResource.TMSUCCESS); xares2.end(xid1, javax.transaction.xa.XAResource.TMSUCCESS); // Si el trabajo de la conexin 2 se ha realizado en otra hebra, // es necesaria aqu una llamada a thread.join() para esperar // a que termine el trabajo de la conexin 2. try { // Ahora prepare ambas ramas de la transaccin distribuida. // Ambas ramas se deben preparar satisfactoriamente para // poder confirmar los cambios. // Si la transaccin distribuida falla, se emite una // excepcin XAException. rc1 = xares1.prepare(xid1); if(rc1 == javax.transaction.xa.XAResource.XA_OK) { // La preparacin fue satisfactoria. Prepare la segunda conexin rc2 = xares2.prepare(xid1); if(rc2 == javax.transaction.xa.XAResource.XA_OK) { // Ambas conexiones se prepararon satisfactoriamente // y ninguna de ella era de solo lectura. xares1.commit(xid1, false); xares2.commit(xid1, false); } else if(rc2 == javax.transaction.xa.XAException.XA_RDONLY) { // La segunda conexin es de solo lectura, por lo que // solo se confirma la primera conexin. xares1.commit(xid1, false); } } else if(rc1 == javax.transaction.xa.XAException.XA_RDONLY) { // El SQL de la primera conexin es de solo lectura // (tal como un SELECT). // La preparacin ha confirmado la conexin. Prepare la // segunda conexin. rc2 = xares2.prepare(xid1); if(rc2 == javax.transaction.xa.XAResource.XA_OK) { // La primera conexin es de solo lectura, pero la // segunda no lo es. // Confirme la segunda conexin. xares2.commit(xid1, false); } else if(rc2 == javax.transaction.xa.XAException.XA_RDONLY) { // Ambas conexiones son de solo lectura, y ambas // estn ya confirmadas, por lo que no es necesaria // ninguna otra accin. } } } Figura 64. Ejemplo de transaccin distribuida que hace uso de la JTA (Parte 2 de 4)

228

Desarrollo de aplicaciones Java

catch (javax.transaction.xa.XAException xae) { // La transaccin distribuida ha fallado, // por lo que debe retrotraerla. // Notificar XAException para preparacin/confirmacin. System.out.println("Distributed transaction prepare/commit failed. " + "Rolling it back."); System.out.println("XAException error code = " + xae.errorCode); System.out.println("XAException message = " + xae.getMessage()); xae.printStackTrace(); try { xares1.rollback(xid1); } catch (javax.transaction.xa.XAException xae1) { // Notificar error de la retrotraccin. System.out.println("distributed Transaction rollback xares1 failed"); System.out.println("XAException error code = " + xae1.errorCode); System.out.println("XAException message = " + xae1.getMessage()); } try { xares2.rollback(xid1); } catch (javax.transaction.xa.XAException xae2) { // Notificar error de la retrotraccin. System.out.println("distributed Transaction rollback xares2 failed"); System.out.println("XAException error code = " + xae2.errorCode); System.out.println("XAException message = " + xae2.getMessage()); } } try { conn1.close(); xaconn1.close(); } catch (Exception e) { System.out.println("Failed to close connection 1: " + e.toString()); e.printStackTrace(); } try { conn2.close(); xaconn2.close(); } catch (Exception e) { System.out.println("Failed to close connection 2: " + e.toString()); e.printStackTrace(); } } Figura 64. Ejemplo de transaccin distribuida que hace uso de la JTA (Parte 3 de 4)

Captulo 8. Java 2 Platform, Enterprise Edition

229

catch (java.sql.SQLException sqe) { System.out.println("SQLException caught: " + sqe.getMessage()); sqe.printStackTrace(); } catch (javax.transaction.xa.XAException xae) { System.out.println("XA error is " + xae.getMessage()); xae.printStackTrace(); } catch (javax.naming.NamingException nme) { System.out.println(" Naming Exception: " + nme.getMessage()); } } } Figura 64. Ejemplo de transaccin distribuida que hace uso de la JTA (Parte 4 de 4)

Recomendacin: Para lograr un mejor rendimiento, finalice una transaccin distribuida antes de iniciar otra transaccin distribuida o local. Conceptos relacionados: v Gestin de transacciones Java en la pgina 224

Enterprise Java Beans


La arquitectura Enterprise Java Beans es una arquitectura de componentes para el desarrollo y el despliegue de aplicaciones de empresa distribuidas basadas en componentes. Las aplicaciones que se escriben utilizando la arquitectura Enterprise Java Beans se pueden escribir una sola vez y luego desplegar en cualquier plataforma de servidor que d soporte a la especificacin Enterprise Java Beans. Las aplicaciones Java 2 Platform, Enterprise Edition (J2EE) implementan componentes de empresa del lado del servidor mediante Enterprise Java Beans (EJB) que incluyen beans de sesin y beans de entidad. Los beans de sesin representan servicios de empresa y no se comparten entre usuarios. Los beans de entidad son objetos transaccionales distribuidos, de mltiples usuarios, que representan datos permanentes. Los lmites transaccionales de una aplicacin EJB se pueden definir especificando transacciones gestionadas por contenedor o gestionadas por bean. El programa de ejemplo AccessEmployee.ear utiliza Enterprise Java Beans para implementar una aplicacin J2EE para acceder a una base de datos DB2. Encontrar este ejemplo en el directorio SQLLIB/samples/websphere. La aplicacin de ejemplo EJB proporciona dos servicios de empresa. Un servicio permite al usuario acceder a informacin sobre un empleado (que est almacenada en la tabla EMPLOYEE de la base de datos sample) mediante el nmero de empleado de dicho empleado. El otro servicio permite al usuario recuperar una lista de nmeros de empleado de modo que el usuario pueda obtener un nmero de empleado para utilizarlo para consultar datos del empleado. El siguiente ejemplo utiliza EJB para implementar una aplicacin J2EE para acceder a una base de datos DB2. En el ejemplo se utiliza la arquitectura Model-View-Controller (MVC), que es una arquitectura de GUI de uso habitual. Se utiliza la JSP para implementar la vista (el componente de presentacin). Un servlet acta como controlador en el ejemplo. El servlet controla el flujo de trabajo

230

Desarrollo de aplicaciones Java

y delega la peticin del usuario al modelo, que se implementa mediante los EJB. El componente modelo del ejemplo consta de dos EJB: un bean de sesin y un bean de entidad. El bean de permanencia gestionada por contenedor (CMP), Employee, representa los objetos transaccionales distribuidos que representan los datos permanentes de la tabla EMPLOYEE de la base de datos sample. El trmino permanencia gestionada por contenedor significa que el contenedor EJB maneja todo el acceso a base de datos que necesita el bean de entidad. El cdigo del bean no contiene ninguna llamada de acceso a base de datos (SQL). Como resultado, el cdigo del bean no est enlazado a ningn mecanismo de almacenamiento permanente especfico (base de datos). El bean de sesin, AccessEmployee, acta como fachada del bean de entidad y proporciona una estrategia uniforme de acceso de clientes. Este diseo de fachada reduce el trfico en la red entre el cliente EJB y el bean de entidad y resulta ms eficiente en transacciones distribuidas que cuando el cliente EJB accede al bean de entidad directamente. El acceso a la base de datos DB2 se puede proporcionar desde el bean de sesin o el bean de entidad. Los dos servicios de la aplicacin de ejemplo muestran ambos mtodos para acceder a la base de datos DB2. En el primer servicio, se utiliza el bean de entidad:
//==================================================== // Este mtodo devuelve informacin sobre un empleado mediante la // interaccin con el bean de entidad identificado por el nmero // de empleado proporcionado public EmployeeInfo getEmployeeInfo(String empNo) throws java.rmi.RemoteException } Employee employee = null; try } employee = employeeHome.findByPrimaryKey(new EmployeeKey(empNo)); EmployeeInfo empInfo = new EmployeeInfo(empNo); //establecer la informacin del empleado en el objeto de valor dependiente empInfo.setEmpno(employee.getEmpno()); empInfo.setFirstName (employee.getFirstName()); empInfo.setMidInit(employee.getMidInit()); empInfo.setLastName(employee.getLastName()); empInfo.setWorkDept(employee.getWorkDept()); empInfo.setPhoneNo(employee.getPhoneNo()); empInfo.setHireDate(employee.getHireDate()); empInfo.setJob(employee.getJob()); empInfo.setEdLevel(employee.getEdLevel()); empInfo.setSex(employee.getSex()); empInfo.setBirthDate(employee.getBirthDate()); empInfo.setSalary(employee.getSalary()); empInfo.setBonus(employee.getBonus()); empInfo.setComm(employee.getComm()); return empInfo; } catch (java.rmi.RemoteException rex) { ......

En el segundo servicio, que visualiza nmeros de empleado, el bean de sesin, AccessEmployee, accede directamente a la base de datos de ejemplo de DB2.
/============================================= * Obtener la lista de nmeros de empleado. * @return Collection */ public Collection getEmpNoList() { ResultSet rs = null; PreparedStatement ps = null; Vector list = new Vector(); DataSource ds = null;
Captulo 8. Java 2 Platform, Enterprise Edition

231

Connection con = null; try { ds = getDataSource(); con = ds.getConnection(); String schema = getEnvProps(DBschema); String query = "Select EMPNO from " + schema + ".EMPLOYEE"; ps = con.prepareStatement(query); ps.executeQuery(); rs = ps.getResultSet(); EmployeeKey pk; while (rs.next()) { pk = new EmployeeKey(); pk.employeeId = rs.getString(1); list.addElement(pk.employeeId); } rs.close(); return list;

Informacin relacionada: v Ejemplos de Java WebSphere en la pgina 192

232

Desarrollo de aplicaciones Java

Captulo 9. Soporte de agrupaciones de conexiones JDBC y SQLJ


La agrupacin de conexiones forma parte del soporte DataSource de JDBC y est soportada por el Controlador IBM DB2 para JDBC y SQLJ. El Controlador IBM DB2 para JDBC y SQLJ ofrece una fbrica de conexiones agrupadas que utilizan el servidor WebSphere Application Server u otros servidores de aplicaciones. En realidad, el servidor de aplicaciones realiza la agrupacin. La agrupacin de conexiones es completamente transparente para las aplicaciones JDBC o SQLJ. La agrupacin de conexiones es una infraestructura para almacenar en antememoria conexiones de fuentes de datos fsicas que equivale a las hebras de DB2. Cuando JDBC reutiliza conexiones de fuentes de datos fsicas, se minimizan las operaciones costosas necesarias para la creacin y el cierre posterior de objetos java.sql.Connection. Sin la agrupacin de conexiones, cada objeto java.sql.Connection representa una conexin fsica con un servidor de bases de datos. Cuando la aplicacin establece una conexin con una fuente de datos, DB2 rea una conexin fsica nueva con la fuente de datos. Cuando la aplicacin llama al mtodo java.sql.Connection.close, DB2 finaliza la conexin fsica con la fuente de datos. En cambio, con la agrupacin de conexiones, un objeto java.sql.Connection es una representacin lgica y temporal de una conexin de fuente de datos. La conexin de fuente de datos fsica se puede reutilizar secuencialmente mediante instancias java.sql.Connection. La aplicacin puede utilizar el objeto java.sql.Connection lgico exactamente del mismo modo en que utiliza un objeto java.sql.Connection cuando no existe soporte de agrupacin de conexiones. Con la agrupacin de conexiones, cuando una aplicacin JDBC invoca el mtodo DataSource.getConnection, la fuente de datos determinar si existe una conexin fsica adecuada. Si dicha conexin existe, la fuente de datos devolver una instancia de java.sql.Connection a la aplicacin. Cuando la aplicacin JDBC invoca el mtodo java.sql.Connection.close, JDBC no cierre la conexin de la fuente de datos fsica. En su lugar, JDBC cierra slo los recursos JDBC, como por ejemplo los objetos Statement o ResultSet. La fuente de datos devuelve la conexin fsica a la agrupacin de conexiones para su reutilizacin. Las agrupaciones de conexiones pueden ser homogneas o heterogneas. Con una agrupacin homognea, todos los objetos Connection que provengan de la misma agrupacin de conexiones deben tener las mismas propiedades. El primer objeto Connection lgico que se crea con DataSource tiene las propiedades que se han definido para DataSource. No obstante, una aplicacin puede cambiar dichas propiedades. Cuando se devuelve un objeto Connection a la agrupacin de conexiones, un servidor de aplicaciones o un mdulo de agrupacin deber restaurar los valores originales de las propiedades. Sin embargo, es posible que un servidor de aplicaciones o un mdulo de agrupacin no pueda restaurar las propiedades modificadas. El controlador JDBC no modifica las propiedades. Por lo tanto, en funcin del diseo del servidor de aplicaciones o del mdulo de

Copyright IBM Corp. 2006

233

agrupacin, es posible que las propiedades de un objeto Connection lgico reutilizado sean las mismas que las que se han definido para DataSource o que sean propiedades diferentes. Con la agrupacin heterognea, los objetos Connection con propiedades diferentes pueden compartir la misma agrupacin de conexiones.

234

Desarrollo de aplicaciones Java

Captulo 10. Soporte para el controlador IBM DB2 para JDBC y SQLJ para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex
Los siguientes temas contienen informacin sobre el soporte del Controlador IBM DB2 para JDBC y SQLJ para el concentrador de conexin y el equilibrado de carga de trabajo Sysplex. v Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex v Ejemplo de habilitacin del controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y equilibrado de carga de trabajo Sysplex en la pgina 236 v Tcnicas para supervisar el controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y el equilibrado de carga de trabajo Sysplex en la pgina 238

Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex


Las aplicaciones Java que utilizan Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 para acceder a los servidores DB2 para z/OS pueden utilizar las funciones de concentrador de conexin y equilibrado de carga de trabajo Sysplex. Las funciones de concentrador de conexin y equilibrado de carga de trabajo Sysplex del Controlador IBM DB2 para JDBC y SQLJ son similares a las funciones de concentrador de conexin y equilibrado de carga de trabajo Sysplex de DB2 Connect. El concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ puede reducir los recursos que los servidores de bases de datos DB2 para z/OS necesitan para dar soporte a un gran nmero de aplicaciones cliente. La funcin de concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ permite que muchos objetos de conexin utilicen la misma conexin fsica, lo que reduce el nmero total de conexiones fsicas con el servidor de bases de datos. El equilibrado de carga de trabajo Sysplex del Controlador IBM DB2 para JDBC y SQLJ puede aumentar la disponibilidad de un grupo de compartimiento de datos. Cuando el equilibrado de carga de trabajo Sysplex est habilitado, el controlador obtiene con frecuencia informacin de estado acerca de los miembros de un grupo de compartimiento de datos. El controlador utiliza esta informacin para determinar el miembro de compartimiento de datos al que debe dirigirse la siguiente transaccin. Con el equilibrado de carga de trabajo Sysplex, el servidor DB2 para z/OS y Workload Manager for z/OS (WLM) garantizan que el trabajo se distribuye de forma eficaz entre los miembros del grupo de compartimiento de datos y que el trabajo se transfiere a otro miembro del grupo de compartimiento de datos si uno de los miembros sufre una anomala. El Controlador IBM DB2 para JDBC y SQLJ utiliza objetos de transporte y una agrupacin de objetos de transporte global para dar soporte al concentrador de conexin y el equilibrado de carga de trabajo Sysplex. Hay un objeto de transporte para cada conexin fsica con el servidor de bases de datos. Cuando habilite el concentrador de conexin y el equilibrado de carga de trabajo Sysplex, establezca
Copyright IBM Corp. 2006

235

el nmero mximo de conexiones fsicas con el servidor de bases de datos que puede haber en cualquier momento mediante la definicin del nmero mximo de objetos de transporte. En el nivel de controlador, establezca los lmites sobre el nmero de objetos de transporte mediante las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ. En el nivel de conexin, habilite e inhabilite el concentrador de conexin y el equilibrado de carga de trabajo Sysplex del Controlador IBM DB2 para JDBC y SQLJ y establezca los lmites sobre el nmero de objetos de transporte mediante las propiedades DataSource. La agrupacin de objetos de transporte global se puede supervisar de cualquiera de los modos siguientes: v Mediante rastreos que se inician con las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ v Mediante una interfaz de programacin de aplicaciones Conceptos relacionados: v Personalizacin de las propiedades de configuracin del controlador IBM DB2 para JDBC y SQLJ en la pgina 11 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Ejemplo de habilitacin del controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y equilibrado de carga de trabajo Sysplex
El procedimiento siguiente es un ejemplo de habilitacin de las funciones de equilibro de la carga de trabajo Sysplex y del concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ con WebSphere Application Server. Los valores que se especifican no se dan como recomendacin. Los valores deben determinarse basndose en factores como los que indicamos a continuacin: v Disponibilidad de los recursos del sistema v El nmero de conexiones fsicas disponibles v La relacin deseada de los objetos de conexin con los objetos de transporte Requisitos previos: Requisitos del servidor: v WLM para z/OS v DB2 UDB para OS/390 y z/OS Versin 7 o posterior configurado para compartimiento de datos El valor por omisin para registros especiales en todos los miembros del grupo de compartimiento de datos debe ser el mismo. La razn de ello se debe a que cuando el Controlador IBM DB2 para JDBC y SQLJ equilibra las cargas en cada miembro del grupo de compartimiento de datos, mueve la conexin del usuario de un miembro a otro. Si el usuario ha configurado algn valor de registro especial en el miembro de compartimiento de datos original, el controlador restablecer todos los registros especiales en sus valores por omisin y aplicar los cambios de registro especiales en el nuevo miembro. Sin embargo, el Controlador IBM DB2 para JDBC y SQLJ no tiene forma de determinar los valores por omisin de todos los miembros. Si dos miembros tienen valores por

236

Desarrollo de aplicaciones Java

omisin diferentes, el resultado de una sentencia de SQL puede ser diferente, en funcin del miembro en el que se ejecute la sentencia. Requisitos del cliente: v El Controlador IBM DB2 para JDBC y SQLJ debe estar en el nivel de FixPak 10 v WebSphere Application Server, Versin 5.1 o posterior Procedimiento: 1. Verifique que el Controlador IBM DB2 para JDBC y SQLJ est en el nivel correcto para dar soporte al concentrador de conexin y al equilibrado de carga de trabajo Sysplex emitiendo el mandato siguiente en el procesador de la lnea de mandatos:
java com.ibm.db2.jcc.DB2Jcc -version

Encuentre una lnea en el resultado obtenido como la que indicamos a continuacin:


[ibm][db2][jcc] Driver: IBM DB2 Driver for JDBC and SQLJ Architecture nnn xxx

nnn debe ser 2.7 o posterior. 2. Establezca las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ para habilitar el concentrador de conexin o el equilibrado de carga de trabajo Sysplex para todas las instancias DataSource que se crean bajo el controlador. Establezca las propiedades de configuracin en un archivo DB2JccConfiguration.properties. a. Cree un archivo DB2JccConfiguration.properties o edite el archivo DB2JccConfiguration.properties existente. b. Establezca las propiedades de configuracin siguientes: v db2.jcc.minTransportObjects v db2.jcc.maxTransportObjects v db2.jcc.maxTransportObjectWaitTime v db2.jcc.dumpPool v db2.jcc.dumpPoolStatisticsOnScheduleFile Empiece con una configuracin similar a la siguiente:
db2.jcc.minTransportObjects=0 db2.jcc.maxTransportObjects=1500 db2.jcc.maxTransportObjectWaitTime=-1 db2.jcc.dumpPool=0 db2.jcc.dumpPoolStatisticsOnScheduleFile=/home/WAS/logs/srv1/poolstats

c. Aada la va de acceso del directorio para DB2JccConfiguration.properties a la classpath del Controlador IBM DB2 para JDBC y SQLJ de WebSphere Application Server. 3. Establezca las propiedades de la fuente de datos del Controlador IBM DB2 para JDBC y SQLJ para habilitar el concentrador de conexin o el equilibrado de carga de trabajo Sysplex. En la consola administrativa de WebSphere Application Server, establezca las propiedades siguientes para la fuente de datos que la aplicacin utiliza para conectarse al servidor de bases de datos: v enableSysplexWLB v enableConnectionConcentrator v maxTransportObjects Supongamos que desea la funcin del concentrador de conexin y la de equilibrado de carga de trabajo Sysplex. Empiece con una configuracin similar
Captulo 10. Soporte IBM DB2 para JDBC y SQLJ para concentrador de conexin y equilibrado de carga de trabajo Sysplex

237

a la siguiente:
Tabla 27. Ejemplo de configuracin de las propiedades de una fuente de datos para el equilibrado de carga de trabajo Sysplex y el concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ Propiedad enableSysplexWLB maxTransportObjects Nota: 1. enableConnectionConcentrator est establecido en true por omisin ya que enableSysplexWLB est establecido en true. Valor true1 100

4. Reinicie WebSphere Application Server. Conceptos relacionados: v Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex en la pgina 235

Tcnicas para supervisar el controlador IBM DB2 para el concentrador de conexin JDBC y SQLJ y el equilibrado de carga de trabajo Sysplex
Para supervisar el concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ y el equilibrado de carga de trabajo Sysplex, es necesario supervisar la agrupacin de objetos de transporte global. La agrupacin de objetos de transporte global se puede supervisar de cualquiera de los modos siguientes: v Mediante rastreos que se inician estableciendo las propiedades de configuracin del Controlador IBM DB2 para JDBC y SQLJ v Mediante una interfaz de programacin de aplicaciones Configuracin de propiedades para supervisar la agrupacin de objetos de transporte global: Las propiedades de configuracin db2.jcc.dumpPool, db2.jcc.dumpPoolStatisticsOnSchedule, y db2.jcc.dumpPoolStatisticsOnScheduleFile controlan el rastreo de la agrupacin de objetos de transporte global. Por ejemplo, el siguiente conjunto de valores de propiedad de configuracin causa mensajes de error Sysplez y de agrupacin de vuelco que deben grabarse cada 60 segundos en un archivo llamado /home/WAS/logs/srv1/poolstats:
db2.jcc.dumpPool=DUMP_SYSPLEX_MSG|DUMP_POOL_ERROR db2.jcc.dumpPoolStatisticsOnSchedule=60 db2.jcc.dumpPoolStatisticsOnScheduleFile=/home/WAS/logs/srv1/poolstats

Una entrada del archivo de estadsticas de agrupacin tiene el aspecto siguiente:


time Scheduled PoolStatistics npr:2575 nsr:2575 lwroc:439 hwroc:1764 coc:372 aooc:362 rmoc:362 nbr:2872 tbt:857520 tpo:10

Los significados de los campos son: npr Nmero total de peticiones que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin desde la creacin de sta.

238

Desarrollo de aplicaciones Java

nsr

Nmero de peticiones satisfactorias que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin desde la creacin de sta. Una peticin satisfactoria indica que la agrupacin ha devuelto un objeto. Nmero de objetos que se han vuelto a utilizar pero que no se encontraban en la agrupacin. Esto puede ocurrir si un objeto Connection libera un objeto de transporte en el lmite de una transaccin. Si el objeto Connection necesita un objeto de transporte posteriormente y ningn otro objeto Connection ha utiliza el objeto de transporte original, el objeto Connection podr utilizar el objeto de transporte.

lwroc

hwroc Nmero de de la agrupacin que se han vuelto a utilizar. coc aooc Nmero de objetos que el Controlador IBM DB2 para JDBC y SQLJ ha creado desde la creacin de la agrupacin. Nmero de objetos que han excedido el tiempo de inactividad especificado por db2.jcc.maxTransportObjectIdleTime y que no se han suprimido de la agrupacin. Nmero de objetos que se han suprimido de la agrupacin desde que sta fue creada. Nmero de peticiones que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin que la agrupacin bloque debido a que sta haba llegado a su capacidad mxima. Es posible que una peticin bloqueada se ejecute correctamente si el objeto se devuelve a la agrupacin antes de que se supere el tiempo especificado por db2.jcc.maxTransportObjectWaitTime y que se haya emitido una excepcin. Tiempo total en milisegundos que la agrupacin ha empleado para bloquear las peticiones. Este tiempo puede ser mucho mayor que el tiempo de ejecucin de la aplicacin transcurrido si la aplicacin utiliza varias hebras. Tiempo ms breve en milisegundos que una hebra ha esperado hasta obtener un objeto de la agrupacin. Si el tiempo es inferior a un milisegundo, el valor de este campo ser cero. Tiempo ms largo en milisegundos que una hebra ha esperado hasta obtener un objeto de la agrupacin. Promedio de tiempo en milisegundos que las hebras han esperado hasta obtener un objeto de transporte de la agrupacin. Este valor es tbt/nbr. Nmero de objetos que se encuentran actualmente en la agrupacin.

rmoc nbr

tbt

sbt

lbt abt tpo

Interfaces de programacin de aplicaciones para la supervisin de la agrupacin de objetos de transporte global: Es posible grabar aplicaciones para recopilar estadsticas sobre la agrupacin de objetos de transporte global. Dichas aplicaciones crean objetos en la clase DB2PoolMonitor e invocan mtodos para recuperar informacin acerca de la agrupacin. Por ejemplo, el cdigo siguiente crea un objeto para supervisar la agrupacin de objetos de transporte global:
import com.ibm.db2.jcc.DB2PoolMonitor; DB2PoolMonitor transportObjectPoolMonitor = DB2PoolMonitor.getPoolMonitor (DB2PoolMonitor.TRANSPORT_OBJECT);

Captulo 10. Soporte IBM DB2 para JDBC y SQLJ para concentrador de conexin y equilibrado de carga de trabajo Sysplex

239

Una vez que haya creado el objeto DB2PoolMonitor, podr utilizar los mtodos siguientes para supervisar la agrupacin. getMonitorVersion Formato:
public int getMonitorVersion()

Recupera la versin de la clase DB2PoolMonitor que se entrega con el Controlador IBM DB2 para JDBC y SQLJ. totalRequestsToPool Formato:
public int totalRequestsToPool()

Recupera el nmero total de peticiones que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin desde la creacin de sta. successfullRequestsFromPool Formato:
public int successfullRequestsFromPool()

Recupera el nmero de peticiones satisfactorias que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin desde la creacin de sta. Una peticin satisfactoria indica que la agrupacin ha devuelto un objeto. numberOfRequestsBlocked Formato:
public int numberOfRequestsBlocked()

Recupera el nmero de peticiones que el Controlador IBM DB2 para JDBC y SQLJ ha realizado a la agrupacin que la agrupacin bloque debido a que sta haba llegado a su capacidad mxima. Es posible que una peticin bloqueada se ejecute correctamente si el objeto se devuelve a la agrupacin antes de que se supere el tiempo especificado por db2.jcc.maxTransportObjectWaitTime y que se haya emitido una excepcin. totalTimeBlocked Formato:
public long totalTimeBlocked()

Recupera el tiempo total en milisegundos que la agrupacin ha empleado para bloquear las peticiones. Este tiempo puede ser mucho mayor que el tiempo de ejecucin de la aplicacin transcurrido si la aplicacin utiliza varias hebras. lightWeightReusedObjectCount Formato:
public int lightWeightReusedObjectCount()

Recupera el nmero de objetos que se han vuelto a utilizar pero que no se encontraban en la agrupacin. Esto puede ocurrir si un objeto Connection libera un objeto de transporte en el lmite de una transaccin. Si el objeto Connection necesita un objeto de transporte posteriormente y ningn otro objeto Connection ha utiliza el objeto de transporte original, el objeto Connection podr utilizar el objeto de transporte. heavyWeightReusedObjectCount Formato:
public int heavyWeightReusedObjectCount()

240

Desarrollo de aplicaciones Java

Recupera el nmero de de la agrupacin que se han vuelto a utilizar. createdObjectCount Formato:


public int createdObjectCount()

Recupera el nmero de objetos que el Controlador IBM DB2 para JDBC y SQLJ ha creado desde la creacin de la agrupacin. agedOutObjectCount Formato:
public int agedOutObjectCount()

Recupera el nmero de objetos que han excedido el tiempo de inactividad especificado por db2.jcc.maxTransportObjectIdleTime y que no se han suprimido de la agrupacin. removedObjectCount Formato:
public int removedObjectCount()

Recupera el nmero de objetos que se han suprimido de la agrupacin desde que sta fue creada. totalPoolObjects Formato:
public int totalPoolObjects()

Recupera el nmero de objetos que se encuentran actualmente en la agrupacin. Conceptos relacionados: v Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex en la pgina 235

Captulo 10. Soporte IBM DB2 para JDBC y SQLJ para concentrador de conexin y equilibrado de carga de trabajo Sysplex

241

242

Desarrollo de aplicaciones Java

Captulo 11. Informacin de consulta sobre JDBC y SQLJ


Los temas siguientes contienen informacin de consulta sobre mtodos de JDBC y clusulas de SQLJ. v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249 v Soporte para las API de JDBC en la pgina 264 v Informacin de consulta sobre sentencias de SQLJ en la pgina 284 v Informacin de consulta sobre el Controlador IBM DB2 para JDBC y SQLJ en la pgina 321 v Mandatos para la preparacin de programas de SQLJ en la pgina 371

Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC
Las tablas siguientes resumen las correlaciones de tipos de datos Java con tipos de datos JDBC y SQL para un sistema DB2 Database para Linux, UNIX y Windows. La Tabla 28 resume las correlaciones de tipos de datos Java con tipos de datos de DB2 para mtodos PreparedStatement.setXXX o ResultSet.updateXXX de programas JDBC, y para expresiones del lenguaje principal de entrada. Cuando aparece listado ms de un tipo de datos de Java, el primer tipo de datos es el recomendado.
Tabla 28. Correlaciones de tipos de datos de Java con tipos de datos de DB2 para actualizar tablas de DB2. Tipo de datos de Java short, boolean , byte
1 1

Tipo de datos de SQL SMALLINT INTEGER BIGINT REAL DOUBLE DECIMAL(p,s)2 DECFLOAT(n)3,4 CHAR(n)5 GRAPHIC(m)6 VARCHAR(n)7 VARGRAPHIC(m)8 CLOB(n)9 XML CHAR(n) FOR BIT DATA5 VARCHAR(n) FOR BIT DATA7 BINARY(n)5 VARBINARY(n)7 BLOB(n)9,10

int, java.lang.Integer long, java.lang.Long float, java.lang.Float double, java.lang.Double java.math.BigDecimal java.math.BigDecimal java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String byte[] byte[] byte[] byte[] byte[]

Copyright IBM Corp. 2006

243

Tabla 28. Correlaciones de tipos de datos de Java con tipos de datos de DB2 para actualizar tablas de DB2. (continuacin) Tipo de datos de Java byte[] byte[] java.sql.Blob java.sql.Blob java.sql.Clob java.sql.Clob java.sql.Clob java.sql.Date java.sql.Time java.sql.Timestamp java.io.ByteArrayInputStream java.io.StringReader java.io.ByteArrayInputStream java.io.InputStream com.ibm.db2.jcc.DB2RowID com.ibm.db2.DB2Xml java.net.URL Notas: 1. DB2 no tiene un equivalente exacto a los tipos de datos boolean o byte de de Java, pero la mejor opcin es SMALLINT. 2. p es la precisin decimal y s es la escala de la columna de DB2. Es conveniente que disee las aplicaciones financieras de forma que las columnas de tipo java.math.BigDecimal se correlacionen con columnas de tipo DECIMAL. Si conoce la precisin y la escala de una columna DECIMAL, actualizando los datos de la columna DECIMAL con datos de una variable java.math.BigDecimal obtendr un rendimiento mejor que si utiliza otras combinaciones de tipos de datos. 3. n=16 o n=34. 4. DECFLOAT es vlido para conexiones con servidores de bases de datos DB2 Versin 9.1 para z/OS o posteriores. La utilizacin de DECFLOAT requiere el SDK para Versin Java 5 (1.5) o posterior. 5. n<=254. 6. m<=127. 7. n<=32672. 8. m<=16336. 9. Esta correlacin slo es vlida si DB2 puede determinar el tipo de datos de la columna. 10. n<=2147483647. 11. m<=1073741823. 12. El tipo de datos DATALINK slo est soportado por el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows. Tipo de datos de SQL ROWID XML BLOB(n)10 XML CLOB(n)10 DBCLOB(m)11 XML DATE TIME TIMESTAMP BLOB(n)10 CLOB(n)10 CLOB(n)10 XML ROWID XML DATALINK12

La Tabla 29 en la pgina 245 resume las correlaciones de tipos de datos de DB2 con tipos de datos Java para mtodos ResultSet.getXXX en programas JDBC y para iteradores en programas SQLJ. Esta tabla no lista los tipos de objetos de derivador numrico de Java, que se recuperan mediante ResultSet.getObject.

244

Desarrollo de aplicaciones Java

Tabla 29. Correlaciones de tipos de datos de DB2 con tipos de datos Java para recuperar datos de tablas DB2 Tipo de datos de SQL SMALLINT Tipo de datos de Java o tipo de objeto Java recomendado short Otros tipos de datos Java soportados byte, int, long, float, double, java.math.BigDecimal, boolean, java.lang.String short, byte, long, float, double, java.math.BigDecimal, boolean, java.lang.String int, short, byte, float, double, java.math.BigDecimal, boolean, java.lang.String long, int, short, byte, float, double, java.math.BigDecimal, boolean, java.lang.String long, int, short, byte, double, java.math.BigDecimal, boolean, java.lang.String long, int, short, byte, float, java.math.BigDecimal, boolean, java.lang.String long, int, short, byte, float, double, java.math.BigDecimal, boolean, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.io.InputStream, java.io.Reader long, int, short, byte, float, double, java.math.BigDecimal, boolean, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.io.InputStream, java.io.Reader java.lang.String, java.io.InputStream, java.io.Reader java.lang.String, java.io.InputStream, java.io.Reader Ninguno Ninguno long, int, short, byte, float, double, java.math.BigDecimal, boolean, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.io.InputStream, java.io.Reader long, int, short, byte, float, double, java.math.BigDecimal, boolean, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.io.InputStream, java.io.Reader java.lang.String byte[]4

INTEGER

int

BIGINT

long

DECFLOAT(n)2,3

java.math.BigDecimal

REAL

float

DOUBLE

double

CHAR(n)

java.lang.String

VARCHAR(n)

java.lang.String

CHAR(n) FOR BIT DATA VARCHAR(n) FOR BIT DATA BINARY(n) VARBINARY(n) GRAPHIC(m)

byte[] byte[] byte[] byte[] java.lang.String

VARGRAPHIC(m)

java.lang.String

CLOB(n) BLOB(n) DBCLOB(m) ROWID

java.sql.Clob java.sql.Blob No existe un equivalente exacto. Utilice java.sql.Clob. com.ibm.db2.jcc.DB2RowID

byte[]

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

245

Tabla 29. Correlaciones de tipos de datos de DB2 con tipos de datos Java para recuperar datos de tablas DB2 (continuacin) Tipo de datos de SQL XML DATE TIME TIMESTAMP DATALINK Notas: 1. Es conveniente que disee las aplicaciones financieras de forma que las columnas de tipo java.math.BigDecimal se correlacionen con columnas de tipo DECIMAL. Si conoce la precisin y escala de una columna DECIMAL, la actualizacin de datos de esa columna con datos de una variable java.math.BigDecimal produce una mejor precisin que el uso de cualquier otra combinacin de tipos de datos. 2. n=16 o n=34. 3. DECFLOAT es vlido para conexiones con servidores de bases de datos DB2 Versin 9.1 para z/OS o posteriores. La utilizacin de DECFLOAT requiere el SDK para Versin Java 5 (1.5) o posterior. 4. Esta correlacin slo es vlida si DB2 puede determinar el tipo de datos de la columna. 5. El tipo de datos DATALINK slo est soportado por el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows. Tipo de datos de Java o tipo de objeto Java recomendado com.ibm.db2.jcc.DB2Xml java.sql.Date java.sql.Time java.sql.Timestamp java.net.URL5 Otros tipos de datos Java soportados byte[], java.lang.String, java.io.InputStream, java.io.Reader java.sql.String, java.sql.Timestamp java.sql.String, java.sql.Timestamp java.sql.String, java.sql.Date, java.sql.Time, java.sql.Timestamp

La Tabla 30 resume las correlaciones de tipos de datos Java con tipos de datos JDBC y tipos de datos DB2 para parmetros de funciones definidas por el usuario y de procedimientos almacenados. Las correlaciones de tipos de datos Java con tipos de datos de JDBC son para mtodos CallableStatement.registerOutParameter en programas JDBC. Las correlaciones de tipos de datos Java con tipos de datos de DB2 so para parmetros de invocaciones de funciones definidas por el usuario y de procedimientos almacenados. Si la lista contiene ms de un tipo de datos de Java en Tabla 30, el primer tipo de datos es el recomendado.
Tabla 30. Correlaciones de tipos de datos Java, de JDBC y de SQL para llamar a procedimientos almacenados y funciones definidas por el usuario Tipo de datos de Java boolean byte
1 1

Tipo de datos de JDBC BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE NUMERIC DECIMAL CHAR

Tipo de datos de SQL SMALLINT SMALLINT SMALLINT INTEGER BIGINT REAL REAL DOUBLE DECIMAL DECIMAL CHAR

short, java.lang.Integer int, java.lang.Integer long float, java.lang.Float float, java.lang.Float double, java.lang.Double java.math.BigDecimal java.math.BigDecimal java.lang.String

246

Desarrollo de aplicaciones Java

Tabla 30. Correlaciones de tipos de datos Java, de JDBC y de SQL para llamar a procedimientos almacenados y funciones definidas por el usuario (continuacin) Tipo de datos de Java java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String java.lang.String byte[] byte[] byte[] byte[] byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Timestamp java.sql.Blob java.sql.Clob java.sql.Clob java.io.ByteArrayInputStream java.io.StringReader java.io.ByteArrayInputStream com.ibm.db2.jcc.DB2RowID com.ibm.db2.jcc.DB2Xml java.net.URL Notas: 1. Un procedimiento almacenado o funcin definida por el usuario que est definido con un parmetro de tipo SMALLINT se puede invocar con un parmetro de tipo boolean o byte. Sin embargo, esto no es aconsejable. 2. Esta correlacin slo es vlida si DB2 puede determinar el tipo de datos de la columna. 3. El tipo de datos DATALINK slo est soportado por el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows. Tipo de datos de JDBC CHAR VARCHAR VARCHAR LONGVARCHAR VARCHAR LONGVARCHAR CLOB BINARY VARBINARY BINARY VARBINARY LONGVARBINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP BLOB CLOB CLOB Ninguno Ninguno Ninguno com.ibm.db2.jcc.DB2Types.ROWID com.ibm.db2.jcc.DB2Types.XML DATALINK Tipo de datos de SQL GRAPHIC VARCHAR VARGRAPHIC VARCHAR CLOB(n) CLOB(n) CLOB(n) CHAR FOR BIT DATA VARCHAR FOR BIT DATA BINARY VARBINARY VARCHAR FOR BIT DATA BLOB(n)2 BLOB(n)2 DATE TIME TIMESTAMP BLOB CLOB DBCLOB BLOB(n) CLOB(n) CLOB(n) ROWID XML AS CLOB DATALINK3

La Tabla 31 en la pgina 248 resume las correlaciones de los tipos de datos de parmetros de SQL de las sentencias CREATE PROCEDURE o CREATE FUNCTION con los tipos de datos del mtodo correspondiente de funcin definida por el usuario o procedimiento almacenado de Java. Para DB2 Database para Linux, UNIX y Windows, si se lista ms de un tipo de datos Java para un tipo de datos SQL, slo es vlido el primer tipo de datos Java.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

247

Para DB2 para z/OS, si se lista ms de un tipo de datos de Java y se utiliza un tipo de datos distinto del primero como parmetro de un mtodo, es necesario incluir una signatura de mtodo en la clusula EXTERNAL de la sentencia CREATE PROCEDURE o CREATE FUNCTION que especifique los tipos de datos Java de los parmetros del mtodo.
Tabla 31. Correlaciones de los tipos de datos de SQL de las sentencias CREATE PROCEDURE y CREATE FUNCTION con los tipos de datos del programa correspondiente de funcin definida por el usuario o procedimiento almacenado de Java Tipo de datos de SQL en CREATE PROCEDURE o CREATE FUNCTION SMALLINT INTEGER BIGINT REAL DOUBLE DECIMAL DECFLOAT CHAR GRAPHIC VARCHAR VARGRAPHIC CHAR FOR BIT DATA VARCHAR FOR BIT DATA BINARY VARBINARY DATE TIME TIMESTAMP BLOB CLOB DBCLOB ROWID XML AS CLOB DATALINK Notas: 1. En el caso de un procedimiento almacenado o una funcin definida por el usuario en un servidor DB2 Database para Linux, UNIX y Windows, slo es vlido el primer tipo de datos. 2. DECFLOAT es vlido para conexiones con servidores de bases de datos DB2 Versin 9.1 para z/OS o posteriores. La utilizacin de DECFLOAT requiere el SDK para Versin Java 5 (1.5) o posterior. 3. El tipo de datos DATALINK slo est soportado por el controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows.
2

Tipo de datos en mtodos de funcin definida por el usuario o de procedimiento almacenado de Java1 short, java.lang.Integer int, java.lang.Integer long, java.lang.Long float, java.lang.Float double, java.lang.Double java.math.BigDecimal java.math.BigDecimal java.lang.String java.lang.String java.lang.String java.lang.String byte[] byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Timestamp java.sql.Blob java.sql.Clob java.sql.Clob com.ibm.db2.jcc.DB2Types.ROWID com.ibm.db2.jcc.DB2Types.XML java.net.URL3

Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

248

Desarrollo de aplicaciones Java

Propiedades del controlador IBM DB2 para JDBC y SQLJ


Las propiedades definen cmo se debe establecer la conexin con una fuente de datos determinada. A menos que se indique otra cosa, las propiedades se pueden definir para un objeto DataSource o para un objeto Connection. Puede definir propiedades de una de las maneras siguientes: v Utilizando mtodos setXXX Las propiedades son aplicables a las siguientes implementaciones especficas de DB2 que las heredan de com.ibm.db2.jcc.DB2BaseDataSource : com.ibm.db2.jcc.DB2SimpleDataSource com.ibm.db2.jcc.DB2ConnectionPoolDataSource com.ibm.db2.jcc.DB2XADataSource Consulte el apartado Resumen del controlador IBM DB2 para extensiones JDBC y SQLJ para JDBC para ver un resumen de los nombres de propiedades y tipos de datos. v En un valor java.util.Properties del parmetro informacin de una llamada DriverManager.getConnection, tal como se muestra en el apartado Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador DB2 de IBM para JDBC y SQLJ. v En un valor java.lang.String del parmetro url de la llamada DriverManager.getConnection, tal como se muestra en el tema Conectar con una fuente de datos mediante la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ. Las propiedades son: blockingReadConnectionTimeout Cantidad de tiempo en segundos que transcurre hasta que se excede el tiempo de espera de lectura del socket de la conexin. Esta propiedad slo es aplicable para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 y afecta a todas las peticiones que se envan al servidor de bases de datos una vez que la conexin se ha establecido correctamente. El valor por omisin es 0, que es el valor que indica que no hay tiempo de espera. clientAccountingInformation Especifica informacin contable correspondiente al cliente actual de la conexin. Esta informacin se utiliza con fines de contabilidad de clientes. Este valor puede cambiar durante una conexin. El tipo de datos de esta propiedad es String. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 22 bytes. Una serie vaca Java ("") es vlida para este valor, pero un valor null de Java no es vlido. clientProgramName Especifica el ID de aplicacin que se utilizar mientras dure la conexin fsica para un cliente. El valor de esta propiedad se convierte en el ID de correlacin en un servidor DB2 para z/OS. Los administradores de base de datos pueden utilizar esta propiedad para correlacionar tareas en un servidor DB2 para z/OS con aplicaciones de cliente. El tipo de datos de esta propiedad es String. La longitud mxima es de 12 bytes. Si este valor es null, el Controlador IBM DB2 para JDBC y SQLJ proporcionar un valor db2jccnombre-hebra. clientRerouteServerListJNDIName Identifica una referencia JNDI para una instancia de DB2ClientRerouteServerList en un depsito JNDI de informacin del servidor

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

249

de redireccionamiento. Si el valor de clientRerouteServerListJNDIName no es nulo, clientRerouteServerListJNDIName proporcionar las funciones siguientes: v Permite conservar la informacin sobre servidores de redireccionamiento en todas las JVM. v Proporciona una ubicacin de servidor alternativa en el caso de que la primera conexin con el servidor de la base de datos falle. clientUser Especifica el nombre de usuario del cliente actual de la conexin. Esta informacin se utiliza con fines de contabilidad de clientes. A diferencia del nombre de usuario de una conexin JDBC, este valor puede cambiar durante una conexin. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 16 bytes. clientWorkstation Especifica el nombre de la estacin de trabajo correspondiente al cliente actual de la conexin. Esta informacin se utiliza con fines de contabilidad de clientes. Este valor puede cambiar durante una conexin. El tipo de datos de esta propiedad es String. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 18 bytes. Una serie vaca Java ("") es vlida para este valor, pero un valor null de Java no es vlido. connectionReuseProtocol Especifica si se restablece el estado de la conexin cuando una conexin se reutiliza desde una agrupacin de conexiones. Los valores posibles son: DIRTY_CONNECTION_REUSE El estado de la conexin no se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial no se restablecen y las tablas temporales no se eliminan. Los valores de la propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo de aplicaciones al controlador JDBC para la reinicializacin. No se cambian las propiedades que no se pasen mediante el mdulo de agrupaciones. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval v databaseName v driverType v pkList v planName v portNumber v kerberosServerPrincipal v password v readOnly v securityMechanism v serverName v user RESET_CONNECTIONS_ON_REUSE El estado de la conexin se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial se restablecen y las tablas temporales se eliminan. Los valores de la

250

Desarrollo de aplicaciones Java

propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo de aplicaciones al controlador JDBC para la reinicializacin. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval v databaseName v driverType v pkList v planName v portNumber v kerberosServerPrincipal v password v readOnly v securityMechanism v serverName v user currentExplainMode Especifica el valor del registro especial CURRENT EXPLAIN MODE de DB2. El registro especial CURRENT EXPLAIN MODE habilita e inhabilita el recurso Explain. El tipo de datos de esta propiedad es String. La longitud mxima es de 254 bytes. Esta propiedad slo se aplica para conexiones a servidores de bases de datos que soportan el registro especial CURRENT EXPLAIN MODE, como DB2 Database para Linux, UNIX y Windows. currentExplainSnapshot Especifica el valor del registro especial CURRENT EXPLAIN SNAPSHOT de DB2. El registro especial CURRENT EXPLAIN SNAPSHOT habilita e inhabilita el recurso de instantneas Explain. El tipo de datos de esta propiedad es String. La longitud mxima es de ocho bytes. Esta propiedad slo se aplica para conexiones a servidores de bases de datos que soportan el registro especial CURRENT EXPLAIN SNAPSHOT, como DB2 Database para Linux, UNIX y Windows. currentFunctionPath Especifica la va de SQL que se utiliza para resolver nombres de tipos de datos y de funciones no calificados en las sentencias de SQL que estn contenidas en programas de JDBC. El tipo de datos de esta propiedad es String. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 254 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 2048 bytes. El valor es una lista de nombres de esquema separados por comas. Esos nombres pueden ser identificadores ordinarios o delimitados. currentLockTimeout Especifica si los servidores DB2 Database para Linux, UNIX y Windows esperan un bloqueo cuando ste no se puede obtener de forma inmediata. El tipo de datos de esta propiedad es int. Los valores posibles son: entero La espera para un entero segundos. entero oscila entre -1 y 32767, ambos inclusive.

LOCK_TIMEOUT_NO_WAIT No espere ningn bloqueo. ste es el valor por omisin. LOCK_TIMEOUT_WAIT_INDEFINITELY Espere un bloqueo durante un tiempo no definido.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

251

LOCK_TIMEOUT_NOT_SET Utilice el valor por omisin para el servidor de bases de datos. currentMaintainedTableTypesForOptimization Especifica un valor que identifica los tipos de objetos que se tienen en cuenta cuando DB2 optimiza el proceso de consultas de SQL dinmico. Este registro contiene una palabra clave que representa tipos de tabla. El tipo de datos de esta propiedad es String. Los valores posibles de currentMaintainedTableTypesForOptimization son: ALL Indica que se tendrn en cuenta todas las tablas de consultas materializadas. NONE Indica que no se tendr en cuenta ninguna tabla de consulta materializada. SYSTEM Indica que slo se tendrn en cuenta las tablas de consultas materializadas de renovacin diferida mantenidas por el sistema. USER Indica que slo se tendrn en cuenta las tablas de consultas materializadas de renovacin diferida mantenidas por el usuario. currentPackagePath Especifica un lista separada por comas de colecciones contenidas en el servidor. El servidor de DB2 examina estas colecciones para buscar paquetes JDBC y SQLJ. Las reglas de prioridad de las propiedades currentPackagePath y currentPackageSet se ajustan a las reglas de prioridad de los registros especiales DB2 CURRENT PACKAGESET y CURRENT PACKAGE PATH. currentPackageSet Especifica el ID de coleccin para buscar paquetes JDBC y SQLJ. El tipo de datos de esta propiedad es String. El valor por omisin es NULLID. Si currentPackageSet est definido, su valor tiene prioridad sobre el valor de jdbcCollection. Se pueden instalar varias instancias del Controlador IBM DB2 para JDBC y SQLJ en un servidor de bases de datos ejecutando varias veces el programa de utilidad DB2binder. El programa de utilidad DB2binder incluye la opcin -collection, que permite que el instalador especifique el ID de coleccin para cada instancia del Controlador IBM DB2 para JDBC y SQLJ. Para seleccionar una instancia del Controlador IBM DB2 para JDBC y SQLJ para una conexin, especifique un valor de currentPackageSet que coincida con el ID de coleccin para una de las instancias del Controlador IBM DB2 para JDBC y SQLJ. Las reglas de prioridad de las propiedades currentPackagePath y currentPackageSet se ajustan a las reglas de prioridad de los registros especiales DB2 CURRENT PACKAGESET y CURRENT PACKAGE PATH. currentQueryOptimization Especifica un valor que controla la clase de optimizacin de consulta que el gestor de la base de datos lleva a cabo cuando vincula sentencias de SQL dinmico. El tipo de datos de esta propiedad es int. Los valores posibles de currentQueryOptimization son: 0 Especifica que se lleva a cabo una optimizacin mnima para generar

252

Desarrollo de aplicaciones Java

un plan de acceso. Esta clase es la ms adecuada para el acceso SQL dinmico simple para tablas bien indexadas. 1 2 Especifica que se efecta una optimizacin ms o menos comparable a DB2 Versin 1 para generar un plan de acceso. Especifica un nivel de optimizacin superior al de DB2 Versin 1, pero con un coste de optimizacin significativamente menor que los niveles 3 y superiores, especialmente para consultas muy complejas. Especifica que se efecta una optimizacin moderada para generar un plan de acceso. Especifica que se efecta una optimizacin significativa para generar un plan de acceso. Para consultas SQL dinmico complejas, se utilizan las normas heursticas para limitar el tiempo empleado en seleccionar un plan de acceso. Cuando sea posible, las consultas utilizarn tablas de consultas materializadas en lugar de la tablas base subyacentes.. Especifica que se efecta una optimizacin significativa para generar un plan de acceso. Similar al 5 pero sin las normas heursticas. Especifica que se efecta una optimizacin mxima para generar un plan de acceso. Puede expandir mucho el nmero de planes de acceso posibles que se evalan. Esta clase debe utilizarse para determinar si se puede generar un plan de acceso mejor para las consultas muy complejas y de muy larga ejecucin que utilizan tablas grandes. Las medidas de explicacin y de rendimiento se pueden utilizar para verificar que se haya generado el plan mejor.

3 5

7 9

currentRefreshAge Especifica un valor de duracin de indicacin de fecha y hora mxima desde que la sentencia REFRESH TABLE se ha procesado en una tabla de consultas materializada REFRESH DEFERRED mantenida por el sistema, como por ejemplo en el caso en el que la tabla de consultas materializada se utiliza para optimizar el proceso de una consulta. Esta propiedad afecta a la coincidencia de antememoria de sentencias dinmicas. El tipo de datos de esta propiedad es long. currentSchema Especifica el nombre de esquema por omisin que se utiliza para calificar objetos de base de datos no calificados en sentencias de SQL preparadas dinmicamente. El valor de esta propiedad establece el valor del registro especial CURRENT SCHEMA en un servidor de DB2. currentSQLID Especifica: v El ID de autorizacin que se utiliza para la comprobacin de autorizaciones en las sentencias CREATE, GRANT y REVOKE de SQL preparadas dinmicamente. v El propietario de un espacio de tablas, base de datos, grupo de almacenamiento o sinnimo que es creado por una sentencia CREATE emitida dinmicamente. v El calificador implcito de todos los nombres de tabla, vista, alias e ndice especificados en sentencias de SQL dinmico. La propiedad currentSQLID define el valor del registro especial CURRENT SQLID en un servidor DB2 para z/OS. Si la propiedad currentSQLID no est definida, el nombre de esquema por omisin es el valor del registro especial CURRENT SQLID.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

253

cursorSensitivity Especifica si el valor java.sql.ResultSet.TYPE_SCROLL_SENSITIVE para un ResultSet de JDBC se correlaciona con el atributo SENSITIVE DYNAMIC, el atributo SENSITIVE STATIC o el atributo ASENSITIVE para el cursor de DB2 subyacente. El tipo de datos de esta propiedad es int. Los valores posibles son TYPE_SCROLL_SENSITIVE_STATIC (0), TYPE_SCROLL_SENSITIVE_DYNAMIC (1), o TYPE_SCROLL_ASENSITIVE (2). El valor por omisin es TYPE_SCROLL_SENSITIVE_STATIC. Si el servidor de bases de datos no soporta cursores desplazables dinmicos sensibles y se solicita el valor TYPE_SCROLL_SENSITIVE_DYNAMIC, el controlador JDBC mostrar un aviso y correlacionar el atributo sensitivity con SENSITIVE STATIC. Para servidores de bases de datos de DB2 UDB para iSeries, los cuales no soportan cursores estticos sensibles, el valor java.sql.ResultSet.TYPE_SCROLL_SENSITIVE siempre se correlaciona con SENSITIVE DYNAMIC. databaseName Especifica el nombre del servidor de bases de datos. Este nombre constituye la porcin del URL de conexin correspondiente a la basedatos. El nombre depende de si se utiliza el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 o el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2. Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4: v Si la conexin es un con un servidor DB2 para z/OS, el valor de databaseName ser el nombre de la ubicacin de DB2 que se define durante la instalacin. Todos los caracteres de este valor deben ser caracteres en maysculas. Puede determinar el nombre de ubicacin ejecutando la sentencia de SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

v Si la conexin es con un servidor DB2 Database para Linux, UNIX y Windows, el valor de databaseName ser el nombre de la base de datos que se define durante la instalacin. v Si la conexin es con un servidor IBM Cloudscape, el valor de databaseName ser el nombre totalmente calificado del archivo que contiene la base de datos. Este nombre debe estar encerrado entre comillas dobles ("). Por ejemplo:
"c:/databases/testdb"

Si esta propiedad no est definida, las conexiones se establecen con el sitio local. Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2: v El valor de databaseName es el nombre de base de datos que se define durante la instalacin, si el valor de la propiedad de conexin serverName es nulo. Si el valor de la propiedad serverName no es nulo, el valor de databaseName es un alias de base de datos. deferPrepares Especifica si se deben o no se deben diferir las operaciones de preparacin hasta la ejecucin de la sentencia. El tipo de datos de esta propiedad es boolean. El valor por omisin es true para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. Esta propiedad no es aplicable al Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2.

254

Desarrollo de aplicaciones Java

El diferir las operaciones de preparacin puede reducir los retardos de la red. Sin embargo, si difiere las operaciones de preparacin, asegrese de que los tipos de datos de entrada coincidan con los tipos de columna de la tabla de DB2. description Descripcin de la fuente de datos. El tipo de datos de esta propiedad es String. driverType Para la interfaz DataSource, determina qu controlador utilizar para las conexiones. El tipo de datos de esta propiedad es int. Los valores vlidos son 2 o 4. El valor por omisin es 2. enableConnectionConcentrator Indica si la funcin del concentrador de conexin del Controlador IBM DB2 para JDBC y SQLJ est habilitada. La funcin del concentrador de conexin est disponible slo para conexiones con servidores DB2 para z/OS. El tipo de datos de enableConnectionConcentrator es boolean. El valor por omisin es false. Sin embargo, si enableSysplexWLB se ha establecido en true, el valor por omisin ser true. enableSysplexWLB Indica si la funcin de equilibrado de carga de trabajo Sysplex del Controlador IBM DB2 para JDBC y SQLJ est habilitada. La funcin de equilibrado de carga de trabajo Sysplex est disponible slo para conexiones con servidores DB2 para z/OS. El tipo de datos de enableSysplexWLB es boolean. El valor por omisin es false. Si enableSysplexWLB se establece en true, enableConnectionConcentrator se establecer en true por omisin. fullyMaterializeInputStreams Indica si las corrientes de materializan totalmente antes de enviarse desde el cliente al servidor de bases de datos. El tipo de datos de esta propiedad es boolean. El valor por omisin es false. Si el valor de fullyMaterializeInputStreams es true, ello significar que el controlador JDBC habr materializado completamente las corrientes antes de enviarlas al servidor. fullyMaterializeLobData Indica si el controlador recupera localizadores de LOB para operaciones FETCH. El tipo de datos de esta propiedad es boolean. El efecto de fullyMaterializeLobData depender de si el servidor de bases de datos soporta la modalidad continua progresiva: v Si el servidor de bases de datos no soporta la modalidad continua progresiva: Si el valor de fullyMaterializeLobData es true, los datos LOB se materializarn completamente dentro del controlador JDBC cuando se capte una fila. Si el valor es false, los datos LOB se canalizarn. El controlador utiliza localizadores internamente para recuperar datos LOB en forma de bloques a medida que sea necesario. Es muy recomendable que establezca este valor en false cuando recupere datos LOB que contengan grandes volmenes de datos. El valor por omisin es true. v Si el servidor de bases de datos soporta la modalidad continua progresiva: El controlador JDBC pasa por alto el valor de fullyMaterializeLobData si la propiedad progresssiveLocators est establecida en DB2BaseDataSource.YES o en DB2BaseDataSource.NOT_SET.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

255

Esta propiedad no tiene ningn efecto para parmetros de procedimiento almacenado ni datos LOB que se recuperan utilizando cursores desplazables. credencialGss Para una fuente de datos que utilice la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. El tipo de datos de esta propiedad es org.ietf.jgss.GSSCredential. Las credenciales delegadas se utilizan en los entornos de varios niveles, como por ejemplo cuando un cliente se conecta con WebSphere Application Server, el cual, a su vez, se conecta con DB2. El valor de esta propiedad se obtiene del cliente, invocando el mtodo GSSContext.getDelegCred. GSSContext forma parte de la API GSS (Generic Security Service) de IBM Java. Si define esta propiedad, debe tambin definir las propiedades Mechanism y KerberosServerPrincipal. Esta propiedad solo es aplicable al Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. Para obtener informacin sobre la utilizacin de la seguridad Kerberos con el Controlador IBM DB2 para JDBC y SQLJ, consulte el apartado Utilizacin de seguridad Kerberos bajo el controlador IBM DB2 para JDBC y SQLJ. jdbcCollection Especifica el ID de coleccin de los paquetes que son utilizados por una instancia del Controlador IBM DB2 para JDBC y SQLJ durante la ejecucin. El tipo de datos de jdbcCollection es String. El valor por omisin es NULLID. Esta propiedad se utiliza con la opcin -collection de DB2Binder. El programa de utilidad DB2Binder debe haber vinculado previamente paquetes del Controlador IBM DB2 para JDBC y SQLJ en el servidor utilizando un valor de -collection que coincida con el valor de jdbcCollection. El valor de jdbcCollection no determina la coleccin que se utiliza para aplicaciones SQLJ. Para SQLJ, la coleccin est determinada por la opcin -collection del personalizador de SQLJ. jdbcCollection no es aplicable al Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS. kerberosServerPrincipal Para una fuente de datos que utilice la seguridad Kerberos, especifica el nombre que se utiliza para la fuente de datos cuando se registra con el Centro de distribucin de claves (KCD) de Kerberos. El tipo de datos de esta propiedad es String. Esta propiedad solo es aplicable al Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. loginTimeout Cantidad mxima de tiempo, en segundos, que se debe esperar para establecer conexin con una fuente de datos. Una vez transcurrido el nmero de segundos especificado por loginTimeout, el controlador cierra la conexin con la fuente de datos. El tipo de datos de esta propiedad es int. El valor por omisin es 0, que es el valor por omisin del sistema para el tiempo de espera. Esta propiedad no est soportada para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS. logWriter Es la corriente de salida donde se escriben todos los mensajes de registro de anotaciones y de rastreo correspondientes al objeto DataSource. El tipo de

256

Desarrollo de aplicaciones Java

datos de esta propiedad es java.io.PrinterWriter. El valor por omisin es nulo, que significa que no se generan datos de registro de anotaciones ni de rastreo para DataSource. maxRetriesForClientReroute Durante el redireccionamiento de cliente automtico, limite el nmero de reintentos si falla la conexin principal con el servidor de bases de datos. El tipo de datos de esta propiedad es int.El Controlador IBM DB2 para JDBC y SQLJ utiliza la propiedad maxRetriesForClientReroute slo si la propiedad retryIntervalClientReroute tambin se ha definido. maxTransportObjects Especifica el nmero mximo de objetos de transporte que se pueden utilizar para todas las conexiones con el objeto DataSource asociado. El Controlador IBM DB2 para JDBC y SQLJ utiliza objetos de transporte y una agrupacin de objetos de transporte global para dar soporte al concentrador de conexin y al equilibrado de carga de trabajo Sysplex. Hay un objeto de transporte para cada conexin fsica con el servidor de bases de datos. El tipo de datos de esta propiedad es int. El valor maxTransportObjects se pasa por alto si las propiedades enableConnectionConcentrator y enableSysplexWLB no se establecen para habilitar el uso del concentrador de conexin o del equilibrado de carga de trabajo Sysplex. Si no se ha alcanzado el valor maxTransportObjects y no hay ningn objeto de transporte disponible en la agrupacin de objetos de transporte global, la agrupacin crear un objeto de transporte nuevo. Si se ha alcanzado el valor maxTransportObjects, la aplicacin esperar el tiempo especificado por la propiedad de configuracin db2.jcc.maxTransportObjectWaitTime. Una vez transcurrido dicho perodo de tiempo, si todava no hay ningn objeto de transporte disponible en la agrupacin, la agrupacin emitir una excepcin SQLException. maxTransportObjects no altera temporalmente la propiedad de configuracin db2.jcc.maxTransportObjects. maxTransportObjects no tiene efecto alguna en las conexiones procedentes de otros objetos DataSource. Si el valor maxTransportObjects es mayor que el valor db2.jcc.maxTransportObjects, maxTransportObjects no incrementar el valor db2.jcc.maxTransportObjects. El valor por omisin de maxTransportObjects es -1, lo que significa que el nmero de objetos de transporte de DataSource est limitado nicamente por el valor db2.jcc.maxTransportObjects del controlador. password Es la contrasea que se debe utilizar para establecer conexiones. El tipo de datos de esta propiedad es String. Cuando utiliza la interfaz DataSource para establecer una conexin, puede alterar temporalmente el valor de esta propiedad invocando esta modalidad del mtodo DataSource.getConnection:
getConnection(usuario, contrasea);

plugin Nombre del plugin de seguridad JDBC de la parte del cliente. Esta propiedad es de tipo Object y contiene una instancia nueva del mtodo de plugin de seguridad JDBC. pluginName Nombre del mdulo del plugin de seguridad del lado del servidor.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

257

portNumber El nmero de puerto en que el servidor DRDA escucha peticiones. El tipo de datos de esta propiedad es int. progressiveStreaming Especifica si el controlador JDBC utiliza la modalidad continua progresiva cuando dicha modalidad se soporta en el servidor de bases de datos. Con la modalidad continua progresiva, el servidor de bases de datos determina de manera dinmica el modo ms eficaz para devolver datos LOB o XML en funcin del tamao de los objetos de LOB o XML. El valor del parmetro streamBufferSize determina si los datos se materializan cuando se devuelven. El tipo de datos de progressiveStreaming es int. Los valores vlidos son DB2BaseDatSource.YES (1) y DB2BaseDatSource.NO (2). Si no se especifica la propiedad progressiveStreaming, el valor de progressiveStreaming ser DB2BaseDatSource.NOT_SET (0). Si la conexin es con un servidor de bases de datos que da soporte a la modalidad continua progresiva y el valor de progressiveStreaming es DB2BaseDatSource.YES o DB2BaseDatSource.NOT_SET, el controlador JDBC utilizar la modalidad continua progresiva para devolver datos LOB y XML. Si el valor de progressiveStreaming es DB2BaseDataSource.NO o el servidor de bases de datos no da soporte a la modalidad continua progresiva, el modo en que el controlador JDBC devuelva los datos LOB o XML depender del valor de la propiedad fullyMaterializeLobData. DB2BaseDataSource.NOT_SET (0) El efecto de fullyMaterializeLobData depender de si el servidor de bases de datos da soporte a los localizadores progresivos: v Si el servidor de bases de datos no da soporte a los localizadores progresivos: Si el valor de fullyMaterializeLobData es true, los datos LOB se materializarn completamente dentro del controlador JDBC cuando se capte una fila. Si el valor es false, los datos LOB se canalizarn. El controlador utiliza localizadores internamente para recuperar datos LOB en forma de bloques a medida que sea necesario. Es muy recomendable que establezca este valor en false cuando recupere datos LOB que contengan grandes volmenes de datos. El valor por omisin es true. v Si el servidor de bases de datos da soporte a los localizadores progresivos: El controlador JDBC pasa por alto el valor de fullyMaterializeLobData si la propiedad progresssiveLocators est establecida en DB2BaseDataSource.YES o en DB2BaseDataSource.NOT_SET. Esta propiedad no tiene ningn efecto para parmetros de procedimiento almacenado ni datos LOB que se recuperan utilizando cursores desplazables. Los parmetros de procedimiento almacenado de LOB se materializan siempre. Se utilizan siempre localizadores de LOB para los datos que se recuperan utilizando cursores desplazables. queryCloseImplicit Especifica si los cursores se cierran inmediatamente despus de que se hayan captado todas las filas. queryCloseImplicit se aplica slo para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 con servidores de bases de datos DB2 para z/OS. Los valores posibles son DB2BaseDataSource.QUERY_CLOSE_IMPLICIT_YES (1) y

258

Desarrollo de aplicaciones Java

DB2BaseDataSource.QUERY_CLOSE_IMPLICIT_NO (2). El valor por omisin es DB2BaseDataSource.QUERY_CLOSE_IMPLICIT_YES. Un valor de DB2BaseDataSource.QUERY_CLOSE_IMPLICIT_YES puede tener un rendimiento mejor, ya que esta configuracin reduce el trfico de red. readOnly Especifica si la conexin es de solo lectura. El tipo de datos de esta propiedad es boolean. El valor por omisin es false. resultSetHoldability Especifica si los cursores permanecen abiertos despus de una operacin de confirmacin. El tipo de datos de esta propiedad es int. Los valores vlidos son HOLD_CURSORS_OVER_COMMIT (1) o CLOSE_CURSORS_AT_COMMIT (2). Estos valores son los mismos que las constantes ResultSet.HOLD_CURSORS_OVER_COMMIT y ResultSet.CLOSE_CURSORS_AT_COMMIT que se definen en JDBC 3.0. retrieveMessagesFromServerOnGetMessage Especifica si las llamadas de SQLException.getMessage JDBC hacen que el Controlador IBM DB2 para JDBC y SQLJ invoque un procedimiento almacenado de DB2 para z/OS que recupere el texto del mensaje del error. El tipo de datos de esta propiedad es boolean. El valor por omisin es false, que significa que el texto completo del mensaje no se devuelve al cliente. Por ejemplo, si retrieveMessagesFromServerOnGetMessage est establecido en true, SQLException.getMessage devolver el mensaje siguiente despus de intentar realizar una operacin SQL en una tabla ADMF001.NO_TABLE no existente:
ADMF001.NO_TABLE es un nombre no definido.

Si retrieveMessagesFromServerOnGetMessage se establece en false, se devolver el mensaje siguiente:


DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: ADMF001.NO_TABLE

Una alternativa al uso de true como valor de esta propiedad, es utilizar el mtodo DB2Sqlca.getMessage, exclusivo de DB2, en las aplicaciones. Ambas tcnicas producen una llamada de procedimiento almacenado, la cual inicia una unidad de trabajo. retryIntervalForClientReroute En el caso de un redireccionamiento de cliente automtico, especifica la cantidad de tiempo, en segundos, entre los dos reintentos de conexin. El tipo de datos de esta propiedad es int.El Controlador IBM DB2 para JDBC y SQLJ utiliza la propiedad retryIntervalClientReroute slo si la propiedad maxRetriesForClientRerouteOnly tambin se ha definido. returnAlias Especifica si el controlador JDBC devuelve filas de alias de tabla y sinnimos para mtodos DatabaseMetaData que devuelven informacin de tabla, como por ejemplo getTables. El tipo de datos de returnAlias es int. Los valores posibles son: 0 1 No devolver filas para alias ni sinnimos de tablas en la salida de mtodos DatabaseMetaData que devuelven informacin de tabla. En el caso de tablas que tienen alias o sinnimos, devolver filas de alias y sinnimos de dichas tablas, as como filas de tablas, en la salida de mtodos DatabaseMetaData que devuelven informacin de tabla. ste es el valor por omisin.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

259

securityMechanism Especifica el mecanismo de seguridad de DRDA. El tipo de datos de esta propiedad es int. Los valores posibles son: CLEAR_TEXT_PASSWORD_SECURITY (3) ID de usuario y contrasea USER_ONLY_SECURITY (4) Slo ID de usuario ENCRYPTED_PASSWORD_SECURITY (7) ID de usuario, contrasea cifrada ENCRYPTED_USER_AND_PASSWORD_SECURITY (9) ID de usuario y contrasea cifrados KERBEROS_SECURITY (11) Kerberos ENCRYPTED_USER_AND_DATA_SECURITY (12) ID de usuario y datos sensibles a la seguridad cifrados. ENCRYPTED_USER_PASSWORD_AND_DATA_SECURITY (13) ID de usuario, contrasea y datos sensibles a la seguridad cifrados. PLUGIN_SECURITY (15) Seguridad de plugin (solamente DB2 Database para Linux, UNIX y Windows). Si se especifica esta propiedad, el mecanismo de seguridad especificado es el nico mecanismo utilizado. Si el mecanismo de seguridad no est soportado por la conexin, se emite una excepcin. El valor por omisin de securityMechanism es CLEAR_TEXT_PASSWORD_SECURITY. Si el servidor no admite CLEAR_TEXT_PASSWORD_SECURITY pero s admite ENCRYPTED_USER_AND_PASSWORD_SECURITY, el Controlador IBM DB2 para JDBC y SQLJ actualiza el mecanismo de seguridad a ENCRYPTED_USER_AND_PASSWORD_SECURITY y trata de conectarse al servidor. Cualquier otra discrepancia en el soporte del mecanismo de seguridad entre el solicitante y el servidor da como resultado un error. sendDataAsIs Especifica que el Controlador IBM DB2 para JDBC y SQLJ no convierte valores de parmetro de entrada para los tipos de datos de columna de destino. El tipo de datos de esta propiedad es boolean. El valor por omisin es false. Esta propiedad debe utilizarse slo para aplicaciones que siempre garanticen que los tipos de datos de la aplicacin coincidan con los tipos de datos de las tablas DB2 correspondientes. serverName Nombre de sistema principal o direccin TCP/IP de la fuente de datos. El tipo de datos de esta propiedad es String. sslConnection Especifica si el Controlador IBM DB2 para JDBC y SQLJ utiliza un socket SSL para conectarse con un servidor de DB2. Si sslConnection se establece en true, la conexin utilizar un socket SSL. Si sslConnection se establece en false, la conexin utilizar un socket normal.

260

Desarrollo de aplicaciones Java

statementReuseProtocol Especifica el modo en que se manejan los objetos Statement cuando se devuelve una conexin a una agrupacin de conexiones. Los valores posibles son: NO_REUSE Los objetos Statement se cierran cuando se devuelve una conexin para la agrupacin. streamBufferSize Especifica el tamao, en bytes, de los almacenamientos intermedios del controlador JDBC para truncar datos LOB o XML. El controlador JDBC utiliza el valor streamBufferSize independientemente de que utilice la modalidad continua progresiva. El tipo de datos de streamBufferSize es int. El valor por omisin es 1048576. Si el controlador JDBC utiliza la modalidad continua progresiva, los datos LOB o XML se materializarn si caben en los almacenamientos intermedios y el controlador no utilizar la propiedad fullyMaterializeLobData. DB2BaseDataSource.NOT_SET (0) El efecto de fullyMaterializeLobData depender de si el servidor de bases de datos da soporte a los localizadores progresivos: v Si el servidor de bases de datos no da soporte a los localizadores progresivos: Si el valor de fullyMaterializeLobData es true, los datos LOB se materializarn completamente dentro del controlador JDBC cuando se capte una fila. Si el valor es false, los datos LOB se canalizarn. El controlador utiliza localizadores internamente para recuperar datos LOB en forma de bloques a medida que sea necesario. Es muy recomendable que establezca este valor en false cuando recupere datos LOB que contengan grandes volmenes de datos. El valor por omisin es true. v Si el servidor de bases de datos da soporte a los localizadores progresivos: El controlador JDBC pasa por alto el valor de fullyMaterializeLobData si la propiedad progresssiveLocators est establecida en DB2BaseDataSource.YES o en DB2BaseDataSource.NOT_SET. Esta propiedad no tiene ningn efecto para parmetros de procedimiento almacenado ni datos LOB que se recuperan utilizando cursores desplazables. Los parmetros de procedimiento almacenado de LOB se materializan siempre. Se utilizan siempre localizadores de LOB para los datos que se recuperan utilizando cursores desplazables. supportsAsynchronousXARollback Especifica si el Controlador IBM DB2 para JDBC y SQLJ da soporte a operaciones de retrotraccin XA asncrona. El tipo de datos de esta propiedad es int. El valor por omisin es DB2BaseDataSource.NO (2). Si la aplicacin se ejecuta en un servidor de aplicaciones BEA WebLogic Server, establezca supportsAsynchronousXARollback en DB2BaseDataSource.YES (1). sysSchema Especifica el esquema de las tablas o vistas de catlogo transitorias de DB2 que se examinan cuando una aplicacin invoca un mtodo de DatabaseMetaData. La propiedad sysSchema se denominaba cliSchema anteriormente. traceDirectory Especifica un directorio en el que se graba la informacin de rastreo. El tipo de

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

261

datos de esta propiedad es String. Cuando se especifica traceDirectory, la informacin de rastreo correspondiente a varias conexiones en el mismo DataSource se graba en varios archivos. Si se especifica traceDirectory, la conexin se guarda en un archivo denominado traceFile_origen_n. Si no se especifica traceFileName, el valor nombre-archivo ser traceFile. Si tambin se especifica traceFileName, nombre-archivo ser el valor traceFileName. n es la conexin nmero n correspondiente a una DataSource. origen indica el origen del grabador de anotaciones cronolgicas que se est utilizando. Los valores posibles de origen son: cpds Grabador de anotaciones cronolgicas para un objeto DB2ConnectionPoolDataSource.

driver Grabador de anotaciones cronolgicas para un objeto DB2Driver. global Grabador de anotaciones cronolgicas para un objeto DB2TraceManager. sds xads Grabador de anotaciones cronolgicas para un objeto DB2SimpleDataSource. Grabador de anotaciones cronolgicas para un objeto DB2XADataSource.

traceFile Especifica el nombre del archivo en donde el Controlador IBM DB2 para JDBC y SQLJ escribe informacin de rastreo. El tipo de datos de esta propiedad es String. La propiedad traceFile es una alternativa al uso de la propiedad logWriter para encaminar la corriente de datos de rastreo de salida hacia un archivo. traceFileAppend Especifica si deben aadir o sobrescribir datos en el archivo especificado por la propiedad traceFile. El tipo de datos de esta propiedad es boolean. El valor por omisin es false, que significa que se sobrescribe el archivo especificado por la propiedad traceFile. traceLevel Especifica qu se debe rastrear. El tipo de datos de esta propiedad es int. Puede especificar uno o ms de los valores de rastreo siguientes con la propiedad traceLevel: v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_NONE (X'00') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTION_CALLS (X'01') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_STATEMENT_CALLS (X'02') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_CALLS (X'04') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRIVER_CONFIGURATION (X'10') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTS (X'20') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRDA_FLOWS (X'40') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_META_DATA (X'80') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_PARAMETER_META_DATA (X'100') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DIAGNOSTICS (X'200') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SQLJ (X'400') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_XA_CALLS (Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 para DB2 Database para Linux, UNIX y Windows solamente) (X'800') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_META_CALLS (X'2000') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DATASOURCE_CALLS (X'4000')

262

Desarrollo de aplicaciones Java

v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_LARGE_OBJECT_CALLS (X'8000') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SYSTEM_MONITOR (X'20000') v com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL (X'FFFFFFFF') Para especificar ms de un valor de rastreo, utilice una de estas tcnicas: v Utilice operadores OR (|) de bits con dos o ms valores de rastreo. Por ejemplo, para rastrear flujos de DRDA y llamadas de conexin, especifique este valor para traceLevel:
TRACE_DRDA_FLOWS|TRACE_CONNECTION_CALLS

v Utilice un operador de complemento a nivel de bit ( ~) con un valor de rastreo para especificar todos los rastreos excepto uno determinado. Por ejemplo, para rastrear todo excepto los flujos de DRDA, especifique este valor para traceLevel:
~TRACE_DRDA_FLOWS

usePool Especifica si la agrupacin de objetos de transporte global se utiliza para las funciones del concentrador de conexin o de equilibrado de carga de trabajo Sysplex del Controlador IBM DB2 para JDBC y SQLJ. El tipo de datos de usePool es boolean. Si usePool se establece en true, se comprobar la agrupacin de objetos de transporte global para buscar objetos de transporte disponibles antes de crear objetos de transporte nuevos. Si usePool se establece en false, no se comprobar la agrupacin de objetos de transporte global antes de crear cualquier objeto nuevo. El objeto de transporte se crear cuando una aplicacin lo requiera y se eliminar cuando una aplicacin ya no lo necesite. El valor por omisin para usePool es true. usePool se pasar por alto si las funciones del concentrador de conexin o del equilibrado de carga de trabajo Sysplex se encuentran inhabilitadas. Si se establece usePool en false, es posible que disminuya el rendimiento. Dicho valor slo deber utilizarse cuando deba crearse un objeto de transporte nuevo para una aplicacin o cuando la aplicacin modifique el objeto de transporte de modo que no pueda ser utilizado por otras aplicaciones. useTargetColumnEncoding Especifica si se deben enviar datos de tipo carcter de un solo byte para parmetros de entrada de sentencias JDBC al servidor en el esquema de codificacin de la columna de la tabla de destino. El tipo de datos de esta propiedad es boolean. El valor por omisin es true. Si useTargetColumnEncoding se establece en false o no hay informacin disponible sobre el esquema de codificacin para la columna de destino, los datos se enviarn al servidor de bases de datos en el esquema de codificacin UTF-8 o UCS-2. El valor de useTargetColumnEncoding no tiene efecto alguno en datos de tipo carcter mixtos o de doble byte. Los datos se envan al servidor con el formato Unicode. El valor de useTargetColumnEncoding no tiene efecto alguno en los datos de salida. Si se establece useTargetColumnEncoding en true y no existe ningn conversor de caracteres en bytes de tiempo de ejecucin Java para convertir los datos al CCSID de la columna de tabla de DB2, se emitir una excepcin. user ID de usuario que se utilizar para establecer conexiones. El tipo de datos de
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

263

esta propiedad es String. Cuando utiliza la interfaz DataSource para establecer una conexin, puede alterar temporalmente el valor de esta propiedad invocando esta modalidad del mtodo DataSource.getConnection:
getConnection(usuario, contrasea);

Conceptos relacionados: v Concentrador de conexin JDBC y equilibrado de carga de trabajo Sysplex en la pgina 235 v LOB en aplicaciones JDBC con el controlador IBM DB2 para JDBC y SQLJ en la pgina 63 v Seguridad en el controlador IBM DB2 para JDBC y SQLJ en la pgina 154 Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358 v Resumen de las extensiones de JDBC del Controlador IBM DB2 para JDBC y SQLJ en la pgina 321

Soporte para las API de JDBC


Las tablas siguientes muestran las interfaces de JDBC y los controladores soportados para cada una. Los controladores y sus plataformas soportadas son:
Tabla 32. Controladores JDBC para servidores de bases de datos DB2 Nombre del controlador JDBC Controlador IBM DB2 para JDBC y SQLJ Controlador JDBC de DB2 de tipo 2 para Linux, UNIX y Windows (obsoleto) Servidor de bases de datos DB2 asociado DB2 Database para Linux, UNIX y Windows o DB2 para z/OS DB2 Database para Linux, UNIX y Windows

Si un mtodo tiene formatos de JDBC 2.0 y JDBC 3.0, el Controlador IBM DB2 para JDBC y SQLJ los soporta todos. El controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows slo soporta los formatos de JDBC 2.0.
Tabla 33. Soporte de JDBC para DB2 para mtodos Array Soporte del Controlador IBM DB2 para JDBC y SQLJ No No No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No

Mtodo JDBC getArray getBaseType getBaseTypeName getResultSet

264

Desarrollo de aplicaciones Java

Tabla 34. Soporte de JDBC para DB2 para mtodos de BatchUpdateException Soporte del Controlador IBM DB2 para JDBC y SQLJ S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S

Mtodo de JDBC Mtodos heredados de java.lang.Exception getUpdateCounts

Tabla 35. Soporte de JDBC de DB2 para mtodos Blob Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S
1

Mtodo de JDBC getBinaryStream getBytes longitud posicin setBinaryStream setBytes


1 1

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S No No No

S S S

truncate Notas:

1. Este mtodo slo se puede utilizar si la propiedad fullyMaterializeLobData est configurada en true. Tabla 36. Soporte de JDBC de DB2 para mtodos CallableStatement Soporte del Controlador IBM DB2 para JDBC y SQLJ S S
1

Mtodo de JDBC Mtodos heredados de java.sql.Statement Mtodos heredados de java.sql.PreparedStatement getArray getBigDecimal getBlob getBoolean getByte getBytes getClob getDate getDouble getFloat getInt getLong getObject getRef getShort getString getTime

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S No S S S S S S S3 S S S S S4 No S S S3

No S S S S S S S
2 2 2 2 2 2 2,3

S2 S S S S
2 2 2 2,4

No S S S
2 2 2,3

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

265

Tabla 36. Soporte de JDBC de DB2 para mtodos CallableStatement (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S2,3 S S
5

Mtodo de JDBC getTimestamp getURL registerOutParameter setAsciiStream setBigDecimal setBinaryStream setBoolean setByte setBytes setCharacterStream setDate setDouble setFloat setInt setLong setNull setObject setShort setString setTime setTimestamp setURL wasNull

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S3 No S5 No No No No No No No No No No No No No No No No No No No S

S6 S S S S S S S S S S S S S S S S S S S
6 6 6 6 6 6 6 6 6 6 6 6,,7 6, 6 6 6 6

266

Desarrollo de aplicaciones Java

Tabla 36. Soporte de JDBC de DB2 para mtodos CallableStatement (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows

Mtodo de JDBC Notas:

1. No se soporta el mtodo getParameterMetaData heredado si el servidor de bases de datos es DB2 para z/OS. 2. Los formatos siguientes de los mtodos CallableStatement.getXXX no tienen soporte si la base de datos es DB2 para z/OS: getXXX(String Nombre del parmetro) 3. DB2 no da soporte al ajuste de huso horario para los valores de fecha y hora. El controlador JDBC ajusta un valor para el huso horario local despus de recuperar el valor de DB2, si se especifica un formato del mtodo getDate, getTime o getTimestamp que incluya un parmetro java.util.Calendar. 4. El formato siguiente del mtodo getObject no se soporta: getObject(int ndiceparmetros, java.util.Map map) 5. El formato siguiente del mtodo registerOutParameter no se soporta: registerOutParameter(int ndiceparmetros, int Tipojdbc, String Nombre del tipo) 6. No se soporta si el servidor de bases de datos es DB2 para z/OS. 7. El formato siguiente de setNull no se soporta: setNull(int ndiceparmetros, int Tipojdbc, String Nombretipo)

Tabla 37. Soporte de JDBC de DB2 para mtodos Clob Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S
1

Mtodo de JDBC getAsciiStream getCharacterStream getSubString longitud posicin setAsciiStream


1 1

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S No No No No

S S S S

setCharacterStream setString truncate Notas:


1

1. Este mtodo slo se puede utilizar si la propiedad fullyMaterializeLobData est configurada en true. Tabla 38. Soporte de JDBC de DB2 para mtodos Connection Soporte del Controlador IBM DB2 para JDBC y SQLJ S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

Mtodo de JDBC clearWarnings close

267

Tabla 38. Soporte de JDBC de DB2 para mtodos Connection (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S No S S S S S S S S S S S S S No
2

Mtodo de JDBC commit createStatement getAutoCommit getCatalog getHoldability getMetaData getTransactionIsolation getTypeMap getWarnings isClosed isReadOnly nativeSQL prepareCall prepareStatement releaseSavepoint rollback setAutoCommit setCatalog setReadOnly setSavepoint setTransactionIsolation setTypeMap Notas:

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S1 S S No S S No S S S S S S1 No S1 S S S No S No

1. El controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows no soporta los formatos de JDBC 3.0 de este mtodo. 2. El controlador no utiliza el valor. Para el Controlador IBM DB2 para JDBC y SQLJ, una conexin se puede definir como de slo lectura mediante la propiedad readOnly de un objeto Connection o DataSource. Tabla 39. Soporte de JDBC de DB2 para mtodos ConnectionEvent Soporte del Controlador IBM DB2 para JDBC y SQLJ S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S

Mtodo de JDBC Mtodos heredados de java.util.EventObject getSQLException

Tabla 40. Soporte de JDBC de DB2 para mtodos ConnectionEventListener Soporte del Controlador IBM DB2 para JDBC y SQLJ S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S

Mtodo de JDBC connectionClosed connectionErrorOccurred

268

Desarrollo de aplicaciones Java

Tabla 41. Soporte de JDBC de DB2 para mtodos ConnectionPoolDataSource Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S
1

Mtodo de JDBC getLoginTimeout getLogWriter getPooledConnection setLoginTimeout setLogWriter Nota:

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S

1. Este mtodo no est soportado para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS. Tabla 42. Soporte de JDBC de DB2 para mtodos DatabaseMetaData Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S S S S S S S S S S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S No S S S S S S1 S S No No S S S S S S S S

Mtodo de JDBC allProceduresAreCallable allTablesAreSelectable dataDefinitionCausesTransactionCommit dataDefinitionIgnoredInTransactions deletesAreDetected doesMaxRowSizeIncludeBlobs getAttributes getBestRowIdentifier getCatalogs getCatalogSeparator getCatalogTerm getColumnPrivileges getColumns getConnection getCrossReference getDatabaseMajorVersion getDatabaseMinorVersion getDatabaseProductName getDatabaseProductVersion getDefaultTransactionIsolation getDriverMajorVersion getDriverMinorVersion getDriverName getDriverVersion getExportedKeys

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

269

Tabla 42. Soporte de JDBC de DB2 para mtodos DatabaseMetaData (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S No No S S S S S S S S S S S S S S S S S S S S S S S S S No S1 S S S No

Mtodo de JDBC getExtraNameCharacters getIdentifierQuoteString getImportedKeys getIndexInfo getJDBCMajorVersion getJDBCMinorVersion getMaxBinaryLiteralLength getMaxCatalogNameLength getMaxCharLiteralLength getMaxColumnNameLength getMaxColumnsInGroupBy getMaxColumnsInIndex getMaxColumnsInOrderBy getMaxColumnsInSelect getMaxColumnsInTable getMaxConnections getMaxCursorNameLength getMaxIndexLength getMaxProcedureNameLength getMaxRowSize getMaxSchemaNameLength getMaxStatementLength getMaxStatements getMaxTableNameLength getMaxTablesInSelect getMaxUserNameLength getNumericFunctions getPrimaryKeys getProcedureColumns getProcedures getProcedureTerm getResultSetHoldability getSchemas getSchemaTerm getSearchStringEscape getSQLKeywords getSQLStateType

270

Desarrollo de aplicaciones Java

Tabla 42. Soporte de JDBC de DB2 para mtodos DatabaseMetaData (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S No S S S S S S S S S S S S S S S S S S S S S S S S S S S
2 2

Mtodo de JDBC getStringFunctions getSuperTables getSuperTypes getSystemFunctions getTablePrivileges getTables getTableTypes getTimeDateFunctions getTypeInfo getUDTs getURL getUserName getVersionColumns insertsAreDetected isCatalogAtStart isReadOnly nullPlusNonNullIsNull nullsAreSortedAtEnd nullsAreSortedAtStart nullsAreSortedHigh nullsAreSortedLow othersDeletesAreVisible othersInsertsAreVisible othersUpdatesAreVisible ownDeletesAreVisible ownInsertsAreVisible ownUpdatesAreVisible storesLowerCaseIdentifiers storesLowerCaseQuotedIdentifiers storesMixedCaseIdentifiers storesMixedCaseQuotedIdentifiers storesUpperCaseIdentifiers storesUpperCaseQuotedIdentifiers supportsAlterTableWithAddColumn supportsAlterTableWithDropColumn supportsANSI92EntryLevelSQL supportsANSI92FullSQL

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S No No S S S1 S S S S2 S S S S S S S S S S S S S S S S S S S S S S S S S S S

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

271

Tabla 42. Soporte de JDBC de DB2 para mtodos DatabaseMetaData (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S S S S S S S S S S S S No S S S S S S S S S No S S No S S S S S S

Mtodo de JDBC supportsANSI92IntermediateSQL supportsBatchUpdates supportsCatalogsInDataManipulation supportsCatalogsInIndexDefinitions supportsCatalogsInPrivilegeDefinitions supportsCatalogsInProcedureCalls supportsCatalogsInTableDefinitions SupportsColumnAliasing supportsConvert supportsCoreSQLGrammar supportsCorrelatedSubqueries supportsDataDefinitionAndDataManipulationTransactions supportsDataManipulationTransactionsOnly supportsDifferentTableCorrelationNames supportsExpressionsInOrderBy supportsExtendedSQLGrammar supportsFullOuterJoins supportsGetGeneratedKeys supportsGroupBy supportsGroupByBeyondSelect supportsGroupByUnrelated supportsIntegrityEnhancementFacility supportsLikeEscapeClause supportsLimitedOuterJoins supportsMinimumSQLGrammar supportsMixedCaseIdentifiers supportsMixedCaseQuotedIdentifiers supportsMultipleOpenResults supportsMultipleResultSets supportsMultipleTransactions supportsNamedParameters supportsNonNullableColumns supportsOpenCursorsAcross Commit supportsOpenCursorsAcross Rollback supportsOpenStatementsAcrossCommit supportsOpenStatementsAcrossRollback supportsOrderByUnrelated

272

Desarrollo de aplicaciones Java

Tabla 42. Soporte de JDBC de DB2 para mtodos DatabaseMetaData (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S S S S S S S S S S S S S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S No S No S S S S S S S S S S S No No S S S S S S S S

Mtodo de JDBC supportsOuterJoins supportsPositionedDelete supportsPositionedUpdate supportsResultSetConcurrency supportsResultSetHoldability supportsResultSetType supportsSavepoints supportsSchemasInDataManipulation supportsSchemasInIndexDefinitions supportsSchemasInPrivilegeDefinitions supportsSchemasInProcedureCalls supportsSchemasInTableDefinitions supportsSelectForUpdate supportsStoredProcedures supportsSubqueriesInComparisons supportsSubqueriesInExists supportsSubqueriesInIns supportsSubqueriesInQuantifieds supportsSuperTables supportsSuperTypes supportsTableCorrelationNames supportsTransactionIsolationLevel supportsTransactions supportsUnion supportsUnionAll updatesAreDetected usesLocalFilePerTable usesLocalFiles Notas:

1. El controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows no soporta el formato JDBC 3.0 de este mtodo. 2. El mtodo se puede ejecutar, pero devuelve un conjunto de resultados vaco. Tabla 43. Soporte de JDBC de DB2 para mtodos DataSource Soporte del Controlador IBM DB2 para JDBC y SQLJ S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S

Mtodo de JDBC getConnection

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

273

Tabla 43. Soporte de JDBC de DB2 para mtodos DataSource (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S
2

Mtodo de JDBC getLoginTimeout getLogWriter setLoginTimeout setLogWriter Notas:

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S1 S S1 S

1. El Controlador JDBC de DB2 de tipo 2 no utiliza este valor. 2. Este mtodo no est soportado para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS. Tabla 44. Soporte de JDBC de DB2 para mtodos DataTruncation Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S S S

Mtodo de JDBC Mtodos heredados de java.lang.Throwable Mtodos heredados de java.sql.SQLException Mtodos heredados de java.sql.SQLWarning getDataSize getIndex getParameter getRead getTransferSize

Tabla 45. Soporte de JDBC de DB2 para mtodos Driver Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S

Mtodo de JDBC acceptsURL connect getMajorVersion getMinorVersion getPropertyInfo jdbcCompliant

Tabla 46. Soporte de JDBC de DB2 para mtodos DriverManager Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S

Mtodo de JDBC deregisterDriver getConnection getDriver getDrivers

274

Desarrollo de aplicaciones Java

Tabla 46. Soporte de JDBC de DB2 para mtodos DriverManager (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S
2

Mtodo de JDBC getLoginTimeout getLogStream getLogWriter println registerDriver setLoginTimeout setLogStream setLogWriter Notas:

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S1 S S S S S1 S S

1. El controlador JDBC de DB2 de tipo 2 no utiliza este valor. 2. Este mtodo no est soportado para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS. Tabla 47. Soporte de JDBC de DB2 para mtodos ParameterMetaData Soporte del Controlador IBM DB2 para JDBC y SQLJ No S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No No No No No No

Mtodo de JDBC getParameterClassName getParameterCount getParameterMode getParameterType getParameterTypeName getPrecision getScale isNullable isSigned

Tabla 48. Soporte de JDBC de DB2 para mtodos PooledConnection Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S

Mtodo de JDBC addConnectionEventListener close getConnection removeConnectionEventListener

Tabla 49. Soporte de JDBC de DB2 para mtodos PreparedStatement Soporte del Controlador IBM DB2 para JDBC y SQLJ S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S

Mtodo de JDBC Mtodos heredados de java.sql.Statement

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

275

Tabla 49. Soporte de JDBC de DB2 para mtodos PreparedStatement (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S No S S S S S S S S S S S S S S S S No S S
3 2 1

Mtodo de JDBC addBatch clearParameters execute executeQuery executeUpdate getMetaData getParameterMetaData setArray setAsciiStream setBigDecimal setBinaryStream setBlob setBoolean setByte setBytes setCharacterStream setClob setDate setDouble setFloat setInt setLong setNull setObject setRef setShort setString setTime setTimestamp setUnicodeStream setURL Notas:

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S S No S S S S S S S S S S1 S S S S S2 S No S S3 S1 S1 S S

S1 S1 S S

1. DB2 no da soporte al ajuste de huso horario para los valores de fecha y hora. El controlador JDBC ajusta un valor para el huso horario local antes de enviar el valor a DB2, si se especifica un formato del mtodo setDate, setTime o setTimestamp que incluya un parmetro java.util.Calendar. 2. El formato siguiente de setNull no se soporta: setNull(int ndiceparmetros, int Tipojdbc, String Nombretipo) 3. setString no est soportado si la columna tiene el atributo FOR BIT DATA o el tipo de datos es BLOB.

276

Desarrollo de aplicaciones Java

Tabla 50. Soporte de JDBC de DB2 para mtodos Ref Soporte del Controlador IBM DB2 para JDBC y SQLJ No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No

Mtodo de JDBC get BaseTypeName

Tabla 51. Soporte de JDBC de DB2 para mtodos ResultSet Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S No S S S S S S S S S S S S S S S S S S S S
3 2 1

Mtodo de JDBC absolute afterLast beforeFirst cancelRowUpdates clearWarnings close deleteRow findColumn first getArray getAsciiStream getBigDecimal getBinaryStream getBlob getBoolean getByte getBytes getCharacterStream getClob getConcurrency getCursorName getDate getDouble getFetchDirection getFetchSize getFloat getInt getLong getMetaData getObject getRef getRow getShort

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S No S S No S S No S S S S S S S S S S S S2 S S S S S S S S3 No S S

No S S

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

277

Tabla 51. Soporte de JDBC de DB2 para mtodos ResultSet (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S
2

Mtodo de JDBC getStatement getString getTime getTimestamp getType getUnicodeStream getURL getWarnings insertRow isAfterLast isBeforeFirst isFirst isLast last moveToCurrentRow moveToInsertRow next previous refreshRow relative rowDeleted rowInserted rowUpdated setFetchDirection setFetchSize updateArray updateAsciiStream updateBigDecimal updateBinaryStream updateBlob updateBoolean updateByte updateBytes updateCharacterStream updateClob updateDate updateDouble updateFloat

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S2 S2 S S S S No S S S S S No No S S No S No No No S S No No No No No No No No No No No No No

S2 S S S S No S S S S S S No S S S S S No S S S No S S S S S S S S S S S S

278

Desarrollo de aplicaciones Java

Tabla 51. Soporte de JDBC de DB2 para mtodos ResultSet (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S No S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No No No No No No No S

Mtodo de JDBC updateInt updateLong updateNull updateObject updateRef updateRow updateShort updateString updateTime updateTimestamp wasNull Notas:

1. getBinaryStream no est soportado para columnas de tipo CLOB. 2. DB2 no da soporte al ajuste de huso horario para los valores de fecha y hora. El controlador JDBC ajusta un valor para el huso horario local despus de recuperar el valor de DB2, si se especifica un formato del mtodo getDate, getTime o getTimestamp que incluya un parmetro java.util.Calendar. 3. El formato siguiente del mtodo getObject no se soporta: getObject(int ndiceparmetros, java.util.Map map)

Tabla 52. Soporte de JDBC de DB2 para mtodos ResultSetMetaData Soporte del Controlador IBM DB2 para JDBC y SQLJ S No S S S S S S S S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S S S S S S S S S S

Mtodo de JDBC getCatalogName getColumnClassName getColumnCount getColumnDisplaySize getColumnLabel getColumnName getColumnType getColumnTypeName getPrecision getScale getSchemaName getTableName isAutoIncrement isCaseSensitive isCurrency

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

279

Tabla 52. Soporte de JDBC de DB2 para mtodos ResultSetMetaData (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S

Mtodo de JDBC isDefinitelyWritable isNullable isReadOnly isSearchable isSigned isWritable

Tabla 53. Soporte de JDBC de DB2 para mtodos SQLData Soporte del Controlador IBM DB2 para JDBC y SQLJ No No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No

Mtodo de JDBC getSQLTypeName readSQL writeSQL

Tabla 54. Soporte de JDBC de DB2 para mtodos SQLException Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S

Mtodo de JDBC Mtodos heredados de java.lang.Exception getSQLState getErrorCode getNextException setNextException

Tabla 55. Soporte de JDBC de DB2 para mtodos SQLInput Soporte del Controlador IBM DB2 para JDBC y SQLJ No No No No No No No No No No No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No No No No No No No No No

Mtodo de JDBC readArray readAsciiStream readBigDecimal readBinaryStream readBlob readBoolean readByte readBytes readCharacterStream readClob readDate readDouble

280

Desarrollo de aplicaciones Java

Tabla 55. Soporte de JDBC de DB2 para mtodos SQLInput (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ No No No No No No No No No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No No No No No No No

Mtodo de JDBC readFloat readInt readLong readObject readRef readShort readString readTime readTimestamp wasNull

Tabla 56. Soporte de JDBC de DB2 para mtodos SQLOutput Soporte del Controlador IBM DB2 para JDBC y SQLJ No No No No No No No No No No No No No No No No No No No No No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No No No No No No No No No No No No No No No No No No No No No

Mtodo de JDBC writeArray writeAsciiStream writeBigDecimal writeBinaryStream writeBlob writeBoolean writeByte writeBytes writeCharacterStream writeClob writeDate writeDouble writeFloat writeInt writeLong writeObject writeRef writeShort writeString writeStruct writeTime writeTimestamp

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

281

Tabla 57. Soporte de JDBC de DB2 para mtodos Statement Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S S S S S S S S S S S S S2 S S S S S S S S S S S S S
5 1,2

Mtodo de JDBC addBatch cancel clearBatch clearWarnings close execute executeBatch executeQuery executeUpdate getConnection getFetchDirection getFetchSize getGeneratedKeys getMaxFieldSize getMaxRows getMoreResults getQueryTimeout getResultSet getResultSetConcurrency getResultSetHoldability getResultSetType getUpdateCount getWarnings setCursorName setEscapeProcessing setFetchDirection setFetchSize setMaxFieldSize setMaxRows setQueryTimeout
4

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S S3 S S S3 S S S No S S S3 S S S No S S S S S S S S S S

282

Desarrollo de aplicaciones Java

Tabla 57. Soporte de JDBC de DB2 para mtodos Statement (continuacin) Soporte del Controlador IBM DB2 para JDBC y SQLJ Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows

Mtodo de JDBC Notas:

1. Con el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4, puede ejecutar Statement.cancel() slo si el servidor de bases de datos soporta el mandato DRDA INTRDBRQS (interrupcin de la peticin de la base de datos relacional). Slo los servidores DB2 para z/OS de la versin 9.1 o versiones posteriores tienen este soporte. Por consiguiente, con el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 puede ejecutar Statement.cancel() slo en el caso de conexiones con DB2 para z/OS en la versin 9 o en versiones posteriores. 2. Este mtodo slo est soportado para: v Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 para un servidor DB2 Database para Linux, UNIX y Windows en la versin 9.1 o posterior v Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 para un servidor DB2 para z/OS en la versin 9 o posterior 3. El controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows no soporta el formato JDBC 3.0 de este mtodo. 4. No est soportado para conjuntos de resultados de procedimiento almacenado. 5. Para el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 en DB2 para z/OS, este mtodo slo est soportado para un valor de 0 segundos. Tabla 58. Soporte de JDBC de DB2 para mtodos Struct Soporte del Controlador IBM DB2 para JDBC y SQLJ No No Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows No No

Mtodo de JDBC getSQLTypeName getAttributes

Tabla 59. Soporte de JDBC de DB2 para mtodos XAConnection Soporte del Controlador IBM DB2 para JDBC y SQLJ
1

Mtodo de JDBC

Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S

Mtodos heredados de javax.sql.PooledConnection S1 getXAResource Notas: S

1. Este mtodo est soportado para la Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 2 con un servidor DB2 Database para Linux, UNIX y Windows o para la Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4 con un servidor DB2 para z/OS. Tabla 60. Soporte de JDBC de DB2 para mtodos XADataSource Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S S Controlador JDBC de DB2 de Tipo 2 para Linux, UNIX y Windows S S S S S

Mtodo de JDBC getLoginTimeout getLogWriter getXAConnection setLoginTimeout setLogWriter

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

283

Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Informacin de consulta sobre sentencias de SQLJ


Los temas siguientes contienen informacin sobre la sintaxis de clusulas de SQLJ. v Clusula SQLJ v Expresin de lenguaje principal de SQLJ v Clusula implements de SQLJ en la pgina 285 v Clusula with de SQLJ en la pgina 286 v Clusula connection-declaration SQLJ en la pgina 287 v Clusula de declaracin de iterador de SQLJ en la pgina 288 v Clusula ejecutable de SQLJ en la pgina 290 v Clusula context de SQLJ en la pgina 291 v Clusula de sentencia de SQLJ en la pgina 291 v Clusula SET TRANSACTION de SQLJ en la pgina 293 v Clusula de asignacin de SQLJ en la pgina 294 v Clusula de conversin a iterador de SQLJ en la pgina 295

Clusula SQLJ
Las sentencias de SQL de un programa SQLJ estn contenidas en clusulas SQLJ. La sintaxis general de una clusula SQLJ es:
#sql clusula-declaracin-conexin clusula-declaracin-iterador clusula-ejecutable ;

Las palabras clave de una clusula SQLJ distinguen entre maysculas y minsculas, a menos que esas palabras clave formen parte de una sentencia de SQL dentro de una clusula ejecutable. Informacin relacionada: v Clusula connection-declaration SQLJ en la pgina 287 v Clusula ejecutable de SQLJ en la pgina 290 v Clusula de declaracin de iterador de SQLJ en la pgina 288

Expresin de lenguaje principal de SQLJ


Una expresin de lenguaje principal es una variable o expresin Java que se especifica en clusulas de SQLJ dentro de un programa de aplicacin SQLJ. Sintaxis:
: IN OUT INOUT variable-simple (expresin-compleja)

Descripcin:

284

Desarrollo de aplicaciones Java

Indica que la variable o expresin que sigue a continuacin es una expresin de lenguaje principal. La variable o expresin debe estar precedida inmediatamente por los dos puntos (:).

IN|OUT|INOUT Para expresiones de lenguaje principal que se utilizan como parmetros en una llamada de procedimiento almacenado, identifica si el parmetro proporciona datos al procedimiento almacenado (IN), recibe datos del procedimiento almacenado (OUT), o realiza ambas cosas (INOUT). El valor por omisin es IN. variable-simple Especifica un identificador Java no calificado. expresin-compleja Especifica una expresin Java cuya evaluacin da como resultado un valor individual. Notas de uso: v Las expresiones complejas deben estar encerradas entre parntesis. v La ubicacin de una expresin de lenguaje principal dentro de una sentencia de SQL esttico est regida por reglas de ANSI/ISO. Conceptos relacionados: v Variables en aplicaciones SQLJ en la pgina 106

Clusula implements de SQLJ


La clusula implements obtiene una o varias clases a partir de una interfaz Java. Sintaxis:
, implements elemento-interfaz

elemento-interfaz:
sqlj.runtime.ForUpdate sqlj.runtime.Scrollable clase-interfaz-especificada-por-usuario

Descripcin: elemento-interfaz Especifica una interfaz Java definida por el usuario, la interfaz sqlj.runtime.ForUpdate de SQLJ o la interfaz sqlj.runtime.Scrollable de SQLJ. Es necesario que implemente sqlj.runtime.ForUpdate cuando declare un iterador para una operacin UPDATE o DELETE de posicin. Consulte el tema Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ para conocer cmo ejecutar una operacin UPDATE o DELETE de posicin en SQLJ.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

285

Es necesario que implemente sqlj.runtime.Scrollable cuando declare un iterador desplazable. Consulte el tema Utilizacin de iteradores desplazables en una aplicacin SQLJ para obtener informacin acerca de iteradores desplazables. Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110 v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128

Clusula with de SQLJ


La clusula with especifica uno o ms atributos para un iterador o contexto de conexin. Sintaxis:
, with ( elemento-with )

elemento-with:
holdability=true holdability=false sensitivity=ASENSITIVE sensitivity=INSENSITIVE sensitivity=SENSITIVE , , updateColumns= " nombre-columna " ID-Java=expresin-constante-Java dataSource= " nombre-lgico-fuente-datos " dynamic=false dynamic=true

Descripcin: holdability Para un iterador, especifica si el iterador conserva su posicin en una tabla despus de ejecutarse una operacin COMMIT. El valor de holdability debe ser true o false. sensitivity Para un iterador, especifica si los cambios hechos en la tabla subyacente pueden ser visibles para el iterador despus de abrir el iterador. El valor debe ser INSENSITIVE, SENSITIVE o ASENSITIVE. El valor por omisin es ASENSITIVE. dynamic Para un iterador que est definido con sensitivity=SENSITIVE, este atributo especifica si se cumplen las condiciones siguientes: v Cuando la aplicacin ejecuta sentencias UPDATE y DELETE de posicin con el iterador, esos cambios son visibles para el iterador.

286

Desarrollo de aplicaciones Java

v Cuando la aplicacin ejecuta sentencias INSERT, UPDATE y DELETE dentro de la aplicacin, pero fuera del iterador, esos cambios son visibles para el iterador. El valor de dynamic debe ser true o false. El valor por omisin es false. Los servidores DB2 Database para Linux, UNIX y Windows no dan soporte a los cursores desplazables dinmicos. Especifique true slo si la aplicacin accede a datos en servidores DB2 para z/OS en la Versin 9 o posterior. updateColumns Para un iterador, especifica las columnas que se deben modificar cuando el iterador se utiliza para una sentencia UPDATE de posicin. El valor de updateColumns debe ser una cadena de caracteres literal que contenga los nombres de las columnas, separados por comas. nombre-columna Para un iterador, especifica una columna de la tabla de resultados que se debe actualizar utilizando el iterador. ID-Java Para un iterador o contexto de conexin, especifica una variable Java que identifica un atributo definido por el usuario del iterador o contexto de conexin. El valor de expresin-constante-Java tambin est definido por el usuario. dataSource Para un contexto de conexin, especifica el nombre lgico de un objeto DataSource, creado por separado, que representa la fuente de datos a la que se conectar la aplicacin. Esta opcin solo est disponible para el Controlador IBM DB2 para JDBC y SQLJ. Notas de uso: v El valor situado en el lado izquierdo de un elemento with debe ser exclusivo dentro de su clusula. v Si especifica updateColumns en un elemento with de una clusula de declaracin de iterador, esta clusula tambin debe contener una clusula implements en la que se especifique la interfaz sqlj.runtime.ForUpdate. v Si el usuario no personaliza su programa SQLJ, el controlador JDBC no tiene en cuenta el valor de holdability que est contenido en la clusula with. En lugar de ello, el controlador utiliza el valor de holdability definido para el controlador JDBC. Conceptos relacionados: v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100 v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110 v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128

Clusula connection-declaration SQLJ


La clusula connection-declaration declara una conexin con una fuente de datos en un programa de aplicacin de SQLJ.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

287

Sintaxis:
context nombre-clase-Java modificadores-Java clusula-implements clusula-with

Descripcin: modificadores-Java Especifica modificadores que son vlidos para declaraciones de clases Java, tales como static, public, private o protected. nombre-clase-Java Especifica un identificador Java vlido. Durante el proceso de preparacin del programa, SQLJ genera una clase de contexto de conexin cuyo nombre es este identificador. clusula-implements Consulte el tema Clusula implements de SQLJ para obtener una descripcin de esta clusula. En una clusula de declaracin de conexin, la clase de interfaz referida por la clusula implements debe ser una clase de interfaz definida por el usuario. clusula-with Consulte el tema Clusula with de SQLJ para obtener una descripcin de esta clusula. Notas de uso: v SQLJ genera una declaracin de clase de conexin para cada clusula de declaracin de conexin especificada por el usuario. Las conexiones con una fuente de datos de SQLJ son objetos de esas clases de conexin generadas. v Puede especificar una clusula de declaracin de conexin en cualquier lugar de un programa Java en el que pueda existir una definicin de clase Java. Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100 Informacin relacionada: v Clusula implements de SQLJ en la pgina 285 v Clusula with de SQLJ en la pgina 286

Clusula de declaracin de iterador de SQLJ


Una clusula de declaracin de iterador declara una clase de iterador de posicin o de iterador de nombre dentro de un programa de aplicacin SQLJ. Un iterador contiene la tabla de resultados de una consulta. SQLJ genera una clase de iterador para cada clusula de declaracin de iterador especificada por el usuario. Un iterador es un objeto de una clase de iterador. Una clusula de declaracin de iterador tiene formatos diferentes para un iterador de posicin y un iterador de nombre. Las dos clases de iteradores son tipos Java diferentes e incompatibles que se implementan con interfaces diferentes. Sintaxis:
iterator nombre-clase-Java modificadores-Java clusula-implements clusula-with

288

Desarrollo de aplicaciones Java

declaraciones-columna-iterador-posicin declaraciones-columna-iterador-nombre

Declaraciones de columna-iterador-posicin:
, tipo-datos-Java

Declaraciones de columna-iterador-nombre:
, tipo-datos-Java ID-Java

Descripcin: modificadores-Java Cualquier modificador que sea vlido para declaraciones de clases Java, tales como static, public, private o protected. nombre-clase-Java Cualquier identificador Java vlido. Durante el proceso de preparacin del programa, SQLJ genera una clase de iterador cuyo nombre es este identificador. clusula-implements Consulte el tema Clusula implements de SQLJ para obtener una descripcin de esta clusula. Para una clusula de declaracin de iterador que declara un iterador para una operacin UPDATE o DELETE de posicin, la clusula implements debe especificar la interfaz sqlj.runtime.ForUpdate. Para una clusula de declaracin de iterador que declara un iterador desplazable, la clusula implements debe especificar la interfaz sqlj.runtime.Scrollable. clusula-with Consulte el tema Clusula with de SQLJ para obtener una descripcin de esta clusula. declaraciones-columna-iterador-posicin Especifica una lista de tipos de datos Java, que son los tipos de datos de las columnas del iterador de posicin. Los tipos de datos contenidos en la lista deben estar separados por comas. El orden de los tipos de datos en la declaracin de iterador de posicin es el mismo que el orden de las columnas en la tabla de resultados. Para que sea efectiva la comprobacin en lnea durante la personalizacin del perfil serializado, los tipos de datos de las columnas del iterador deben ser compatibles con los tipos de datos de las columnas de la tabla de resultados. Consulte el tema Tipos de datos Java, JDBC y SQL para obtener una lista de tipos de datos compatibles. declaraciones-columna-iterador-nombre Especifica una lista de tipos de datos Java e identificadores Java, que son los tipos de datos y nombres de las columnas del iterador de nombre. Los pares tipo de datos-nombre deben estar separador por comas. El nombre de una columna del iterador debe coincidir con el nombre de una columna de la tabla de resultados, excepto en lo que respecta al uso de letras maysculas y minsculas. Para que sea efectiva la comprobacin en lnea durante la personalizacin del perfil serializado, los tipos de datos de las columnas del
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

289

iterador deben ser compatibles con los tipos de datos de las columnas de la tabla de resultados. Consulte el tema Tipos de datos Java, JDBC y SQL para obtener una lista de tipos de datos compatibles. Notas de uso: v Una clusula de declaracin de iterador puede aparecer en cualquier punto de un programa Java en donde pueda existir una declaracin de clase Java. v Cuando una declaracin de iterador de nombre contiene ms de un par de tipos de datos Java e ID de Java, todos los ID de Java de la lista tienen que ser exclusivos. Dos ID de Java no son exclusivos si slo se diferencian por estar en maysculas o minsculas. Conceptos relacionados: v Recuperacin de datos de tablas DB2 por una aplicacin SQLJ en la pgina 120 Tareas relacionadas: v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123 v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128 Informacin relacionada: v Clusula implements de SQLJ en la pgina 285 v Clusula with de SQLJ en la pgina 286

Clusula ejecutable de SQLJ


Una clusula ejecutable contiene una sentencia de SQL o una sentencia de asignacin. Una sentencia de asignacin asigna el resultado de una operacin de SQL a una variable Java. El presente tema describe el formato general de una clusula ejecutable. Sintaxis:
clusula-sentencia clusula-asignacin

clusula-contexto

Notas de uso: v Una clusula ejecutable puede aparecer en cualquier lugar de un programa Java en que pueda aparecer una sentencia Java. v SQLJ utiliza la clase java.sql.SQLException para notificar los cdigos negativos de SQL resultantes de clusulas ejecutables. Si SQLJ emite una excepcin de ejecucin durante la ejecucin de una clusula ejecutable, el valor de cualquier expresin de lenguaje principal de tipo OUT o INOUT no est definido. Informacin relacionada: v Clusula de asignacin de SQLJ en la pgina 294 v Clusula context de SQLJ en la pgina 291 v Clusula de sentencia de SQLJ en la pgina 291

290

Desarrollo de aplicaciones Java

Clusula context de SQLJ


La clusula context especifica un contexto de conexin, un contexto de ejecucin o ambas cosas. El contexto de conexin se utiliza para conectar con una fuente de datos. El contexto de ejecucin se utiliza para supervisar y modificar la ejecucin de sentencias de SQL. Sintaxis:
[ contexto-conexin contexto-ejecucin contexto-conexin , contexto-ejecucin ]

Descripcin: contexto-conexin Especifica un identificador Java vlido que se ha declarado anteriormente en el programa de SQLJ. Este identificador debe estar declarado como instancia de la clase de contexto de conexin que SQLJ genera para una clusula de declaracin de conexin. contexto-ejecucin Especifica un identificador Java vlido que se ha declarado anteriormente en el programa de SQLJ. Este identificador debe estar declarado como instancia de la clase sqlj.runtime.ExecutionContext. Notas de uso: v Si no especifica un contexto de conexin en una clusula ejecutable, SQLJ utiliza el contexto de conexin por omisin. v Si no especifica un contexto de ejecucin, SQLJ obtiene el contexto de ejecucin a partir del contexto de conexin de la sentencia. Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100 v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141

Clusula de sentencia de SQLJ


Una clusula de sentencia contiene una sentencia de SQL o una clusula SET TRANSACTION. Sintaxis:
{ sentencia-SQL clusula-SET-TRANSACTION }

Descripcin: sentencia-SQL Puede incluir las sentencias de SQL de DB2 Database para Linux, UNIX y Windows de Tabla 61 en la pgina 292 en la clusula de una sentencia. clusula-SET-TRANSACTION Define el nivel de aislamiento de las sentencias de SQL del programa y la modalidad de acceso de la conexin. La clusula SET TRANSACTION es equivalente a la sentencia SET TRANSACTION, que est descrita en el
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

291

estndar de ANSI/ISO para SQL de 1992 y est soportada en algunas implementaciones de SQL. Consulte el tema Clusula SET TRANSACTION de SQLJ para obtener ms informacin.
Tabla 61. Sentencias de SQL vlidas en una clusula de sentencia de SQLJ ALTER DATABASE ALTER FUNCTION ALTER INDEX ALTER PROCEDURE ALTER STOGROUP ALTER TABLE ALTER TABLESPACE CALL COMMENT ON COMMIT CREATE ALIAS CREATE DATABASE CREATE DISTINCT TYPE CREATE FUNCTION CREATE GLOBAL TEMPORARY TABLE CREATE INDEX CREATE PROCEDURE CREATE STOGROUP CREATE SYNONYM CREATE TABLE CREATE TABLESPACE CREATE TRIGGER CREATE VIEW DECLARE GLOBAL TEMPORARY TABLE DELETE DROP ALIAS DROP DATABASE DROP DISTINCT TYPE DROP FUNCTION DROP INDEX DROP PACKAGE DROP PROCEDURE DROP STOGROUP DROP SYNONYM DROP TABLE DROP TABLESPACE DROP TRIGGER DROP VIEW FETCH GRANT INSERT LOCK TABLE MERGE REVOKE ROLLBACK SAVEPOINT SELECT INTO SET CURRENT DEFAULT TRANSFORM GROUP SET CURRENT DEGREE SET CURRENT EXPLAIN MODE SET CURRENT EXPLAIN SNAPSHOT

292

Desarrollo de aplicaciones Java

Tabla 61. Sentencias de SQL vlidas en una clusula de sentencia de SQLJ (continuacin) SET CURRENT ISOLATION SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION SET CURRENT OPTIMIZATION HINT SET CURRENT PACKAGESET (no se soporta USER) SET CURRENT PRECISION SET CURRENT QUERY OPTIMIZATION SET CURRENT REFRESH AGE SET CURRENT SCHEMA SET PATH UPDATE

Notas de uso: v SQLJ da soporte a operaciones DELETE y UPDATE de posicin y de bsqueda. v Para una sentencia FETCH, una sentencia DELETE de posicin o una sentencia UPDATE de posicin, debe utilizar un iterador para apuntar a las filas de una tabla de resultados. Tareas relacionadas: v Establecimiento del nivel de aislamiento para una transaccin SQLJ en la pgina 149 Informacin relacionada: v Clusula SET TRANSACTION de SQLJ en la pgina 293

Clusula SET TRANSACTION de SQLJ


La clusula SET TRANSACTION define el nivel de aislamiento de la unidad de trabajo actual. Sintaxis:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED READ UNCOMMITTED REPEATABLE READ SERIALIZABLE

Descripcin: ISOLATION LEVEL Especifica uno de los niveles de aislamiento siguientes: READ COMMITTED Especifica que el nivel de aislamiento actual de DB2 es estabilidad del cursor. READ UNCOMMITTED Especifica que el nivel de aislamiento actual de DB2 es lectura no confirmada. REPEATABLE READ Especifica que el nivel de aislamiento actual de DB2 es estabilidad de lectura. SERIALIZABLE Especifica que el nivel de aislamiento actual de DB2 es lectura repetible.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

293

Notas de uso: Puede ejecutar SET TRANSACTION solo al comienzo de una transaccin.

Clusula de asignacin de SQLJ


La clusula de asignacin asigna el resultado de una operacin de SQL a una variable Java. Sintaxis:
ID-Java = { seleccin completa clusula-order-by clusula-optimize-for clusula-isolation clusula-queryno clusula-fetch-first }

clusula-iterator-conversion

Descripcin: ID-Java Identifica un iterador que se declar previamente como instancia de una clase de iterador. seleccin completa Genera una tabla de resultados. clusula-iterator-conversion Consulte el tema Clusula de conversin a iterador de SQLJ para obtener una descripcin de esta clusula. Notas de uso: v Si el objeto identificado por ID-Java es un iterador de posicin, el nmero de columnas del conjunto de resultados debe coincidir con el nmero de columnas del iterador. Adems, el tipo de datos de cada columna del conjunto de resultados debe ser compatible con el tipo de datos de la columna correspondiente del iterador. Consulte el tema Los tipos de datos Java, JDBC y SQL para ver una lista de tipos de datos Java y SQL compatibles. v Si el objeto identificado por ID-Java es un iterador de nombre, el nombre de cada mtodo accesor debe coincidir con el nombre de una columna del conjunto de resultados, salvo en lo que respecta al uso de letras maysculas y minsculas. Adems, el tipo de datos del objeto devuelto por un mtodo accesor debe ser compatible con el tipo de datos de la columna correspondiente del conjunto de resultados. v Puede colocar una clusula de asignacin en cualquier lugar de un programa Java donde pueda aparecer una sentencia de asignacin de Java. Sin embargo, no puede poner una clusula de asignacin donde pueda aparecer una expresin de asignacin de Java. Por ejemplo, no puede especificar una clusula de asignacin en la lista de control de una sentencia FOR. Conceptos relacionados: v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138 Informacin relacionada: v Clusula de conversin a iterador de SQLJ en la pgina 295 v Seleccin completa en Consulta de SQL, Volumen 1

294

Desarrollo de aplicaciones Java

v Sentencia select en Consulta de SQL, Volumen 1

Clusula de conversin a iterador de SQLJ


La clusula de conversin a iterador convierte un conjunto de resultados de JDBC en un iterador. Sintaxis:
CAST expresin-lenguaje-principal

Descripcin: expresin-lenguaje-principal Identifica el conjunto de resultados de JDBC que se debe convertir en un iterador de SQLJ. Notas de uso: v Si el iterador al que se debe convertir el conjunto de resultados es un iterador de posicin, el nmero de columnas del conjunto de resultados debe coincidir con el nmero de columnas del iterador. Adems, el tipo de datos de cada columna del conjunto de resultados debe ser compatible con el tipo de datos de la columna correspondiente del iterador. v Si el iterador es un iterador de nombre, el nombre de cada mtodo accesor debe coincidir con el nombre de una columna del conjunto de resultados, salvo en lo que respecta al uso de letras maysculas y minsculas. Adems, el tipo de datos del objeto devuelto por un mtodo accesor debe ser compatible con el tipo de datos de la columna correspondiente del conjunto de resultados. v Cuando se cierra un iterador que se ha generado mediante una clusula de conversin a iterador, tambin se cierra el conjunto de resultados a partir del cual se cre el iterador. Conceptos relacionados: v Uso de SQLJ y JDBC en la misma aplicacin en la pgina 138

Consulta de sqlj.runtime
El paquete de sqlj.runtime define las clases de tiempo de ejecucin e interfaces utilizadas directa o indirectamente por el programador de SQLJ. Las clases de tipo AsciiStream son utilizadas directamente por el programador de SQLJ. Las interfaces de tipo ResultSetIterator se implementan como parte de las declaraciones de clase generadas.

Resumen de las interfaces y clases del paquete sqlj.runtime


En la Tabla 62, se resumen las interfaces de sqlj.runtime.
Tabla 62. Resumen de interfaces de sqlj.runtime Nombre de interfaz ConnectionContext ForUpdate Finalidad Gestiona las operaciones SQL que se realizan durante una conexin a una fuente de datos. Se implementa mediante los operadores que se utilizan en sentencias UPDATE o DELETE de posicin.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

295

Tabla 62. Resumen de interfaces de sqlj.runtime (continuacin) Nombre de interfaz NamedIterator PositionedIterator ResultSetIterator Scrollable Finalidad Se implementa mediante los iteradores declarados como iteradores de nombre. Se implementa mediante los iteradores declarados como iteradores de posicin. Se implementa mediante todos los iteradores para permitir que los resultados de la consulta se procesen utilizando un conjunto de resultados de JDBC. Proporciona un conjunto de mtodos para la manipulacin de iteradores desplazables.

En la Tabla 63, se resumen las clases de sqlj.runtime.


Tabla 63. Resumen de clases sqlj.runtime Nombre de clase AsciiStream BinaryStream CharacterStream DefaultRuntime Finalidad Clase para manejar una corriente de entrada cuyos bytes deberan interpretarse como ASCII. Clase para manejar una corriente de entrada cuyos bytes deberan interpretarse como binarios. Clase para manejar una corriente de entrada cuyos bytes deberan interpretarse como de tipo carcter. Se implementa mediante SQLJ para satisfacer el comportamiento del tiempo de ejecucin previsto de SQLJ para la mayora de entornos de JVM. Esta clase se utiliza slo de modo interno y no se describe en esta documentacin. Se implementa cuando se declara un contexto de ejecucin de SQLJ para controlar la ejecucin de operaciones SQL. Define los servicios especficos del sistema proporcionados por el entorno de ejecucin. Esta clase se utiliza slo de modo interno y no se describe en esta documentacin. Deriva de la clase java.sql.SQLException. La clase sqlj.runtime.SQLNullException se emite cuando un valor SQL NULL se capta para un identificador de lenguaje principal con un tipo primitivo de Java. Deriva una instancia de java.io.InputStream. Clase para manejar una corriente de datos cuyos bytes deberan interpretarse como Unicode.

ExecutionContext RuntimeContext

SQLNullException

StreamWrapper UnicodeStream

Informacin relacionada: v Clase sqlj.runtime.CharacterStream en la pgina 309 v Clase sqlj.runtime.SQLNullException en la pgina 319 v Interfaz sqlj.runtime.Scrollable en la pgina 306 v Clase sqlj.runtime.AsciiStream en la pgina 308 v Clase sqlj.runtime.BinaryStream en la pgina 309 v sqlj.runtime.ConnectionContext interface en la pgina 297 v Clase sqlj.runtime.ExecutionContext en la pgina 311 v Interfaz sqlj.runtime.ForUpdate en la pgina 301 v Interfaz sqlj.runtime.NamedIterator en la pgina 302 v Interfaz sqlj.runtime.ResultSetIterator en la pgina 303 v Clase sqlj.runtime.UnicodeStream en la pgina 320 v Interfaz sqlj.runtime.PositionedIterator en la pgina 302

296

Desarrollo de aplicaciones Java

sqlj.runtime.ConnectionContext interface
La interfaz sqlj.runtime.ConnectionContext proporciona un conjunto de mtodos que gestionan las operaciones de SQL que se llevan a cabo durante una sesin con una fuente de datos determinada. La conversin de una clusula de declaracin de conexin SQLJ hace que SQLJ cree una clase de contexto de conexin. Un objeto de contexto de conexin mantiene un objeto Connection de JDBC en el que se pueden realizar operaciones de SQL dinmico. Un objeto de contexto de conexin tambin mantiene un objeto ExecutionContext por omisin. Variables: CLOSE_CONNECTION Formato:
public static final boolean CLOSE_CONNECTION=true;

Constante que puede pasarse al mtodo close. Indica que el objeto de conexin de JDB subyacente debe cerrarse. KEEP_CONNECTION Formato:
public static final boolean KEEP_CONNECTION=false;

Constante que puede pasarse al mtodo close. Indica que el objeto de conexin de JDB subyacente no debe cerrarse. Mtodos que estn definidos para la interfaz: close() Formato:
public abstract void close() throws SQLException

Realiza las funciones siguientes: v Libera todos los recursos utilizados por el objeto de contexto de conexin dado. v Cierra todos los objetos ConnectedProfile abiertos. v Cierra el objeto Connection de JDBC subyacente. close() es equivalente a close(CLOSE_CONNECTION). close(boolean) Formato:
public abstract void close (boolean cerrar-conexin) throws SQLException

Realiza las funciones siguientes: v Libera todos los recursos utilizados por el objeto de contexto de conexin dado. v Cierra todos los objetos ConnectedProfile abiertos. v Cierra el objeto Connection de JDBC subyacente, en funcin del valor del parmetro cerrar-conexin. Parmetros: cerrar-conexin Especifica si el objeto Connection de JDBC se cierra cuando se cierra un objeto de contexto de conexin:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

297

CLOSE_CONNECTION Cierra el objeto Connection de JDBC subyacente. KEEP_CONNECTION No cierra el objeto Connection de JDBC subyacente. getConnectedProfile Formato:
public abstract ConnectedProfile getConnectedProfile(Object profileKey) throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. getConnection Formato:
public abstract Connection getConnection()

Devuelve el objeto Connection de JDBC subyacente correspondiente al objeto de contexto de conexin dado. getExecutionContext Formato:
public abstract ExecutionContext getExecutionContect()

Devuelve el objeto ExecutionContext por omisin asociado con el objeto de contexto de conexin dado. isClosed Formato:
public abstract boolean isClosed()

Devuelve true si el objeto de contexto de conexin dado se ha cerrado. Devuelve false si el objeto de contexto de conexin no se ha cerrado. Constructores de una implementacin concreta de la interfaz ConnectionContext que resulta de la conversin de la sentencia #sql context Ctx;: Ctx(String, boolean) Formato:
public Ctx(String url, boolean confirmacin-automtica) throws SQLException

Parmetros: url Representacin de una fuente de datos, tal como se ha especificado en el mtodo getConnection de JDBC. confirmacin-automtica Indica si se ha habilitado la confirmacin automtica para la conexin. El valor true significa que la confirmacin automtica est habilitada. El valor false significa que la confirmacin automtica est inhabilitada. Ctx(String, String, String, boolean) Formato:
public Ctx(String url, String usuario, String contrasea, boolean confirmacin-automtica) throws SQLException

Parmetros:

298

Desarrollo de aplicaciones Java

url Representacin de una fuente de datos, tal como se ha especificado en el mtodo getConnection de JDBC. usuario ID de usuario con el que se ha establecido la conexin con la fuente de datos. contrasea Contrasea del ID de usuario con el que se ha establecido la conexin con la fuente de datos. confirmacin-automtica Indica si se ha habilitado la confirmacin automtica para la conexin. El valor true significa que la confirmacin automtica est habilitada. El valor false significa que la confirmacin automtica est inhabilitada. Ctx(String, Properties, boolean) Formato:
public Ctx(String url, Properties info, boolean confirmacin-automtica) throws SQLException

Parmetros: url Representacin de una fuente de datos, tal como se ha especificado en el mtodo getConnection de JDBC. info Objeto de tipo que contiene un conjunto de propiedades de controlador para la conexin. Se puede especificar cualquiera de las propiedades del Controlador IBM DB2 para JDBC y SQLJ. confirmacin-automtica Indica si se ha habilitado la confirmacin automtica para la conexin. El valor true significa que la confirmacin automtica est habilitada. El valor false significa que la confirmacin automtica est inhabilitada. Ctx(Connection) Formato:
public Ctx(java.sql.Connection objeto-conexin-JDBC) throws SQLException

Parmetros: objeto-conexin-JDBC Objeto Connection de JDBC creado previamente. Si la llamada del constructor emite una excepcin de SQL, el objeto Connection de JDBC permanece abierto. Ctx(ConnectionContext) Formato:
public Ctx(sqlj.runtime.ConnectionContext objeto-contexto-conexin-SQLJ) throws SQLException

Parmetros: objeto-contexto-conexin-SQLJ Objeto ConnectionContext de SQLJ creado previamente.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

299

Constructores de una implementacin concreta de la interfaz ConnectionContext que resulta de la conversin de la sentencia #sql context Ctx with (dataSource ="jdbc/TestDS");: Ctx() Formato:
public Ctx() throws SQLException

Ctx(String, String) Formato:


public Ctx(String usuario, String contrasea, ) throws SQLException

Parmetros: usuario ID de usuario con el que se ha establecido la conexin con la fuente de datos. contrasea Contrasea del ID de usuario con el que se ha establecido la conexin con la fuente de datos. Ctx(Connection) Formato:
public Ctx(java.sql.Connection objeto-conexin-JDBC) throws SQLException

Parmetros: objeto-conexin-JDBC Objeto Connection de JDBC creado previamente. Si la llamada del constructor emite una excepcin de SQL, el objeto Connection de JDBC permanece abierto. Ctx(ConnectionContext) Formato:
public Ctx(sqlj.runtime.ConnectionContext objeto-contexto-conexin-SQLJ) throws SQLException

Parmetros: objeto-contexto-conexin-SQLJ Objeto ConnectionContext de SQLJ creado previamente. Mtodos adicionales que se generan en una implementacin concreta de la interfaz ConnectionContext que resulta de la conversin de la sentencia #sql context Ctx;: getDefaultContext Formato:
public static Ctx getDefaultContext()

Devuelve el objeto del contexto de conexin por omisin correspondiente a la clase Ctx.

300

Desarrollo de aplicaciones Java

getProfileKey Formato:
public static Object getProfileKey(sqlj.runtime.profile.Loader cargador, String nombre-perfil) throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. getProfile Formato:
public static sqlj.runtime.profile.Profile getProfile(Object clave)

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. getTypeMap Formato:
public static java.util.Map getTypeMap()

Devuelve una instancia de una clase que implementa java.util.Map, que es la correlacin de tipos definidos por el usuario asociada con ConnectionContext. Si no existe una correlacin de tipos asociada, se devuelve un nulo Java. Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ para las clusulas ejecutables y de declaracin de iterador, pero tambin se pueden invocar en una aplicacin SQLJ para su uso directo en sentencias JDBC. SetDefaultContext Formato:
public static void Ctx setDefaultContext(Ctx contexto-por-omisin)

Define el objeto del contexto de conexin por omisin correspondiente a la clase Ctx. Recomendacin: no utilice este mtodo para las aplicaciones de varias hebras. En su lugar, utilice contextos explcitos. Tareas relacionadas: v Cierre de una conexin a una fuente de datos en una aplicacin SQLJ en la pgina 151 v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Interfaz sqlj.runtime.ForUpdate
SQLJ implementa la interfaz sqlj.runtime.ForUpdate en los programas SQLJ que contienen una clusula de declaracin del iterador con implements sqlj.runtime.ForUpdate. Un programa SQLJ que efecta operaciones UPDATE o DELETE de posicin (UPDATE...WHERE CURRENT OF o DELETE...WHERE CURRENT OF) debe incluir una clusula de declaracin del iterador con implements sqlj.runtime.ForUpdate. Mtodos: getCursorName Formato:
public abstract String getCursorName() throws SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

301

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. Conceptos relacionados: v Uso de iteradores pasados como variables en operaciones UPDATE o DELETE de posicin de una aplicacin SQLJ en la pgina 115 Tareas relacionadas: v Ejecucin de operaciones UPDATE y DELETE de posicin en una aplicacin SQLJ en la pgina 110

Interfaz sqlj.runtime.NamedIterator
La interfaz sqlj.runtime.NamedIterator se implementa cuando una aplicacin SQLJ ejecuta una clusula de declaracin de iterador para un iterador determinado. Un iterador de nombres incluye nombres de columnas de la tabla de resultados; el orden de stas en el iterador no es importante. En las implementaciones de la interfaz sqlj.runtime.NamedIterator se incluye un mtodo accesor para cada columna de la tabla de resultados. Un mtodo accesor devuelve los datos contenidos en las columnas de la tabla de resultados. El nombre de un mtodo accesor coincide con el nombre de la columna correspondiente del iterador de nombre. Mtodos (heredados de la interfaz ResultSetIterator): close Formato:
public abstract void close() throws SQLException

Libera recursos de base de datos que el iterador est utilizando. isClosed Formato:
public abstract boolean isClosed() throws SQLException

Devuelve el valor true si se ha invocado el mtodo close. Devuelve el valor false si no se ha invocado el mtodo. next Formato:
public abstract boolean next() throws SQLException

Avanza el iterador hasta la fila siguiente. Antes de invocar por primera vez una instancia del mtodo next, el iterador se posiciona delante de la primera fila de la tabla de resultados. next devuelve el valor true cuando est disponible una fila siguiente, y el valor false cuando se han recuperado todas las filas. Tareas relacionadas: v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121

Interfaz sqlj.runtime.PositionedIterator
La interfaz sqlj.runtime.PositionedIterator se implementa cuando una aplicacin SQLJ ejecuta una clusula de declaracin de iterador para un iterador de

302

Desarrollo de aplicaciones Java

posicin. El orden de las columnas de un iterador de posicin debe ser el mismo que el orden de las columnas de la tabla de resultados, y un iterador de posicin no incluye nombres de columna de tabla de resultados. Mtodos: sqlj.runtime.PositionedIterator contiene todos los mtodos ResultSetIterator, e incluye el mtodo adicional siguiente: endFetch Formato:
public abstract boolean endFetch() throws SQLException

Devuelve el valor true si el iterador no est posicionado en una fila. Devuelve el valor false si el iterador est posicionado en una fila. Tareas relacionadas: v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123

Interfaz sqlj.runtime.ResultSetIterator
SQLJ implementa la interfaz sqlj.runtime.ResultSetIterator para todas las clusulas de declaracin de iterador. Un iterador sin tipo se puede generar mediante la declaracin de una instancia de la interfaz sqlj.runtime.ResultSetIterator directamente. En general, el uso de interadores sin tipo no es recomendable. Variables: ASENSITIVE Formato:
public static final int ASENSITIVE

Constante que el mtodo getSensitivity puede devolver. Indica que el iterador est definido como ASENSITIVE. FETCH_FORWARD Formato:
public static final int FETCH_FORWARD

Constante que los mtodos siguientes pueden utilizar: v Establecida por sqlj.runtime.Scrollable.setFetchDirection y sqlj.runtime.ExecutionContext.setFetchDirection v Devuelta por sqlj.runtime.ExecutionContext.getFetchDirection Indica que el iterador capta filas en una tabla de resultados hacia adelante, desde la primera hasta la ltima. FETCH_REVERSE Formato:
public static final int FETCH_REVERSE

Constante que los mtodos siguientes pueden utilizar: v Establecida por sqlj.runtime.Scrollable.setFetchDirection y sqlj.runtime.ExecutionContext.setFetchDirection v Devuelta por sqlj.runtime.ExecutionContext.getFetchDirection Indica que el iterador capta filas en una tabla de resultados hacia atrs, desde la ltima hasta la primera.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

303

FETCH_UNKNOWN Formato:
public static final int FETCH_UNKNOWN

Constante que los mtodos siguientes pueden utilizar: v Establecida por sqlj.runtime.Scrollable.setFetchDirection y sqlj.runtime.ExecutionContext.setFetchDirection v Devuelta por sqlj.runtime.ExecutionContext.getFetchDirection Indica que el iterador capta filas en una tabla de resultados en un orden desconocido. INSENSITIVE Formato:
public static final int INSENSITIVE

Constante que el mtodo getSensitivity puede devolver. Indica que el iterador est definido como INSENSITIVE. SENSITIVE Formato:
public static final int SENSITIVE

Constante que el mtodo getSensitivity puede devolver. Indica que el iterador est definido como SENSITIVE. clearWarnings Formato:
public abstract void clearWarnings() throws SQLException

Despus de llamar a clearWarnings, getWarnings devuelve un valor nulo hasta que se informa de un nuevo aviso para el iterador. close Formato:
public abstract void close() throws SQLException

Cierra el iterador y libera los recursos de base de datos subyacentes. getFetchSize Formato:
synchronized public int getFetchSize() throws SQLException

Devuelve el nmero de filas que SQLJ debera captar cuando se necesita ms de una fila. El valor devuelto es aqul que se defini con el mtodo setFetchSize, o 0 si no se defini ningn valor en setFetchSize. getResultSet Formato:
public abstract ResultSet getResultSet() throws SQLException

Devuelve el objeto ResultSet de JDBC asociado con el iterador. getRow Formato:


synchronized public int getRow() throws SQLException

304

Desarrollo de aplicaciones Java

Devuelve el nmero de fila actual. La primera fila corresponde al nmero 1, la segunda corresponde al nmero 2, etc. Si el iterador no se encuentra en una fila, se devuelve 0. getSensitivity Formato:
synchronized public int getSensitivity() throws SQLException

Devuelve la sensibilidad del iterador. La sensibilidad se determina mediante el valor de sensibilidad que se ha especificado en la clusula with de la clusula de declaracin de iterador o mediante el valor por omisin de dicha clusula with. getWarnings Formato:
public abstract SQLWarning getWarnings() throws SQLException

Devuelve el primer aviso notificado por las llamadas en el iterador. Los avisos del iterador subsiguientes se encadenan a este aviso de SQL. La cadena de avisos se borra automticamente cada vez que el iterador se desplaza a una fila nueva. isClosed Formato:
public abstract boolean isClosed() throws SQLException

Devuelve el valor true si el iterador est cerrado. En caso contrario devuelve false. next Formato:
public abstract boolean next() throws SQLException

Avanza el iterador hasta la fila siguiente. Antes de invocar next por primera vez, el iterador se coloca delante de la primera fila de la tabla de resultados. next devuelve el valor true cuando hay una prxima fila disponible y false cuando se han recuperado todas las filas. setFetchSize Formato:
synchronized public void setFetchSize(int nmero de filas) throws SQLException

Proporciona a SQLJ una pista sobre el nmero de filas que deben captarse cuando se necesitan ms filas. Parmetros: nmero de filas El nmero esperado de filas que SQLJ debe captar para el iterador asociado al contexto de ejecucin definido. Si nmero de filas es menor que 0 o mayor que el nmero mximo de filas que pueden captarse, se emite una excepcin de SQL (SQLException). Tareas relacionadas: v Utilizacin de un iterador de nombre en una aplicacin SQLJ en la pgina 121 v Utilizacin de un iterador de posicin en una aplicacin SQLJ en la pgina 123
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

305

Informacin relacionada: v Clusula de declaracin de iterador de SQLJ en la pgina 288

Interfaz sqlj.runtime.Scrollable
sqlj.runtime.Scrollable se implementa cuando se declara un iterador desplazable. sqlj.runtime.Scrollable proporciona mtodos para moverse por la tabla de resultados y para comprobar la posicin de dicha tabla. absolute(int) Formato:
public abstract boolean absolute (int n) throws SQLException

Desplaza el cursor hasta una fila especificada. Si n>0, sita el iterador en la fila n de la tabla de resultados. Si n<0 y m es el nmero de filas de la tabla de resultados, sita el iterador en la fila m+n+1 de la tabla de resultados. Si el valor absoluto de n es mayor que el nmero de filas de la tabla de resultados, posiciona el cursor despus de la ltima fila si n es positivo o antes de la primera fila si n es negativo. Absolute(0) es lo mismo que beforeFirst(). Absolute(1) es lo mismo que first(). Absolute(-1) es lo mismo que last(). Devuelve el valor true si el iterador est en una fila. De lo contrario, devuelve el valor false. afterLast() Formato:
public abstract void afterLast() throws SQLException

Coloca el iterador despus de la ltima fila de la tabla de resultados. beforeFirst() Formato:


public abstract void beforeFirst() throws SQLException

Coloca el iterador antes de la primera fila de la tabla de resultados. first() Formato:


public abstract boolean first() throws SQLException

Mueve el reiterador a la primera fila de la tabla de resultados. Devuelve el valor true si el iterador est en una fila. De lo contrario, devuelve el valor false. getFetchDirection() Formato:
public abstract int getFetchDirection ( ) throws SQLException

Devuelve la direccin de captacin del iterador. Los valores posibles son:

306

Desarrollo de aplicaciones Java

sqlj.runtime.ResultSetIterator.FETCH_FORWARD Las filas se procesan en direccin de avance, de la primera a la ltima. sqlj.runtime.ResultSetIterator.FETCH_REVERSE Las filas se procesan en direccin de retroceso, de la ltima a la primera. sqlj.runtime.ResultSetIterator.FETCH_UNKNOWN El orden del proceso no es conocido. isAfterLast() Formato:
public abstract boolean isAfterLast() throws SQLException

Devuelve el valor true si el iterador est situado despus de la ltima fila de la tabla de resultados. De lo contrario, devuelve el valor false. isBeforeFirst() Formato:
public abstract boolean isBeforeFirst() throws SQLException

Devuelve el valor true si el iterador est situado antes de la primera fila de la tabla de resultados. De lo contrario, devuelve el valor false. isFirst() Formato:
public abstract boolean isFirst() throws SQLException

Devuelve el valor true si el iterador est situado en la primera fila de la tabla de resultados. De lo contrario, devuelve el valor false. isLast() Formato:
public abstract boolean isLast() throws SQLException

Devuelve el valor true si el iterador est situado en la ltima fila de la tabla de resultados. De lo contrario, devuelve el valor false. last() Formato:
public abstract boolean last() throws SQLException

Mueve el iterador a la ltima fila de la tabla de resultados. Devuelve el valor true si el iterador est en una fila. De lo contrario, devuelve el valor false. previous() Formato:
public abstract boolean previous() throws SQLException

Mueve el iterador a la fila anterior de la tabla de resultados. Devuelve el valor true si el iterador est en una fila. De lo contrario, devuelve el valor false. relative(int) Formato:

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

307

public abstract boolean relative(int n) throws SQLException

Si n>0, sita el iterador en la fila que est situada n filas despus de la fila actual. Si n<0, sita el iterador en la fila que est situada n filas antes de la fila actual. Si n=0, sita el iterador en la fila actual. El cursor debe estar en una fila vlida de la tabla de resultados para poder utilizar este mtodo. Si el cursor est antes de la primera fila o despus de la ltima fila, el mtodo emite una excepcin de SQL. Suponga que m es el nmero de filas de la tabla de resultados y x es el nmero de fila actual de la tabla de resultados. Si n>0 y x+n>m, el iterador se sita despus de la ltima fila. Si n<0 y x+n<1, el iterador se sita antes de la primera fila. Devuelve el valor true si el iterador est en una fila. De lo contrario, devuelve el valor false. setFetchDirection(int) Formato:
public abstract void setFetchDirection (int) throws SQLException

Indica al entorno de ejecucin de SQLJ la direccin en la que se procesan las filas del objeto iterador. Los valores posibles son: sqlj.runtime.ResultSetIterator.FETCH_FORWARD Las filas se procesan en direccin de avance, de la primera a la ltima. sqlj.runtime.ResultSetIterator.FETCH_REVERSE Las filas se procesan en direccin de retroceso, de la ltima a la primera. sqlj.runtime.ResultSetIterator.FETCH_UNKNOWN El orden del proceso no es conocido. Tareas relacionadas: v Utilizacin de iteradores desplazables en una aplicacin SQLJ en la pgina 128

Clase sqlj.runtime.AsciiStream
La clase sqlj.runtime.AsciiStream se utiliza para una corriente de entrada de datos ASCII con una longitud especfica. La clase sqlj.runtime.AsciiStream deriva de la clase java.io.InputStream y ampla la clase sqlj.runtime.StreamWrapper. SQLJ interpreta los bytes de un objeto sqlj.runtime.AsciiStream como caracteres ASCII. Los objetos InputStream con caracteres ASCII deben pasarse como objetos sqlj.runtime.AsciiStream. Constructores: AsciiStream(InputStream) Formato:
public AsciiStream(java.io.InputStream corriente-entrada)

Crea un objeto java.io.InputStream ASCII con una longitud no especificada. Parmetros:

308

Desarrollo de aplicaciones Java

corriente-entrada Objeto InputStream que SQLJ interpreta como objeto AsciiStream. AsciiStream(InputStream, int) Formato:
public AsciiStream(java.io.InputStream corriente-entrada, int longitud)

Crea un objeto java.io.InputStream ASCII con una longitud especificada. Parmetros: corriente-entrada Objeto InputStream que SQLJ interpreta como objeto AsciiStream . longitud Longitud del objeto InputStream que SQLJ interpreta como objeto AsciiStream.

Clase sqlj.runtime.BinaryStream
La clase sqlj.runtime.BinaryStream se utiliza para una corriente de entrada de datos binarios con una longitud especfica. La clase sqlj.runtime.BinaryStream deriva de la clase java.io.InputStream y ampla la clase sqlj.runtime.StreamWrapper. SQLJ interpreta los bytes de un objeto sqlj.runtime.BinaryStream como caracteres binarios. Los objetos InputStream con caracteres binarios deben pasarse como objetos sqlj.runtime.BinaryStream. Constructores: BinaryStream(InputStream) Formato:
public BinaryStream(java.io.InputStream corriente-entrada)

Crea un objeto java.io.InputStream binario con una longitud no especificada. Parmetros: corriente-entrada Objeto InputStream que SQLJ interpreta como objeto BinaryStream. BinaryStream(InputStream, int) Formato:
public BinaryStream(java.io.InputStream corriente-entrada, int longitud)

Crea un objeto java.io.InputStream binario con una longitud especificada. Parmetros: corriente-entrada Objeto InputStream que SQLJ interpreta como objeto BinaryStream . longitud Longitud del objeto InputStream que SQLJ interpreta como objeto BinaryStream.

Clase sqlj.runtime.CharacterStream
La clase sqlj.runtime.CharacterStream se utiliza para la corriente de entrada de datos de tipo carcter con una longitud especificada. La clase
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

309

sqlj.runtime.CharacterStream se deriva de la clase java.io.Reader y ampla la clase java.io.FilterReader. SQLJ interpreta los bytes de un objeto sqlj.runtime.CharacterStream como datos Unicode. Debe pasarse un objeto Reader con datos Unicode como objeto sqlj.runtime.CharacterStream. Constructores: CharacterStream(InputStream) Formato:
public CharacterStream(java.io.Reader corriente-entrada)

Crea un objeto java.io.Reader de tipo carcter con una longitud no especificada. Parmetros: corriente-entrada Objeto Reader que SQLJ interpreta como objeto CharacterStream. CharacterStream(InputStream, int) Formato:
public CharacterStream(java.io.Reader corriente-entrada, int longitud)

Crea un objeto java.io.Reader de tipo carcter con una longitud especificada. Parmetros: corriente-entrada Objeto Reader que SQLJ interpreta como objeto CharacterStream. longitud Longitud del objeto Reader que SQLJ interpreta como objeto CharacterStream. Mtodos: getReader Formato:
public Reader getReader()

Devuelve el objeto Reader subyacente derivado mediante el objeto CharacterStream. getLength Formato:
public void getLength()

Devuelve la longitud en caracteres del objeto Reader derivado, tal como se ha especificado mediante el constructor o en la ltima llamada a setLength. setLength Formato:
public void setLength (int longitud)

Establece el nmero de caracteres que se leen en el objeto Reader cuando el objeto se pasa como argumento de entrada a una operacin de SQL. Parmetros:

310

Desarrollo de aplicaciones Java

longitud Nmero de caracteres que se leen en el objeto Reader.

Clase sqlj.runtime.ExecutionContext
La clase sqlj.runtime.ExecutionContext se define para contextos de ejecucin. Utilice un contexto de ejecucin para controlar la ejecucin de sentencias de SQL. Variables: ADD_BATCH_COUNT Formato:
public static final int ADD_BATCH_COUNT

Constante que el mtodo getUpdateCount puede devolver. Indica que la setencia anterior no se ejecut, pero se aadi al lote de setencias existente. AUTO_BATCH Formato:
public static final int AUTO_BATCH

Constante que puede pasarse al mtodo setBatchLimit. Indica que debe realizarse la ejecucin por lotes implcita, y que SQLJ debe determinar el tamao del lote. EXEC_BATCH_COUNT Formato:
public static final int EXEC_BATCH_COUNT

Constante que puede volver del mtodo getUpdateCount. Indica que se acaba de ejecutar un lote de setencias. EXCEPTION_COUNT Formato:
public static final int EXCEPTION_COUNT

Constante que puede volver del mtodo getUpdateCount. Indica que se ha emitido una excepcin antes de que finalizara la ejecucin anterior, o que no se ha realizado ninguna operacin en el objeto de contexto de ejecucin. NEW_BATCH_COUNT Formato:
public static final int NEW_BATCH_COUNT

Constante que puede volver del mtodo getUpdateCount. Indica que la setencia anterior no se ejecut, pero se aadi al lote de setencias nuevo. QUERY_COUNT Formato:
public static final int QUERY_COUNT

Constante que puede pasarse al mtodo setBatchLimit. Indica que la ejecucin anterior gener un conjunto de resultados. UNLIMITED_BATCH Formato:
public static final int UNLIMITED_BATCH

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

311

Constante que puede volver del mtodo getUpdateCount. Indica que las sentencias deben seguir aadindose a un lote de setencias, independientemente del tamao del lote. Constructores: ExecutionContext Formato:
public ExecutionContext()

Crea una instancia ExecutionContext. Mtodos: cancel Formato:


public void cancel() throws SQLException

Cancela la operacin SQL que actualmente est ejecutando una hebra que utiliza el objeto de contexto de ejecucin. Si hay un lote de sentencias pendiente en el objeto de contexto de ejecucin, el lote de setencias se cancela y se borra. El mtodo cancel emite SQLException si la sentencia no se puede cancelar. execute Formato:
public boolean execute ( ) throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. executeBatch Formato:
public synchronized int[] executeBatch() throws SQLException

Ejecuta el lote de sentencias pendiente y devuelve una matriz de contajes de actualizacin. Si no existe ningn lote de sentencias pendiente, se devuelve un valor nulo. Cuando se invoca este mtodo, se elimina el lote de sentencias, aunque la llamada produzca una excepcin. Cada elemento de la matriz devuelta puede ser uno de estos valores: -2 Este valor indica que la sentencia de SQL se ejecut satisfactoriamente, pero no se pudo determinar el nmero de filas que fueron actualizadas. -3 Este valor indica que la sentencia de SQL fall. Otro valor entero Este valor es el nmero de filas que fueron actualizadas por la sentencia. El mtodo executeBatch emite un SQLException si se produce un error en la base de datos durante la ejecucin del lote de sentencias. executeQuery Formato:
public RTResultSet executeQuery ( ) throws SQLException

312

Desarrollo de aplicaciones Java

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. executeUpdate Formato:
public int executeUpdate() throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. getBatchLimit Formato:
synchronized public int getBatchLimit()

Devuelve el nmero de sentencias que se aaden a un lote antes de ejecutarlo implcitamente. El valor que se devuelve es uno de los siguientes: UNLIMITED_BATCH Este valor indica que el tamao del lote es ilimitado. AUTO_BATCH Este valor indica que el tamao del lote es limitado pero desconocido. Otro valor entero El lmite del lote actual. getBatchUpdateCounts Formato:
public synchronized int[] getBatchUpdateCounts()

Devuelve una matriz que contiene el nmero de filas que cada sentencia actualiz y que se ejecutaron satisfactoriamente en un lote. El orden de los elementos de la matriz corresponde al orden en el que se insertaron las sentencias en el lote. Devuelve un valor nulo si ninguna sentencia del lote se ejecut satisfactoriamente. Cada elemento de la matriz devuelta puede ser uno de estos valores: -2 Este valor indica que la sentencia de SQL se ejecut satisfactoriamente, pero no se pudo determinar el nmero de filas que fueron actualizadas. -3 Este valor indica que la sentencia de SQL fall. Otro valor entero Este valor es el nmero de filas que fueron actualizadas por la sentencia. getFetchDirection Formato:
synchronized public int getFetchDirection() throws SQLException

Devuelve la direccin de captacin actual para los objetos del iterador desplazable que se generaron a partir del contexto de ejecucin definido. Si en el contexto de ejecucin no se defini una direccin de captacin, se devuelve sqlj.runtime.ResultSetIterator.FETCH_FORWARD. getFetchSize Formato:
synchronized public int getFetchSize() throws SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

313

Devuelve el nmero de filas que SQLJ debera captar cuando se necesita ms de una fila. Este valor slo se aplica a los objetos del iterador que se generaron a partir del contexto de ejecucin definido. El valor devuelto es aqul que se defini con el mtodo setFetchSize, o 0 si no se defini ningn valor en setFetchSize. getMaxFieldSize Formato:
public synchronized int getMaxFieldSize()

Devuelve el nmero mximo de bytes que se devuelven para cualquier columna de serie (de caracteres, grfica o binaria de longitud variable) en consultas que utilizan el contexto de ejecucin definido. Si se sobrepasa este lmite, SQLJ descarta los bytes restantes. Un valor 0 significa que el nmero mximo de bytes es ilimitado. getMaxRows Formato:
public synchronized int getMaxRows()

Proporciona el nmero mximo de filas que son devueltas por una consulta cualquiera que hace uso del contexto de ejecucin existente. Si se sobrepasa este lmite, SQLJ descarta los rows restantes. Si el valor devuelto es 0, significa que el nmero mximo de filas es ilimitado. getNextResultSet() Formato:
public ResultSet getNextResultSet() throws SQLException

Despus de una llamada de procedimiento almacenado, devuelve un conjunto de resultados procedente del procedimiento almacenado. Se devuelve un valor nulo si se produce cualquiera de estas situaciones: v No hay ms conjuntos de resultados que devolver. v La llamada del procedimiento almacenado no gener ningn conjunto de resultados. v No se ha ejecutado una llamada de procedimiento almacenado en el contexto de ejecucin. Cuando invoca getNextResultSet(), SQLJ cierra el conjunto de resultados que est abierto actualmente y pasa al conjunto de resultados siguiente. Si se produce un error durante una llamada a getNextResultSet, se liberarn los recursos para el objeto ResultSet de JDBC actual, y se emitir un SQLException. Las llamadas subsiguientes a getNextResultSet devolvern un valor nulo. getNextResultSet(int) Formatos:
public ResultSet getNextResultSet(int actual)

Despus de una llamada de procedimiento almacenado, devuelve un conjunto de resultados procedente del procedimiento almacenado. Se devuelve un valor nulo si se produce cualquiera de estas situaciones: v No hay ms conjuntos de resultados que devolver.

314

Desarrollo de aplicaciones Java

v La llamada del procedimiento almacenado no gener ningn conjunto de resultados. v No se ha ejecutado una llamada de procedimiento almacenado en el contexto de ejecucin. Si se produce un error durante una llamada a getNextResultSet, se liberarn los recursos para el objeto ResultSet de JDBC actual, y se emitir un SQLException. Las llamadas subsiguientes a getNextResultSet devolvern un valor nulo. Parmetros: actual Indica la accin que lleva a cabo SQLJ con el conjunto de resultados actualmente abierto antes de pasar al siguiente conjunto de resultados. java.sql.Statement.CLOSE_CURRENT_RESULT Especifica que el objeto ResultSet actual se cierra cuando se devuelve el objeto ResultSet siguiente. java.sql.Statement.KEEP_CURRENT_RESULT Especifica que el objeto ResultSet actual permanece abierto cuando se devuelve el objeto ResultSet siguiente. java.sql.Statement.CLOSE_ALL_RESULTS Especifica que todos los objetos ResultSet abiertos se cierran cuando se devuelve el objeto ResultSet siguiente. getQueryTimeout Formato:
public synchronized int getQueryTimeout()

Devuelve el nmero mximo de segundos que pueden ejecutar las operaciones SQL que utilizan el objeto de contexto de ejecucin definido. Si una operacin SQL sobrepasa el lmite, se emite un SQLException. El valor devuelto es aqul que se defini con el mtodo setQueryTimeout, o 0 si no se defini ningn valor en setQueryTimeout. 0 significa que el tiempo de ejecucin es ilimitado. getUpdateCount Formato:
public abstract int getUpdateCount() throws SQLException

Devuelve: ExecutionContext.ADD_BATCH_COUNT Si la sentencia se aadi a un lote existente. ExecutionContext.NEW_BATCH_COUNT Si la sentencia era la primera sentencia de un nuevo lote. ExecutionContext.EXCEPTION_COUNT Si la sentencia anterior gener un SQLException, o no se ejecut ninguna sentencia anterior. ExecutionContext.EXEC_BATCH_COUNT Si la sentencia era parte de un lote y el lote se ejecut. ExecutionContext.QUERY_COUNT Si la sentencia anterior cre un objeto iterador o un ResultSet de JDBC.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

315

Otro valor entero Si la sentencia se ejecut en lugar de aadirla a un lote. Este valor es el nmero de filas que fueron actualizadas por la sentencia. getWarnings Formato:
public synchronized SQLWarning getWarnings()

Devuelve el primer aviso que fue notificado por la ltima operacin SQL que se ejecut utilizando el contexto de ejecucin definido. Los avisos subsiguientes se encadenan al primer aviso. Si no se produce ningn aviso, se devuelve un valor nulo. getWarnings se utiliza para recuperar SQLCODE positivos. isBatching Formato:
public synchronized boolean isBatching()

Devuelve el valor true si se habilita el proceso por lotes en el contexto de ejecucin. Devuelve el valor false si el proceso por lotes est inhabilitado. registerStatement Formato:
public RTStatement registerStatement(ConnectionContext connCtx, Object profileKey, int stmtNdx) throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. releaseStatement Formato:
public void releaseStatement() throws SQLException

Este mtodo lo utiliza cdigo que se genera mediante el conversor SQLJ. No est indicado para el uso directo por parte de los programas de aplicacin. setBatching Formato:
public synchronized void setBatching(boolean proceso_por_lotes)

Parmetros: proceso_por_lotes Indica si las sentencias que pueden procesarse por lotes y que estn registradas con el contexto de ejecucin definido pueden aadirse a un lote de sentencias: true Las sentencias pueden aadirse a un lote de sentencias. false Las sentencias se ejecutan individualmente. setBatching slo afecta a las sentencias que se producen en el programa despus de invocar a setBatching. No afecta a sentencias anteriores ni a un lote de sentencias existente.

316

Desarrollo de aplicaciones Java

setBatchLimit Formato:
public synchronized void setBatchLimit(int tamao_del_lote)

Establece el nmero mximo de sentencias que se aaden a un lote antes de ejecutarlo implcitamente. Parmetros: tamao_del_lote Uno de estos valores: ExecutionContext.UNLIMITED_BATCH Indica que la ejecucin implcita solo se produce cuando SQLJ encuentra una sentencia que es procesable por lotes pero incompatible, o que no es procesable por lotes. Establecer este valor es lo mismo que no invocar setBatchLimit. ExecutionContext.AUTO_BATCH Indica que la ejecucin implcita se produce cuando el nmero de sentencias del lote alcanza un valor definido por SQLJ. Entero positivo Es el nmero de sentencias que se aaden al lote antes de que SQLJ ejecute el lote implcitamente. El lote puede ejecutarse antes de que se haya aadido este nmero de sentencias si SQLJ encuentra una sentencia que es procesable por lotes pero incompatible, o que no es procesable por lotes. setBatchLimit slo afecta a las sentencias que se producen en el programa despus de invocar a setBatchLimit. No afecta a un lote de sentencias existente. setFetchDirection Formato:
public synchronized void setFetchDirection(int direccin) throws SQLException

Proporciona a SQLJ una pista sobre la direccin de captacin actual para los objetos del iterador desplazable que se generaron a partir del contexto de ejecucin definido. Parmetros: direccin Uno de estos valores: sqlj.runtime.ResultSetIterator.FETCH_FORWARD La captacin de las filas se realiza hacia adelante. ste es el valor por omisin. sqlj.runtime.ResultSetIterator.FETCH_REVERSE La captacin de las filas se realiza hacia atrs. sqlj.runtime.ResultSetIterator.FETCH_UNKNOWN El orden de la captacin es desconocido. Cualquier otro valor de entrada da como resultado un SQLException. setFetchSize Formato:
synchronized public void setFetchSize(int nmero de filas) throws SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

317

Proporciona a SQLJ una pista sobre el nmero de filas que deben captarse cuando se necesitan ms filas. Parmetros: nmero de filas El nmero esperado de filas que SQLJ debe captar para el iterador asociado al contexto de ejecucin definido. Si nmero de filas es menor que 0 o mayor que el nmero mximo de filas que pueden captarse, se emite una excepcin de SQL (SQLException). setMaxFieldSize Formato:
public void setMaxFieldSize(int n_mximo_de_bytes)

Especifica el nmero mximo de bytes que se devuelven para cualquier columna de serie (de caracteres, grfica o binaria de longitud variable) en consultas que utilizan el contexto de ejecucin definido. Si se sobrepasa este lmite, SQLJ descarta los bytes restantes. Parmetros: n_mximo_de_bytes El nmero mximo de bytes que SQLJ debe devolver desde una columna BINARY, VARBINARY, CHAR, VARCHAR, GRAPHIC o VARGRAPHIC. Un valor de 0 significa que el nmero de bytes es ilimitado. 0 es el valor por omisin. setMaxRows Formato:
public synchronized void setMaxRows(int n_mximo_de_filas)

Especifica el nmero mximo de filas que son devueltas por una consulta cualquiera que hace uso del contexto de ejecucin existente. Si se sobrepasa este lmite, SQLJ descarta los rows restantes. Parmetros: n_mximo_de_filas El nmero mximo de filas que SQLJ debe devolver para una consulta que utiliza el contexto de ejecucin definido. Un valor de 0 significa que el nmero de filas es ilimitado. 0 es el valor por omisin. setQueryTimeout Formato:
public synchronized void setQueryTimeout(int valor_de_tiempo_de_espera)

Especifica el nmero mximo de segundos que pueden ejecutar las operaciones SQL que utilizan el objeto de contexto de ejecucin definido. Si una operacin SQL sobrepasa el lmite, se emite un SQLException. Parmetros: valor_de_tiempo_de_espera El nmero mximo de segundos que pueden ejecutar las operaciones SQL que utilizan el objeto de contexto de ejecucin definido. 0 significa que el tiempo de ejecucin es ilimitado. 0 es el valor por omisin.

318

Desarrollo de aplicaciones Java

Tareas relacionadas: v Control de la ejecucin de sentencias de SQL en SQLJ en la pgina 141

Clase sqlj.runtime.SQLNullException
La clase sqlj.runtime.SQLNullException se deriva de la clase java.sql.SQLException. La clase sqlj.runtime.SQLNullException se emite cuando un valor SQL NULL se capta para un identificador de lenguaje principal con un tipo primitivo de Java. El valor de SQLSTATE para una instancia de SQLNullException es '22002'. Informacin relacionada: v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Clase sqlj.runtime.StreamWrapper
La clase sqlj.runtime.StreamWrapper deriva una instancia de java.io.InputStream y ampla la clase java.io.InputStream. Las clases sqlj.runtime.AsciiStream, sqlj.runtime.BinaryStream y sqlj.runtime.UnicodeStream amplan sqlj.runtime.StreamWrapper. sqlj.runtime.StreamWrapper da soporte a mtodos para especificar la longitud de los objetos sqlj.runtime.AsciiStream , sqlj.runtime.BinaryStream y sqlj.runtime.UnicodeStream. Constructores: StreamWrapper(InputStream) Formato:
protected StreamWrapper(InputStream corriente-entrada)

Crea un objeto sqlj.runtime.StreamWrapper con una longitud no especificada. Parmetros: corriente-entrada El objeto InputStream que el objeto sqlj.runtime.StreamWrapper deriva. StreamWrapper(InputStream, int) Formato:
protected StreamWrapper(java.io.InputStream corriente-entrada, int longitud)

Crea un objeto sqlj.runtime.StreamWrapper con una longitud especificada. Parmetros: corriente-entrada El objeto InputStream que el objeto sqlj.runtime.StreamWrapper deriva. longitud Longitud del objeto InputStream en bytes. Mtodos: getInputStream Formato:
public InputStream getInputStream()

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

319

Devuelve el objeto InputStream subyacente derivado mediante el objeto StreamWrapper. getLength Formato:
public void getLength()

Devuelve la longitud en bytes del objeto InputStream derivado, tal como se ha especificado mediante el constructor o en la ltima llamada a setLength. setLength Formato:
public void setLength (int longitud)

Establece el nmero de bytes que se leen en el objeto InputStream derivado cuando el objeto se pasa como argumento de entrada a una operacin de SQL. Parmetros: longitud Nmero de bytes que se leen en el objeto InputStream derivado. Informacin relacionada: v Clase sqlj.runtime.AsciiStream en la pgina 308 v Clase sqlj.runtime.BinaryStream en la pgina 309 v Clase sqlj.runtime.UnicodeStream en la pgina 320

Clase sqlj.runtime.UnicodeStream
La clase sqlj.runtime.UnicodeStream se utiliza para una corriente de entrada de datos Unicode con una longitud especfica. La clase sqlj.runtime.UnicodeStream deriva de la clase java.io.InputStream y ampla la clase sqlj.runtime.StreamWrapper. SQLJ interpreta los bytes de un objeto sqlj.runtime.UnicodeStream como caracteres Unicode. Los objetos InputStream con caracteres Unicode deben pasarse como objetos sqlj.runtime.UnicodeStream. Constructores: UnicodeStream(InputStream) Formato:
public UnicodeStream(java.io.InputStream corriente-entrada)

Crea un objeto java.io.InputStream Unicode con una longitud no especificada. Parmetros: corriente-entrada Objeto InputStream que SQLJ interpreta como objeto UnicodeStream. UnicodeStream(InputStream, int) Formato:
public UnicodeStream(java.io.InputStream corriente-entrada, int longitud)

Crea un objeto java.io.InputStream Unicode con una longitud especificada. Parmetros:

320

Desarrollo de aplicaciones Java

corriente-entrada Objeto InputStream que SQLJ interpreta como objeto UnicodeStream . longitud Longitud del objeto InputStream que SQLJ interpreta como objeto UnicodeStream.

Informacin de consulta sobre el Controlador IBM DB2 para JDBC y SQLJ


Los temas siguientes contienen informacin que es especfica del Controlador IBM DB2 para JDBC y SQLJ. v Interfaces y clase slo de DB2 v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358 v Diferencias de SQLJ entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores DB2 JDBC en la pgina 366 v Cdigos de error emitidos por el controlador IBM DB2 para JDBC y SQLJ en la pgina 368 v SQLSTATE emitidos por el controlador de IBM DB2 para JDBC y SQLJ en la pgina 369 v Cmo buscar en el controlador IBM DB2 informacin sobre el entorno y la versin de JDBC y SQLJ en la pgina 370

Interfaces y clase slo de DB2


Los siguientes temas tratan las interfaces y clases que slo estn definidas mediante el Controlador IBM DB2 para JDBC y SQLJ.

Resumen de las extensiones de JDBC del Controlador IBM DB2 para JDBC y SQLJ
El Controlador IBM DB2 para JDBC y SQLJ proporciona un conjunto de extensiones para el soporte que proporciona la especificacin JDBC. Para utilizar mtodos exclusivos de DB2 en las clases estndar correspondientes, convierta una instancia de la clase JDBC estndar relacionada en una instancia de la clase exclusiva de DB2. Por ejemplo:
javax.sql.DataSource ds = new com.ibm.db2.jcc.DB2SimpleDataSource(); ((com.ibm.db2.jcc.DB2BaseDataSource) ds).setServerName("sysmvs1.stl.ibm.com");

En la Tabla 64, se resume las interfaces exclusivas de DB2.


Tabla 64. Resumen de interfaces exclusivas de DB2 proporcionadas por el Controlador IBM DB2 para JDBC y SQLJ Nombre de interfaz DB2Connection DB2DatabaseMetaData DB2Diagnosable DB2PreparedStatement DB2RowID DB2Statement Finalidad Ampla la interfaz java.sql.Connection. Ampla la interfaz java.sql.DatabaseMetaData. Proporciona un mecanismo para obtener los diagnsticos de DB2 a partir de una excepcin SQLException de DB2. Ampla las interfaces com.ibm.db2.jcc.DB2Statement y java.sql.PreparedStatement. Se utiliza para declarar objetos Java a fin de utilizarlo con el tipo de datos ROWID de DB2. Ampla la interfaz java.sql.Statement.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

321

Tabla 64. Resumen de interfaces exclusivas de DB2 proporcionadas por el Controlador IBM DB2 para JDBC y SQLJ (continuacin) Nombre de interfaz DB2SystemMonitor DB2Xml Finalidad Se utiliza para recoger datos de supervisin del sistema para una conexin. Se utiliza para actualizar y recuperar datos de columnas XML.

En la Tabla 65, se resumen las clases exclusivas de DB2.


Tabla 65. Resumen de las clases exclusivas de DB2 proporcionadas por el Controlador IBM DB2 para JDBC y SQLJ Nombre de clase DB2BaseDataSource Finalidad Clase padre de fuente de datos abstracta de todas las implementaciones especficas de DB2 de javax.sql.DataSource, javax.sql.ConnectionPoolDataSource y javax.sql.XADataSource. Clase abstracta para la implementacin de plugins de seguridad JDBC. Implementa las interfaces java.io.Serializable y javax.naming.Referenceable.

DB2JCCPlugin DB2ClientRerouteServerList

DB2ConnectionPoolDataSource Fbrica de objetos PooledConnection. DB2ExceptionFormatter DB2PooledConnection DB2SimpleDataSource DB2Sqlca Contiene mtodos para la impresin de la informacin de diagnstico en una corriente. Proporciona mtodos que puede utilizar un servidor de aplicaciones para cambiar de usuarios en una conexin fiable preexistente. Ampla la clase DataBaseDataSource. No soporta agrupaciones de conexiones ni transacciones distribuidas. Encapsulacin de la SQLCA de DB2.

Informacin relacionada: v SQLCA (rea de comunicaciones SQL) en Consulta de SQL, Volumen 1 v Clase DB2Sqlca en la pgina 348 v Clase DB2BaseDataSource en la pgina 322 v Clase DB2ClientRerouteServerList en la pgina 325 v Interfaz DB2Connection en la pgina 326 v Clase DB2ConnectionPoolDataSource en la pgina 339 v Interfaz DB2Diagnosable en la pgina 341 v Clase DB2ExceptionFormatter en la pgina 342 v Clase DB2PooledConnection en la pgina 343 v Interfaz DB2PreparedStatement en la pgina 347 v Interfaz DB2RowID en la pgina 347 v v v v Clase DB2SimpleDataSource en la pgina 347 Interfaz DB2Statement en la pgina 349 Interfaz DB2SystemMonitor en la pgina 350 Interfaz DB2Xml en la pgina 355

Clase DB2BaseDataSource
La clase com.ibm.db2.jcc.DB2BaseDataSource es la clase padre de fuente de datos abstracta para todas las implementaciones de javax.sql.DataSource, javax.sql.ConnectionPoolDataSource y javax.sql.XADataSource especficas de DB2.

322

Desarrollo de aplicaciones Java

Propiedades de DB2BaseDataSource: Las propiedades siguientes se definen solamente para el Controlador IBM DB2 para JDBC y SQLJ. Consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener informacin de estas propiedades. Cada una de estas propiedades tiene un mtodo setXXX para definir el valor de la propiedad y un mtodo getXXX para obtener el valor. Un mtodo setXXX tiene este formato:
void setNombre_propiedad(tipo_datos valor_propiedad)

Un mtodo getXXX tiene este formato:


tipo_datos getnombre_propiedad()

Nombre_propiedad es el nombre de propiedad no calificado, con el primer carcter escrito en maysculas. La Tabla 66 lista las propiedades del Controlador IBM DB2 para JDBC y SQLJ y los tipos de datos asociados a ellas.
Tabla 66. Propiedades de DB2BaseDataSource y tipos de datos asociados a ellas Nombre de propiedad com.ibm.db2.jcc.DB2BaseDataSource.accountingInterval (especfico de DB2 para z/OS) com.ibm.db2.jcc.DB2BaseDataSource.blockingReadConnectionTimeout com.ibm.db2.jcc.DB2BaseDataSource.clientAccountingInformation com.ibm.db2.jcc.DB2BaseDataSource.clientApplicationInformation com.ibm.db2.jcc.DB2BaseDataSource.clientDebugInfo com.ibm.db2.jcc.DB2BaseDataSource.clientProgramId com.ibm.db2.jcc.DB2BaseDataSource.clientProgramName com.ibm.db2.jcc.DB2BaseDataSource.clientRerouteServerListJNDIName com.ibm.db2.jcc.DB2BaseDataSource.clientUser com.ibm.db2.jcc.DB2BaseDataSource.clientWorkstation com.ibm.db2.jcc.DB2BaseDataSource.currentExplainMode com.ibm.db2.jcc.DB2BaseDataSource.currentExplainSnapshot com.ibm.db2.jcc.DB2BaseDataSource.currentFunctionPath com.ibm.db2.jcc.DB2BaseDataSource.currentLockTimeout (especfico de DB2 para z/OS) com.ibm.db2.jcc.DB2BaseDataSource.currentMaintainedTableTypesForOptimization com.ibm.db2.jcc.DB2BaseDataSource.currentPackagePath com.ibm.db2.jcc.DB2BaseDataSource.currentPackageSet com.ibm.db2.jcc.DB2BaseDataSource.currentQueryOptimization com.ibm.db2.jcc.DB2BaseDataSource.currentRefreshAge com.ibm.db2.jcc.DB2BaseDataSource.cursorSensitivity com.ibm.db2.jcc.DB2BaseDataSource.currentSchema com.ibm.db2.jcc.DB2BaseDataSource.currentSQLID com.ibm.db2.jcc.DB2BaseDataSource.databaseName com.ibm.db2.jcc.DB2BaseDataSource.deferPrepares com.ibm.db2.jcc.DB2BaseDataSource.description Tipo de datos String int String String String String String String String String String String String int String String String int long int String String String boolean String
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

323

Tabla 66. Propiedades de DB2BaseDataSource y tipos de datos asociados a ellas (continuacin) Nombre de propiedad com.ibm.db2.jcc.DB2BaseDataSource.driverType com.ibm.db2.jcc.DB2BaseDataSource.enableConnectionConcentrator com.ibm.db2.jcc.DB2BaseDataSource.enableSysplexWLB com.ibm.db2.jcc.DB2BaseDataSource.fullyMaterializeInputStreams com.ibm.db2.jcc.DB2BaseDataSource.fullyMaterializeLobData com.ibm.db2.jcc.DB2BaseDataSource.gssCredential com.ibm.db2.jcc.DB2BaseDataSource.jdbcCollection com.ibm.db2.jcc.DB2BaseDataSource.keepDynamic com.ibm.db2.jcc.DB2BaseDataSource.kerberosServerPrincipal com.ibm.db2.jcc.DB2BaseDataSource.loginTimeout com.ibm.db2.jcc.DB2BaseDataSource.logWriter com.ibm.db2.jcc.DB2BaseDataSource.maxRetriesForClientReroute com.ibm.db2.jcc.DB2BaseDataSource.maxTransportObjects com.ibm.db2.jcc.DB2BaseDataSource.pkList com.ibm.db2.jcc.DB2BaseDataSource.planName com.ibm.db2.jcc.DB2BaseDataSource.plugin (especfico de DB2 Database para Linux, UNIX y Windows) com.ibm.db2.jcc.DB2BaseDataSource.pluginName (especfico de DB2 Database para Linux, UNIX y Windows) com.ibm.db2.jcc.DB2BaseDataSource.portNumber com.ibm.db2.jcc.DB2BaseDataSource.progressiveStreaming com.ibm.db2.jcc.DB2BaseDataSource.queryCloseImplicit com.ibm.db2.jcc.DB2BaseDataSource.readOnly com.ibm.db2.jcc.DB2BaseDataSource.resultSetHoldability com.ibm.db2.jcc.DB2BaseDataSource.retrieveMessagesFromServerOnGetMessage com.ibm.db2.jcc.DB2BaseDataSource.retryIntervalForClientReroute com.ibm.db2.jcc.DB2BaseDataSource.returnAlias com.ibm.db2.jcc.DB2BaseDataSource.securityMechanism com.ibm.db2.jcc.DB2BaseDataSource.sendDataAsIs com.ibm.db2.jcc.DB2BaseDataSource.serverName com.ibm.db2.jcc.DB2BaseDataSource.sslConnection com.ibm.db2.jcc.DB2BaseDataSource.streamBufferSize com.ibm.db2.jcc.DB2BaseDataSource.supportsAsynchronousXARollback com.ibm.db2.jcc.DB2BaseDataSource.sysSchema com.ibm.db2.jcc.DB2BaseDataSource.traceDirectory com.ibm.db2.jcc.DB2BaseDataSource.traceFile com.ibm.db2.jcc.DB2BaseDataSource.traceLevel com.ibm.db2.jcc.DB2BaseDataSource.useCachedCursor com.ibm.db2.jcc.DB2BaseDataSource.usePool com.ibm.db2.jcc.DB2BaseDataSource.user Tipo de datos int boolean boolean boolean boolean Object String int String int PrintWriter int int String String Object String int int int boolean int boolean int short int boolean String boolean int int String String String int boolean boolean String

324

Desarrollo de aplicaciones Java

Tabla 66. Propiedades de DB2BaseDataSource y tipos de datos asociados a ellas (continuacin) Nombre de propiedad com.ibm.db2.jcc.DB2BaseDataSource.useTargetColumnEncoding com.ibm.db2.jcc.DB2BaseDataSource.useTransactionRedirect Tipo de datos boolean boolean

Mtodos de DB2BaseDataSource: Adems de los mtodos getXXX y setXXX para las propiedades de DB2BaseDataSource, estn definidos los mtodos siguientes solo para el Controlador IBM DB2 para JDBC y SQLJ. getReference Formato:
public javax.naming.Reference getReference() throws javax.naming.NamingException

Obtiene la referencia (Reference) de un objeto DataSource. Para obtener una explicacin sobre Reference, consulte la descripcin de javax.naming.Referenceable en la documentacin de JNDI, que se encuentra en:
http://java.sun.com/products/jndi/docs.html

Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Clase DB2ClientRerouteServerList
La clase com.ibm.db2.jcc.DB2ClientRerouteServerList implementa las interfaces java.io.Serializable y javax.naming.Referenceable. Mtodos DB2ClientRerouteServerList: getAlternatePortNumber Formato:
public int[] getAlternatePortNumber()

Obtiene los nmeros de puerto que estn asociados a los servidores de bases de datos DB2 alternativos. getAlternateServerName Formato:
public String[] getAlternateServerName()

Obtiene una matriz que contiene los nombres de los servidores de bases de datos DB2 alternativos. Estos valores son direcciones IP o nombres de servidor DNS. getPrimaryPortNumber Formato:
public int getPrimaryPortNumber()

Obtiene el nmero de puerto que est asociado al servidor de bases de datos DB2 primario. getPrimaryServerName Formato:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

325

public String[] getPrimaryServerName()

Obtiene el nombre del servidor de bases de datos DB2 primario. Este valor es una direccin IP o un nombre de servidor DNS. setAlternatePortNumber Formato:
public void setAlternatePortNumber(int[] listaNmeroPuertoAlternativo)

Define los nmeros de puerto que estn asociados a los servidores de bases de datos DB2 alternativos. setAlternateServerName Formato:
public void setAlternateServerName(String[] servidorAlternativo)

Define los nombres de servidor alternativo correspondientes a los servidores de bases de datos DB2. Estos valores son direcciones IP o nombres de servidor DNS. setPrimaryPortNumber Formato:
public void setPrimaryPortNumber(int nmeroPuertoPrimario)

Define el nmero de puerto que est asociado al servidor de bases de datos DB2 primario. setPrimaryServerName Formato:
public void setPrimaryServerName(String servidorPrimario)

Define el nombre del servidor primario correspondiente al servidor de bases de datos DB2. Este valor es una direccin IP o un nombre de servidor DNS. Conceptos relacionados: v Controlador IBM DB2 para soporte de redireccionamiento de cliente de JDBC y SQLJ en la pgina 93

Interfaz DB2Connection
La interfaz com.ibm.db2.jcc.DB2Connection ampla la interfaz java.sql.Connection. Mtodos de DB2Connection: Los mtodos siguientes se definen solamente para el Controlador IBM DB2 para JDBC y SQLJ. changeDB2Password Formato:
public abstract void changeDB2Password(String contraseaAntigua, String contraseaNueva) throws java.sql.SQLException

Cambia la contrasea para acceder al servidor de bases de datos DB2 para el usuario del objeto Connection. Descripciones de parmetros:

326

Desarrollo de aplicaciones Java

contraseaAntigua Contrasea original de Connection. contraseaNueva Contrasea nueva de Connection. deregisterDB2XmlObject Formatos:
public void deregisterDB2XmlObject(String esquemaIdSql, String nombreIdSql) throws SQLException

Elimina un esquema XML registrado anteriormente de DB2. deregisterDB2XmlObject llama al procedimiento SYSPROC.XSR_REMOVE almacenado para eliminar el esquema XML. Descripciones de parmetros: esquemaIdSql Nombre del esquema SQL para el esquema XML. esquemaIdSql es un valor de serie con una longitud mxima de 128 bytes. El valor de esquemaIdSql debe cumplir con las normas de denominacin de cualquier nombre de esquema SQL. El nombre no puede empezar por la serie 'SYS'. Si el valor de esquemaIdSql es nulo, DB2 utilizar el valor del registro especial CURRENT SCHEMA. nombreIdSql Nombre SQL del esquema XML. nombreIdSql es un valor de serie con una longitud mxima de 128 bytes. El valor de nombreIdSql debe cumplir con las normas de un identificador SQL. Si el valor de esquemaIdSql es nulo, el valor de nombreIdSql puede ser nulo; en tal caso, DB2 generar el valor para nombreIdSql. getDB2ClientProgramId Formato:
public String getDB2ClientProgramId() throws java.sql.SQLException

Devuelve el identificador del programa definido por el usuario para el cliente. El identificador del programa se puede utilizar para identificar la aplicacin en el servidor de la base de datos. getDB2ClientAccountingInformation Formato:
public String getDB2ClientAccountingInformation() throws SQLException

Devuelve informacin de contabilidad para el cliente actual. getDB2ClientApplicationInformation Formato:


public String getDB2ClientApplicationInformation() throws java.sql.SQLException

Devuelve informacin de aplicacin para el cliente actual. getDB2ClientUser Formato:


public String getDB2ClientUser() throws java.sql.SQLException
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

327

Devuelve el nombre de usuario del cliente actual para la conexin. Este nombre no es el valor de usuario para la conexin JDBC. getDB2ClientWorkstation Formato:
public String getDB2ClientWorkstation() throws java.sql.SQLException

Devuelve el nombre de estacin de trabajo para el cliente actual. getDB2Correlator Formato:


String getDB2Correlator() throws java.sql.SQLException

Devuelve el valor de la variable de instancia (smbolo de correlacin) crrtkn que DRDA enva con el mandato ACCRDB. El smbolo de correlacin nicamente identifica una conexin lgica con un servidor. getDB2CurrentPackagePath Formato:
public String getDB2CurrentPackagePath() throws java.sql.SQLException

Devuelve una lista de colecciones de paquetes de DB2 en los que se buscan los paquetes JDBC y SQLJ. getDB2CurrentPackageSet Formato:
public String getDB2CurrentPackageSet() throws java.sql.SQLException

Devuelve el ID de coleccin para la conexin. getDB2SystemMonitor Formato:


public abstract DB2SystemMonitor getDB2SystemMonitor() throws java.sql.SQLException

Obtiene el objeto supervisor del sistema de la conexin. Cada conexin del Controlador IBM DB2 para JDBC y SQLJ puede tener un supervisor del sistema individual. getJccLogWriter Formato:
public PrintWriter getJccLogWriter() throws java.sql.SQLException

Obtiene el destino de rastreo actual para la funcin de rastreo del Controlador IBM DB2 para JDBC y SQLJ. installDB2JavaStoredProcedure Formato:
public void DB2Connection.installDB2JavaStoredProcedure( java.io.InputStream archivoJar, int longitudArchivoJar, String idJar) throws java.sql.SQLException

328

Desarrollo de aplicaciones Java

Invoca el procedimiento almacenado sqlj.install_jar en un servidor DB2 Database para Linux, UNIX y Windows para crear una definicin nueva de un archivo JAR en el catlogo de DB2 de dicho servidor. Descripciones de parmetros: archivoJar El contenido del archivo JAR debe definirse en el servidor DB2. longitudArchivoJar La longitud del archivo JAR debe definirse en el servidor DB2. idJar Nombre DB2 del archivo JAR en la forma esquema.id-JAR o id-JAR. ste es el nombre que se utiliza para hacer referencia al archivo JAR de las sentencias de SQL. Si se omite esquema, DB2 utilizar el ID de autorizacin de SQL que se encuentra en el registro especial CURRENT SCHEMA. El propietario del archivo JAR es el ID de autorizacin del registro especial CURRENT SQLID. isDB2Alive Formato:
public boolean DB2Connection.isDB2Alive() throws java.sql.SQLException

Devuelve el valor true si el socket de una conexin con un servidor DB2 todava est activo. isDB2GatewayConnection Formato:
public boolean DB2Connection.isDB2GatewayConnection() throws java.sql.SQLException

Devuelve el valor true si la conexin con el servidor se realiza a travs de una pasarela DB2 Connect intermedia. De lo contrario, devolver el valor false. reconfigureDB2Connection Formato:
public void reconfigureDB2Connection(java.util.Properties propiedades) throws SQLException

Vuelve a configurar una conexin con valores nuevos. La conexin no debe devolverse a una agrupacin de conexiones antes de que se vuelva a configurar. Se puede llamar a este mtodo mientras una transaccin se encuentra en curso. Descripciones de parmetros: propiedades Propiedades nuevas de la conexin. Estas propiedades alteran temporalmente todas las propiedades que ya se han definido en la instancia de DB2Connection. recycleDB2Connection Formato:
public void recycleDB2Connection() throws SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

329

Notifica la conexin fsica subyacente de un evento de reciclaje. Los objetos Statement de connection se cierran o se reciclan para reutilizarlos, en funcin de los valores de configuracin de la agrupacin. registerDB2XmlSchema Formatos:
public void registerDB2XmlSchema(String[] esquemaIdSql, String[] nombreIdSql, String[] ubicacionesEsquemaXml, InputStream[] documentosEsquemaXml, int[] longitudesDocumentosEsquemaXml, InputStream[] propiedadesDocumentosEsquemaXml, int[] longitudesPropiedadesDocumentosEsquemaXml, InputStream propiedadesEsquemaXml, int longitudPropiedadesEsquemaXml, boolean seUsaParaTrocear) throws SQLException public void registerDB2XmlSchema(String[] esquemaIdSql, String[] nombreIdSql, String[] ubicacionesEsquemaXml, String[] documentosEsquemaXml, String[] propiedadesDocumentosEsquemaXml, String propiedadesEsquemaXml, boolean seUsaParaTrocear) throws SQLException

Proporciona uno o varios documentos de esquema XML para registrar un esquema XML en DB2. registerDB2XmlSchema llama a los procedimientos almacenados SYSPROC.XSR_REGISTER, SYSPROC.XSR_ADDSCHEMADOC y SYSPROC.XSR_COMPLETE para registrar un esquema XML con uno o varios documentos de esquema XML. Si se procesan varios documentos de esquema XML con una sola llamada a registerDB2XmlSchema, dichos documentos se procesarn como parte de una sola transaccin. El primer formato de registerDB2XmlSchema es para documentos de esquema XML que se leen desde una corriente de entrada. El segundo formato de registerDB2XmlSchema es para documentos de esquema XML que se leen desde series. Descripciones de parmetros: esquemaIdSql Nombre del esquema SQL para el esquema XML. Slo se utiliza el primer elemento de la matriz esquemaIdSql. esquemaIdSql es un valor de serie con una longitud mxima de 128 bytes. El valor de esquemaIdSql debe cumplir con las normas de denominacin de cualquier nombre de esquema SQL. El nombre no puede empezar por la serie 'SYS'. Si el valor de esquemaIdSql es nulo, DB2 utilizar el valor del registro especial CURRENT SCHEMA. nombreIdSql Nombre SQL del esquema XML. Slo se utiliza el primer elemento de la matriz nombreIdSql. nombreIdSql es un valor de serie con una longitud mxima de 128 bytes. El valor de nombreIdSql debe cumplir con las normas de un identificador SQL. Si el valor de esquemaIdSql es nulo, el valor de nombreIdSql puede ser nulo; en tal caso, DB2 generar el valor para nombreIdSql. ubicacionesEsquemaXml Ubicaciones de esquema XML de los documentos de esquema XML principal de los esquemas que se estn registrando. Los valores de

330

Desarrollo de aplicaciones Java

ubicacin del esquema XML suelen tener el formato URI. Cada valor ubicacionesEsquemaXml es un valor de serie con una longitud mxima de 1000 bytes. El valor se utiliza slo para que coincida con la informacin que se especifica en el documento de esquema XML que hace referencia a dicho documento. DB2 no realiza ninguna validacin de formato ni intenta resolver el URI. documentosEsquemaXml Contenido de los documentos de esquema XML principal. Cada valor documentosEsquemaXml es un valor de serie o de corriente de entrada con una longitud mxima de 30MB. Los valores no pueden ser nulos. longitudesDocumentosEsquemaXml Longitudes de los documentos de esquema XML del parmetro documentosEsquemaXml, en el caso de que se utilice el primer formato de registerDB2XmlSchema. Cada valor longitudesDocumentosEsquemaXml es un valor int. propiedadesDocumentosEsquemaXml Contiene propiedades de los documentos de esquema XML principal, como las propiedades que utiliza un sistema de creacin de versiones del esquema XML externo. DB2 no realiza ninguna validacin del contenido de dichos valores. Se almacenan en la tabla XSR para su recuperacin y se utilizacin en otras herramientas e implementaciones de depsito de esquema XML. Cada valor propiedadesDocumentosEsquemaXml es un valor de serie o de corriente de entrada con una longitud mxima de 5 MB. Si no debe pasarse ninguna propiedad, el valor ser nulo. longitudesPropiedadesDocumentosEsquemaXml Longitudes de las propiedades de esquema XML del parmetro propiedadesDocumentosEsquemaXml, en el caso de que se utilice el primer formato de registerDB2XmlSchema. Cada valor longitudesPropiedadesDocumentosEsquemaXml es un valor de tipo int. propiedadesEsquemaXml Contiene propiedades de todo el documento XML, como las que utiliza un sistema de creacin de versiones del esquema XML externo. DB2 no realiza ninguna validacin del contenido de este valor. Se almacenan en la tabla XSR para su recuperacin y se utilizacin en otras herramientas e implementaciones de depsito de esquema XML. El valor propiedadesEsquemaXml es un valor de serie o de corriente de entrada con una longitud mxima de 5 MB. Si no debe pasarse ninguna propiedad, el valor ser nulo. longitudesPropiedadesEsquemaXml Longitud de la propiedad del esquema XML del parmetro propiedadesEsquemaXml, en el caso de que se utilice el primer formato de registerDB2XmlSchema. Cada valor longitudesPropiedadesEsquemaXml es un valor de tipo int. seUsaParaTrocear Indica si existen anotaciones en el esquema que debe utilizarse para la descomposicin XML. seUsaParaTrocear es un valor boolean. removeDB2JavaStoredProcedure Formato:
public void DB2Connection.replaceDB2JavaStoredProcedure( String idJar) throws java.sql.SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

331

Invoca el procedimiento almacenado sqlj.remove_jar en un servidor DB2 Database para Linux, UNIX y Windows para suprimir la definicin de un archivo JAR del catlogo DB2 de dicho servidor. Descripciones de parmetros: idJar Nombre DB2 del archivo JAR en la forma esquema.id-JAR o id-JAR. ste es el nombre que se utiliza para hacer referencia al archivo JAR de las sentencias de SQL. Si se omite esquema, DB2 utilizar el ID de autorizacin de SQL que se encuentra en el registro especial CURRENT SCHEMA. replaceDB2JavaStoredProcedure Formato:
public void DB2Connection.replaceDB2JavaStoredProcedure( java.io.InputStream archivoJar, int longitudArchivoJar, String idJar) throws java.sql.SQLException

Invoca el procedimiento almacenado sqlj.replace_jar en un servidor DB2 Database para Linux, UNIX y Windows para sustituir la definicin del archivo JAR en el catlogo DB2 de dicho servidor. Descripciones de parmetros: archivoJar Contenido del archivo JAR que debe sustituirse en el servidor DB2. longitudArchivoJar Longitud del archivo JAR que debe sustituirse en el servidor DB2. idJar Nombre DB2 del archivo JAR en la forma esquema.id-JAR o id-JAR. ste es el nombre que se utiliza para hacer referencia al archivo JAR de las sentencias de SQL. Si se omite esquema, DB2 utilizar el ID de autorizacin de SQL que se encuentra en el registro especial CURRENT SCHEMA. El propietario del archivo JAR es el ID de autorizacin del registro especial CURRENT SQLID. reuseDB2Connection (trusted connection reuse) Formatos:
public Connection reuseDB2Connection(byte[] cookie, String usuario, String contrasea, String registroNombreUsuario, byte[] smboloSeguridadUsuario, String usuarioOriginal, java.util.Properties propiedades) throws java.sql.SQLException

Mtodo utilizado por un servidor de aplicaciones fiable para volver a utilizar una conexin fiable preexistente en nombre de un usuario nuevo. Se pasan las propiedades que pueden restaurarse, incluido el ID de usuario nuevo. El servidor de bases de datos restaura la conexin fsica asociada. Si reuseDB2Connection se ejecuta correctamente, el nuevo usuario podr utilizar inmediatamente la conexin con propiedades diferentes. Descripciones de parmetros:

332

Desarrollo de aplicaciones Java

cookie Una cookie exclusiva que genera el controlador JDBC para la instancia de Connection. Slo el servidor de aplicaciones y el controlador JDBC subyacente que estableci la conexin fiable inicial conocen la cookie. El servidor de aplicaciones pasa la cookie creada por el controlador en el momento de la creacin de la instancia de la conexin agrupada. El controlador JDBC comprueba que la cookie proporcionada coincida con la cookie de la conexin fsica fiable subyacente para garantizar que la peticin se ha creado a partir del servidor de aplicaciones que ha establecido la conexin fsica fiable. Si las cookies coinciden, el usuario podr utilizar inmediatamente la conexin con propiedades diferentes. usuario ID de cliente que el servidor de bases de datos DB2 utiliza para establecer el ID de autorizacin de la base de datos. Si el servidor de aplicaciones no ha autentificado al usuario, el servidor de aplicaciones deber pasar un ID de cliente que represente a un usuario DB2 sin autenticacin. contrasea Contrasea del usuario. registroNombreUsuario Nombre que identifica un servicio de correlacin que correlaciona un ID de usuario de estacin de trabajo con un ID de z/OS RACF. Un ejemplo de servicio de correlacin es la correlacin de identidades empresariales (EIM) de servicios de seguridad integrados. El servicio de correlacin se define mediante un plugin. Los proveedores de plugins definen los valores vlidos de registroNombreUsuario. Si el valor de registroNombreUsuario es nulo, no se realizar ninguna correlacin de usuario. smboloSeguridadUsuario Smbolos de seguridad del cliente. Este valor se rastrea como parte de DB2 para datos contables de z/OS. El contenido de smboloSeguridadUsuario se describe en el servidor de aplicaciones y el servidor DB2 lo interpreta como un smbolo de seguridad del servidor de aplicaciones. usuarioOriginal ID del usuario original utilizado por el servidor de aplicaciones. propiedades Propiedades de la conexin reutilizada. reuseDB2Connection (untrusted reuse with reauthentication) Formatos:
public DB2Connection reuseDB2Connection(String usuario, String contrasea, java.util.Properties propiedades) throws java.sql.SQLException public DB2Connection reuseDB2Connection( org.ietf.jgss.GSSCredential credencialGss, java.util.Properties propiedades) throws java.sql.SQLException

En un entorno de agrupacin heterogneo, se utiliza una instancia de Connection despus de que se haya vuelto a realizar la autenticacin. Descripcin de parmetros: usuario ID de autorizacin que se utiliza para establecer la conexin.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

333

contrasea Contrasea del ID de autorizacin que se utiliza para establecer la conexin. credencialGss Si la fuente de datos utiliza la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. propiedades Propiedades de la conexin reutilizada. Estas propiedades alteran temporalmente todas las propiedades que ya se han definido en la instancia de DB2Connection. reuseDB2Connection (reutilizacin no fiable sin reautentificacin) Formatos:
public DB2Connection reuseDB2Connection(java.util.Properties propiedades) throws java.sql.SQLException public DB2Connection reuseDB2Connection() throws java.sql.SQLException public DB2Connection reuseDB2Connection(int ProtocoloReutilizacinConexin, java.util.Properties propiedades) throws java.sql.SQLException public DB2Connection reuseDB2Connection(int ProtocoloReutilizacinConexin) throws java.sql.SQLException

Reutiliza una instancia de conexin sin reautentificacin. Los formatos segundo y cuarto del mtodo estn diseados para reutilizar la instancia de Connection en el caso de que las propiedades no cambien. Los formatos tercero y cuarto de getDB2Connection permiten especificar si se deben restablecer las propiedades de conexin cuando se reutilice la conexin. Descripcin de parmetros: propiedades Propiedades de la conexin reutilizada. Estas propiedades alteran temporalmente todas las propiedades que ya se han definido en la instancia de DB2Connection. ProtocoloReutilizacinConexin Especifica si se restablece el estado de la conexin cuando una conexin se reutiliza desde una agrupacin de conexiones. Este valor altera temporalmente el valor de la propiedad connectionReuseProtocol. Los valores posibles son: DIRTY_CONNECTION_REUSE El estado de la conexin no se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial no se restablecen y las tablas temporales no se eliminan. Los valores de la propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo de aplicaciones al controlador JDBC para la reinicializacin. No se cambian las propiedades que no se pasen mediante el mdulo de agrupaciones. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval

334

Desarrollo de aplicaciones Java

v v v v v v v v v v v

databaseName driverType pkList planName portNumber kerberosServerPrincipal password readOnly securityMechanism serverName user

RESET_CONNECTIONS_ON_REUSE El estado de la conexin se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial se restablecen y las tablas temporales se eliminan. Los valores de la propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo de aplicaciones al controlador JDBC para la reinicializacin. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval v databaseName v driverType v pkList v planName v portNumber v kerberosServerPrincipal v password v readOnly v securityMechanism v serverName v user setDB2ClientAccountingInformation Formato:
public void setDB2ClientAccountingInformation(String info) throws java.sql.SQLException

Especifica informacin contable para la conexin. Esta informacin se utiliza con fines de contabilidad de clientes. Este valor puede cambiar durante una conexin. Descripcin de parmetros: info Informacin contable especificada por el usuario. La longitud mxima depende del servidor. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 22 bytes. Una serie vaca Java ("") es vlida para este valor de parmetro, pero un valor null de Java no es vlido.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

335

setDB2ClientDebugInfo Formatos:
public void setDB2ClientDebugInformation(String InformacinDepuracin) throws java.sql.SQLException public void setDB2ClientDebugInformation(String informacinGestor, String InformacinRastreo) throws java.sql.SQLException

Establece un valor para el atributo CLIENT DEBUGINFO de the DB2 para notificar al servidor DB2 que los procedimientos almacenados y las funciones definidas por el usuario que estn utilizando la conexin se estn ejecutando en modalidad de depuracin. El depurador unificado de DB2 utiliza el atributo CLIENT DEBUGINFO. Utilice el primer formato para establecer toda la serie de CLIENT DEBUGINFO. Utilice el segundo formato para modificar nicamente el gestor de sesiones y la informacin de rastreo de la serie CLIENT DEBUGINFO. El mtodo setDB2ClientDebugInfo se aplica slo para conexiones a servidores de bases de datos DB2 para z/OS. Para establecer el atributo CLIENT DEBUGINFO para una serie cuya longitud sea mayor que cero, es necesario contar con uno de los privilegios siguientes: v El privilegio DEBUGSESSION v Autoridad SYSADM Descripcin de parmetros: informacinDepuracin Cadena de un mximo de 254 bytes con el formato siguiente:
Mip:puerto,Iip,Pidp,Tidh,Cid,Lniv

Las partes de la serie son: Mip:puerto Direccin IP y nmero de puerto del gestor de la sesin Iip Pidp Tidh Cid Lniv Direccin IP de cliente ID de proceso de cliente ID de hebra de cliente (opcional) ID generado por la conexin de datos Nivel de rastreo de diagnstico de biblioteca de depuracin

Por ejemplo:
M9.72.133.89:8355,I9.72.133.89,P4552,T123,C1,L0

Consulte la descripcin de SET CLIENT DEBUGINFO para obtener detalles de esta serie. informacinGestor Serie con el formato siguiente, la cual especifica la direccin IP y el nmero de puerto del gestor de sesiones del depurador unificado.
Mip:puerto

Por ejemplo:
M9.72.133.89:8355

336

Desarrollo de aplicaciones Java

Consulte la descripcin de SET CLIENT DEBUGINFO para obtener detalles de esta serie. informacinRastreo Serie con el formato siguiente, la cual especifica el nivel de rastreo de diagnstico de la biblioteca de depuracin.
Lniv

Por ejemplo:
L0

Consulte la descripcin de SET CLIENT DEBUGINFO para obtener detalles de esta serie. setDB2ClientProgramId Formato:
public abstract void setDB2ClientProgramId(String ID-programa) throws java.sql.SQLException

Establece un identificador de programa definido por el usuario para la conexin en servidores DB2 para z/OS. Dicho identificador de programa es una serie de 80 bytes que se utiliza para identificar al llamador. El servidor DB2 para z/OS coloca la serie en los registros de rastreo IFCID 316 junto con los dems datos estadsticos, de modo que se pueda identificar el programa que est asociado con una sentencia de SQL determinada. setDB2ClientUser Formato:
public void setDB2ClientUser(String usuario) throws java.sql.SQLException

Especifica el nombre de usuario del cliente actual de la conexin. Este nombre se utiliza con fines de contabilidad de clientes, y no es el valor de usuario (user) de la conexin JDBC. A diferencia del valor de usuario de la conexin JDBC, el nombre de usuario del cliente actual puede cambiar durante una conexin. Descripcin de parmetros: usuario ID de usuario para el cliente actual. La longitud mxima depende del servidor. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 16 bytes. Una serie vaca Java ("") es vlida para este valor de parmetro, pero un valor null de Java no es vlido. setDB2ClientWorkstation Formato:
public void setDB2ClientWorkstation(String nombre) throws java.sql.SQLException

Especifica el nombre de estacin de trabajo del cliente actual de la conexin. Este nombre se utiliza con fines de contabilidad de clientes. El nombre de estacin de trabajo del cliente actual puede cambiar durante una conexin. Descripcin de parmetros:

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

337

nombre Nombre de estacin de trabajo para el cliente actual. La longitud mxima depende del servidor. Para un servidor DB2 Database para Linux, UNIX y Windows, la longitud mxima es de 255 bytes. Para un servidor DB2 para z/OS, la longitud mxima es de 18 bytes. Una serie vaca Java ("") es vlida para este valor de parmetros, pero un valor nulo de Java no es vlido. setDB2CurrentPackagePath Formato:
public void setDB2CurrentPackagePath(String vaPaquetes) throws java.sql.SQLException

Especifica una lista de ID de coleccin en los que el servidor DB2 busca paquetes JDBC y SQLJ. Descripcin de parmetros: vaPaquetes Lista de ID de coleccin, separados por comas. setDB2CurrentPackageSet Formato:
public void setDB2CurrentPackageSet(String conjuntoPaquetes) throws java.sql.SQLException

Especifica el ID de coleccin de la conexin. Cuando define este valor, tambin define el ID de coleccin de la instancia del Controlador IBM DB2 para JDBC y SQLJ que se utiliza para la conexin. Descripcin de parmetros: conjuntoPaquetes ID de coleccin para la conexin. La longitud mxima del valor de packageSet es 18 bytes. Puede invocar este mtodo como alternativa a ejecutar la sentencia SET CURRENT PACKAGESET de SQL en su programa. setJccLogWriter Formatos:
public void setJccLogWriter(PrintWriter grabadorRegistro) throws java.sql.SQLException public void setJccLogWriter(PrintWriter grabadorRegistro, int nivelRastreo) throws java.sql.SQLException

Habilita o inhabilita la funcin de rastreo del Controlador IBM DB2 para JDBC y SQLJ, o cambia el destino de rastreo durante una conexin activa. Descripciones de parmetros: grabadorRegistro Objeto de tipo java.io.PrintWriter en que el Controlador IBM DB2 para JDBC y SQLJ graba la salida del rastreo. Para desactivar el rastreo, establezca el valor de logWriter en null.

338

Desarrollo de aplicaciones Java

nivelRastreo Especifica los tipos de rastreos que se deben recoger. Consulte la descripcin de la propiedad traceLevel en Propiedades del controlador IBM DB2 para JDBC y SQLJ para conocer los valores que son vlidos. Conceptos relacionados: v Diagnstico de problemas de JDBC y SQLJ en el controlador IBM DB2 para JDBC y SQLJ en la pgina 195 Tareas relacionadas: v Suministro de informacin ampliada sobre el cliente al servidor DB2 con el Controlador IBM DB2 para JDBC y SQLJ en la pgina 73

Clase DB2ConnectionPoolDataSource
La clase com.ibm.db2.jcc.DB2ConnectionPoolDataSource ampla la clase com.ibm.db2.jcc.DB2BaseDataSource e implementa las interfaces javax.sql.ConnectionPoolDataSource, java.io.Serializable y javax.naming.Referenceable. DB2ConnectionPoolDataSource es una fbrica para los objetos PooledConnection. Un objeto que implementa esta interfaz se registra con un servicio de asignacin de nombres que se basa en Java Naming and Directory Interface (JNDI). Propiedades DB2ConnectionPoolDataSource: Estas propiedades slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. Consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener informacin de estas propiedades. Estas propiedades tienen un mtodo setXXX para establecer el valor de la propiedad y un mtodo getXXX para recuperar el valor. Un mtodo setXXX tiene este formato:
void setNombre_propiedad(tipo_datos valor_propiedad)

Un mtodo getXXX tiene este formato:


tipo_datos getnombre_propiedad()

Nombre_propiedad es el nombre de propiedad no calificado, con el primer carcter escrito en maysculas. Tabla 67 lista las propiedades del Controlador IBM DB2 para JDBC y SQLJ y los tipos de datos asociados a ellas.
Tabla 67. Propiedades de DB2ConnectionPoolDataSource y tipos de datos asociados a ellas Nombre de propiedad com.ibm.db2.jcc.DB2ConnectionPoolDataSource.connectionReuseProtocol com.ibm.db2.jcc.DB2ConnectionPoolDataSource.statementReuseProtocol Tipo de datos int int

Mtodos DB2ConnectionPoolDataSource: getDB2PooledConnection Formatos:


Captulo 11. Informacin de consulta sobre JDBC y SQLJ

339

public DB2PooledConnection getDB2PooledConnection(String usuario, String contrasea, java.util.Properties propiedades) throws java.sql.SQLException public DB2PooledConnection getDB2PooledConnection( org.ietf.jgss.GSSCredential credencialGss, java.util.Properties propiedades) throws java.sql.SQLException

Establece la conexin no fiable inicial en un entorno de agrupacin heterogneo. El primer formato de getDB2PooledConnection ofrece un ID de usuario y una contrasea. El segundo formato de getDB2PooledConnection es para conexiones que utilizan la seguridad Kerberos. Descripciones de parmetros: usuario ID de autorizacin que se utiliza para establecer la conexin. contrasea Contrasea del ID de autorizacin que se utiliza para establecer la conexin. credencialGss Si la fuente de datos utiliza la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. propiedades Propiedades de la conexin. getDB2TrustedPooledConnection Formatos:
public Object[] getDB2TrustedPooledConnection(String usuario, String contrasea, java.util.Properties propiedades) throws java.sql.SQLException public Object[] getDB2TrustedPooledConnection( java.util.Properties propiedades) throws java.sql.SQLException public Object[] getDB2TrustedPooledConnection( org.ietf.jgss.GSSCredential credencialGss, java.util.Properties propiedades) throws java.sql.SQLException

Un servidor de aplicaciones que utiliza un ID de autorizacin del sistema utiliza este mtodo para establecer una conexin fiable. Los elementos siguientes se devuelven en Object[]: v El primer elemento es una instancia de DB2PooledConnection fiable. v El segundo elemento es una cookie exclusiva para la instancia de conexin agrupada que se ha generado. El primer formato de getDB2TrustedPooledConnection ofrece un ID de usuario y una contrasea, mientras que el segundo formato de getDB2TrustedPooledConnection utiliza el ID de usuario y la contrasea del objeto DB2ConnectionPoolDataSource. El tercer formato de getDB2TrustedPooledConnection es para conexiones que utilizan la seguridad Kerberos. Descripciones de parmetros:

340

Desarrollo de aplicaciones Java

usuario El ID de autorizacin de DB2 que se utiliza para establecer la conexin fiable con el servidor de bases de datos. contrasea Contrasea del ID de autorizacin que se utiliza para establecer la conexin fiable. credencialGss Si la fuente de datos utiliza la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. propiedades Propiedades de la conexin. Conceptos relacionados: v Captulo 9, Soporte de agrupaciones de conexiones JDBC y SQLJ, en la pgina 233 Informacin relacionada: v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249

Interfaz DB2Diagnosable
La interfaz com.ibm.db2.jcc.DB2Diagnosable proporciona un mecanismo para obtener los diagnsticos de DB2 a partir de una SQLException de DB2. Mtodos DB2Diagnosable: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. getSqlca Formato:
public DB2Sqlca getSqlca()

Devuelve un objeto DB2Sqlca a partir de una excepcin java.sql.Exception que se genera al utilizar un Controlador IBM DB2 para JDBC y SQLJ. getThrowable Formato:
public Throwable getThrowable()

Devuelve un objeto java.lang.Throwable a partir de una excepcin java.sql.Exception que se produce al utilizar un Controlador IBM DB2 para JDBC y SQLJ. printTrace Formato:
static public void printTrace(java.io.PrintWriter grabadorImpresin, String cabecera)

Imprime informacin de diagnstico despus de emitirse una excepcin java.sql.Exception al utilizar un Controlador IBM DB2 para JDBC y SQLJ. Descripciones de parmetros:

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

341

grabadorImpresin Es el destino de la informacin de diagnstico. cabecera Informacin definida por el usuario que se imprime al comienzo de la salida. Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Manejo de avisos de SQL en una aplicacin SQLJ en la pgina 150

Clase DB2ExceptionFormatter
La clase com.ibm.db2.jcc.DB2ExceptionFormatter contiene mtodos para imprimir informacin de diagnstico en una corriente de datos. Mtodos de DB2ExceptionFormatter: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. printTrace Formatos:
static public void printTrace(java.sql.SQLException sqlException, java.io.PrintWriter grabadorImpresin, String cabecera) static public void printTrace(DB2Sqlca sqlca, java.io.PrintWriter grabadorImpresin, String cabecera) static public void printTrace(java.lang.Throwable throwable, java.io.PrintWriter grabadorImpresin, String cabecera)

Imprime informacin de diagnstico despus de emitirse una excepcin. Descripciones de parmetros: sqlException|sqlca|throwable La excepcin que se ha emitido durante una operacin anterior de JDBC o Java. grabadorImpresin Es el destino de la informacin de diagnstico. cabecera Informacin definida por el usuario que se imprime al comienzo de la salida. Conceptos relacionados: v Ejemplo de un programa de rastreo bajo el controlador IBM DB2 para JDBC y SQLJ en la pgina 199

342

Desarrollo de aplicaciones Java

Clase DB2JCCPlugin
La clase com.ibm.db2.jcc.DB2JCCPlugin es una clase abstracta que define mtodos que se pueden implementar para proporcionar soporte de plugin de DB2 Database para Linux, UNIX y Windows. Esta clase solo atae al DB2 Database para Linux, UNIX y Windows. Mtodos de DB2JCCPlugin: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. getTicket Formato:
public abstract byte[] getTicket(String usuario, String contrasea, byte[] smbolodevuelto) throws org.ietf.jgss.GSSException

Recupera un certificado Kerberos para un usuario. Descripciones de parmetros: usuario ID de usuario para el que debe recuperarse el certificado Kerberos. contrasea La contrasea para usuario. smbolodevuelto Conceptos relacionados: v Soporte de plugin de seguridad del Controlador IBM DB2 para JDBC y SQLJ en la pgina 163

Clase DB2PooledConnection
La clase com.ibm.db2.jcc.DB2PooledConnection ofrece mtodos que puede utilizar un servidor de aplicaciones para cambiar de usuarios en una conexin fiable preexistente. Mtodos DB2PooledConnection: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. getDB2Connection (reutilizacin fiable) Formatos:
public DB2Connection getDB2Connection(byte[] cookie, String usuario, String contrasea, String registroUsuario, byte[] smboloSeguridadUsuario, String usuarioOriginal, java.util.Properties propiedades) throws java.sql.SQLException

Cambia el usuario que est asociado a una conexin fiable sin autentificacin. Descripciones de parmetros:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

343

cookie Una cookie exclusiva que genera el controlador JDBC para la instancia de Connection. Slo el servidor de aplicaciones y el controlador JDBC subyacente que estableci la conexin fiable inicial conocen la cookie. El servidor de aplicaciones pasa la cookie que cre el controlador cuando se cre la instancia de la conexin agrupada. El controlador JDBC comprueba que la cookie suministrada coincida con la cookie de la conexin fsica fiable subyacente para asegurarse de que la peticin se origin desde el servidor de aplicaciones que estableci la conexin fsica fiable. Si las cookies difieren, la conexin puede quedar disponible, con propiedades diferentes, para que un usuario nuevo la utilice inmediatamente. usuario La identidad cliente utilizada por DB2 para establecer el ID de autorizacin para el servidor de bases de datos. Si el servidor de aplicaciones no autentific al usuario, el primero debe pasar una identidad de usuario que represente a un usuario de DB2 sin autentificar. contrasea La contrasea para el usuario. registroNombreUsuario Nombre que identifica un servicio de correlacin que correlaciona un ID de usuario de estacin de trabajo con un ID de z/OS RACF. La correlacin de identidades empresariales (EIM) de servicios de seguridad integrados es un ejemplo de servicios de correlacin. Un plugin define el servicio de correlacin. Los proveedores de plugins definen los valores vlidos de registroNombreUsuario. Si registroNombreUsuario es nulo, la conexin no utiliza un servicio de correlacin. smboloSeguridadUsuario Los smbolos de seguridad del cliente. Este valor se rastrea como parte de DB2 para datos contables de z/OS. El servidor de aplicaciones describe el contenido de smboloSeguridadUsuario y el servidor DB2 lo interpreta como smbolo de seguridad del servidor de aplicaciones. usuarioOriginal La identidad cliente que enva la peticin original al servidor de aplicaciones. usuarioOriginal se incluye en DB2 para los datos contables de z/OS como el ID de usuario original utilizado por el servidor de aplicaciones. propiedades Propiedades de la conexin reutilizada. Estas propiedades alteran temporalmente las propiedades ya definidas en la instancia de DB2PooledConnection. getDB2Connection (reutilizacin no fiable con reautentificacin) Formatos:
public DB2Connection getDB2Connection( String usuario, String contrasea, java.util.Properties propiedades) throws java.sql.SQLException public DB2Connection getDB2Connection( org.ietf.jgss.GSSCredential credencialGss java.util.Properties propiedades) throws java.sql.SQLException

Cambia el usuario que est asociado a una conexin no fiable con autentificacin.

344

Desarrollo de aplicaciones Java

El primer formato de getDB2Connection ofrece un ID de usuario y una contrasea. El segundo formato de getDB2Connection es para conexiones que utilizan la seguridad Kerberos. Descripciones de parmetros: usuario El ID de usuario utilizado por DB2 para establecer el ID de autorizacin para el servidor de bases de datos. usuario y contrasea slo se pueden especificar bajo estas circunstancias: v Cuando la agrupacin de conexiones se configura con el servidor de aplicaciones WebSphere, la propiedad de autentificacin de referencias res-auth se establece en 1 (true). v Cuando la propiedad DB2ConnectionPoolDataSource.connectionReuseProtocol no se establece en DIRTY_CONNECTION_REUSE. contrasea La contrasea para usuario. propiedades Propiedades de la conexin reutilizada. Estas propiedades alteran temporalmente las propiedades ya definidas en la instancia de DB2PooledConnection. getDB2Connection (reutilizacin no fiable sin reautentificacin) Formatos:
public java.sql.Connection getDB2Connection( java.util.Properties propiedades) throws java.sql.SQLException public DB2Connection getDB2Connection(int protocoloReutilizacinConexin, java.util.Properties propiedades) throws java.sql.SQLException

Reutiliza una conexin no fiable, sin reautentificacin. El segundo formato de getDB2Connection permite especificar si restablecer las propiedades de conexin cuando se reutilice la conexin. Descripciones de parmetros: propiedades Propiedades de la conexin reutilizada. Estas propiedades alteran temporalmente las propiedades ya definidas en la instancia de DB2PooledConnection. protocoloReutilizacinConexin Especifica si se restablece el estado de la conexin cuando una conexin se reutiliza desde una agrupacin de conexiones. Este valor altera temporalmente el valor de la propiedad connectionReuseProtocol. Los valores posibles son: DIRTY_CONNECTION_REUSE El estado de la conexin no se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial no se restablecen y las tablas temporales no se eliminan. Los valores de la propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

345

de aplicaciones al controlador JDBC para la reinicializacin. No se cambian las propiedades que no se pasen mediante el mdulo de agrupaciones. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval v databaseName v driverType v pkList v planName v portNumber v kerberosServerPrincipal v password v readOnly v securityMechanism v serverName v user RESET_CONNECTIONS_ON_REUSE El estado de la conexin se restablece cuando se reutiliza Connection desde una agrupacin de conexiones. Los valores del registro especial se restablecen y las tablas temporales se eliminan. Los valores de la propiedad especificada (derivados de una referencia de recursos del servidor de aplicaciones WebSphere o DataSource de una aplicacin) pueden pasar mediante el mdulo de aplicaciones al controlador JDBC para la reinicializacin. Todas las propiedades transitorias estndar de JDBC, como el nivel de aislamiento, la modalidad Auto-commit y la modalidad de slo lectura se restablecen a sus valores por omisin de JDBC. Estas propiedades no cambian: v accountingInterval v databaseName v driverType v pkList v planName v portNumber v kerberosServerPrincipal v password v readOnly v securityMechanism v serverName v user recycleDB2Connection Formato:
public void recycleDB2Connection() throws SQLException

Notifica la conexin fsica subyacente de un evento de reciclaje. Los objetos Statement de connection se cierran o se reciclan para reutilizarlos, en funcin de los valores de configuracin de la agrupacin. Este mtodo se utiliza bajo un modelo de agrupacin donde el mdulo de agrupacin proporciona el derivador de conexin lgico. Conceptos relacionados:

346

Desarrollo de aplicaciones Java

v Captulo 9, Soporte de agrupaciones de conexiones JDBC y SQLJ, en la pgina 233 Informacin relacionada: v Clase DB2ConnectionPoolDataSource en la pgina 339

Interfaz DB2PreparedStatement
La interfaz com.ibm.db2.jcc.DB2PreparedStatement ampla las interfaces com.ibm.db2.jcc.DB2Statement y java.sql.PreparedStatement. Mtodos DB2PreparedStatement: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. executeDB2QueryBatch Formato:
public void executeDB2QueryBatch() throws java.sql.SQLException

Ejecuta un lote de sentencias que contiene consultas con parmetros. Tareas relacionadas: v Realizacin de consultas por lotes en aplicaciones JDBC en la pgina 54

Interfaz DB2RowID
La interfaz com.ibm.db2.jcc.DB2RowID se utiliza para declarar objetos Java a fin de utilizarlos con el tipo de datos ROWID de DB2. Mtodos de DB2RowID: El mtodo siguiente slo se define para el Controlador IBM DB2 para JDBC y SQLJ. getBytes Formato:
public byte[] getBytes()

Convierte un objeto com.ibm.jcc.DB2RowID a bytes. Conceptos relacionados: v Uso de valores ROWID en JDBC con el controlador IBM DB2 para JDBC y SQLJ en la pgina 67 v Uso de valores ROWID en SQLJ con el controlador IBM DB2 para JDBC y SQLJ en la pgina 141

Clase DB2SimpleDataSource
La clase com.ibm.db2.jcc.DB2SimpleDataSource ampla la clase DataBaseDataSource. Un objeto DataBaseDataSource no da soporte a la agrupacin de conexiones ni a las transacciones distribuidas. Contiene todas las propiedades y los mtodos contenidos por la clase DB2BaseDataSource. Adems, DB2SimpleDataSource contiene las siguientes propiedades especficas del Controlador IBM DB2 para JDBC y SQLJ.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

347

Propiedades de DB2SimpleDataSource: La propiedad siguiente se define solamente para el Controlador IBM DB2 para JDBC y SQLJ. Consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ para obtener una explicacin de esta propiedad. String com.ibm.db2.jcc.DB2SimpleDataSource.password Mtodos de DB2SimpleDataSource: El mtodo siguiente slo se define para el Controlador IBM DB2 para JDBC y SQLJ. setPassword Formato:
public void setPassword(String contrasea)

Establece la contrasea para el objeto DB2SimpleDataSource. No existe un mtodo correspondiente para getPassword. Por tanto, la contrasea no se puede cifrar, pues no hay forma de recuperar la contrasea para poder descifrarla. Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Creacin y despliegue de objetos DataSource en la pgina 37

Clase DB2Sqlca
La clase com.ibm.db2.jcc.DB2Sqlca es una encapsulacin de la SQLCA de DB2. . Mtodos de DB2Sqlca: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. getMessage Formato:
public abstract String getMessage()

Devuelve el texto de mensajes de error. getSqlCode Formato:


public abstract int getSqlCode()

Devuelve el valor de un cdigo de error de SQL. getSqlErrd Formato:


public abstract int[] getSqlErrd()

Devuelve una matriz, cuyos elementos contienen un SQLERRD de SQLCA. getSqlErrmc Formato:
public abstract String getSqlErrmc()

348

Desarrollo de aplicaciones Java

Devuelve una cadena de caracteres que contiene los valores SQLERRMC de SQLCA, delimitados por espacios. getSqlErrmcTokens Formato:
public abstract String[] getSqlErrmcTokens()

Devuelve una matriz, cuyos elementos contienen un smbolo SQLERRMC de SQLCA. getSqlErrd Formato:
public abstract int[] getSqlErrd()

Devuelve una matriz, cuyos elementos contienen un valor SQLERRP de SQLCA. getSqlErrp Formato:
public abstract String getSqlErrp()

Devuelve el valor SQLERRP de SQLCA. getSqlState Formato:


public abstract String getSqlState()

Devuelve el valor SQLSTATE de SQLCA. getSqlWarn Formato:


public abstract char[] getSqlWarn()

Devuelve una matriz, cuyos elementos contienen un valor SQLWARN de SQLCA. Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Manejo de avisos de SQL en una aplicacin SQLJ en la pgina 150

Interfaz DB2Statement
La interfaz com.ibm.db2.jcc.DB2Statement ampla la interfaz java.sql.Statement. Mtodos DB2Statement: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. getDB2ClientProgramId Formato:
public String getDB2ClientProgramId() throws java.sql.SQLException

Devuelve el identificador del programa cliente definido por el usuario para la conexin, que se almacena en el servidor de bases de datos.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

349

setDB2ClientProgramId Formato:
public abstract void setDB2ClientProgramId(String ID-programa) throws java.sql.SQLException

Define un identificador de programa definido por el usuario para la conexin, en los servidores DB2 para z/OS. Ese identificador de programa es una serie de 80 bytes que se utiliza para identificar al llamador. El servidor DB2 para z/OS coloca la serie en los registros de rastreo IFCID 316 junto con los dems datos estadsticos, de modo que se pueda identificar el programa que est asociado con una sentencia de SQL determinada. Informacin relacionada: v Interfaz DB2PreparedStatement en la pgina 347

Interfaz DB2SystemMonitor
La interfaz com.ibm.db2.jcc.DB2SystemMonitor se utiliza para recoger datos de supervisin del sistema correspondientes a una conexin. Cada conexin puede tener una sola instancia de DB2SystemMonitor. Campos de DB2SystemMonitor: Los campos siguientes se definen solamente para el Controlador IBM DB2 para JDBC y SQLJ. public final static int RESET_TIMES public final static int ACCUMULATE_TIMES Estos valores son argumentos del mtodo DB2SystemMonitor.start. RESET_TIMES inicializa a cero los contadores de tiempo antes del comienzo de la supervisin. ACCUMULATE_TIMES no pone a cero los contadores de tiempo. Mtodos de DB2SystemMonitor: Los mtodos siguientes slo se definen para el Controlador IBM DB2 para JDBC y SQLJ. enable Formato:
public void enable(boolean on) throws java.sql.SQLException

Habilita el supervisor del sistema que est asociado a una conexin. Este mtodo no se puede invocar durante la supervisin. Todos los tiempo se inicializan cuando se invoca enable. getApplicationTimeMillis Formato:
public long getApplicationTimeMillis() throws java.sql.SQLException

Devuelve la suma de los tiempos transcurridos correspondientes a la aplicacin, el controlador JDBC, la E/S de red y el servidor DB2. El tiempo est expresado en milisegundos.

350

Desarrollo de aplicaciones Java

Un intervalo de tiempo transcurrido supervisado es la diferencia, en milisegundos, entre estos puntos en el proceso del controlador JDBC: Inicio de intervalo Es el momento en el que se invoca start. Fin de intervalo Es el momento en el que se invoca stop. getApplicationTimeMillis devuelve un 0 si la supervisin del sistema est inhabilitada. Si se invoca este mtodo sin invocar primero stop, se produce una excepcin SQLException. getCoreDriverTimeMicros Formato:
public long getCoreDriverTimeMicros() throws java.sql.SQLException

Devuelve la suma de los tiempos transcurridos de API supervisada que se recogieron mientras la supervisin del sistema estaba habilitada. El tiempo est expresado en microsegundos. Una API supervisada es un mtodo de controlador JDBC para la cual se obtiene el tiempo de proceso. En general, los tiempos transcurridos slo se supervisan para las API que puedan producir interaccin con la E/S de red o servidor DB2. Por ejemplo, los mtodos PreparedStatement.setXXX y y ResultSet.getXXX no se supervisan. El tiempo transcurrido de las API supervisadas incluye el tiempo total que se invierte en el controlador para una llamada de mtodo. Este tiempo incluye cualquier tiempo de E/S de red y tiempo transcurrido de servidor DB2. Un intervalo de tiempo transcurrido de API supervisada es la diferencia, en microsegundos, entre estos puntos en el proceso del controlador JDBC: Inicio de intervalo Es el momento en el que la aplicacin llama a la API supervisada. Fin de intervalo Inmediatamente antes de este momento la API supervisada devuelve el control a la aplicacin. getCoreDriverTimeMicros devuelve un 0 si la supervisin del sistema est inhabilitada. Si se invoca este mtodo sin primero llamar al mtodo stop, o si se invoca este mtodo cuando la JVM subyacente no da soporte a la notificacin de tiempos en microsegundos, se produce una excepcin SQLException. getNetworkIOTimeMicros Formato:
public long getNetworkIOTimeMicros() throws java.sql.SQLException

Devuelve la suma de los tiempos transcurridos de E/S de red que se recogieron mientras la supervisin del sistema estaba habilitada. El tiempo est expresado en microsegundos. El tiempo transcurrido de E/S de red incluye el tiempo que se invierte en escribir y leer datos de DRDA procedentes de corrientes de E/S de la red. Un
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

351

intervalo de tiempo transcurrido de E/S de red es el intervalo de tiempo que se invierte en realizar las operaciones siguientes en el controlador JDBC: v Emitir un mandato de TCP/IP para enviar un mensaje de DRDA al servidor DB2. Este intervalo de tiempo es la diferencia, en microsegundos, entre los momentos inmediatamente anterior y posterior a la realizacin de una escritura y vaciado en la corriente de E/S de la red. v Emitir un mandato de TCP/IP para recibir mensajes de respuesta de DRDA procedentes del servidor DB2. Este intervalo de tiempo es la diferencia, en microsegundos, entre los momentos inmediatamente anterior y posterior a la realizacin de una lectura en la corriente de E/S de la red. Los intervalos de tiempo de E/S de red se recogen para todas las operaciones de envo y recepcin, incluido el envo de mensajes para operaciones de confirmacin y retrotraccin. El tiempo invertido en la espera a causa de operaciones de E/S de red puede verse afectado por retrasos en la CPU que despacha peticiones de SQL de baja prioridad en el servidor DB2. Los intervalos de tiempo de E/S de red incluyen el tiempo transcurrido del servidor DB2. getNetworkIOTimeMicros devuelve un 0 si la supervisin del sistema est inhabilitada. Si se invoca este mtodo sin primero llamar al mtodo stop, o si se invoca este mtodo cuando la JVM subyacente no da soporte a la notificacin de tiempos en microsegundos, se produce una excepcin SQLException. getServerTimeMicros Formato:
public long getServerTimeMicros() throws java.sql.SQLException

Devuelve la suma de todos los tiempos transcurridos notificados del servidor DB2 que se recopilaron mientras la supervisin del sistema estaba habilitada. El tiempo est expresado en microsegundos. El servidor DB2 notifica tiempos transcurridos cuando se dan estas condiciones: v El servidor da soporte a la devolucin de datos sobre tiempos transcurridos al cliente. Actualmente, los servidores DB2 Database para Linux, UNIX y Windows no admiten esta funcin. v El servidor efecta operaciones que se pueden supervisar. Por ejemplo, el tiempo transcurrido del servidor DB2 no se devuelve para operaciones de confirmacin ni retrotraccin. El tiempo transcurrido del servidor DB2 se define como el tiempo transcurrido que se invierte en analizar la corriente de datos de la peticin, procesar el mandato y generar la corriente de respuesta en el servidor. El tiempo de red necesario para recibir o enviar la corriente de datos no se incluye. Un intervalo de tiempo transcurrido de servidor DB2 es la diferencia, en microsegundos, entre estos puntos en el proceso del servidor: Inicio de intervalo Es el momento en el que el sistema operativo asigna a DB2 el proceso de un mensaje de TCP/IP que se ha recibido del controlador JDBC.

352

Desarrollo de aplicaciones Java

Fin de intervalo Es el momento en el que DB2 est preparado para emitir el mandato de TCP/IP para devolver el mensaje de respuesta al cliente. getServerTimeMicros devuelve un 0 si la supervisin del sistema est inhabilitada. Si se invoca este mtodo sin invocar primero stop, se produce una excepcin SQLException. start Formato:
public void start (int lapMode) throws java.sql.SQLException

Si el supervisor del sistema est habilitado, start inicia la recogida de datos de supervisin del sistema para una conexin. Los valores vlidos de lapMode son RESET_TIMES o ACCUMULATE_TIMES. La invocacin de este mtodo cuando la supervisin del sistema est inhabilitada no produce ningn efecto. La invocacin de este mtodo ms de una vez sin que medie una llamada a stop produce una excepcin SQLException. stop Formato:
public void stop() throws java.sql.SQLException

Si el supervisor del sistema est habilitado, stop finaliza la recogida de datos de supervisin del sistema para una conexin. Una vez detenida la supervisin, se pueden obtener los tiempos supervisados utilizando los mtodos getXXX de DB2SystemMonitor. La invocacin de este mtodo cuando la supervisin del sistema est inhabilitada no produce ningn efecto. La invocacin de este mtodo sin primero invocar start, o la invocacin repetida de este mtodo sin que medie una llamada a start produce una excepcin SQLException. Tareas relacionadas: v Supervisin del sistema del controlador IBM DB2 para JDBC y SQLJ en la pgina 203

Clase DB2XADataSource
La clase com.ibm.db2.jcc.DB2XADataSource ampla la clase com.ibm.db2.jcc.DB2BaseDataSource e implementa las interfaces javax.sql.XADataSource, java.io.Serializable y javax.naming.Referenceable. DB2XADataSource es una fbrica para los objetos XADataSource. Un objeto que implementa esta interfaz se registra con un servicio de asignacin de nombres que se basa en Java Naming and Directory Interface (JNDI). Mtodos DB2XADataSource: getDB2TrustedXAConnection Formatos:
public Object[] getDB2TrustedXAConnection(String usuario, String contrasea, java.util.Properties propiedades)
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

353

throws java.sql.SQLException public Object[] getDB2TrustedXAConnection( java.util.Properties propiedades) throws java.sql.SQLException public Object[] getDB2TrustedXAConnection( org.ietf.jgss.GSSCredential credencialGss, java.util.Properties propiedades) throws java.sql.SQLException

Un servidor de aplicaciones que utiliza un ID de autorizacin del sistema utiliza este mtodo para establecer una conexin fiable. Los elementos siguientes se devuelven en Object[]: v El primer elemento es una instancia de DB2TrustedXAConnection. v El segundo elemento es una cookie exclusiva para la instancia de conexin generada de XA. El primer formato getDB2TrustedXAConnection ofrece un ID de usuario y una contrasea. El segundo formato de getDB2TrustedXAConnection utiliza el ID de usuario y la contrasea del objeto DB2XADataSource. El tercer formato de getDB2TrustedXAConnection es para conexiones que utilizan la seguridad Kerberos. Descripciones de parmetros: usuario El ID de autorizacin que se utiliza para establecer la conexin fiable. contrasea La contrasea para el ID de autorizacin que se utiliza para establecer la conexin fiable. credencialGss Si la fuente de datos utiliza la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. propiedades Propiedades de la conexin. getDB2TrustedPooledConnection Formato:
public Object[] getDB2TrustedPooledConnection(java.util.Properties propiedades) throws java.sql.SQLException

Un servidor de aplicaciones que utiliza un ID de autorizacin del sistema utiliza este mtodo para establecer una conexin fiable, utilizando el ID de usuario y la contrasea para el objeto DB2XADataSource. Los elementos siguientes se devuelven en Object[]: v El primer elemento es una instancia fiable de DB2TrustedPooledConnection. v El segundo elemento es una cookie exclusiva para la instancia de conexin agrupada que se ha generado. Descripciones de parmetros: propiedades Propiedades de la conexin. getDB2XAConnection Formatos:
public DB2XAConnection getDB2XAConnection(String usuario, String contrasea, java.util.Properties propiedades)

354

Desarrollo de aplicaciones Java

throws java.sql.SQLException public DB2XAConnection getDB2XAConnection( org.ietf.jgss.GSSCredential credencialGss, java.util.Properties propiedades) throws java.sql.SQLException

Establece la conexin no fiable inicial en un entorno de agrupacin heterogneo. El primer formato de getDB2PooledConnection ofrece un ID de usuario y una contrasea. El segundo formato de getDB2XAConnection es para conexiones que utilizan la seguridad Kerberos. Descripciones de parmetros: usuario ID de autorizacin que se utiliza para establecer la conexin. contrasea Contrasea del ID de autorizacin que se utiliza para establecer la conexin. credencialGss Si la fuente de datos utiliza la seguridad Kerberos, especifica una credencial delegada que se pasa desde otro principal. propiedades Propiedades de la conexin. Conceptos relacionados: v Ejemplo de una transaccin distribuida que utiliza mtodos de JTA en la pgina 225 v Gestin de transacciones Java en la pgina 224 Tareas relacionadas: v Creacin y despliegue de objetos DataSource en la pgina 37

Interfaz DB2Xml
La interfaz com.ibm.db2.jcc.DB2Xml se utiliza para declarar objetos Java a fin de utilizarlos con el tipo de datos XML de DB2. Mtodos DB2Xml: El mtodo siguiente slo se define para el Controlador IBM DB2 para JDBC y SQLJ. close Formato:
public void close() throws SQLException

Libera los recursos que estn asociados con un objeto com.ibm.jcc.DB2Xml. getDB2AsciiStream Formato:
public java.io.InputStream getDB2AsciiStream() throws SQLException

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

355

Recupera datos de un objeto DB2Xml, y convierte los datos en codificacin US-ASCII. getDB2BinaryStream Formato:
public java.io.InputStream getDB2BinaryStream() throws SQLException

Recupera datos de un objeto DB2Xml como serie binaria codificada con UTF-8. getDB2Bytes Formato:
public byte[] getDB2Bytes() throws SQLException

Recupera datos de un objeto DB2Xml como una matriz de bytes codificada con UTF-8. getDB2CharacterStream Formato:
public java.io.Reader getDB2CharacterStream() throws SQLException

Recupera datos de un objeto DB2Xml como un objeto java.io.Reader. getDB2String Formato:


public String getDB2String() throws SQLException

Recupera datos de un objeto DB2Xml como valor de String. getDB2XmlAsciiStream Formato:


public InputStream getDB2XmlAsciiStream() throws SQLException

Recupera datos de un objeto DB2Xml, convierte los datos a codificacin US-ASCII e incorpora una declaracin XML con una especificacin de codificacin para US-ASCII en los datos devueltos. getDB2XmlBinaryStream Formato:
public java.io.InputStream getDB2XmlBinaryStream(String CodificacinDestino) throws SQLException

Recupera datos de un objeto DB2Xml como serie binaria, convierte los datos a CodificacinDestino e incorpora una declaracin XML con una especificacin de codificacin para CodificacinDestino en los datos devueltos. Parmetro: CodificacinDestino Nombre de codificacin vlido que aparece en el registro de conjuntos de caracteres IANA. Los nombres de codificacin que soporta el servidor DB2 aparecen en las "Asignaciones de CCSID para los nombres de codificaciones de los datos de salida XML serializados". getDB2XmlBytes Formato:

356

Desarrollo de aplicaciones Java

public byte[] getDB2XmlBytes(String CodificacinDestino) throws SQLException

Recupera datos de un objeto DB2Xml como matriz binaria, convierte los datos a CodificacinDestino e incorpora una declaracin XML con una especificacin de codificacin para CodificacinDestino en los datos devueltos. Parmetro: CodificacinDestino Nombre de codificacin vlido que aparece en el registro de conjuntos de caracteres IANA. Los nombres de codificacin que soporta el servidor DB2 aparecen en las "Asignaciones de CCSID para los nombres de codificaciones de los datos de salida XML serializados". getDB2XmlCharacterStream Formato:
public java.io.Reader getDB2XmlCharacterStream() throws SQLException

Recupera datos de un objeto DB2Xml como objeto java.io.Reader, convierte los datos en codificacin ISO-10646-UCS-2 e incorpora una declaracin XML con una especificacin de codificacin para ISO-10646-UCS-2 en los datos devueltos. getDB2XmlString Formato:
public String getDB2XmlString() throws SQLException

Recupera datos de un objeto DB2Xml como objeto String, convierte los datos en codificacin ISO-10646-UCS-2 e incorpora una declaracin XML con una especificacin de codificacin para ISO-10646-UCS-2 en los datos devueltos. isDB2XmlClosed Formato:
public boolean isDB2XmlClosed() throws SQLException

Indica si se ha cerrado un objeto com.ibm.jcc.DB2Xml. Conceptos relacionados: v Actualizacin de columnas XML en aplicaciones JDBC en la pgina 76 v Actualizaciones de columnas XML en aplicaciones SQLJ en la pgina 145 v Recuperacin de datos XML en aplicaciones JDBC en la pgina 77 v Recuperacin de datos XML en aplicaciones SQLJ en la pgina 147 Informacin relacionada: v Mappings of CCSIDs to encoding names for serialized XML output data en XML Guide v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

357

Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2
El controlador DB2 JDBC Tipo para Linux, UNIX y Windows (controlador DB2 JDBC Tipo 2) ha quedado obsoleto. Esta informacin se ofrece para ayudarle a trasladar sus aplicaciones al Controlador IBM DB2 para JDBC y SQLJ. Mtodos soportados: Para una comparacin de mtodos que los controladores JDBC soportan, consulte Soporte de controlador para las API de JDBC. Soporte para conjuntos de resultados desplazables y actualizables: El Controlador IBM DB2 para JDBC y SQLJ soporta conjuntos de resultados desplazables y actualizables. El Controlador JDBC de DB2 de tipo 2 soporta conjuntos de resultados desplazables, pero no conjuntos de resultados actualizables. Diferencia en la sintaxis del URL: La sintaxis del parmetro url en el mtodo DriverManager.getConnection es diferente para cada controlador. Consulte los temas siguientes para obtener ms informacin: v Conectar a una fuente de datos utilizando la interfaz DriverManager con el controlador de IBM DB2 para JDBC y SQLJ v Diferencia en los cdigos de error y en los SQLSTATE devueltos para errores de controlador: A diferencia de los dems controladores, el Controlador IBM DB2 para JDBC y SQLJ no utiliza cdigos de SQL (SQLCODE) ni estados de SQL (SQLSTATE) existentes para errores internos, . Consulte el tema Cdigos de error emitidos por el controlador de IBM DB2 para JDBC y SQLJ y SQLSTATE emitidos por el controlador de IBM DB2 para JDBC y SQLJ. El controlador JDBC/SQLJ para z/OS devuelve ODBC SQLSTATE cuando se producen errores internos. Volumen devuelto de texto de mensajes de error: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando ejecuta SQLException.getMessage(), no se devuelve texto de mensajes con formato a menos que la propiedad retrieveMessagesFromServerOnGetMessage tenga el valor true. Con el Controlador JDBC de DB2 de tipo 2, cuando ejecuta SQLException.getMessage(), se devuelve texto de mensajes con formato. Mecanismos de seguridad: Los controladores JDBC tienen diversos mecanismos de seguridad.

358

Desarrollo de aplicaciones Java

Para obtener informacin sobre los mecanismos de seguridad del Controlador IBM DB2 para JDBC y SQLJ, consulte el tema Seguridad con el controlador de IBM DB2 para JDBC y SQLJ. Para obtener informacin sobre los mecanismos de seguridad del Controlador JDBC de DB2 de tipo 2, consulte el tema Seguridad con el Controlador JDBC de DB2 de tipo 2. Soporte para conexiones de slo lectura: Con el Controlador IBM DB2 para JDBC y SQLJ, puede hacer que una conexin sea de slo lectura mediante la propiedad readOnly de un objeto Connection o DataSource. El controlador JDBC de DB2 de tipo 2 utiliza el valor Connection.setReadOnly cuando determina si debe hacer que una conexin sea de slo lectura. No obstante, el hecho de establecer Connection.setReadOnly(true) no garantiza que la conexin sea de slo lectura. Resultados devueltos por ResultSet.getString para una columna BIT DATA: El Controlador IBM DB2 para JDBC y SQLJ devuelve datos mediante una llamada ResultSet.getString para una columna CHAR FOR BIT DATA o VARCHAR FOR BIT DATA en forma de serie hexadecimal en minsculas. El controlador JDBC de DB2 de tipo 2 devuelve los datos en forma de serie hexadecimal en maysculas. Resultado de una llamada executeUpdate que no afecta a ninguna fila: El Controlador IBM DB2 para JDBC y SQLJ genera un SQLWarning cuando una llamada executeUpdate no afecta a ninguna fila. El controlador JDBC de DB2 de tipo 2 no genera un SQLWarning. Resultado de una llamada getDate o getTime para una columna TIMESTAMP: El Controlador IBM DB2 para JDBC y SQLJ no genera un SQLWarning cuando se efecta una llamada getDate o getTime para una columna TIMESTAMP. El controlador JDBC de DB2 de tipo 2 genera un SQLWarning cuando se realiza una llamada getDate o getTime para una columna TIMESTAMP. Emisin de una excepcin para PreparedStatement.setXXXStream con una discrepancia de longitud: Cuando se utilizan los mtodos PreparedStatement.setBinaryStream, PreparedStatement.setCharacterStream o PreparedStatement.setUnicodeStream, el valor del parmetro length debe coincidir con el nmero de bytes de la corriente de entrada. Si los nmeros de bytes no coinciden, el Controlador IBM DB2 para JDBC y SQLJ no emite una excepcin hasta que se ejecuta el mtodo PreparedStatement.executeUpdate posterior. Por lo tanto, para el Controlador IBM DB2 para JDBC y SQLJ se pueden enviar algunos datos al servidor cuando las longitudes no coinciden. El servidor trunca o rellena estos datos. La aplicacin
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

359

llamadora tiene que emitir una peticin de retrotraccin para deshacer las actualizaciones de base de datos que incluyen los datos truncados o rellenados. El controlador JDBC de DB2 de tipo 2 emite una excepcin despus de ejecutarse el mtodo PreparedStatement.setBinaryStream, PreparedStatement.setCharacterStream o PreparedStatement.setUnicodeStream. Correlaciones por omisin para PreparedStatement.setXXXStream: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando se utilizan los mtodos PreparedStatement.setBinaryStream, PreparedStatement.setCharacterStream o PreparedStatement.setUnicodeStream, y no se dispone de informacin sobre el tipo de datos de la columna de destino, los datos de entrada se correlacionan con un tipo de datos BLOB o CLOB. Para el controlador JDBC de DB2 de tipo 2, los datos de entrada se correlacionan con un tipo de datos VARCHAR FOR BIT DATA o VARCHAR. Cmo se realiza la conversin de caracteres: Cuando se transfieren datos de tipo carcter entre un cliente y un servidor, los datos se tienen que convertir a un formato que el receptor pueda procesar. Para el Controlador IBM DB2 para JDBC y SQLJ, los datos de tipo carcter que se envan desde el servidor de bases de datos al cliente se convierten utilizando conversores de caracteres incorporados en Java. Las conversiones que soporta el Controlador IBM DB2 para JDBC y SQLJ se limitan a las soportadas por la implementacin de JRE subyacente. Un cliente del Controlador IBM DB2 para JDBC y SQLJ que utilice conectividad de tipo 4 enva datos al servidor de bases de datos como Unicode UTF-8. Para el controlador JDBC de DB2 de tipo 2, se pueden realizar conversiones de caracteres si el servidor DB2 las soporta. Esos controladores utilizan informacin CCSID del servidor de bases de datos si est disponible. Los controladores convierten los datos de parmetros de entrada al CCSID del servidor de bases de datos antes de enviar los datos. Si la informacin del CCSID de destino no est disponible, los controladores envan los datos con formato de Unicode UTF-8. Conversiones de tipos de datos implcitas o explcitas para parmetros de entrada: Si ejecuta un mtodo PreparedStatement.setXXX, y el tipo de datos resultante del mtodo setXXX no coincide con el tipo de datos de la columna de tabla a la que est asignado el valor de parmetro, el controlador devuelve un error a menos que se produzca una conversin del tipo de datos. Con el Controlador IBM DB2 para JDBC y SQLJ, se produce implcitamente una conversin al tipo de datos correcto de SQL si se conoce el tipo de datos de destino y las propiedades de conexin deferPrepares y sendDataAsIs estn establecidas en false. En este caso, los valores implcitos alteran temporalmente los posibles valores explcitos de la llamada setXXX. Si la propiedad de conexin deferPrepares

360

Desarrollo de aplicaciones Java

o sendDataAsIs se establece en true, debe utilizar el mtodo PreparedStatement.setObject para convertir el parmetro al tipo de datos correcto de SQL. Para el Controlador JDBC de DB2 de tipo 2, si el tipo de datos de un parmetro no coincide con su tipo de datos de SQL por omisin, debe utilizar el mtodo PreparedStatement.setObject para convertir el parmetro al tipo de datos correcto de SQL. Soporte para las conversiones del tipo de datos String a BINARY para parmetros de entrada: El Controlador IBM DB2 para JDBC y SQLJ no da soporte a las llamadas PreparedStatement.setObject del formato siguiente cuando x es un objeto de tipo String:
setObject(ndiceParmetros, x, java.sqlTypes.BINARY)

El controlador JDBC de DB2 de tipo 2 soporta llamadas de este tipo. El controlador interpreta el valor de x como una serie de caracteres hexadecimal. Resultado de PreparedStatement.setObject cuando existe una discrepancia de escala decimal: Con el Controlador IBM DB2 para JDBC y SQLJ, si invoca PreparedStatement.setObject con un parmetro de entrada decimal y la escala del parmetro de entrada es mayor que la escala de la columna de destino, el controlador trunca los dgitos de cola del valor de entrada antes de asignar el valor a la columna. El controlador JDBC de DB2 de tipo 2 redondea los dgitos de cola del valor de entrada antes de asignar el valor a la columna. Rango vlido para el parmetro de escala ResultSet.getBigDecimal: El formato obsoleto de ResultSet.getBigDecimal tiene un parmetro de escala como segundo parmetro. El Controlador IBM DB2 para JDBC y SQLJ permite un rango de 0 a 32 para el parmetro de escala. El controlador JDBC de DB2 de tipo 2 permite un rango de -1 a 32. Soporte de conversiones del tipo de datos java.lang.Character para los parmetros de entrada: Para el formato siguiente de PreparedStatement.setObject, el Controlador IBM DB2 para JDBC y SQLJ da soporte a las correlaciones de tipo de datos estndares de los objetos de Java a tipos de datos JDBC cuando convierte x a un tipo de datos JDBC:
setObject(ndiceParmetros, x)

El controlador JDBC de DB2 de tipo 2 soporta la correlacin no estndar de x de java.lang.Character con CHAR. Soporte de ResultSet.getBinaryStream para una columna de caracteres:

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

361

El Controlador IBM DB2 para JDBC y SQLJ soporta ResultSet.getBinaryStream con un argumento que representa una columna de caracteres nicamente si la columna tiene el atributo FOR BIT DATA. Para el controlador JDBC de DB2 de tipo 2, si el argumento ResultSet.getBinaryStream es una columna de caracteres, no es necesario que dicha columna tenga el atributo FOR BIT DATA. Datos devueltos por ResultSet.getBinaryStream para una columna binaria: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando se ejecuta ResultSet.getBinaryStream para una columna binaria, los datos devueltos estn en forma de pares de dgitos hexadecimales en minsculas. Con el controlador JDBC de DB2 de tipo 2, cuando se ejecuta ResultSet.getBinaryStream para una columna binaria, los datos devueltos estn en forma de pares de dgitos hexadecimales en maysculas. Resultado de utilizar setObject con un tipo de entrada Boolean y un tipo de destino CHAR: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando ejecuta PreparedStatement.setObject(ndiceParmetros,x,CHAR), y x es de tipo Boolean, se inserta el valor 0 o 1 en la columna de tabla. Con el controlador JDBC de DB2 de tipo 2, se inserta la serie false o true en la columna de la tabla. La longitud de la columna de tabla debe ser 5 como mnimo. Resultado de utilizar getBoolean para recuperar un valor de una columna de tipo CHAR: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando se ejecuta ResultSet.getBoolean o CallableStatement.getBoolean para recuperar un valor de tipo Boolean de una columna de tipo CHAR y la columna contiene el valor false o 0, se devuelve el valor false. Si la columna contiene cualquier otro valor, se devuelve true. Con el controlador JDBC de DB2 de tipo 2, cuando se ejecuta ResultSet.getBoolean o CallableStatement.getBoolean para recuperar un valor de tipo boolean de una columna CHAR y la columna contiene el valor true o 1, se devuelve el valor true. Si la columna contiene cualquier otro valor, se devuelve false. Resultado de ejecutar ResultSet.next() sobre un cursor cerrado: Con el Controlador IBM DB2 para JDBC y SQLJ, cuando ejecuta ResultSet.next() para un cursor cerrado, se emite una excepcin SQLException. Esto se ajusta a los estndares de JDBC. Con el controlador JDBC de DB2 de tipo 2, cuando se ejecuta ResultSet.next() sobre un cursor cerrado, se devuelve un valor de false y no se emite ninguna excepcin. Resultado de especificar argumentos nulos en llamadas DatabaseMetaData:

362

Desarrollo de aplicaciones Java

Con el Controlador IBM DB2 para JDBC y SQLJ, se puede especificar null para un argumento de una llamada al mtodo DatabaseMetaData nicamente si la especificacin de JDBC indica que se admite null. De lo contrario, se emite una excepcin. Con el controlador JDBC de DB2 de tipo 2, null significa que no se utiliza el argumento para restringir la bsqueda. Soporte de DATALINK: El Controlador IBM DB2 para JDBC y SQLJ no da soporte al tipo DATALINK de SQL. El controlador JDBC de DB2 de tipo 2 soporta el tipo DATALINK en llamadas a mtodos con los formatos siguientes: v PreparedStatement.setObject(ndiceParmetros, x, DB2Constants.DATALINK) v PreparedStatement.setObject(ndiceParmetros, x, java.sql.Types.DATALINK) (Java 1.4 o posterior) v PreparedStatement.setURL( ndiceParmetros, java.net.URL) v PreparedStatement.setObject( ndiceParmetros, java.net.URL) v PreparedStatement.setObject(ndiceParmetros, java.net.URL, java.sql.Types.DATALINK) (Java 1.4 o posterior) v ResultSet.getString para una columna DATALINK v ResultSet.getURL para una columna DATALINK Conversin de los argumentos de mtodos a maysculas: El Controlador IBM DB2 para JDBC y SQLJ no convierte a maysculas los argumentos de las llamadas de mtodo. El Controlador JDBC de DB2 de tipo 2 convierte a maysculas el argumento de una llamada Statement.setCursorName. Para impedir que el nombre de cursor se convierta a maysculas, encierre el nombre de cursor entre caracteres \". Por ejemplo:
Statement.setCursorName("\"micursor\"");

Soporte para clusulas de escape de indicacin horaria: El Controlador IBM DB2 para JDBC y SQLJ soporta el formato estndar de una clusula de escape para TIME:
{t hh:mm:ss}

Adems del formato estndar, el Controlador JDBC de DB2 de tipo 2 soporta el formato siguiente de una clusula de escape de TIME:
{ts hh:mm:ss}

Inclusin de una sentencia CALL en un lote de sentencias: El Controlador IBM DB2 para JDBC y SQLJ soporta el uso de sentencias CALL en un lote de sentencias. El controlador JDBC de DB2 de tipo 2 no soporta sentencias CALL en un lote de sentencias. Eliminacin de caracteres sobrantes en el texto de una sentencia de SQL:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

363

El Controlador IBM DB2 para JDBC y SQLJ no elimina los caracteres de espacio en blanco, como por ejemplo espacios, tabuladores y caracteres de salto de lnea, del texto de las sentencias de SQL antes de pasar el texto al servidor de bases de datos. El controlador JDBC de DB2 de tipo 2 elimina los caracteres de espacio en blanco del texto de las sentencias de SQL antes de pasar el texto al servidor de bases de datos. Resultado de ejecutar PreparedStatement.executeBatch: Cuando se ejecuta una sentencia PreparedStatement.executeBatch bajo el Controlador IBM DB2 para JDBC y SQLJ, el controlador devuelve una matriz de nmeros de actualizaciones int. Cada elemento de la matriz contiene el nmero de filas actualizadas por una sentencia del lote de sentencias. Cuando se ejecuta una sentencia PreparedStatement.executeBatch bajo el controlador JDBC de DB2 de tipo 2, el controlador no puede determinar las cuentas de actualizacin, de manera que devuelve -3 para cada cuenta de actualizacin. Soporte para SQL compuesto: El Controlador IBM DB2 para JDBC y SQLJ no soporta bloques de SQL compuesto. El cdigo SQL compuesto permite que se agrupen varias sentencias de SQL en un solo bloque ejecutable. Por ejemplo:
EXEC SQL BEGIN COMPOUND ATOMIC STATIC UPDATE ACCOUNTS SET ABALANCE = ABALANCE + :delta WHERE AID = :aid; UPDATE TELLERS SET TBALANCE = TBALANCE + :delta WHERE TID = :tid; INSERT INTO TELLERS (TID, BID, TBALANCE) VALUES (:i, :branch_id, 0); COMMIT; END COMPOUND;

El controlador JDBC de DB2 de tipo 2 da soporte a la ejecucin de bloques de SQL compuesto PreparedStatement.executeUpdate o Statement.executeUpdate. Resultado de no definir un parmetro en una actualizacin por lotes: El Controlador IBM DB2 para JDBC y SQLJ emite una excepcin despus de una llamada PreparedStatement.addBatch si un parmetro no est definido. El controlador JDBC de DB2 de tipo 2 emite una excepcin despus de una llamada PreparedStatement.executeBatch si un parmetro no est definido para cualquiera de las sentencias del lote. Posibilidad de llamar a procedimientos almacenados no catalogados: El Controlador IBM DB2 para JDBC y SQLJ no permite llamar a procedimientos almacenados que no estn definidos en el catlogo de DB2. El controlador JDBC de DB2 de tipo 2 permite llamar a procedimientos almacenados que no estn definidos en el catlogo de DB2.

364

Desarrollo de aplicaciones Java

Especificacin de tipos de datos para parmetros de procedimientos almacenados: Con el Controlador IBM DB2 para JDBC y SQLJ, si el servidor de bases de datos no da soporte a la ejecucin dinmica de la sentencia CALL, debe especificar parmetros de la sentencia CALL exactamente como estn especificados en la definicin de procedimiento almacenado. Por ejemplo, los servidores de bases de datos de DB2 para z/OS no dan soporte a la ejecucin dinmica de sentencias CALL. Supongamos que el primer parmetro de un procedimiento almacenado en un servidor DB2 para z/OS est definido de este modo en la sentencia CREATE PROCEDURE:
OUT PARM1 DECIMAL(3,0)

En la aplicacin solicitante, una sentencia como cs.registerOutParameter(1, Types.DECIMAL) no es correcta. Debe utilizar el formato del mtodo registerOutParameter que especifica la escala, as como el tipo de datos: cs.registerOutParameter (1, Types.DECIMAL, 0). El controlador JDBC de DB2 de tipo 2 no necesita que los tipos de datos del parmetro de una aplicacin solicitante coincidan con los tipos de datos de la sentencia CREATE PROCEDURE. Connection.Commit() y Connection.Rollback() cuando se habilita la modalidad Autocommit: En la versin actual de DB2, el Controlador IBM DB2 para JDBC y SQLJ no permite la ejecucin de Connection.Commit() ni Connection.Rollback() cuando se habilita la modalidad Autocommit. Este comportamiento cumple con la especificacin JDBC. Las versiones anteriores del Controlador IBM DB2 para JDBC y SQLJ, y los anteriores controladores JDBC permitan Connection.Commit() y Connection.Rollback() cuando se habilitaba la modalidad Autocommit. Conceptos relacionados: v Seguridad cuando se utiliza el controlador JDBC de DB2 de tipo 2 en la pgina 153 v Seguridad en el controlador IBM DB2 para JDBC y SQLJ en la pgina 154 v LOB en aplicaciones JDBC con el controlador IBM DB2 para JDBC y SQLJ en la pgina 63 Tareas relacionadas: v Conexin a una fuente de datos utilizando la interfaz DataSource en la pgina 33 v Conexin con una fuente de datos utilizando la interfaz DriverManager con el controlador IBM DB2 para JDBC y SQLJ en la pgina 30 v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Realizacin de actualizaciones por lotes en aplicaciones JDBC en la pgina 46 v Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC en la pgina 55 v Llamada a procedimientos almacenados mediante mtodos CallableStatement en la pgina 58

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

365

v Actualizacin de datos de tablas DB2 mediante el mtodo PreparedStatement.executeUpdate en la pgina 44 v Creacin y modificacin de objetos DB2 mediante el mtodo Statement.executeUpdate en la pgina 43 Informacin relacionada: v Soporte para las API de JDBC en la pgina 264 v Cdigos de error emitidos por el controlador IBM DB2 para JDBC y SQLJ en la pgina 368 v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243 v Propiedades del controlador IBM DB2 para JDBC y SQLJ en la pgina 249 v SQLSTATE emitidos por el controlador de IBM DB2 para JDBC y SQLJ en la pgina 369

Diferencias de SQLJ entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores DB2 JDBC
El controlador DB2 JDBC de tipo 2 para Linux, UNIX y Windows (Controlador DB2 JDBC de tipo 2) ha quedado obsoleto. Esta informacin se ofrece para ayudarle a trasladar sus aplicaciones al Controlador IBM DB2 para JDBC y SQLJ. El soporte de SQLJ en el Controlador IBM DB2 para JDBC y SQLJ difiere del soporte de SQLJ del resto de los controladores JDBC de DB2 en los aspectos siguientes: Errores de db2sqljcustomize y el parmetro -collection: El programa de utilidad db2sqljcustomize que forma parte del Controlador IBM DB2 para JDBC y SQLJ tiene un parmetro -collection. El programa de utilidad db2profc que forma parte del controlador DB2 JDBC de tipo 2 no tiene un parmetro -collection. Si el destino de una operacin de vinculacin con el programa de utilidad db2sqljcustomize es un servidor DB2 para z/OS, y el parmetro -collection contiene caracteres en minscula. db2sqljcustomize devuelve un error -4499 porque los ID de coleccin no pueden contener caracteres en minsculas en DB2 para z/OS. Esta situacin no puede producirse en db2profc. Diferencias en los perfiles serializados: El Controlador JDBC de DB2 de tipo 2 y el Controlador IBM DB2 para JDBC y SQLJ crean cdigo binario diferente cuando se ejecutan sus programas de utilidad de conversin y personalizacin de SQLJ. Por lo tanto, las aplicaciones SQLJ que traslad y personaliz utilizando el controlador DB2 JDBC de tipo 2 sqlj y los programas de utilidad db2profc no se ejecutan en el Controlador IBM DB2 para JDBC y SQLJ. Para poder ejecutar esas aplicaciones SQLJ con el Controlador IBM DB2 para JDBC y SQLJ, las tiene que volver a convertir y personalizar utilizando los programas de utilidad sqlj y db2sqljcustomize del Controlador IBM DB2 para JDBC y SQLJ. Debe hacer esto aunque no hubiera modificado las aplicaciones. Soporte de la sentencia VALUES de SQL:

366

Desarrollo de aplicaciones Java

El Controlador JDBC de DB2 de tipo 2 soporta la sentencia VALUES de SQL en una clusula de una sentencia de SQLJ, pero no as el Controlador IBM DB2 para JDBC y SQLJ. Por tanto, es necesario que modifique las aplicaciones SQLJ que incluyan sentencias VALUES. Ejemplo: suponga que un programa SQLJ contiene la sentencia siguiente:
#sql [ctxt] hv = {VALUES (MY_ROUTINE(1))};

Para el Controlador IBM DB2 para JDBC y SQLJ, es necesario que cambie esa sentencia por lo siguiente:
#sql [ctxt] {SELECT MY_ROUTINE(1) INTO :hv FROM SYSIBM.SYSDUMMY1};

Soporte de sentencias de SQL compuesto: El Controlador JDBC de DB2 de tipo 2 soporta sentencias de SQL compuesto en una clusula de una sentencia de SQLJ, pero no as el Controlador IBM DB2 para JDBC y SQLJ. Por tanto, es necesario que modifique las aplicaciones SQLJ que tengan sentencias de SQLJ donde se incluyan las especificaciones BEGIN COMPOUND y END COMPOUND. Si utiliza sentencias compuestas para efectuar actualizaciones de proceso por lotes, en su lugar puede utilizar las interfaces de programacin de SQLJ para las actualizaciones de proceso por lotes. Diferencia en las tcnicas de conexin: Las tcnicas de conexin que estn disponibles, y los nombres de controlador y los URL que se utilizan para esas tcnicas de conexin, varan de un controlador a otro. Consulte el tema Conectar a una fuente de datos utilizando SQLJ para obtener ms informacin. Soporte para iteradores desplazables y actualizables: SQLJ con el Controlador IBM DB2 para JDBC y SQLJ soporta iteradores desplazables y actualizables. El controlador DB2 JDBC de tipo 2 para Linux, UNIX y Windows (Controlador DB2 JDBC de tipo 2) admite los cursores desplazables, pero no los iteradores actualizables. Ejecucin dinmica de sentencias de SQL en WebSphere Application Server: Para WebSphere Application Server Versin 5.0.1 y superior, si personaliza el programa SQLJ, las sentencias de SQL se ejecutan de manera esttica. Los nombres alternativos para db2sqljcustomize y db2sqljprint no estn soportados: El controlador DB2 JDBC Tipo 2 utilizaba originariamente el nombre db2profc para el mandato de personalizador de perfil SQLJ, y el nombre db2profp para el mandato de impresora de perfil SQLJ. Para Controlador IBM DB2 para JDBC y SQLJ, el mandato de personalizador de perfil SQLJ se denomina db2sqljcustomize, y el mandato de impresora de perfil SQLJ se denomina db2sqljprint. En releases anteriores de DB2 Database para Linux, UNIX y Windows, db2profc se aceptaba como nombre alternativo de db2sqljcustomize, y db2profp se aceptaba como nombre alternativo de db2sqljprint. Estos nombres alternativos ya no se aceptan. Tareas relacionadas:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

367

v Conexin a una fuente de datos utilizando SQLJ en la pgina 100

Cdigos de error emitidos por el controlador IBM DB2 para JDBC y SQLJ
Los cdigos de error comprendidos dentro de los rangos +4200 a +4299, +4450 a +4499, -4200 a -4299, y -4450 a -4499 estn reservados para el Controlador IBM DB2 para JDBC y SQLJ. Actualmente, el Controlador IBM DB2 para JDBC y SQLJ emite los cdigos de error siguientes:
Tabla 68. Cdigos de error emitidos por el Controlador IBM DB2 para JDBC y SQLJ Cdigo de error +4204 Texto del mensaje y explicacin Se han encontrado errores y se han tolerado segn lo especificado en la clusula RETURN DATA UNTIL. Explicacin: Los errores tolerados incluyen errores de autorizacin, autentificacin y conexin federada. Este aviso se aplica solamente a las conexiones con los servidores DB2 Database para Linux, UNIX y Windows. Se emite solamente cuando una operacin del cursor, como una llamada ResultSet.next() o ResultSet.previous(), devuelve false. -4200 Operacin no vlida: Se ha llamado una operacin COMMIT o ROLLBACK no vlida en un entorno XA durante una transaccin global. Explicacin: Una aplicacin perteneciente a una transaccin global en un entorno XA ha emitido una operacin de confirmacin o retrotraccin. Una operacin de confirmacin o retrotraccin en una transaccin global no es vlida. -4201 Operacin no vlida: no se permite setAutoCommit(true) durante la transaccin global. Explicacin: Una aplicacin perteneciente a una transaccin global en un entorno XA ha ejecutado la sentencia setAutoCommit(true). La emisin de setAutoCommit(true) en una transaccin global no es vlida. -4203 Error al ejecutar la funcin. El servidor ha devuelto rc. Explicacin: Se ha producido un error en una conexin XA durante la ejecucin de una sentencia de SQL. Para la optimizacin de la red, el Controlador IBM DB2 para JDBC y SQLJ retarda algunos flujos XA hasta que se ejecuta la siguiente sentencia de SQL. Si se produce un error en un flujo XA retardado, se informa de ese error como parte de una excepcin SQLException que emite la sentencia de SQL actual. -4450 -4496 No se soporta la caracterstica: nombre-caracterstica no se soporta. Se ha emitido un SQL OPEN para un cursor retenido en una conexin XA. El controlador JDBC no permite que se abra un cursor retenido en el servidor DB2 para una conexin XA. La aplicacin debe emitir una retrotraccin. Ya se ha retrotrado la unidad de trabajo en el servidor DB2, pero es posible que otros gestores de recursos implicados en la unidad de trabajo no hayan retrotrado sus cambios. Para asegurar la integridad de la aplicacin, todas las peticiones de SQL se rechazan hasta que la aplicacin emite una retrotraccin.

-4497

368

Desarrollo de aplicaciones Java

Tabla 68. Cdigos de error emitidos por el Controlador IBM DB2 para JDBC y SQLJ (continuacin) Cdigo de error -4498 Texto del mensaje y explicacin Ha fallado una conexin pero se ha restablecido. El nombre del sistema principal o direccin IP es \nombre-sistema-principal\ y el nombre del servicio o el nmero de puerto es puerto. Es posible que los registros especiales se vuelvan a intentar o no (Cdigo de razn = rc). Explicacin: nombre-sistema-principal y puerto indican el servidor de bases de datos en el que se restablece la conexin. rc puede tener los valores siguientes: 1 2 El servidor de bases de datos ha intentado restablecer los registros especiales a sus valores originales.

El servidor de bases de datos no ha intentado restablecer los registros especiales a sus valores originales. La aplicacin se retrotrae a su punto de confirmacin anterior. -4499 Se ha producido un error grave que ha dado como resultado una desconexin. Explicacin: Una causa posible es que un error de red haya provocado la desconexin de un socket. -99999 El Controlador IBM DB2 para JDBC y SQLJ ha emitido un error que no tiene asignado todava un cdigo de error.

Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Manejo de errores de SQL en una aplicacin SQLJ en la pgina 150 Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

SQLSTATE emitidos por el controlador de IBM DB2 para JDBC y SQLJ


Los estados de SQL (SQLSTATE) comprendidos dentro del rango 46600 a 466ZZ estn reservados para el Controlador IBM DB2 para JDBC y SQLJ. Actualmente, el Controlador IBM DB2 para JDBC y SQLJ devuelve un valor de SQLSTATE nulo para un error interno, a menos que el error sea un error de DRDA. Los SQLSTATE siguientes se emiten para errores de DRDA: 02506 08003 08004 08506 22021 24501 Error tolerable. Este SQLSTATE se emite para SQLCODE +4204. No existe una conexin. El servidor de aplicaciones ha rechazado el establecimiento de la conexin. Excepcin de redireccin de cliente. Este SQLSTATE se emite para SQLCODE -4498. Un carcter no se encuentra en el conjunto de caracteres codificados. El cursor identificado no est abierto.

2D521 Las operaciones COMMIT o ROLLBACK de SQL no son vlidas en el entorno operativo actual.
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

369

58008

La ejecucin ha fallado debido a un error del protocolo de distribucin que no afectar a la ejecucin satisfactoria de los subsiguientes mandatos de DDM o sentencias de SQL. La ejecucin ha fallado debido a un error del protocolo de distribucin que ha provocado la desasignacin de la conversacin. La ejecucin ha fallado debido a un error del protocolo de distribucin que impedir que los subsiguientes mandatos de DDM o sentencias de SQL se ejecuten satisfactoriamente. No se da soporte al mandato de DDM. No se da soporte al objeto de DDM. No se da soporte al parmetro de DDM. No se da soporte al valor del parmetro de DDM.

58009 58010

58014 58015 58016 58017

Tareas relacionadas: v Manejo de una excepcin de SQL en el controlador IBM DB2 para JDBC y SQLJ en la pgina 84 v Manejo de errores de SQL en una aplicacin SQLJ en la pgina 150 Informacin relacionada: v Diferencias de JDBC entre el controlador IBM DB2 para JDBC y SQLJ y otros controladores JDBC de DB2 en la pgina 358

Cmo buscar en el controlador IBM DB2 informacin sobre el entorno y la versin de JDBC y SQLJ
Para determinar la versin del Controlador IBM DB2 para JDBC y SQLJ, as como la informacin sobre el entorno en que se ejecuta el controlador, ejecute el programa de utilidad DB2Jcc en la lnea de mandatos. Sintaxis de DB2Jcc:
java com.ibm.db2.jcc.DB2Jcc -version -configuration -help

Descripciones de las opciones de DB2Jcc: -version Especifica que el Controlador IBM DB2 para JDBC y SQLJ muestra su nombre y versin. -configuration Especifica que el Controlador IBM DB2 para JDBC y SQLJ muestra su nombre y versin, as como informacin sobre el entorno, como la informacin sobre restricciones de licencia, informacin sobre la va de acceso, el sistema operativo y el entorno de ejecucin de Java. -help Especifica que el programa de utilidad DB2Jcc describe todas las opciones a las que da soporte. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. Salida de ejemplo de DB2Jcc:

370

Desarrollo de aplicaciones Java

sqlj - Conversor SQLJ


La salida siguiente es resultado de invocar DB2Jcc con el parmetro -configuration.
(myid@mymachine) /home/myid $ java com.ibm.db2.jcc.DB2Jcc -version IBM DB2 Driver for JDBC and SQLJ Architecture 2.1.29 Test Build (myid@mymachine) /home/myid $ java com.ibm.db2.jcc.DB2Jcc -configuration [ibm][db2][jcc] BEGIN TRACE_DRIVER_CONFIGURATION [ibm][db2][jcc] Driver: IBM DB2 Driver for JDBC and SQLJ Architecture 2.1.29 Test Build [ibm][db2][jcc] Compatible JRE versions: { 1.4 } [ibm][db2][jcc][ibm][db2][jcc] Target server licensing restrictions: { z/OS: disabled; SQLDS: disabl ed; iSeries: disabled; DB2 for Unix/Windows: disabled; Cloudscape:disabled } [ibm][db2][jcc] Range checking enabled: true [ibm][db2][jcc] Bug check level: 0xff [ibm][db2][jcc] Default fetch size: 64 [ibm][db2][jcc] Default isolation: 2 [ibm][db2][jcc] Collect performance statistics: false [ibm][db2][jcc] No security manager detected. [ibm][db2][jcc] Detected local client host: mymachine/9.99.99.999 [ibm][db2][jcc] Access to package sun.io is permitted by security manager. [ibm][db2][jcc] JDBC 1 system property jdbc.drivers = null [ibm][db2][jcc] Java Runtime Environment version 1.4.2 [ibm][db2][jcc] Java Runtime Environment vendor = IBM Corporation [ibm][db2][jcc] Java vendor URL = http://www.ibm.com/ [ibm][db2][jcc] Java installation directory = /wsdb/v91/bldsupp/AIX/jdk1.4.2/jre [ibm][db2][jcc] Java Virtual Machine specification version = 1.0 [ibm][db2][jcc] Java Virtual Machine specification vendor = Sun Microsystems Inc. [ibm][db2][jcc] Java Virtual Machine specification name = Java Virtual Machine Specification [ibm][db2][jcc] Java Virtual Machine implementation version = 1.4.2 [ibm][db2][jcc] Java Virtual Machine implementation vendor = IBM Corporation [ibm][db2][jcc] Java Virtual Machine implementation name = Classic VM [ibm][db2][jcc] Java Runtime Environment specification version = 1.4.2 [ibm][db2][jcc] Java Runtime Environment specification vendor = Sun Microsystems Inc. [ibm][db2][jcc] Java Runtime Environment specification name = Java Platform API Specification [ibm][db2][jcc] Java class format version number = 46.0 [ibm][db2][jcc] Java class path = .:/home/myid/sqllib/java/db2jcc.jar:/home/myid/sqllib/java/db2 java.zip:/home/myid/sqllib/java/sqlj.zip:/home/myid/sqllib/java/runtime.zip:/wsdb/v91/bldsupp/AI X/jdk1.4.2/jdbc2.0_stdext/jdbc2_0-stdext.jar:/wsdb/v91/bldsupp/AIX/jdk1.4.2/jta1.0.1/jta-spec1_0_1.j ar:/wsdb/v91/bldsupp/AIX/jdk1.4.2/jndi1.2/lib/jndi.jar:/home/myid/util:./test:/home/myid/build/c ur/engn/lib/db2jcc_license_cisuz.jar:/home/myid/build/cur/engn/lib/db2jcc_license_cu.jar [ibm][db2][jcc] Java native library path = /wsdb/v91/bldsupp/AIX/jdk1.4.2/jre/bin:/wsdb/v91/bldsupp/ AIX/jdk1.4.2/jre/bin/classic:/home/myid/sqllib/lib:/local/cobol:/usr/lib [ibm][db2][jcc] Path of extension directory or directories = /wsdb/v91/bldsupp/AIX/jdk1.4.2/jre/lib/ ext [ibm][db2][jcc] Operating system name = AIX [ibm][db2][jcc] Operating system architecture = ppc [ibm][db2][jcc] Operating system version = 4.3 [ibm][db2][jcc] File separator ("/" on UNIX) = / [ibm][db2][jcc] Path separator (":" on UNIX) = : [ibm][db2][jcc] Users account name = myid [ibm][db2][jcc] Users home directory = /home/myid [ibm][db2][jcc] Users current working directory = /home/myid [ibm][db2][jcc] END TRACE_DRIVER_CONFIGURATION (myid@mymachine) /home/myid $

Figura 65. Salida de ejemplo de DB2Jcc

Mandatos para la preparacin de programas de SQLJ


Los temas siguientes contienen informacin sobre la preparacin de programas de SQLJ. v sqlj - Conversor SQLJ v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375 v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385 v db2sqljprint - Impresora de perfiles de SQLJ en la pgina 392

sqlj - Conversor SQLJ


El mandato sqlj convierte un archivo fuente SQLJ en un archivo fuente Java con cero o ms perfiles serializados SQLJ. Por omisin, el mandato sqlj tambin compila el archivo fuente Java. Autorizacin:

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

371

sqlj - Conversor SQLJ


Ninguno Sintaxis del mandato:
sqlj -help -dir=directorio -d=directorio -props=archivo-propiedades

-compile=true -compile=false

-linemap=NO -linemap=YES

-smap=NO -smap=YES -encoding=codificacin -db2optimize

-ser2class

-status

-version

-C-help (1) -Copcin-compilador

-Jopcin-JVM

nombre-archivo-fuente-SQLJ

Notas: 1 Las opciones -C-classpath y -C-sourcepath las utiliza tanto el conversor SQLJ como el compilador Java. Parmetros del mandato: -help Especifica que el conversor SQLJ describa cada una de las opciones a las que da soporte el conversor. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. -dir=directorio Especifica el nombre del directorio en el que SQLJ pone los archivos .java que el conversor genera. El directorio por omisin es el que contiene los archivos fuente SQLJ. El conversor utiliza la estructura de directorios de los archivos fuente SQLJ cuando pone los archivos generados en directorios. Por ejemplo, suponga que desea que el conversor procese dos archivos: v file1.sqlj, que no est en un paquete Java v file2.sqlj, que est en el paquete Java sqlj.test Adems, suponga que ha especificado el parmetro -dir=/src al invocar el conversor. ste pone el archivo fuente Java para file1.sqlj en el directorio /src y pone el archivo fuente Java para file2.sqlj en el directorio /src/sqlj/test. -d=directorio Especifica el nombre del directorio en el que SQLJ pone los archivos binarios que el conversor genera. Estos archivos son: v Los archivos de perfiles serializados (archivos .ser) v Si el mandato sqlj invoca el compilador Java, los archivos de clases generados por el compilador (archivos .class) El directorio por omisin es el que contiene los archivos fuente SQLJ.

372

Desarrollo de aplicaciones Java

sqlj - Conversor SQLJ


El conversor utiliza la estructura de directorios de los archivos fuente SQLJ cuando pone los archivos generados en directorios. Por ejemplo, suponga que desea que el conversor procese dos archivos: v file1.sqlj, que no est en un paquete Java v file2.sqlj, que est en el paquete Java sqlj.test Adems, suponga que ha especificado el parmetro -d=/src al invocar el conversor. ste pone los perfiles serializados para file1.sqlj en el directorio /src y pone los perfiles serializados para file2.sqlj en el directorio /src/sqlj/test. -props=archivo-propiedades Especifica el nombre del archivo en el cual el conversor SQLJ obtiene una lista de opciones. -compile=true|false Especifica si el conversor SQLJ debe compilar el fuente de Java generado en cdigos de bytes. true El conversor compila el cdigo fuente de Java generado. ste es el valor por omisin. false El conversor no compila el cdigo fuente de Java generado. -linemap=no|yes Especifica si los nmeros de lnea de las excepciones Java coinciden con los nmeros de lnea del archivo fuente SQLJ (el archivo .sqlj), o los nmeros de lnea del archivo fuente Java generado por el conversor SQLJ (el archivo .java). no Los nmeros de lnea de las excepciones Java coinciden con los nmeros de lnea del archivo fuente Java. ste es el valor por omisin. yes Los nmeros de lnea de las excepciones Java coinciden con los nmeros de lnea del archivo fuente SQLJ. -smap=no|yes Especifica si el conversor SQLJ genera un archivo de correlacin fuente (SMAP) por cada archivo fuente SQLJ. Algunas herramientas de depuracin del lenguaje Java utilizan un archivo SMAP. Dicho archivo correlaciona las lneas del archivo fuente SQLJ con las lneas del archivo fuente Java generado por el conversor SQLJ. El archivo est en el esquema de codificacin Unicode UTF-8. Su formato se describe en la solicitud de especificacin original Java (JSR) 45, que est disponible en el sitio Web:
http://www.jcp.org

no No genera archivos SMAP. ste es el valor por omisin. yes Genera archivos SMAP. El nombre de un archivo MAP es del tipo nombre-archivo-fuente-SQLJ.java.smap. El conversor SQLJ pone el archivo SMAP en el mismo directorio que el archivo fuente Java generado. -encoding=nombre-codificacin Especifica la codificacin del archivo fuente. Por ejemplo, JIS o EUC. Si no se especifica esta opcin, se utilizar el convertidor por omisin del sistema operativo. -db2optimize Especifica que el conversor SQLJ genera cdigo para una clase de contexto de conexin que se optimiza para DB2. -db2optimize optimiza el cdigo para el
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

373

sqlj - Conversor SQLJ


contexto definido por el usuario, aunque no para el contexto por omisin. Cuando se ejecuta el conversor SQLJ con la opcin -db2optimize, el archivo db2jcc.jar del Controlador IBM DB2 para JDBC y SQLJ debe estar en CLASSPATH para compilar la aplicacin Java generada. -ser2class Especifica que el conversor SQLJ convierte archivos .ser en archivos .class. -status Especifica que el conversor SQLJ muestra mensajes de estado durante su ejecucin. -version Especifica que el conversor SQLJ muestra la versin del Controlador IBM DB2 para JDBC y SQLJ. La informacin es de la forma:
IBM SQLJ xxxx.xxxx.xx

-C-help Especifica que el conversor SQLJ muestra informacin de ayuda para el compilador Java. -Copcin-compilador Especifica una opcin de compilador Java vlida que empieza por un guin (-). No incluye los espacios entre -C y la opcin de compilador. Si ha de especificar varias opciones de compilador, deber anteponer -C a todas las opciones de compilador. Por ejemplo:
-C-g -C-verbose

Todas las opciones se le pasarn al compilador Java y no las utilizar el conversor SQLJ, a excepcin de las opciones siguientes: -classpath Especifica la va de acceso a clases del usuario que van a utilizar el conversor SQLJ y el compilador Java. Este valor altera temporalmente la variable de entorno CLASSPATH. -sourcepath Especifica la va de acceso al cdigo fuente en que el conversor SQLJ y el compilador Java buscarn definiciones de clases o interfaces. El conversor SQLJ busca archivos .sqlj y .java nicamente en los directorios, no en los archivos JAR o zip. -Jopcin-JVM Especifica una opcin que se le pasar a la mquina virtual de Java (JVM) en que se ejecuta el mandato sqlj. La opcin debe ser una opcin de JVM vlida que empieza por un guin (-). No incluye los espacios entre -J y la opcin de JVM. Si ha de especificar varias opciones de JVM, deber anteponer -J a todas las opciones de compilador. Por ejemplo:
-J-Xmx128m -J-Xmine2M

nombre-archivo-fuente-SQLJ Especifica una lista de archivos fuente SQLJ que se deben convertir. Se trata de un parmetro obligatorio. Todos los nombres de archivos fuente SQLJ deben tener la extensin .sqlj. Salida: Para cada archivo fuente, nombre-programa.sqlj, el conversor SQLJ genera los archivos siguientes: v El programa fuente generado

374

Desarrollo de aplicaciones Java

sqlj - Conversor SQLJ


El archivo fuente generado se denomina nombre-programa.java. v Un archivos de perfiles serializados para cada clase de contexto de conexin que se utilice en una clusula ejecutable de SQLJ Un nombre de perfil serializado tiene el formato siguiente:
nombre-programa_SJProfileNmeroID.ser

v Si el conversor SQLJ invoca el compilador Java, los archivos de clases generados por el compilador. Ejemplos:
sqlj -encoding=UTF8 -C-O MyApp.sqlj

Informacin relacionada: v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385 v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375 v db2sqljprint - Impresora de perfiles de SQLJ en la pgina 392

db2sqljcustomize - Personalizador de perfiles de SQLJ


db2sqljcustomize procesa un perfil de SQLJ, que contiene sentencias de SQL incorporado. Por omisin, db2sqljcustomize crea cuatro paquetes DB2: uno por cada nivel de aislamiento. db2sqljcustomize aumenta el perfil con informacin especfica de DB2 para su utilizacin en tiempo de ejecucin. Autorizacin: El conjunto de privilegios del proceso tiene que incluir una de las autorizaciones posibles: v Autoridad SYSADM v Autoridad DBADM v Si el paquete no existe, el privilegio BINDADD y uno de los privilegios siguientes: Privilegio CREATEIN Autorizacin IMPLICIT_SCHEMA sobre la base de datos si el nombre de esquema del paquete no existe v Si el paquete existe: Privilegio ALTERIN sobre el esquema Privilegio BIND sobre el paquete El usuario tambin necesita todos los privilegios necesarios para compilar las sentencias de SQL estticas de la aplicacin. Los privilegios otorgados a grupos no se utilizan para la comprobacin de autorizaciones de dichas sentencias. Si el usuario tiene una autorizacin SYSADM, aunque ningn privilegio explcito para completar el vnculo, el gestor de bases de datos DB2 otorga automticamente una autorizacin DBADM explcita. Sintaxis del mandato:
db2sqljcustomize -help -url jdbc:db2://servidor :puerto : -datasource nombre-JNDI propiedad=valor; /basedatos

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

375

db2sqljcustomize - Personalizador de perfiles de SQLJ


-automaticbind YES -user ID-usuario -password contrasea -automaticbind NO -pkgversion AUTO -pkgversion ID-versin

-bindoptions " serie-opciones "

-storebindoptions

-collection nombre-coleccin

-onlinecheck YES -onlinecheck NO -qualifier nombre-calificador -rootpkgname raz-nombre-paquete -singlepkgname nombre-paquete

-staticpositioned NO -longpkgname -staticpositioned YES

-tracelevel TRACE_SQLJ -tracefile nombre-archivo , -tracelevel TRACE_NONE TRACE_CONNECTION_CALLS TRACE_STATEMENT_CALLS TRACE_RESULT_SET_CALLS TRACE_DRIVER_CONFIGURATION TRACE_CONNECTS TRACE_DRDA_FLOWS TRACE_RESULT_SET_META_DATA TRACE_PARAMETER_META_DATA TRACE_DIAGNOSTICS TRACE_SQLJ TRACE_XA_CALLS TRACE_ALL

nombre-perfil-serializado nombre-archivo.grp

serie-opciones:
opciones-DB2-para-z/OS opciones-base-datos-DB2-para-Linux-UNIX-y-Windows

376

Desarrollo de aplicaciones Java

db2sqljcustomize - Personalizador de perfiles de SQLJ


Opciones de DB2 para z/OS:
ACTION(REPLACE) (1) ACTION(ADD) EXPLAIN(NO) EXPLAIN(YES) IMMEDWRITE(NO) IMMEDWRITE(PH1) IMMEDWRITE(YES) REPLVER(ID-versin) DBPROTOCOL(DRDA) DBPROTOCOL(PRIVATE) ISOLATION(RR) ISOLATION(RS) ISOLATION(CS) ISOLATION(UR) NOREOPT(VARS) REOPT(VARS) DEGREE(1) DEGREE(ANY)

OPTHINT(ID-sugerencia)

OWNER(ID-autorizacin) PATH(

, nombre-esquema USER )

RELEASE(COMMIT) QUALIFIER(nombre-calificador) RELEASE(DEALLOCATE)

SQLERROR(NOPACKAGE) SQLERROR(CONTINUE)

VALIDATE(RUN) VALIDATE(BIND)

Notas: 1 Estas opciones se pueden especificar en cualquier orden.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

377

db2sqljcustomize - Personalizador de perfiles de SQLJ


DB2 Database para Linux, UNIX y Windowsopciones
(1) BLOCKING UNAMBIG BLOCKING ALL BLOCKING NO FEDERATED NO FEDERATED YES FUNCPATH nombre-esquema DEC 15 DEC 31 DEGREE 1 DEGREE ANY EXPLAIN NO EXPLAIN YES EXPLSNAP NO EXPLSNAP ALL EXPLSNAP YES

INSERT DEF INSERT BUF

ISOLATION CS ISOLATION RR ISOLATION RS ISOLATION UR

OWNER ID-autorizacin

QUALIFIER nombre-calificador

QUERYOPT nivel-optimizacin

SQLERROR NOPACKAGE SQLERROR CONTINUE

SQLWARN YES SQLWARN NO

STATICREADONLY NO STATICREADONLY YES

VALIDATE RUN VALIDATE BIND

Notas: 1 Estas opciones se pueden especificar en cualquier orden. Parmetros del mandato: -help Especifica que el personalizador de SQLJ describe todas las opciones soportadas por el personalizador. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. -url Especifica el URL de la fuente de datos para la que se personalizar el perfil. Se establece una conexin con la fuente de datos que este URL representa si la opcin -automaticbind o -onlinecheck se especifica como YES o toma de por omisin el valor YES. Las partes variables del valor -url son: servidor Nombre de dominio o direccin IP del sistema MVS donde reside el subsistema DB2. puerto El nmero de puerto del servidor TCP/IP que est asignado al subsistema DB2. El valor por omisin es 446. basedatos Nombre del servidor de bases de datos para el que se va a personalizar el perfil. Si la conexin es con un servidor DB2 para z/OS, el valor de basedatos es el nombre de ubicacin de DB2 que se define durante la instalacin. Todos los caracteres de este valor deben ser caracteres en maysculas. Puede determinar el nombre de ubicacin ejecutando la sentencia de SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

Si la conexin es con un servidor DB2 Database para Linux, UNIX y Windows, basedatos es el nombre de la base de datos que se define durante la instalacin.

378

Desarrollo de aplicaciones Java

db2sqljcustomize - Personalizador de perfiles de SQLJ


Si la conexin es con un servidor IBM Cloudscape, el valor de basedatos es el nombre totalmente calificado del archivo donde reside la base de datos. Este nombre debe estar encerrado entre comillas dobles ("). Por ejemplo:
"c:/databases/testdb"

propiedad=valor; Es una propiedad de la conexin JDBC. Para conocer las definiciones de estas propiedades, consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ. -datasource nombre-JNDI Especifica el nombre lgico de un objeto DataSource que se registr con JNDI. El objeto DataSource representa la fuente de datos para la que se va personalizar el perfil. Se establece una conexin con la fuente de datos si la opcin -automaticbind o -onlinecheck se especifica como YES o toma de por omisin el valor YES. La especificacin de -datasource es una alternativa a especificar -url. El objeto DataSource debe representar una conexin que utilice el Controlador IBM DB2 para conectividad JDBC y SQLJ de tipo 4. -user ID-usuario Especifica el ID de usuario que se utilizar para conectarse con la fuente de datos para realizar comprobaciones en lnea o vincular un paquete. Si especifica -url, debe especificar -user. Si especifica -datasource y el objeto DataSource que representa el nombre-JNDI no contiene un ID de usuario, debe especificar -user. -password contrasea Especifica la contrasea que se utilizar para conectarse con la fuente de datos para realizar comprobaciones en lnea o vincular un paquete. Si especifica -url, debe especificar -password. Si especifica -datasource y el objeto DataSource que representa el nombre-JNDI no contiene una contrasea, debe especificar -password. -automaticbind YES|NO Especifica si el personalizador vincula paquetes DB2 en el origen de datos especificado por el parmetro -url. El valor por omisin es YES. El nmero de paquetes y los niveles de aislamiento de estos paquetes estn controlados por las opciones -rootpkgname y -singlepkgname. Para que la operacin de vinculacin pueda funcionar se deben cumplir las condiciones siguientes: v TCP/IP y DRDA deben estar instalados en el origen de datos de destino. v Deben especificarse valores vlidos para -url, -username y -password. v El valor -username debe tener autorizacin para vincular un paquete en el origen de datos de destino. -pkgversion AUTO|ID-versin Especifica la versin del paquete que se va a utilizar al vincular paquetes en el servidor para el perfil serializado que se est personalizando. db2sqljcustomize almacena el ID de versin en el perfil serializado y en el paquete DB2. La verificacin de la versin en tiempo de ejecucin se basa en la seal de coherencia y no en el nombre de la versin. Para generar automticamente un nombre de versin basado en la seal de coherencia, especifique -pkgversion AUTO. El valor por omisin es que no hay versin.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

379

db2sqljcustomize - Personalizador de perfiles de SQLJ


-bindoptions serie-opciones Especifica una lista de opciones separadas por espacios. Estas opciones tienen la misma funcin que las opciones de precompilacin y enlace de DB2 con los mismos nombres. Si prepara el programa para ejecutarlo en un sistema DB2 para z/OS, especifique opciones de DB2 para z/OS. Si prepara el programa para ejecutarlo en un sistema DB2 Database para Linux, UNIX y Windows, especifique opciones de DB2 Database para Linux, UNIX y Windows. Notas sobre las opciones de enlace: v Especifique ISOLATION slo si tambin especifica la opcin -singlepkgname. v El valor para STATICREADONLY es YES para servidores que den soporte a STATICREADONLY, y NO para los otros servidores. Al especificar STATICREADONLY YES, DB2 procesa los cursores ambiguos como si fueran cursores de slo lectura. Para resolver problemas de errores de declaracin de reiterador, debe especificar explcitamente STATICREADONLY NO o declarar los reiteradores para que no sean ambiguos. Por ejemplo, si desea que un reiterador sea actualizable de forma no ambigua, declare el reiterador para implementar sqlj.runtime.ForUpdate. Si desea que un reiterador sea de slo lectura, incluya la clusula FOR READ ONLY en las sentencias SELECT que utilicen el reiterador. Importante: Especifique slo las opciones de preparacin de programa que sean adecuadas para el origen de datos en el que se vincula un paquete. Algunos valores (predeterminados o no) para el Controlador IBM DB2 para JDBC y SQLJ son diferentes de los de DB2. -storebindoptions Especifica que los valores para los parmetros -bindoptions y -staticpositioned se almacenan en el perfil serializado. Si db2sqljbind se invoca sin los parmetros -bindoptions o -staticpositioned, los valores que se almacenan en el perfil serializado se utilizan durante la operacin de vinculacin. Cuando se especifican varios perfiles serializados para una invocacin de db2sqljcustomize, los valores de los parmetros se almacenan en cada perfil serializado. Los valores almacenados se visualizan en la salida del programa de utilidad db2sqljprint. -collection nombre-coleccin El calificador para los paquetes vinculados por db2sqljcustomize. db2sqljcustomize almacena este valor en el perfil serializado personalizado y se utiliza cuando se vinculan los paquetes asociados. Si no especifica este parmetro, db2sqljcustomize utiliza NULLID como ID de coleccin. -onlinecheck YES|NO Especifica si se van a ejecutar las comprobaciones en lnea de tipos de datos en el programa SQLJ. La opcin -url o -datasource determina el origen de datos que se va a utilizar para las comprobaciones en lnea. El valor por omisin es YES si se especifica el parmetro -url o -datasource. En otro caso, el valor por omisin es NO. -qualifier nombre-calificador Especifica el calificador que se va a utilizar para objetos no calificados en el programa SQLJ durante las comprobaciones en lnea. Este valor no se utiliza como calificador cuando se vinculan paquetes. -rootpkgname|-singlepkgname Especifica los nombres de los paquetes que estn asociados al programa. Si -automaticbind es NO, se utilizan estos nombres de paquetes al ejecutar db2sqljbind. Los significados de los parmetros son:

380

Desarrollo de aplicaciones Java

db2sqljcustomize - Personalizador de perfiles de SQLJ


-rootpkgname raz-nombre-paquete Especifica que el personalizador crea cuatro paquetes, uno para cada uno de los cuatro niveles de aislamiento de DB2. Los nombres de los cuatro paquetes son: raz-nombre-paquete1 raz-nombre-paquete2 raz-nombre-paquete3 raz-nombre-paquete4 Para el nivel de aislamiento UR Para el nivel de aislamiento CS Para el nivel de aislamiento RS Para el nivel de aislamiento RR

Si no se especifica -longpkgname, raz-nombre-paquete deber ser una serie alfanumrica de siete o menos bytes. Si se especifica -longpkgname, raz-nombre-paquete deber ser una serie alfanumrica de 127 o menos bytes. -singlepkgname nombre-paquete Especifica que el personalizador crea un paquete con el nombre nombre-paquete. Si especifica esta opcin, el programa slo podr ejecutarse en un nivel de aislamiento. El nivel de aislamiento del paquete se especifica entrando la opcin ISOLATION en la serie de opciones -bindoptions. Si no se especifica -longpkgname, nombre-paquete deber ser una serie alfanumrica de ocho o menos bytes. Si se especifica -longpkgname, nombre-paquete deber ser una serie alfanumrica de 128 o menos bytes. No se recomienda utilizar la opcin -singlepkgname. Si no especifica -rootpkgname o -singlepkgname, db2sqljcustomize genera cuatro nombres de paquete basados en el nombre del perfil serializado. Un nombre de perfil serializado tiene el formato siguiente:
nombre-programa_SJProfileNmeroID.ser

Los cuatro nombres de paquete generados tienen el formato siguiente:


Bytes-del-nombre-programaNmeroIDAislamientopqt

La Tabla 69 muestra las partes de un nombre de paquete generado y el nmero de bytes de cada parte. La longitud mxima de un nombre de paquete es lonmx. lonmx es 8 si no se especifica -longpkgname. lonmx es 128 si se especifica -longpkgname.
Tabla 69. Partes de un nombre de paquete generado por db2sqljcustomize Parte del nombre del paquete Bytes-del-nombre-programa NmeroID Aislamientopqt Nmero de bytes m=min(Length(nombre-programa), lonmx1Length(NmeroID)) Length(NmeroID) 1 Valor Los primeros m bytes del nombre-programa, en maysculas NmeroID 1, 2, 3 4. Este valor representa el nivel de aislamiento de la transaccin para el paquete. Consulte la Tabla 70 en la pgina 382.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

381

db2sqljcustomize - Personalizador de perfiles de SQLJ


La Tabla 70 muestra los valores de la porcin Aislamientopqt de un nombre de paquete generado por db2sqljcustomize.
Tabla 70. Valores de Aislamientopqt y niveles de aislamiento asociados Valor de Nmeropqt 1 2 3 4 Nivel de aislamiento del paquete Lectura no confirmada (UR) Estabilidad del cursor (CS) Estabilidad de lectura (RS) Lectura repetible (RR)

Ejemplo: supongamos que el nombre de un perfil sea ThisIsMyProg_SJProfile111.ser. No se especifica la opcin -longpkgname de db2sqljcustomize. Por consiguiente, Bytes-del-nombre-programa corresponde a los cuatro primeros bytes de ThisIsMyProg, convertidos a maysculas o THIS. NmeroID es 111. Los nombres de los cuatro paquetes son:
THIS1111 THIS1112 THIS1113 THIS1114

Ejemplo: supongamos que el nombre de un perfil sea ThisIsMyProg_SJProfile111.ser. Se especifica la opcin -longpkgname de db2sqljcustomize. Por consiguiente, Bytes-del-nombre-programa corresponde a ThisIsMyProg, convertidos a maysculas, o THISISMYPROG. NmeroID es 111. Los nombres de los cuatro paquetes son:
THISISMYPROG1111 THISISMYPROG1112 THISISMYPROG1113 THISISMYPROG1114

Ejemplo: supongamos que el nombre de un perfil sea A_SJProfile0.ser. Bytes-del-nombre-programa es A. NmeroID es 0. Por consiguiente, los nombres de los cuatro paquetes son:
A01 A02 A03 A04

No se recomienda dejar que db2sqljcustomize genere los nombres de paquetes. Si algn nombre de paquete generado coincide con el nombre de un paquete existente, db2sqljcustomize sobregrabar el paquete existente. Si desea asegurarse de la exclusividad de los nombres de paquetes, especifique -rootpkgname. -longpkgname Especifica que los nombres de los paquetes DB2 que db2sqljcustomize genera pueden tener un mximo de 128 bytes. Utilice esta opcin slo si vincula paquetes en un servidor que soporta nombres de paquetes largos. Si especifica -singlepkgname o -rootpkgname, tambin deber especificar -longpkgname en las condiciones siguientes: v El argumento de -singlepkgname tiene ms de ocho bytes. v El argumento de -rootpkgname tiene ms de siete bytes -staticpositioned NO|YES Para reiteradores declarados en el mismo archivo fuente que las sentencias UPDATE posicionadas que utilizan los reiteradores, especifica si las sentencias

382

Desarrollo de aplicaciones Java

db2sqljcustomize - Personalizador de perfiles de SQLJ


UPDATE posicionadas se ejecutan como sentencias vinculadas estticamente. El valor por omisin es NO. NO significa que las sentencias UPDATE posicionadas se ejecutan como sentencias vinculadas dinmicamente. -tracefile nombre-archivo Habilita el rastreo e identifica el archivo de salida para la informacin de rastreo. Esta opcin slo debe especificarse bajo la direccin del soporte de software de IBM. -tracelevel Si se especifica -tracefile, indica lo que se desea rastrear durante la ejecucin de db2sqljcustomize. El valor por omisin es TRACE_SQLJ. Esta opcin slo debe especificarse bajo la direccin del soporte de software de IBM. nombre-perfil-serializado|nombre-archivo.grp Especifica los nombres de uno o varios perfiles serializados que se van a personalizar. Un nombre de perfil serializado tiene el formato siguiente:
nombre-programa_SJProfileNmeroID.ser

Puede especificar el nombre del perfil serializado con o sin la extensin .ser. nombre-programa es el nombre del programa fuente de SQLJ, sin la extensin .sqlj. n es un entero entre 0 y m-1, donde m es el nmero de perfiles serializados generados por el conversor de SQLJ a partir del programa fuente de SQLJ. Puede especificar nombres de perfiles serializados de una de las maneras siguientes: v Liste los nombres en el mandato db2sqljcustomize. Si desea especificar varios nombres de perfiles serializados deben estar separados por espacios. v Especifique los nombres de perfiles serializados, uno en cada lnea, en un archivo con el nombre nombre-archivo.grp y especifique nombre-archivo.grp en el mandato db2sqljcustomize. Si especifica ms de un nombre de perfil serializado, y si especifica o utiliza el valor por omisin de -automaticbind YES, db2sqljcustomize vincula un nico paquete DB2 de los perfiles. Al utilizar db2sqljcustomize para crear un nico paquete DB2 a partir de varios perfiles serializados, tambin se tiene que especificar la opcin -rootpkgname o -singlepkgname. Si especifica ms de un nombre de perfil serializado, y si especifica -automaticbind NO, si desea vincular los perfiles serializados en un nico paquete DB2 al ejecutar db2sqljbind, se tiene que especificar la misma lista de nombres de perfiles serializados, en el mismo orden, en db2sqljcustomize y db2sqljbind. Salida: Cuando se ejecuta db2sqljcustomize, crea un perfil serializado personalizado. Tambin crea paquetes DB2, si el valor de automaticbind es YES. Ejemplos:
db2sqljcustomize -user richler -password mordecai -url jdbc:db2:/server:50000/sample -collection duddy -bindoptions "EXPLAIN YES" pgmname_SJProfile0.ser

Notas de uso:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

383

db2sqljcustomize - Personalizador de perfiles de SQLJ


Siempre se recomiendan las comprobaciones en lnea: Es muy recomendable utilizar las comprobaciones en lnea al personalizar los perfiles serializados. Las comprobaciones en lnea determinan la informacin sobre los tipos de datos y longitudes de variables de sistema principal DB2 y es especialmente importante para los elementos siguientes: v Predicados con variables del lenguaje principal java.lang.String y columnas CHAR A diferencia de las variables de caracteres en otros lenguajes principales, las variables de serie Java del lenguaje principal no se declaran con un atributo de longitud. Para optimizar correctamente una consulta que contenga variables del sistema principal, DB2 necesita la longitud de las variables del lenguaje principal. Por ejemplo, suponga que una consulta tiene un predicado en el que una variable de serie del lenguaje principal se compara con una columna CHAR y se define un ndice en dicha columna. Si DB2 no puede determinar la longitud de la variable del lenguaje principal, podra efectuar una exploracin del espacio de tabla en lugar de una exploracin de ndice. Las comprobaciones en lnea evitan este problema al proporcionar las longitudes de las columnas de caracteres correspondientes. v Predicados con variables del lenguaje principal java.lang.String y columnas GRAPHIC Sin comprobaciones en lnea, DB2 podra emitir un error de vinculacin (SQLCODE -134) al encontrar un predicado en el que una variable de serie del lenguaje principal se compara con una columna GRAPHIC. v Nombres de columna en la tabla de resultados de una sentencia SQLJ SELECT en un servidor remoto: Sin comprobaciones en lnea, el controlador no puede determinar los nombres de columna para la tabla de resultados de una sentencia SELECT remota. Personalizacin de varios perfiles serializados conjuntamente: Varios perfiles serializados se pueden personalizar conjuntamente para crear un nico paquete DB2. En este caso, y si especifica -staticpostioned YES, cualquier sentencia UPDATE o DELETE posicionada que haga referencia a un cursor declarado anteriormente en el paquete se ejecuta estticamente, aunque la sentencia UPDATE o DELETE se encuentre en un archivo fuente distinto al de la declaracin de cursor. Si desea obtener el comportamiento de-staticpositioned YES cuando el programa consiste en varios archivos fuente, debe ordenar los perfiles en el mandato db2sqljcustomize para que las declaraciones de cursor se coloquen por delante de sentencias UPDATE o DELETE posicionadas en el paquete. Para ello, liste los perfiles que contengan sentencias SELECT que asignen tablas de resultados a reiteradores antes de los perfiles que contengan las sentencias UPDATE o DELETE posicionadas que hagan referencia a dichos reiteradores. Utilizacin de un perfil serializado personalizado en un origen de datos personalizado en otro origen de datos: Puede ejecutar db2sqljcustomize para crear un perfil serializado personalizado para un programa de SQLJ en un origen de datos y, a continuacin, utilizar ese perfil en otro origen de datos. Para ello debe ejecutar db2sqljbind varias veces en los perfiles serializados personalizados que haya creado al ejecutar db2sqljcustomize una vez. Cuando se ejecutan los programas en estos orgenes de datos, los objetos de DB2 a los que acceden los programas tienen que ser idnticos en cada origen de datos. Por ejemplo, las tablas de todos los orgenes de datos deben tener los mismos esquemas de codificacin y las mismas columnas con los mismos tipos de datos.

384

Desarrollo de aplicaciones Java

db2sqljcustomize - Personalizador de perfiles de SQLJ


Utilizacin del parmetro -collection: db2sqljcustomize almacena el nombre de coleccin de DB2 en cada perfil serializado personalizado que se crea. Cuando se ejecuta un programa de SQLJ, el controlador utiliza el nombre de coleccin almacenado en el perfil serializado personalizado para buscar paquetes que pueda ejecutar. El nombre que se almacena en el perfil serializado personalizado viene determinado por el valor del parmetro -collection. Slo se puede almacenar un ID de coleccin en el perfil serializado. No obstante, puede vincular el mismo perfil serializado en varias colecciones de paquetes especificando la opcin COLLECTION en el parmetro -bindoptions. Para ejecutar un paquete que se encuentre en una coleccin distinta a la coleccin especificada en el perfil serializado, incluya una sentencia SET CURRENT PACKAGESET en el programa. Utilizacin del parmetro VERSION: Utilice el parmetro VERSION para vincular dos o ms versiones de un paquete para el mismo programa de SQLJ en la misma coleccin. Podra hacerlo si ha cambiado un programa fuente de SQLJ y desea ejecutar la versin antigua y nueva del programa. Para mantener dos versiones de un paquete, siga estos pasos: 1. Cambie el cdigo en el programa fuente. 2. Convierta el programa fuente para crear un nuevo perfil serializado. Asegrese de no sobregrabar el perfil serializado original. 3. Ejecute db2sqljcustomize para personalizar el perfil serializado y crear paquetes de DB2 con los mismos nombres de paquete y la misma coleccin que los paquetes originales. Para ello, utilice los mismos valores para -rootpkgname y -collection cuando vincule los paquetes nuevos que haya utilizado al crear los paquetes originales. Especifique la opcin VERSION en el parmetro -bindoptions para colocar un ID de versin en el nuevo perfil serializado personalizado y en los nuevos paquetes. Es esencial especificar la opcin VERSION al efectuar este paso. En caso contrario, sobregrabar los paquetes originales. Al ejecutar la versin antigua del programa, DB2 carga las versiones antiguas de los paquetes. Al ejecutar la versin nueva del programa, DB2 carga las versiones nuevas de los paquetes. Informacin relacionada: v Mandato BIND en Consulta de mandatos v db2sqljprint - Impresora de perfiles de SQLJ en la pgina 392 v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385

db2sqljbind - Vinculador de perfiles SQLJ


db2sqljbind vincula paquetes de DB2 para un perfil serializado personalizado con anterioridad con el mandato db2sqljcustomize. Autorizacin: El juego de privilegios del proceso debe incluir una de las autorizaciones siguientes: v Autorizacin SYSADM v Autorizacin DBADM v Si el paquete no existe, el privilegio BINDADD y uno de los privilegios siguientes: Privilegio CREATEIN
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

385

db2sqljbind - Vinculador de perfiles SQLJ


Autorizacin IMPLICIT_SCHEMA sobre la base de datos si el nombre de esquema del paquete no existe v Si el paquete existe: Privilegio ALTERIN en el esquema Privilegio BIND en el paquete El usuario tambin necesita todos los privilegios necesarios para compilar las sentencias de SQL estticas de la aplicacin. Los privilegios otorgados a grupos no se utilizan para la comprobacin de autorizaciones de sentencias estticas. Si el usuario tiene autorizacin SYSADM, aunque ningn privilegio explcito para completar el vnculo, el gestor de bases de datos de DB2 otorga automticamente la autorizacin DBADM explcita. Sintaxis del mandato:
db2sqljbind -help

-url jdbc:db2://servidor :puerto

/basedatos

-user ID-usuario

propiedad=valor;

-staticpositioned NO -password contrasea -bindoptions " serie-opciones " -staticpositioned YES

-tracelevel TRACE_SQLJ -tracefile nombre-archivo , -tracelevel TRACE_NONE TRACE_CONNECTION_CALLS TRACE_STATEMENT_CALLS TRACE_RESULT_SET_CALLS TRACE_DRIVER_CONFIGURATION TRACE_CONNECTS TRACE_DRDA_FLOWS TRACE_RESULT_SET_META_DATA TRACE_PARAMETER_META_DATA TRACE_DIAGNOSTICS TRACE_SQLJ TRACE_XA_CALLS TRACE_ALL

nombre-perfil-serializado

serie-opciones:

386

Desarrollo de aplicaciones Java

db2sqljbind - Vinculador de perfiles SQLJ


opciones-DB2-para-z/OS opciones-DB2-Database-para-Linux-UNIX-y-Windows

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

387

db2sqljbind - Vinculador de perfiles SQLJ


Opciones de DB2 para z/OS:
ACTION(REPLACE) (1) ACTION(ADD) EXPLAIN(NO) EXPLAIN(YES) IMMEDWRITE(NO) IMMEDWRITE(PH1) IMMEDWRITE(YES) REPLVER(id-versin) DBPROTOCOL(DRDA) DBPROTOCOL(PRIVATE) ISOLATION(RR) ISOLATION(RS) ISOLATION(CS) ISOLATION(UR) NOREOPT(VARS) REOPT(VARS) OPTHINT(ID-pista) DEGREE(1) DEGREE(ANY)

OWNER(ID-autorizacin) PATH(

, nombre-esquema USER )

QUALIFIER(nombre-calificador)

RELEASE(COMMIT) RELEASE(DEALLOCATE)

SQLERROR(NOPACKAGE) SQLERROR(CONTINUE)

VALIDATE(RUN) VALIDATE(BIND)

Notas: 1 Estas opciones pueden especificarse en cualquier orden.

388

Desarrollo de aplicaciones Java

db2sqljbind - Vinculador de perfiles SQLJ


Opciones de DB2 Database para Linux, UNIX y Windows
(1) BLOCKING UNAMBIG BLOCKING ALL BLOCKING NO FEDERATED NO FEDERATED YES FUNCPATH nombre-esquema DEC 15 DEC 31 DEGREE 1 DEGREE ANY EXPLAIN NO EXPLAIN YES EXPLSNAP NO EXPLSNAP ALL EXPLSNAP YES

INSERT DEF INSERT BUF

ISOLATION CS ISOLATION RR ISOLATION RS ISOLATION UR

OWNER ID-autorizacin

QUALIFIER nombre-calificador

QUERYOPT nivel-optimizacin

SQLERROR NOPACKAGE SQLERROR CONTINUE

SQLWARN YES SQLWARN NO

STATICREADONLY NO STATICREADONLY YES

VALIDATE RUN VALIDATE BIND

Notas: 1 Estas opciones pueden especificarse en cualquier orden. Parmetros del mandato: -help Especifica que db2sqljbind describe todas las opciones a las que da soporte. Si se especifica cualquier otra opcin con -help, no se tiene en cuenta. -url Especifica el URL de la fuente de datos para la que se personalizar el perfil. Este URL se utiliza si las opciones -automaticbind o -onlinecheck son YES. Las partes variables del valor -url son: servidor Nombre de dominio o direccin IP del sistema MVS donde reside el subsistema DB2. puerto Nmero de puerto de servidor TCP/IP asignado al subsistema DB2. El valor por omisin es 446. basedatos Nombre del servidor de bases de datos para el que se va a personalizar el perfil. Si la conexin es con un servidor DB2 para z/OS, el valor de basedatos es el nombre de ubicacin de DB2 que se define durante la instalacin. Todos los caracteres de este valor deben ser caracteres en maysculas. Puede determinar el nombre de ubicacin ejecutando la sentencia de SQL siguiente en el servidor:
SELECT CURRENT SERVER FROM SYSIBM.SYSDUMMY1;

Si la conexin es con un servidor DB2 Database para Linux, UNIX y Windows, basedatos es el nombre de la base de datos que se define durante la instalacin.

Captulo 11. Informacin de consulta sobre JDBC y SQLJ

389

db2sqljbind - Vinculador de perfiles SQLJ


Si la conexin es con un servidor IBM Cloudscape, el valor de basedatos es el nombre totalmente calificado del archivo donde reside la base de datos. Este nombre se debe encerrar entre comillas dobles ("). Por ejemplo:
"c:/databases/testdb"

propiedad=valor; Propiedad de la conexin JDBC. Para conocer las definiciones de estas propiedades consulte Propiedades del controlador IBM DB2 para JDBC y SQLJ. -user ID-usuario Especifica el ID de usuario que se utilizar para conectarse con la fuente de datos para vincular el paquete. -password contrasea Especifica la contrasea que se utilizar para conectarse con la fuente de datos para vincular el paquete. -bindoptions serie-opciones Especifica una lista de opciones, separadas por espacios. Estas opciones tienen la misma funcin que las opciones de precompilacin y vinculacin de DB2 del mismo nombre. Si est preparando un programa para que se ejecute en un sistema DB2 para z/OS, especifique opciones de DB2 para z/OS. Si est preparando el programa para que se ejecute en un sistema DB2 Database para Linux, UNIX y Windows, especifique opciones de DB2 Database para Linux, UNIX y Windows. Notas sobre las opciones de vinculacin: v Especifique VERSION solamente si se cumplen las condiciones siguientes son: Si est vinculando un paquete en un sistema DB2 Database para Linux, UNIX y Windows, el sistema es de la versin 8 o posterior. Ha vuelto a ejecutar el conversor en un programa antes de vincular el paquete asociado con un valor VERSION nuevo. v El valor de STATICREADONLY es YES para los servidores que dan soporte a STATICREADONLY, y NO para los dems servidores. Si se especifica STATICREADONLY YES, DB2 procesa los cursores ambiguos como si fueran cursores de solo lectura. Para la resolucin de problemas de errores de declaracin de iterador, tendr que especificar explcitamente STATICREADONLY NO, o declarar iteradores de forma que no sean ambiguos. Por ejemplo, si desea que un iterador se pueda actualizar de forma no ambigua, declare el iterador para implementar sqlj.runtime.ForUpdate. Si desea un iterador de solo lectura, incluya la clusula FOR READ ONLY en las sentencias SELECT que utilicen el iterador. Importante: especifique solamente las opciones de preparacin del programa que sean adecuadas para la fuente de datos en que se est vinculando el paquete. Algunos valores y valores por omisin de Controlador IBM DB2 para JDBC y SQLJ son distintos de los valores y valores por omisin de DB2. -staticpositioned NO|YES Para los iteradores declarados en el mismo archivo fuente que las sentencias UPDATE de posicin que utilizan los iteradores, especifica si las sentencias UPDATE de posicin se ejecutarn como sentencias vinculadas estticamente. El valor por omisin es NO. NO significa que las sentencias UPDATE de posicin se ejecutan como sentencias preparadas dinmicamente. Este valor debe ser igual que el valor -staticpositioned de la invocacin db2sqljcustomize anterior del perfil serializado.

390

Desarrollo de aplicaciones Java

db2sqljbind - Vinculador de perfiles SQLJ


-tracefile nombre-archivo Habilita el rastreo e identifica el archivo de salida para la informacin de rastreo. Esta opcin debe especificarse solamente bajo la direccin del soporte de software de IBM. -tracelevel Si se especifica -tracefile, se indica qu se debe rastrear mientras se ejecuta db2sqljcustomize. El valor por omisin es TRACE_SQLJ. Esta opcin debe especificarse solamente bajo la direccin del soporte de software de IBM. nombre-perfil-serializado Especifica el nombre de uno o varios perfiles serializados desde los que se ha vinculado el paquete. Un nombre de perfil serializado tiene el formato siguiente:
nombre-programa_SJProfileNmeroID.ser

nombre-programa es el nombre del programa fuente SQLJ, sin la extensin .sqlj. n es un entero comprendido entre 0 y m-1, donde m es el nmero de perfiles serializados generados por el conversor SQLJ desde el programa fuente SQLJ. Si especifica ms de un nombre de perfil serializado para vincular un solo paquete de DB2 a partir de varios perfiles serializados, deber especificar los mismos nombres de perfiles serializados, en el mismo orden, cuando ejecute db2sqljcustomize. Ejemplos:
db2sqljbind -user richler -password mordecai -url jdbc:db2://server:50000/sample -bindoptions "EXPLAIN YES" pgmname_SJProfile0.ser

Notas de uso: Nombres de paquetes generados por db2sqljbind: los nombres de los paquetes creados por db2sqljbind son los nombres especificados utilizando los parmetros -rootpkgname o -singlepkgname al ejecutar db2sqljcustomize. Si no se especific -rootpkgname o -singlepkgname, los nombres de paquetes son los primeros siete bytes del nombre del perfil, a los que se aade el carcter de nivel de aislamiento. Valor DYNAMICRULES para db2sqljbind: la opcin de vinculacin DYNAMICRULES determina cierto nmero de atributos de ejecucin para un paquete de DB2. Dos de esos atributos son el ID de autorizacin que se utiliza para comprobar la autorizacin y el calificador que se utiliza para los objetos no calificados. Para garantizar la autorizacin correcta para las sentencias UPDATE y DELETE de posicin ejecutadas dinmicamente en programas SQLJ, db2sqljbind siempre vincula los paquetes de DB2 con la opcin DYNAMICRULES(BIND). No se puede modificar esta opcin. La opcin DYNAMICRULES(BIND) hace que las sentencias SET CURRENT SQLID y las sentencias SET CURRENT SCHEMA no tengan impacto en un programa SQLJ, ya que estas sentencias solamente afectan a las sentencias dinmicas vinculadas con los valores DYNAMICRULES distintos de BIND. Con DYNAMICRULES(BIND), los nombres de tabla, vista, ndice y alias no calificados en sentencias de SQL dinmicas estn calificados de forma implcita con el valor de la opcin de vinculacin QUALIFIER. Si no especifica QUALIFIER, DB2 utiliza el ID de autorizacin del propietario del paquete como calificador implcito. Si este comportamiento no es adecuado para el programa, podr utilizar una de las tcnicas siguientes para establecer el calificador correcto:
Captulo 11. Informacin de consulta sobre JDBC y SQLJ

391

db2sqljbind - Vinculador de perfiles SQLJ


v Forzar que las sentencias UDPATE y DELETE de posicin se ejecuten estticamente. Para ello, se puede utilizar la opcin -staticpositioned YES de db2sqljcustomize o db2sqljbind si el cursor (iterador) de una sentencia UPDATE o DELETE de posicin est en el mismo paquete que la sentencia UPDATE o DELETE de posicin. v Calificar totalmente los nombres de tablas de DB2 de las sentencias UPDATE y DELETE de posicin. Informacin relacionada: v Mandato BIND en Consulta de mandatos v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375 v db2sqljprint - Impresora de perfiles de SQLJ en la pgina 392 v sqlj - Conversor SQLJ en la pgina 371

db2sqljprint - Impresora de perfiles de SQLJ


db2sqljprint imprime el contenido de una versin de un perfil personalizada para DB2 en texto plano. Autorizacin: Ninguno Sintaxis del mandato:
db2sqljprint nombre del perfil

Parmetros del mandato: nombre del perfil Especifica el nombre relativo o absoluto de un archivo de perfil SQLJ. Cuando un archivo SQLJ se convierte en un archivo fuente Java, la informacin sobre las operaciones de SQL que contiene se almacenan en archivos de recursos generados por SQLJ denominados perfiles. Los perfiles se identifican mediante el sufijo _SJProfileN (siendo N un entero) despus del nombre del archivo de entrada original. Tienen la extensin .ser. Los nombres de los perfiles se pueden especificar con la extensin .ser o sin sta. Ejemplos:
db2sqljprint pgmname_SJProfile0.ser

Informacin relacionada: v db2sqljcustomize - Personalizador de perfiles de SQLJ en la pgina 375 v db2sqljbind - Vinculador de perfiles SQLJ en la pgina 385

392

Desarrollo de aplicaciones Java

Apndice A. Informacin tcnica sobre DB2 Database


Visin general de la informacin tcnica de DB2
La informacin tcnica de DB2 est disponible a travs de las herramientas y los mtodos siguientes: v Centro de informacin de DB2 Temas Ayuda para herramientas de DB2 Programas de ejemplo Guas de aprendizaje v Manuales de DB2 Archivos PDF (descargables) Archivos PDF (del CD en PDF de DB2) manuales en copia impresa v Ayuda de lnea de mandatos Ayuda de mandatos Ayuda de mensajes v Programas de ejemplo IBM proporciona peridicamente actualizaciones de la documentacin. Si accede a la versin en lnea del Centro de informacin de DB2 en ibm.com, no es necesario que instale las actualizaciones de la documentacin porque IBM mantiene actualizada esta versin. Si ha instalado el Centro de informacin de DB2, es recomendable instalar las actualizaciones de la documentacin. Las actualizaciones de la documentacin permiten actualizar la informacin que instal desde el CD del Centro de informacin de DB2 o que descarg de Passport Advantage a medida que informacin nueva pasa a estar disponible. Nota: Los temas del Centro de informacin de DB2 se actualizan con ms frecuencia que los manuales en PDF o impresos. Para obtener la informacin ms actualizada, instale las actualizaciones de la documentacin cuando estn disponibles, o consulte el Centro de informacin de DB2 en ibm.com. Puede acceder a informacin tcnica adicional de DB2 como, por ejemplo, notas tcnicas, White papers y Redbooks en lnea en el sitio ibm.com. Acceda al sitio de la biblioteca de software de gestin de informacin de DB2 en http://www.ibm.com/software/data/sw-library/.

Comentarios sobre la documentacin


Agradecemos los comentarios sobre la documentacin de DB2. Si tiene sugerencias sobre cmo podemos mejorar la documentacin de DB2, enve un correo electrnico a db2docs@ca.ibm.com. El personal encargado de la documentacin de DB2 lee todos los comentarios de los usuarios, pero no puede responder directamente a cada uno. Proporcione ejemplos especficos siempre que sea posible de manera que podamos comprender mejor sus problemas. Si realiza comentarios sobre un tema o archivo de ayuda determinado, incluya el ttulo del tema y el URL.
Copyright IBM Corp. 2006

393

No utilice esta direccin de correo electrnico para contactar con el Servicio al cliente de DB2. Si tiene un problema tcnico de DB2 que no est tratado por la documentacin, consulte al centro local de servicio tcnico de IBM para obtener ayuda. Conceptos relacionados: v Caractersticas del Centro de informacin de DB2 en Centro de informacin de DB2 en lnea v Archivos de ejemplo en Temas de ejemplos Tareas relacionadas: v Invocacin de ayuda de mandatos desde el procesador de lnea de mandatos en Consulta de mandatos v Invocacin de ayuda de mensajes desde el procesador de lnea de mandatos en Consulta de mandatos v Actualizacin del Centro de informacin de DB2 instalado en el sistema o en un servidor de intranet en la pgina 399 Informacin relacionada: v Biblioteca tcnica de DB2 en formato PDF en la pgina 394

Biblioteca tcnica de DB2 en formato PDF


Las tablas siguientes describen la biblioteca de DB2 que est disponible en el Centro de publicaciones de IBM en www.ibm.com/shop/publications/order. Aunque las tablas identifican los manuales en copia impresa disponibles, puede que dichos manuales no estn disponibles en su pas o regin. La informacin de estos manuales es fundamental para todos los usuarios de DB2; esta informacin le resultar til tanto si es un programador o un administrador de bases de datos como si trabaja con DB2 Connect u otros productos de DB2.
Tabla 71. Informacin tcnica de DB2 Nombre Administration Guide: Implementation Administration Guide: Planning Consulta de las API administrativas Vistas y rutinas administrativas SQL Call Level Interface Guide and Reference, Volume 1 Call Level Interface Guide and Reference, Volume 2 Consulta de mandatos Data Movement Utilities Guide and Reference Data Recovery and High Availability Guide and Reference Nmero de documento SC10-4221 SC10-4223 SC11-3192 SC11-3194 SC10-4224 SC10-4225 SC11-3179 SC10-4227 SC10-4228 Copia impresa disponible S S S No S S No S S

394

Desarrollo de aplicaciones Java

Tabla 71. Informacin tcnica de DB2 (continuacin) Nombre Desarrollo de aplicaciones ADO.NET y OLE DB Nmero de documento SC11-3178 Copia impresa disponible S S No S No S S

Desarrollo de aplicaciones de SQL SC11-3190 incorporado Desarrollo de SQL y rutinas externas Desarrollo de aplicaciones Java Desarrollo de aplicaciones Perl y PHP Iniciacin al desarrollo de aplicaciones de bases de datos Iniciacin a la instalacin y administracin de DB2 en Linux y Windows Consulta de mensajes Volumen 1 Consulta de mensajes Volumen 2 Gua de migracin Net Search Extender Gua de administracin y del usuario Nota: El HTML para este documento no se instala desde el CD de documentacin HTML. Performance Guide Query Patroller Administration and Users Guide Gua rpida de iniciacin para clientes DB2 Gua rpida de iniciacin para servidores DB2 Spatial Extender y Geodetic Data Management Feature Gua del usuario y manual de consulta Gua de SQL Consulta de SQL, Volumen 1 Consulta de SQL, Volumen 2 System Monitor Guide and Reference Troubleshooting Guide Gua de aprendizaje de Visual Explain Novedades XML Extender Administracin y programacin XML Guide XQuery Reference SC11-3381 SC11-3189 SC11-3187 SC11-3188 GC11-3195

SC11-3184 SC11-3198 GC11-3196 SH10-9290

No No S S

SC10-4222 GC10-4241 GC11-3182 GC11-3181 SC11-3229

S S No S S

SC11-3191 SC11-3180 SC11-3193 SC10-4251 GC10-4240 SC11-3357 SC11-3185 SC11-3230-00 SC10-4254 SC18-9796

S S S S No No S S S S

Apndice A. Informacin tcnica sobre DB2 Database

395

Tabla 72. Informacin tcnica especfica de DB2 Connect Nombre DB2 Connect Gua del usuario Quick Beginnings for DB2 Connect Personal Edition Gua rpida de iniciacin para servidores DB2 Connect Nmero de documento SC11-3197 GC10-4244 GC11-3183 Copia impresa disponible S S S

Tabla 73. Informacin tcnica de integracin de la informacin de WebSphere Nombre Nmero de documento Copia impresa disponible S

WebSphere Information SC19-1020 Integration: Administration Guide for Federated Systems WebSphere Information Integration: ASNCLP Program Reference for Replication and Event Publishing WebSphere Information Integration: Configuration Guide for Federated Data Sources WebSphere Information Integration: SQL Replication Guide and Reference SC19-1018

SC19-1034

No

SC19-1030

Nota: Las Notas de release de DB2 proporcionan informacin adicional especfica para el release del producto y el nivel de fixpack. Para obtener ms informacin, consulte los enlaces relacionados. Conceptos relacionados: v Visin general de la informacin tcnica de DB2 en la pgina 393 v Acerca de las notas del release en Notas del release Tareas relacionadas: v Pedido de manuales de DB2 en copia impresa en la pgina 396

Pedido de manuales de DB2 en copia impresa


Si necesita manuales de DB2 en copia impresa, puede comprarlos en lnea en varios, pero no en todos los pases o regiones. Siempre puede hacer pedidos de manuales de DB2 en copia impresa a travs del representante local de IBM. Recuerde que algunos manuales en copia software del CD Documentacin en PDF de DB2 no estn disponibles en copia impresa. Por ejemplo, ningn volumen de Consulta de mensajes de DB2 est disponible como manual impreso. Las versiones impresas de muchos de los manuales de DB2 disponibles en el CD de la Documentacin PDF de DB2 se pueden solicitar a IBM por una cantidad. Dependiendo desde dnde realice el pedido, podr solicitar manuales en lnea, desde el Centro de publicaciones de IBM. Si la realizacin de pedidos en lnea no est disponible en su pas o regin, siempre puede hacer pedidos de manuales de

396

Desarrollo de aplicaciones Java

DB2 en copia impresa al representante local de IBM. Tenga en cuenta que no todos los manuales del CD de la Documentacin PDF de DB2 estn disponibles en copia impresa. Nota: La documentacin ms actualizada y completa de DB2 se mantiene en el Centro de informacin de DB2 en el sitio http://publib.boulder.ibm.com/ infocenter/db2help/. Procedimiento: Para hacer pedidos de manuales de DB2 en copia impresa: v Para averiguar si puede hacer pedidos de manuales de DB2 en copia impresa en lnea en su pas o regin, consulte el Centro de publicaciones de IBM en el sitio http://www.ibm.com/shop/publications/order. Debe seleccionar un pas, regin o idioma para poder acceder a la informacin sobre pedidos de publicaciones y, a continuacin, seguir las instrucciones sobre pedidos para su localidad. v Para hacer pedidos de manuales de DB2 en copia impresa a travs del representante local de IBM: Localice la informacin de contacto de su representante local desde uno de los siguientes sitios Web: - El directorio de IBM de contactos en todo el mundo en el sitio www.ibm.com/planetwide - El sitio Web de publicaciones de IBM en el sitio http://www.ibm.com/ shop/publications/order. Tendr que seleccionar su pas, regin o idioma para acceder a la pgina de presentacin de las publicaciones apropiadas para su localidad. Desde esta pgina, siga el enlace Acerca de este sitio. Cuando llame, indique que desea hacer un pedido de una publicacin de DB2. Proporcinele al representante los ttulos y los nmeros de documento de los manuales que desee solicitar . Conceptos relacionados: v Visin general de la informacin tcnica de DB2 en la pgina 393 Informacin relacionada: v Biblioteca tcnica de DB2 en formato PDF en la pgina 394

Visualizacin de la ayuda para estados de SQL desde el procesador de lnea de mandatos


DB2 devuelve un valor de SQLSTATE para las condiciones que pueden ser el resultado de una sentencia de SQL. La ayuda de SQLSTATE explica los significados de los estados de SQL y los cdigos de las clases de estados de SQL. Procedimiento: Para invocar la ayuda para estados de SQL, abra el procesador de lnea de mandatos y entre:
? sqlstate o ? cdigo de clase

donde sqlstate representa un estado de SQL vlido de cinco dgitos y cdigo de clase representa los dos primeros dgitos del estado de SQL.
Apndice A. Informacin tcnica sobre DB2 Database

397

Por ejemplo, ? 08003 visualiza la ayuda para el estado de SQL 08003, y ? 08 visualiza la ayuda para el cdigo de clase 08. Tareas relacionadas: v Invocacin de ayuda de mandatos desde el procesador de lnea de mandatos en Consulta de mandatos v Invocacin de ayuda de mensajes desde el procesador de lnea de mandatos en Consulta de mandatos

Acceso a diferentes versiones del Centro de informacin de DB2


Para obtener los temas de DB2 Versin 9, la URL del Centro de informacin de DB2 es http://publib.boulder.ibm.com/infocenter/db2luw/v9/. Para obtener los temas de DB2 Versin 8, vaya a la URL del Centro de informacin Versin 8 en: http://publib.boulder.ibm.com/infocenter/db2luw/v8/. Tareas relacionadas: v Actualizacin del Centro de informacin de DB2 instalado en el sistema o en un servidor de intranet en la pgina 399

Visualizacin de temas en el idioma preferido en el Centro de informacin de DB2


El Centro de informacin de DB2 intenta visualizar los temas en el idioma especificado en las preferencias del navegador. Si un tema no se ha traducido al idioma preferido, el Centro de informacin de DB2 visualiza dicho tema en ingls. Procedimiento: Para visualizar temas en su idioma preferido en el navegador Internet Explorer: 1. En Internet Explorer, pulse en el botn Herramientas > Opciones de Internet > Idiomas.... Se abrir la ventana Preferencias de idioma. 2. Asegrese de que su idioma preferido est especificado como la primera entrada de la lista de idiomas. v Para aadir un nuevo idioma a la lista, pulse el botn Agregar.... Nota: La adicin de un idioma no garantiza que el sistema tenga los fonts necesarios para visualizar los temas en el idioma preferido. v Para mover un idioma hacia el principio de la lista, seleccione el idioma y pulse el botn Subir hasta que el idioma est en primer lugar en la lista de idiomas. 3. Limpie la antememoria del navegador y, a continuacin, renueve la pgina para visualizar el Centro de informacin de DB2 en su idioma preferido. Para visualizar temas en su idioma preferido en un navegador Firefox o Mozilla: 1. Seleccione el botn Herramientas > Opciones > Idiomas. Se visualizar el panel Idiomas en la ventana Preferencias. 2. Asegrese de que su idioma preferido est especificado como la primera entrada de la lista de idiomas.

398

Desarrollo de aplicaciones Java

v Para aadir un nuevo idioma a la lista, pulse el botn Aadir... a fin de seleccionar un idioma en la ventana Aadir idiomas. v Para mover un idioma hacia el principio de la lista, seleccione el idioma y pulse el botn Subir hasta que el idioma est en primer lugar en la lista de idiomas. 3. Limpie la antememoria del navegador y, a continuacin, renueve la pgina para visualizar el Centro de informacin de DB2 en su idioma preferido. En algunas combinaciones de navegador y sistema operativo, puede que tambin tenga que cambiar los valores regionales del sistema operativo al entorno local y al idioma de su eleccin. Conceptos relacionados: v Visin general de la informacin tcnica de DB2 en la pgina 393

Actualizacin del Centro de informacin de DB2 instalado en el sistema o en un servidor de intranet


Si ha instalado localmente un Centro de informacin de DB2, puede descargar temas actualizados. El valor de 'ltima actualizacin' que se encuentra la final de la mayora de los temas indica el nivel actual de ese tema. Para determinar si hay una actualizacin disponible para todo el Centro de informacin de DB2, busque el valor de 'ltima actualizacin' en la pgina Web inicial del Centro de informacin. Compare el valor contenido en la pgina Web inicial instalada localmente con la fecha de la actualizacin descargable ms reciente contenida en http://www.ibm.com/software/data/db2/udb/support/ icupdate.html. Puede actualizar el Centro de informacin instalado localmente si est disponible una actualizacin descargable ms reciente. Para actualizar el Centro de informacin de DB2 instalado localmente debe: 1. Detener el Centro de informacin de DB2 en el sistema, y reiniciar el Centro de informacin en modalidad autnoma. La ejecucin del Centro de informacin en modalidad autnoma impide que otros usuarios de la red accedan al Centro de informacin, y permite descargar y aplicar actualizaciones. 2. Utilice la funcin Actualizar para determinar si hay paquetes de actualizacin disponibles en IBM. Nota: Tambin existen actualizaciones en CD. Para conocer detalles sobre cmo configurar el Centro de informacin para instalar actualizaciones desde CD, vea los enlaces correspondientes. Si hay paquetes de actualizacin disponibles, utilice la funcin Actualizar para descargar los paquetes. (La funcin actualizar slo est disponible en modalidad autnoma.) 3. Detenga el Centro de informacin autnomo y reinicie el servicio Centro de informacin de DB2 en el sistema. Procedimiento: Para actualizar el Centro de informacin de DB2 instalado en el sistema o en el servidor de intranet: 1. Detenga el servicio Centro de informacin de DB2.

Apndice A. Informacin tcnica sobre DB2 Database

399

v En Windows, pulse en Inicio Panel de control Herramientas administrativas Servicios. Despus, pulse con el botn derecho del ratn en el servicio Centro de informacin de DB2 y seleccione Detener. v En Linux, especifique el mandato siguiente:
/etc/init.d/db2icdv9 stop

2. Inicie el Centro de informacin en modalidad autnoma. v En Windows: a. Abra una ventana de mandatos. b. Navegue a la va de acceso en la que est instalado el Centro de informacin. Por omisin, el Centro de informacin de DB2 est instalado en el directorio C:\Archivos de programa\IBM\Centro de informacin de DB2\Versin 9. c. Ejecute el archivo help_start.bat utilizando la va de acceso completamente calificada para el Centro de informacin de DB2:
<directorio de Centro de informacin de DB2>\doc\bin\help_start.bat

v En Linux: a. Vaya hasta la va de acceso en la que est instalado el Centro de informacin. Por omisin, el Centro de informacin de DB2 est instalado en el directorio /opt/ibm/db2ic/V9. b. Ejecute el script help_start utilizando la va de acceso totalmente calificada del Centro de informacin de DB2:
<directorio del Centro de informacin de DB2>/doc/bin/help_start

Se inicia el navegador Web por omisin de los sistemas para visualizar el Centro de informacin autnomo. 3. Pulse en el botn Actualizar ( ). En la derecha del panel del Centro de informacin, pulse en Buscar actualizaciones. Se visualiza una lista de actualizaciones para la documentacin existente. 4. Para iniciar el proceso de descarga, compruebe las selecciones que desea descargar, despus pulse en Instalar actualizaciones. 5. Cuando finalice el proceso de descarga e instalacin, pulse en Finalizar. 6. Detenga el Centro de informacin autnomo. v En Windows, ejecute el archivo help_end.bat utilizando la va de acceso completamente calificada para el Centro de informacin de DB2:
<directorio de Centro de informacin de DB2>\doc\bin\help_end.bat

Nota: El archivo help_end de proceso por lotes contiene los mandatos necesarios para concluir sin peligro los procesos que se iniciaron mediante el archivo help_start de proceso por lotes. No utilice Control-C ni ningn otro mtodo para concluir help_start.bat. v En Linux, ejecute el script help_end utilizando la va de acceso totalmente calificada del Centro de informacin de DB2:
<directorio del Centro de informacin de DB2>/doc/bin/help_end

Nota: El script help_end contiene los mandatos necesarios para concluir sin peligro los procesos que se iniciaron mediante el script help_start. No utilice ningn otro mtodo para concluir el script help_start. 7. Reinicie el servicio Centro de informacin de DB2. v En Windows, pulse en Inicio Panel de control Herramientas administrativas Servicios. Despus, pulse con el botn derecho del ratn en el servicio Centro de informacin de DB2 y seleccione Inicio.

400

Desarrollo de aplicaciones Java

v En Linux, especifique el mandato siguiente:


/etc/init.d/db2icdv9 start

El Centro de informacin de DB2 actualizado visualiza los temas nuevos y actualizados. Conceptos relacionados: v Opciones de instalacin del Centro de informacin de DB2 en Gua rpida de iniciacin para servidores DB2 Tareas relacionadas: v Instalacin del Centro de informacin de DB2 utilizando el asistente de instalacin de DB2 (Linux) en Gua rpida de iniciacin para servidores DB2 v Instalacin del Centro de informacin de DB2 mediante el Asistente de instalacin de DB2 (Windows) en Gua rpida de iniciacin para servidores DB2

Guas de aprendizaje de DB2


Las guas de aprendizaje de DB2 le ayudan a conocer diversos aspectos de productos DB2. Se proporcionan instrucciones paso a paso a travs de lecciones. Antes de comenzar: Puede ver la versin XHTML de la gua de aprendizaje desde el Centro de informacin en el sitio http://publib.boulder.ibm.com/infocenter/db2help/. Algunas lecciones utilizan datos o cdigo de ejemplo. Consulte la gua de aprendizaje para obtener una descripcin de los prerrequisitos para las tareas especficas. Guas de aprendizaje de DB2: Para ver la gua de aprendizaje, pulse el ttulo. Almacn de datos XML nativos Configure una base de datos DB2 para almacenar datos XML y realizar operaciones bsicas con el almacn de datos XML nativos. Gua de aprendizaje de Visual Explain Analizar, optimizar y ajustar sentencias de SQL para obtener un mejor rendimiento al utilizar Visual Explain. Conceptos relacionados: v Visual Explain overview en Administration Guide: Implementation

Informacin de resolucin de problemas de DB2


Existe una gran variedad de informacin para la resolucin y determinacin de problemas para ayudarle en la utilizacin de productos DB2. Documentacin de DB2 Puede encontrar informacin sobre la resolucin de problemas en la publicacin DB2 Troubleshooting Guide o en la seccin Soporte y resolucin de problemas del Centro de informacin de DB2. En ellas encontrar informacin sobre cmo aislar e identificar problemas
Apndice A. Informacin tcnica sobre DB2 Database

401

utilizando herramientas y programas de utilidad de diagnstico de DB2, soluciones a algunos de los problemas ms habituales y otros consejos sobre cmo solucionar problemas que podra encontrar en los productos DB2. Sitio Web de soporte tcnico de DB2 Consulte el sitio Web de soporte tcnico de DB2 si tiene problemas y desea obtener ayuda para encontrar las causas y soluciones posibles. El sitio de soporte tcnico tiene enlaces a las publicaciones ms recientes de DB2, notas tcnicas, Informes autorizados de anlisis del programa (APAR o arreglos de defectos), fix packs y otros recursos. Puede buscar en esta base de conocimiento para encontrar posibles soluciones a los problemas. Acceda al sitio Web de soporte tcnico de DB2 en la direccin http://www.ibm.com/software/data/db2/udb/support.html Conceptos relacionados: v Introduction to problem determination en Troubleshooting Guide v Visin general de la informacin tcnica de DB2 en la pgina 393

Trminos y condiciones
Los permisos para utilizar estas publicaciones se otorgan sujetos a los siguientes trminos y condiciones. Uso personal: Puede reproducir estas publicaciones para su uso personal, no comercial, siempre y cuando se mantengan los avisos sobre la propiedad. No puede distribuir, visualizar o realizar trabajos derivados de estas publicaciones, o de 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 los avisos sobre la propiedad. No puede realizar trabajos derivativos de estas publicaciones, ni reproducirlas, distribuirlas o visualizarlas, ni de partes de las mismas fuera de su empresa, sin el consentimiento expreso de IBM. Excepto lo expresamente concedido en este permiso, no se conceden otros permisos, licencias ni derechos, explcitos o implcitos, sobre las publicaciones ni sobre ninguna informacin, datos, software u otra propiedad intelectual contenida en el mismo. IBM se reserva el derecho de retirar los permisos aqu concedidos cuando, a su discrecin, el uso de las publicaciones sea en detrimento de su inters o cuando, segn determine IBM, las instrucciones anteriores no se cumplan correctamente. No puede descargar, exportar ni volver a exportar esta informacin excepto en el caso de cumplimiento total con todas las leyes y regulaciones vigentes, incluyendo todas las leyes y regulaciones sobre exportacin de los Estados Unidos. IBM NO GARANTIZA EL CONTENIDO DE ESTAS PUBLICACIONES. LAS PUBLICACIONES SE PROPORCIONAN TAL CUAL Y SIN GARANTA DE NINGUNA CLASE, NI EXPLCITA NI IMPLCITA, INCLUYENDO PERO SIN LIMITARSE A LAS GARANTAS IMPLCITAS DE COMERCIALIZACIN, NO VULNERACIN E IDONEIDAD PARA UN FIN DETERMINADO.

402

Desarrollo de aplicaciones Java

Apndice B. Avisos
Es posible que IBM no comercialice en todos los pases algunos productos, servicios o caractersticas descritos en este manual. Consulte al representante local de IBM para obtener informacin sobre los productos y servicios que actualmente pueden adquirirse en su zona. Cualquier referencia a un producto, programa o servicio de IBM no pretende afirmar ni implicar que slo 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 los derechos de propiedad intelectual de IBM. Sin embargo, es responsabilidad del usuario evaluar y verificar el funcionamiento de cualquier producto, programa o servicio que no sea de IBM. IBM puede tener patentes o solicitudes de patentes en tramitacin que afecten al tema tratado en este documento. La posesin de este documento no confiere ninguna licencia sobre dichas patentes. Puede realizar consultas sobre licencias escribiendo a: IBM Director of Licensing IBM Corporation North Castle Drive Armonk, NY 10504-1785 EE.UU. Para realizar consultas sobre licencias referentes a informacin de doble byte (DBCS), puede ponerse en contacto con el Departamento de Propiedad Intelectual de IBM de su pas/regin o escribir a: IBM World Trade Asia Corporation Licensing 2-31 Roppongi 3-chome, Minato-ku Tokio 106, Japn El prrafo siguiente no es aplicable al Reino Unido ni a ningn pas/regin en donde tales disposiciones sean incompatibles con la legislacin local: INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA ESTA PUBLICACIN TAL CUAL, SIN GARANTA DE NINGUNA CLASE, NI EXPLCITA NI IMPLCITA, INCLUIDAS, PERO SIN LIMITARSE A ELLAS, LAS GARANTAS IMPLCITAS DE NO VULNERACIN DE DERECHOS, COMERCIALIZACIN O IDONEIDAD PARA UN FIN DETERMINADO. Algunos estados no permiten la exclusin de garantas expresas o implcitas en determinadas transacciones, por lo que es posible que esta declaracin no sea aplicable en su caso. Esta publicacin puede contener inexactitudes tcnicas o errores tipogrficos. Peridicamente se efectan cambios en la informacin aqu contenida; dichos cambios se incorporarn a las nuevas ediciones de la publicacin. IBM puede efectuar, en cualquier momento y sin previo aviso, mejoras y cambios en los productos y programas descritos en esta publicacin. Las referencias hechas en esta publicacin a sitios Web que no son de IBM se proporcionan slo para la comodidad del usuario y no constituyen un aval de esos sitios Web. La informacin contenida en estos sitios Web no forma parte de la informacin del presente producto IBM y el usuario es responsable de la utilizacin de dichos sitios.
Copyright IBM Corp. 2006

403

IBM puede utilizar o distribuir cualquier informacin que se le facilite de la manera que considere adecuada, sin contraer por ello ninguna obligacin con el remitente. Los licenciatarios de este programa que deseen obtener informacin sobre l con el fin de habilitar: (i) el intercambio de informacin entre programas creados de forma independiente y otros programas (incluido ste) y (ii) el uso mutuo de la informacin intercambiada, deben ponerse en contacto con: IBM Canada Limited Office of the Lab Director 8200 Warden Avenue Markham, Ontario L6G 1C7 CANAD Dicha informacin puede estar disponible, sujeta a los trminos y condiciones apropiados, incluido en algunos casos el pago de una tarifa. El programa bajo licencia descrito en este documento y todo el material bajo licencia asociado a l, los proporciona IBM segn los trminos del Acuerdo de Cliente de IBM, el Acuerdo Internacional de Programas Bajo Licencia de IBM o cualquier acuerdo equivalente entre el usuario e IBM. Los datos de rendimiento contenidos en este documento se obtuvieron en un entorno controlado. Por lo tanto, los resultados obtenidos en otros entornos operativos pueden variar significativamente. Algunas mediciones pueden haberse realizado en sistemas experimentales y no es seguro que estas mediciones sean las mismas en los sistemas disponibles comercialmente. Adems, algunas mediciones pueden haberse calculado mediante extrapolacin. Los resultados reales pueden variar. Los usuarios del presente manual deben verificar los datos aplicables para su entorno especfico. La informacin referente a productos que no son de IBM se ha obtenido de los proveedores de esos productos, de sus anuncios publicados o de otras fuentes disponibles pblicamente. IBM no ha probado esos productos y no puede confirmar la exactitud del rendimiento, la compatibilidad ni ninguna otra afirmacin referente a productos que no son de IBM. Las preguntas sobre las prestaciones de productos que no son de IBM deben dirigirse a los proveedores de esos productos. Todas las declaraciones de intenciones de IBM estn sujetas a cambio o cancelacin sin previo aviso, y slo representan objetivos. Este manual puede contener ejemplos de datos e informes que se utilizan en operaciones comerciales diarias. Para ilustrarlos de la forma ms completa posible, los ejemplos incluyen nombres de personas, empresas, marcas y productos. Todos estos nombres son ficticios y cualquier similitud con nombres y direcciones utilizados por una empresa real es totalmente fortuita. LICENCIA DE COPYRIGHT: Este manual puede contener programas de aplicaciones de ejemplo escritos en lenguaje fuente, que muestran tcnicas de programacin en diversas plataformas operativas. Puede copiar, modificar y distribuir estos programas de ejemplo como desee, sin pago alguno a IBM con la intencin de desarrollar, utilizar, comercializar o distribuir programas de aplicaciones de acuerdo con la interfaz de programacin

404

Desarrollo de aplicaciones Java

de aplicaciones correspondiente a la plataforma operativa para la que estn escritos los programas de ejemplo. Estos ejemplos no se han probado exhaustivamente bajo todas las condiciones. Por lo tanto, IBM no puede asegurar ni implicar la fiabilidad, utilidad o funcin de estos programas. Cada copia o parte de estos programas de ejemplo o cualquier trabajo derivado debe incluir una nota de copyright como la siguiente: (nombre de la empresa) (ao). Partes de este cdigo proceden de programas de ejemplo de IBM Corp. Copyright IBM Corp. _entre el o los aos_. Reservados todos los derechos.

Marcas registradas
Los nombres de empresas, productos o servicios identificados en la biblioteca de documentacin de DB2 Versin 9 pueden ser marcas registradas o marcas de servicios de International Business Machines Corporation o de otras empresas. La informacin sobre marcas registradas de IBM Corporation en los Estados Unidos y/o en otros pases est ubicada en http://www.ibm.com/legal/copytrade.shtml. Los trminos siguientes son marcas registradas de otras empresas y se han utilizado como mnimo en uno de los documentos de la biblioteca de documentacin de DB2: Microsoft, Windows, Windows NT y el logotipo de Windows son marcas registradas de Microsoft Corporation en los Estados Unidos y/o en otros pases. Intel, Itanium, Pentium y Xeon son marcas registradas de Intel Corporation en los Estados Unidos y/o en otros pases. Java y todas las marcas registradas basadas en Java son marcas registradas de Sun Microsystems, Inc. en los Estados Unidos y/o en otros pases. UNIX es una marca registrada de The Open Group en los Estados Unidos y/o en otros pases. Linux es una marca registrada de Linus Torvalds en los Estados Unidos y/o en otros pases. Otros nombres de empresas, productos o servicios, pueden ser marcas registradas o marcas de servicio de otras empresas.

Apndice B. Avisos

405

406

Desarrollo de aplicaciones Java

ndice A
acceso a paquetes Java JDBC 38 SQLJ 106 actualizaciones Centro de informacin 399 Centro de informacin de DB2 399 en tablas DB2, JDBC 44 actualizaciones por lotes aplicacin JDBC 46 aplicacin SQLJ 116 agrupacin de conexiones JDBC y SQLJ 233 API comparacin de las implementaciones de JDBC 264 API de transacciones Java 224 aplicacin Java personalizacin del entorno 11 aplicacin JDBC actualizaciones de columnas XML 76 actualizaciones por lotes 46 conexin con una fuente de datos 26 consultas por lotes 54 creacin y modificacin de objetos DB2 43 datos XML 75 declaracin de variables 41 ejecucin de SQL 42 ejemplo 23 pasos bsicos 23 recuperacin de datos XML 77 recuperar datos de columnas de identidad 70 trabajo con puntos de rescate 69 utilizacin de SQLJ 138 valor del nivel de aislamiento para 83 aplicacin SQLJ actualizaciones de columnas XML 145 actualizaciones por lotes 116 comentarios 108 control de la ejecucin de sentencias 141 creacin y modificacin de objetos DB2 110 datos XML 145 declaracin de variables 106 DELETE de posicin 110 ejecucin de SQL 109 ejemplo 97 iterador con nombre, utilizacin 121 manejo de errores 150 pasos bsicos 97 recuperacin de datos de tablas DB2 120 recuperacin de datos XML 147 recuperacin de varios conjuntos de resultados de procemientos almacenados 133 Copyright IBM Corp. 2006 aplicacin SQLJ (continuacin) trabajo con puntos de rescate 143 UPDATE de posicin 110 utilizacin de JDBC 138 utilizacin de un iterador desplazable 128 valor del nivel de aislamiento para 149 aplicaciones soportado por Java 2 Platform, Enterprise Edition 222 applets creacin de JDBC 169 creacin de SQLJ 173 ejemplos de JDBC 181 ejemplos de SQLJ 187 temas para utilizar 175 aviso de SQL manejo en JDBC 88, 92 manejo en SQLJ 150 avisos 403 ayuda para sentencias de SQL 397 visualizacin 398 clusula de declaracin de iterador, SQLJ 288 clusula de declaracin de iterador de SQLJ 288 clusula de sentencia, SQLJ 291 clusula de sentencia de SQLJ 291 clusula ejecutable, SQLJ 290 clusula implements, SQLJ 285 clusula SET-TRANSACTION, SQLJ 293 clusula SET-TRANSACTION de SQLJ 293 clusula SQLJ 284 clusula with, SQLJ 286 CLI (interfaz a nivel de llamada) archivos de rastreo 212 recurso de rastreo 206 CLI/ODBC/JDBC rastreo archivos 212 recurso 206 cdigos de error, JDBC para errores del Controlador IBM DB2 para JDBC y SQLJ 368 columna LOB eleccin de datos Java compatibles, JDBC 65 eleccin de tipos de datos Java compatibles, SQLJ 135 columnas de identidad recuperar datos de, JDBC 70 columnas XML actualizaciones aplicaciones JDBC 76 aplicaciones SQLJ 145 com.ibm.db2.jcc.DB2BaseDataSource mtodos 321 propiedades 321 com.ibm.db2.jcc.DB2DatabaseMetaData mtodos 321 com.ibm.db2.jcc.DB2Diagnosable mtodos 321 com.ibm.db2.jcc.DB2Driver mtodos 321 com.ibm.db2.jcc.DB2ExceptionFormatter mtodos 321 com.ibm.db2.jcc.DB2JccDataSource mtodos 321 com.ibm.db2.jcc.DB2SimpleDataSource mtodos 321 propiedades 321 com.ibm.db2.jcc.DB2Sqlca mtodos 321 comentarios aplicacin SQLJ 108 Concentrador de conexiones JDBC 235 conectividad de tipo 2 para el Controlador IBM DB2 para JDBC y SQLJ cundo se utiliza 35

B
BatchUpdateException recuperar informacin de, JDBC 90

C
Centro de informacin actualizacin 399 versiones 398 visualizacin en distintos idiomas 398 Centro de informacin de DB2 actualizacin 399 versiones 398 visualizacin en distintos idiomas 398 cierre de la conexin fuente de datos JDBC 96 fuente de datos SQLJ 151 clase DB2ClientRerouteServerList 325 clase DB2ConnectionPoolDataSource 339 clase DB2ExceptionFormatter 342 clase DB2JCCPlugin 343 clase DB2PooledConnection 343 clase DB2SimpleDataSource 347 clase DB2Sqlca 348 clase DB2XADataSource 353 clusula de asignacin, SQLJ 294 clusula de contexto, SQLJ 291 clusula de conversin a iterador, SQLJ 295 clusula de declaracin de conexin, SQLJ 287

407

conectividad de tipo 4 para el Controlador IBM DB2 para JDBC y SQLJ cundo se utiliza 35 conexin con fuente de datos utilizando DriverManager Controlador JDBC de DB2 de tipo 2 28 con fuente de datos utilizando SQLJ 100 con una fuente de datos utilizando DataSource 33 con una fuente de datos utilizando DriverManager Controlador IBM DB2 para JDBC y SQLJ 30 conexiones uso en JDBC 36 configuracin de Java Acceso a DB2 de servidores de z/OS 16 configuracin de JDBC Acceso a DB2 de servidores de z/OS 16 confirmacin transaccin JDBC 83 transaccin SQLJ 149 conjunto de resultados actualizable JDBC 55 conjunto de resultados con capacidad de retencin, JDBC 55 conjunto de resultados desplazable JDBC 55 restriccin para tipos de datos 55 consultas por lotes aplicacin JDBC 54 contacto con IBM 409 contenedores Java 2 Platform, Enterprise Edition 222 contexto de ejecucin SQLJ 141 control de la ejecucin de sentencias SQLJ 141 Controlador IBM DB2 para clases de JDBC y SQLJ DB2ClientRerouteServerList 325 DB2ConnectionPoolDataSource 339 DB2ExceptionFormatter 342 DB2JCCPlugin 343 DB2PooledConnection 343 DB2SimpleDataSource 347 DB2Sqlca 348 DB2XADataSource 353 Controlador IBM DB2 para el concentrador de conexiones de JDBC y SQLJ habilitacin 236 tcnicas de supervisin 238 Controlador IBM DB2 para interfaces de JDBC y SQLJ DB2Connection 326 DB2Diagnosable 341 DB2RowID 347 DB2Statement 349 DB2SystemMonitor 350

Controlador IBM DB2 para interfaces de JDBC y SQLJ (continuacin) DB2Xml 355 Controlador IBM DB2 para JDBC y SQLJ cdigos de error para errores del controlador 368 conexin con una fuente de datos interfaz DriverManager 30 configuracin para el acceso a DB2 de servidores de z/OS 16 datos de rastreo, recopilacin 195 DB2PreparedStatement 347 DB2T4XAIndoubtUtil 17 determinacin de la versin y el entorno 370 diagnstico de problemas de JDBC 195 diagnstico de problemas de SQLJ 195 ejemplo, programa de rastreo 199 ejemplo, rastreo con parmetros de configuracin 198 especificacin de la versin 370 informacin de cliente ampliada 73 instalacin 4 manejo de SQLException 84 propiedades 249 ROWID, JDBC 67 ROWID, SQLJ 141 seguridad 154 seguridad basada en el ID de usuario y en la contrasea 156 seguridad basada slo en el ID de usuario 158 seguridad Kerberos 160 seguridad mediante ID de usuario cifrado o contrasea cifrada 158 soporte de contexto fiable 165 soporte de LOB, JDBC 63 soporte de LOB, SQLJ 134 soporte de redireccionamiento del cliente 93 soporte del plugin de seguridad 163 SQLSTATE para errores del controlador 369 controlador JDBC de DB2 1 Controlador JDBC de DB2 de tipo 2 conexin con fuente de datos interfaz DriverManager 28 manejo de SQLException 91 seguridad 153 Controlador JDBC de DB2 Universal mtodos definidos solo en 321 Conversor SQLJ, mandato 371 Conversor SQLJ de DB2, mandato 371 correlaciones de tipos de datos Java, JDBC y SQL 243 creacin objetos DB2, JDBC 43 objetos DB2, SQLJ 110

DB2 para servidores de z/OS configuracin para el acceso desde programas Java 16 db2sqljbind, mandato 385 DB2T4XAIndoubtUtil transacciones distribuidas con DB2 UDB para z/OS V7 17 declaracin variables en aplicacin SQLJ 106 variables en una aplicacin JDBC 41 DELETE de posicin SQLJ 110 deregisterDB2XMLObject 81 desarrollo de aplicaciones software de Java soportado 3 desarrollo de aplicaciones Java software soportado 3 determinacin de problemas guas de aprendizaje 401 informacin en lnea 401 documentacin 393, 394 trminos y condiciones de uso 402

E
ejecucin SQL en una aplicacin JDBC 42 SQL en una aplicacin SQLJ 109 ejemplo deregisterDB2XMLObject 81 registerDB2XMLSchema 81 ejemplos Java WebSphere 192 JDBC 181 plugin de Java 191 SQLJ 187 eliminacin de esquema XML Java 81 Enterprise Java Beans 230 equilibrado de la carga de trabajo de Sysplex JDBC 235 errores manejo en SQLJ 150 expresin de sistema principal, SQLJ 106, 284

F
fuente de datos recuperacin de datos sobre, JDBC 39 fuentes de datos conectar con JDBC 26

G
guas de aprendizaje determinacin y resolucin de problemas 401 Visual Explain 401

D
datos XML aplicaciones JDBC 75 aplicaciones SQLJ 145

408

Desarrollo de aplicaciones Java

H
HP-UX configuracin del entorno de Java 20

I
informacin de cliente ampliada Controlador IBM DB2 para JDBC y SQLJ 73 instalacin Controlador IBM DB2 para JDBC y SQLJ 4 interfaz DataSource SQLJ 103 interfaz DB2Connection 326 interfaz DB2Diagnosable 341 interfaz DB2PreparedStatement 347 interfaz DB2RowID 347 interfaz DB2Statement 349 interfaz DB2SystemMonitor 350 interfaz DB2Xml 355 interfaz DriverManager SQLJ 100 iterador con nombre, SQLJ 121 de posicin, SQLJ 123 desplazable, SQLJ 128 obtencin de conjuntos de resultados JDBC a partir 138 iterador de conjunto de resultados declaracin pblica en archivo separado 138 restricciones referentes a la declaracin 124 iterador de posicin aplicacin SQLJ 123 pasado como variable, SQLJ 115 iterador desplazable restricciones para tipos de datos 128 utilizacin en una aplicacin SQLJ 128 iteradores con nombre en aplicaciones SQLJ 121

J
Java applets, temas para utilizar 175 archivos de ejemplo de plugins 191 archivos de ejemplo de WebSphere 192 configuracin del entorno de HP-UX 20 creacin aplicaciones JDBC 170 aplicaciones SQLJ 174 applets de JDBC 169 applets de SQLJ 173 creacin de rutinas JDBC 171 creacin de rutinas SQLJ 177 ejemplos de JDBC 181 ejemplos de SQLJ 187 Enterprise Java Beans 230 Java 2 Platform, Enterprise Edition requisitos de base de datos 223 servidor 223

Java (continuacin) Java 2 Platform, Enterprise Edition (continuacin) visin general 221 Java 2 Platform, Enterprise Edition contenedores 222 Enterprise Java Beans 230 gestin de transacciones 224 requisitos 223 servidor 223 soporte de aplicaciones 222 visin general 221 Java Naming and Directory Interface (JNDI) 223 JDBC acceso a paquetes Java para 38 actualizacin de datos de tablas DB2 44 agrupacin de conexiones 233 cierre de la conexin con una fuente de datos 96 comparacin del soporte del controlador DB2 264 concentrador de conexiones 235 conexin con una fuente de datos, interfaz DataSource 33 configuracin 11 conjunto de resultados actualizable 55 conjunto de resultados con capacidad de retencin 55 conjunto de resultados desplazable 55 Controlador IBM DB2 para JDBC y SQLJ manejo de errores 84 Controlador JDBC de DB2 de tipo 2 manejo de errores 91 controladores soportados 1 correlaciones de tipos de datos 243 diagnstico de problemas, Controlador IBM DB2 para JDBC y SQLJ 195 diferencias, controladores JDBC 358 equilibrado de la carga de trabajo de Sysplex 235 llamada a procedimientos almacenados 58 manejo de un aviso de SQL 88, 92 objetos DataSource creacin y despliegue 37 procedimiento almacenado, recuperacin de varios conjuntos de resultados 60 recuperacin de datos de tablas DB2 51, 52 recuperacin de la informacin sobre parmetros de sentencias 45 recuperacin de la informacin sobre un conjunto de resultados ResultSet 50 tipos diferenciados, uso 68 transaccin, confirmar 83 transaccin, retrotraer 83 transaccin distribuida 225 uso de una conexin 36

JDBC (conectividad de base de datos Java) applets, temas para utilizar 175 Controlador IBM DB2 para JDBC y SQLJ instalacin 4 creacin de aplicaciones 170 creacin de applets 169 creacin de rutinas 171 ejemplos 181 JDBC ResultSet Controlador IBM DB2 para JDBC y SQLJ 48 JNDI (Java Naming and Directory Interface) 223 JTA 224 JTS 224

M
mandato db2sqljcustomize 375 mandato db2sqljprint 392 mandato Personalizador de perfil SQLJ de DB2 375, 392 mandatos Conversor SQLJ de DB2 371 db2sqljbind 385 db2sqljcustomize 375 db2sqljprint 392 sqlj 371 Vinculador de perfiles SQLJ de DB2 385 manuales imprimidos solicitud 396 marcadores de parmetros recuperacin de la informacin sobre, JDBC 45 modificacin objetos DB2, JDBC 43 modificar objetos DB2, SQLJ 110

N
nivel de aislamiento valor para la aplicacin JDBC 83 valor para la aplicacin SQLJ 149 nombres de variables de SQLJ restricciones 107

O
objetos DataSource, JDBC creacin y despliegue 37 objetos grandes (LOB) Controlador IBM DB2 para JDBC y SQLJ 63, 134

P
parmetros de XML invocacin de rutinas desde programas Java 80 plugin de seguridad soporte de JDBC 163 ndice

409

plugins ejemplos de Java 191 PreparedStatement, mtodos de sentencias de SQL sin marcadores de parmetros 45 procedimiento almacenado recuperacin de varios conjuntos de resultados, aplicacin SQLJ 133 recuperar conjuntos de resultados 133 procedimientos almacenados llamada JDBC 58 SQLJ 132 recuperacin de varios conjuntos de resultados, JDBC 60 programa de rastreo ejemplo de Controlador IBM DB2 para JDBC y SQLJ 199 programa de utilidad DB2Binder 9 programa de utilidad DB2LobTableCreator 10 propiedades Controlador IBM DB2 para JDBC y SQLJ 249 propiedades, JDBC configuracin parmetros 11 propiedades de configuracin JDBC 11 puntos de rescate creacin, JDBC 69 creacin, SQLJ 143 liberacin, JDBC 69 liberacin, SQLJ 143

recuperar informacin de BatchUpdateException 90 registerDB2XMLSchema 81 registro de esquema XML Java 81 resolucin de problemas guas de aprendizaje 401 informacin en lnea 401 restriccin para tipos de datos conjunto de resultados desplazable 55 iterador desplazable 128 restricciones nombres de variables de SQLJ 107 ResultSet Controlador IBM DB2 para JDBC y SQLJ 48 retrotraccin hasta punto de rescate, JDBC 69 hasta punto de rescate, SQLJ 143 transaccin JDBC 83 transaccin SQLJ 149 ROWID Controlador IBM DB2 para JDBC y SQLJ 67, 141 rutinas invocacin desde programas Java parmetros de XML 80

S
SDK para Java configuracin del entorno de HP-UX Java 20 seguridad basada slo en el ID de usuario Controlador IBM DB2 para JDBC y SQLJ 158 Controlador IBM DB2 para JDBC y SQLJ 154 Controlador JDBC de DB2 de tipo 2 153 ID de usuario cifrado o contrasea cifrada Controlador IBM DB2 para JDBC y SQLJ 158 ID de usuario y contrasea Controlador IBM DB2 para JDBC y SQLJ 156 Kerberos Controlador IBM DB2 para JDBC y SQLJ 160 preparacin del programa SQLJ 167 sentencias de SQL visualizacin de ayuda 397 servicio de transacciones Java 224 solicitud de manuales de DB2 396 soporte de aplicaciones Java 1 introduccin 1 soporte de contexto soporte de JDBC 165 soporte de redireccionamiento del cliente Controlador IBM DB2 para JDBC y SQLJ 93 SQLJ acceso a paquetes Java para 106 agrupacin de conexiones 233

R
rastreo con parmetros de configuracin Controlador IBM DB2 para JDBC y SQLJ, ejemplo 198 rastreos CLI/ODBC/JDBC 206 recuperacin de datos de tablas DB2, JDBC 51, 52 de tablas DB2, SQLJ 120 utilizacin de iterador con nombre, SQLJ 121 utilizacin de iterador de posicin, SQLJ 123 utilizando varias instancias abiertas de un iterador, SQLJ 127 utilizando varios iteradores para una tabla DB2, SQLJ 126 recuperacin de datos XML aplicacin SQLJ 147 aplicaciones JDBC 77 recuperacin de informacin sobre una fuente de datos JDBC 39 recuperacin de la informacin sobre conjuntos de resultados JDBC 50 recuperacin de la informacin sobre marcadores de parmetros JDBC 45

SQLJ (continuacin) aplicaciones opciones de compilacin en UNIX 176 opciones de compilacin en Windows 177 cerrar conexin con fuente de datos 151 conexin con una fuente de datos 100 contexto de ejecucin 141 diagnstico de problemas, Controlador IBM DB2 para JDBC y SQLJ 195 diferencias, controladores JDBC 366 expresin de sistema principal 106 iterador de posicin, pasado como variable 115 llamada a procedimientos almacenados 132 manejo de un aviso de SQL 150 rutinas opciones de compilacin en UNIX 179 opciones de compilacin en Windows 180 seguridad, preparacin del programa 167 tipos diferenciados, utilizacin 143 transaccin, confirmar 149 transaccin, retrotraer 149 uso de la conexin por omisin 105 uso de la interfaz DataSource 103 uso de la interfaz DriverManager 100 varias instancias de un iterador 127 varios iteradores para una tabla 126 SQLJ, clases sqlj.runtime.AsciiStream 308 sqlj.runtime.BinaryStream 309 sqlj.runtime.CharacterStream 309 sqlj.runtime.ExecutionContext 311 sqlj.runtime.SQLNullException 319 sqlj.runtime.StreamWrapper 319 sqlj.runtime.UnicodeStream 320 SQLJ, clusula de asignacin 294 SQLJ, clusula de contexto 291 SQLJ, clusula de conversin a iterador 295 SQLJ, clusula de declaracin de conexin 287 SQLJ, clusula ejecutable 290 SQLJ, clusula implements 285 SQLJ, clusula with 286 SQLJ, expresin de sistema principal 284 SQLJ, interfaces sqlj.runtime.ConnectionContext 297 sqlj.runtime.ForUpdate 301 sqlj.runtime.NamedIterator 302 sqlj.runtime.PositionedIterator 302 sqlj.runtime.ResultSetIterator 303 sqlj.runtime.Scrollable 306 sqlj, mandato 371 SQLJ (SQL incorporado para Java) aplicaciones creacin 174

410

Desarrollo de aplicaciones Java

SQLJ (SQL incorporado para Java) (continuacin) applets creacin 173 applets, temas para utilizar 175 creacin de rutinas 177 ejemplos 187 sqlj.runtime Resumen de interfaces y clases 295 sqlj.runtime.AsciiStream, clase 308 sqlj.runtime.BinaryStream, clase 309 sqlj.runtime.CharacterStream, clase 309 sqlj.runtime.ConnectionContext, interfaz 297 sqlj.runtime.ExecutionContext, clase 311 sqlj.runtime.ForUpdate, interfaz 301 sqlj.runtime.NamedIterator, interfaz 302 sqlj.runtime.PositionedIterator, interfaz 302 sqlj.runtime.ResultSetIterator, interfaz 303 sqlj.runtime.Scrollable, interfaz mtodos 306 sqlj.runtime.SQLNullException, clase 319 sqlj.runtime.StreamWrapper, clase 319 sqlj.runtime.UnicodeStream, clase 320 SQLJ y JDBC en la misma aplicacin 138 SQLSTATE cdigos emitidos por el Controlador IBM DB2 para JDBC SQLJ 369 supervisin del sistema, Controlador IBM DB2 para JDBC y SQLJ 203

versin del controlador Controlador IBM DB2 para JDBC y SQLJ 370 Vinculador de perfiles SQLJ de DB2, mandato 385 Visual Explain gua de aprendizaje 401

W
Windows aplicaciones SQLJ opciones de compilacin rutinas SQLJ opciones de compilacin 177 180

T
trminos y condiciones uso de publicaciones 402 tipo de controlador JDBC definicin 1 tipos de datos y cursores desplazables restricciones 55, 128 tipos diferenciados en aplicaciones JDBC 68 en aplicaciones SQLJ 143 transacciones distribuidas ejemplo 225

U
UNIX aplicaciones SQLJ opciones de compilacin rutinas SQLJ opciones de compilacin UPDATE de posicin SQLJ 110 176 179

V
varios conjuntos de resultados recuperacin, aplicacin SQLJ 133 recuperar de un procedimiento almacenado 133

ndice

411

412

Desarrollo de aplicaciones Java

Cmo ponerse en contacto con IBM


Para ponerse en contacto con IBM en su pas o regin, consulte IBM Directory of Worldwide Contacts en el sitio http://www.ibm.com/planetwide Para obtener ms informacin sobre productos DB2, vaya a http://www.ibm.com/software/data/db2/.

Copyright IBM Corp. 2006

413

414

Desarrollo de aplicaciones Java

SC11-3189-00

Spine information:

IBM DB2

DB2 Versin 9

Desarrollo de aplicaciones Java

Vous aimerez peut-être aussi