db2 Java
db2 Java
DB2 Versin 9
para Linux, UNIX y Windows
SC11-3189-00
DB2
DB2 Versin 9
para Linux, UNIX y Windows
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
28
30 33
35 36 37 38 39 41 42 42 43 48
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 . .
. . . . . . . .
156 158
167
iv
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
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 . .
358
Contenido
vi
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
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
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
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
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
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:
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
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
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.
10
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
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
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
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
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
-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
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
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
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");
24
// 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
3a y 3b 4a y 4b 5
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
26
Aplicacin Java
DriverManager o DataSource
Controlador* JDBC
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.
27
Aplicacin Java
DriverManager o DataSource
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
28
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
29
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
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
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
32
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
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
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
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
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
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
36
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
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
38
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
39
v v v v v
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
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
41
v Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones JDBC en la pgina 243
42
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
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.
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
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
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
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
46
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
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
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:
49
v Especificacin de las capacidades de actualizacin, desplazamiento y retencin para conjuntos de resultados en aplicaciones de JDBC en la pgina 55
50
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
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
52
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
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
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
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
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.
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.
58
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.
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
60
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
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
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
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);
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);
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
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
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
68
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
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
70
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.
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();
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
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.
73
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
75
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
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
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
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
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
// 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
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
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
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 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
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
// // // // //
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)
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
88
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
89
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
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
92
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
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
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);
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
95
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
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"); }
98
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(); } }
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
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");
100
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.
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
#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);
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
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
106
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.
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
108
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
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
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
110
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
// 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:
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
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.
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 };
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
116
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
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.
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
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
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
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
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
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
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
... 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
127
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
128
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
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
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
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
131
Conceptos relacionados: v Recuperacin de varios conjuntos de resultados de un procedimiento almacenado en una aplicacin SQLJ en la pgina 133
132
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.
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
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
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:
135
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
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)};
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)};
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
137
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
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
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.
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
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
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
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:
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
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
144
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
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.
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
#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.
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
Conceptos relacionados: v Puntos de salvaguarda en aplicaciones SQLJ en la pgina 143 Tareas relacionadas:
149
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
150
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
Tareas relacionadas: v Conexin a una fuente de datos utilizando SQLJ en la pgina 100
151
152
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
// 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
154
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
GSSPLUGIN
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
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
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
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
160
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/[email protected]"); // 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/[email protected]"); // 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
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/[email protected]"); // 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
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/[email protected]"); // 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:
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
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
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);
166
// 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.
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
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)
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
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
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
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)
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
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
174
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
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
"${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
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
-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
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
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
"${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
-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
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.
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.
AdmCmdOnlineBackup.java
AdmCmdUpdateCfg.java
182
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.
DbRsHold.java
GetLogs.java
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
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
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
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.
UDFDrop.db2
UDFCreate.db2 UDFjcli.java
UDFjsrv.java udfjcat
UDFjDrop.db2
CreateEmployee.java GeneratePayroll.java
186
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.
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
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.
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
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
UDFsrv.java udfcat
UDFDrop.db2
UDFCreate.db2 UDFjcli.sqlj
UDFjsrv.java udfjcat
UDFjDrop.db2
190
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.
BlobClobDemo.sqlj createRegisterDS.java
CreateDemoSchema.sqlj
DbConnDataSource.sqlj
DbConMDataSources.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
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
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
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
193
194
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
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
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
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
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)
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
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)
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
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.
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
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 + ";";
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
206
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
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
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
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:
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
212
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
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
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
52 53
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" )
217
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
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
221
222
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
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.
224
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
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
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)
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
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)
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
230
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;
232
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
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
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
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
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
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
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
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
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
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[]
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
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)
VARGRAPHIC(m)
java.lang.String
byte[]
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
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
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
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
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
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
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
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.
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
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
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
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
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
264
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
Tabla 35. Soporte de JDBC de DB2 para mtodos Blob Soporte del Controlador IBM DB2 para JDBC y SQLJ S S S S
1
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
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
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
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
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
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
S S S S
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
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:
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
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
268
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
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
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
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
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
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
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
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
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
274
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:
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
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
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:
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
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
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
No S S
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
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
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
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
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
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
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
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
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
282
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
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
Tabla 59. Soporte de JDBC de DB2 para mtodos XAConnection Soporte del Controlador IBM DB2 para JDBC y SQLJ
1
Mtodo de JDBC
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
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
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
Descripcin:
284
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
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.
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
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
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
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
288
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-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
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
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
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
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-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
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.
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.
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
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
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
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
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
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
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
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
304
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
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
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
306
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:
307
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)
308
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
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
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()
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
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
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
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.
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
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
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
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()
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)
320
corriente-entrada Objeto InputStream que SQLJ interpreta como objeto UnicodeStream . longitud Longitud del objeto InputStream que SQLJ interpreta como objeto UnicodeStream.
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");
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.
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
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)
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
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
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
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
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 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
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
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
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
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
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
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.
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
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.
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
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:
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
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)
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
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
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:
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
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
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
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 una matriz, cuyos elementos contienen un SQLERRD de SQLCA. getSqlErrmc Formato:
public abstract String getSqlErrmc()
348
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 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.
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
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
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
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
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, 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
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
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
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
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:
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
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
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
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
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
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
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
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
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
371
-compile=true -compile=false
-linemap=NO -linemap=YES
-ser2class
-status
-version
-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
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
-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
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
375
-storebindoptions
-collection nombre-coleccin
-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
OPTHINT(ID-sugerencia)
OWNER(ID-autorizacin) PATH(
, nombre-esquema USER )
SQLERROR(NOPACKAGE) SQLERROR(CONTINUE)
VALIDATE(RUN) VALIDATE(BIND)
377
OWNER ID-autorizacin
QUALIFIER nombre-calificador
QUERYOPT nivel-optimizacin
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
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.
379
380
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
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.
381
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
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
384
385
/basedatos
-user ID-usuario
propiedad=valor;
-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
387
OWNER(ID-autorizacin) PATH(
, nombre-esquema USER )
QUALIFIER(nombre-calificador)
RELEASE(COMMIT) RELEASE(DEALLOCATE)
SQLERROR(NOPACKAGE) SQLERROR(CONTINUE)
VALIDATE(RUN) VALIDATE(BIND)
388
OWNER ID-autorizacin
QUALIFIER nombre-calificador
QUERYOPT nivel-optimizacin
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.
389
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
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
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
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
394
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
No No S S
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
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
396
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
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
398
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
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
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
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
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
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
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
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
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
413
414
SC11-3189-00
Spine information:
IBM DB2
DB2 Versin 9