db2a1z90
TRANSCRIPT
![Page 1: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/1.jpg)
DB2®
Desarrollo de aplicaciones de SQL incorporado
DB2 Versión 9
para Linux, UNIX y Windows
SC11-3190-00
���
![Page 2: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/2.jpg)
![Page 3: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/3.jpg)
DB2®
Desarrollo de aplicaciones de SQL incorporado
DB2 Versión 9
para Linux, UNIX y Windows
SC11-3190-00
���
![Page 4: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/4.jpg)
Antes de utilizar esta información y el producto al que da soporte, asegúrese de leer la información general incluida en el
apartado Avisos.
Información sobre la edición
Esta publicación es la traducción del original inglés DB2 Version 9 for Linux, UNIX, and Windows Developing
Embedded SQL Applications, (SC10-4232-00).
Este documento contiene información sobre productos patentados de IBM. Se proporciona según un acuerdo de
licencia y está protegido por la ley de la propiedad intelectual. La presente publicación no incluye garantías del
producto y las declaraciones que contiene no deben interpretarse como tales.
Puede realizar pedidos de publicaciones en línea o a través del representante de IBM de su localidad.
v Para realizar pedidos de publicaciones en línea, 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 número
1-800-IBM-4YOU (426-4968).
Cuando envía información a IBM, otorga a IBM un derecho no exclusivo para utilizar o distribuir dicha información
en la forma en que IBM considere adecuada, sin contraer por ello ninguna obligación con el remitente.
© Copyright International Business Machines Corporation 1993, 2006. Reservados todos los derechos.
![Page 5: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/5.jpg)
Contenido
Parte 1. Desarrollo de aplicaciones
cliente de SQL incorporado . . . . . 1
Capítulo 1. Introducción a SQL
incorporado . . . . . . . . . . . . . 3
Introducción a SQL incorporado . . . . . . . . 3
Incorporación de sentencias de SQL en un lenguaje
principal . . . . . . . . . . . . . . . . 4
Incorporación de sentencias de SQL en un
lenguaje principal . . . . . . . . . . . . 4
Sentencias de SQL incorporado en aplicaciones C
y C++ . . . . . . . . . . . . . . . 5
Sentencias de SQL incorporado en aplicaciones
COBOL . . . . . . . . . . . . . . . 7
Sentencias de SQL incorporado en aplicaciones
FORTRAN . . . . . . . . . . . . . . 8
Sentencias de SQL incorporado en aplicaciones
REXX . . . . . . . . . . . . . . . . 9
Software de desarrollo soportado para aplicaciones
de SQL incorporado . . . . . . . . . . . 12
Configuración del entorno de desarrollo de SQL
incorporado . . . . . . . . . . . . . . 12
Capítulo 2. Diseño de aplicaciones de
SQL incorporado . . . . . . . . . . 15
Diseño de aplicaciones de SQL incorporado . . . 15
Uso de SQL estático . . . . . . . . . . . 16
Uso de SQL dinámico . . . . . . . . . . . 18
Consideraciones sobre autorización para SQL
incorporado . . . . . . . . . . . . . . 19
Ejecución de sentencias de SQL estático y dinámico
en aplicaciones de SQL incorporado . . . . . . 20
Ejecución de sentencias de SQL estático y
dinámico en aplicaciones de SQL incorporado . . 20
Sentencias dinámicas de SQL incorporado . . . 21
Determinación del momento en que deben
ejecutarse sentencias de SQL estática o
dinámicamente en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 22
Rendimiento de aplicaciones de SQL incorporado . 25
Soporte de 32 bits y 64 bits para aplicaciones de
SQL incorporado . . . . . . . . . . . . 26
Restricciones en aplicaciones SQL incorporadas . . 27
Restricciones sobre juegos de caracteres cuando
se utiliza C y C++ para programar aplicaciones
de SQL incorporado . . . . . . . . . . 27
Restricciones en el uso de COBOL para
programar aplicaciones de SQL incorporado . . 28
Restricciones en el uso de FORTRAN para
programar aplicaciones de SQL incorporado . . 29
Restricciones en el uso de REXX para programar
aplicaciones de SQL incorporado . . . . . . 30
Recomendaciones para desarrollar aplicaciones
de SQL incorporado con XML y XQuery . . . . 30
Transacciones simultáneas y acceso a base de datos
de varias hebras en aplicaciones de SQL
incorporado . . . . . . . . . . . . . . 31
Transacciones simultáneas y acceso a base de
datos de varias hebras en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 31
Recomendaciones para utilizar varias hebras . . 34
Consideraciones sobre la página de códigos y el
código de país o región para aplicaciones UNIX
de varias hebras . . . . . . . . . . . . 35
Resolución de problemas de aplicaciones de SQL
incorporado de varias hebras . . . . . . . 36
Capítulo 3. Programación de
aplicaciones de SQL incorporado . . . 39
Programación de aplicaciones de SQL incorporado 42
Archivos fuente de SQL incorporado . . . . . . 43
Plantilla de aplicación de SQL incorporado en C . . 44
Archivos de inclusión y definiciones necesarios para
aplicaciones de SQL incorporado . . . . . . . 47
Archivos de inclusión y definiciones necesarios
para aplicaciones de SQL incorporado . . . . 47
Archivos include para aplicaciones de SQL
incorporado C y C++ . . . . . . . . . . 48
Archivos include para aplicaciones de SQL
incorporado COBOL . . . . . . . . . . 50
Archivos include para aplicaciones de SQL
incorporado FORTRAN . . . . . . . . . 53
Declaración de la SQLCA para el manejo de errores 56
Manejo de errores utilizando la sentencia
WHENEVER . . . . . . . . . . . . . . 57
Conexión con bases de datos DB2 en aplicaciones de
SQL incorporado . . . . . . . . . . . . 58
Tipos de datos que se correlacionan con tipos de
datos SQL en aplicaciones de SQL incorporado . . 59
Tipos de datos que se correlacionan con tipos de
datos SQL en aplicaciones de SQL incorporado . 59
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado C y C++ . . . 60
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado COBOL . . . 67
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado FORTRAN . . 70
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado REXX . . . . 72
Variables del lenguaje principal en aplicaciones de
SQL incorporado . . . . . . . . . . . . 74
Variables del lenguaje principal en aplicaciones
de SQL incorporado . . . . . . . . . . 74
Declaración de variables del lenguaje principal en
aplicaciones de SQL incorporado . . . . . . 76
Declaración de variables del lenguaje principal
con el Generador de declaraciones db2dclgn . . 77
© Copyright IBM Corp. 1993, 2006 iii
![Page 6: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/6.jpg)
Tipos de datos de columna y variables del
lenguaje principal en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 77
Declaración de variables del lenguaje principal
XML en aplicaciones de SQL incorporado . . . 79
Identificar valores XML en una SQLDA . . . . 80
Identificación de valores de SQL nulos con
variables de indicador de nulo . . . . . . . 81
Inclusión de las variables del lenguaje principal
SQLSTATE y SQLCODE en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 83
Cómo hacer referencia a variables del lenguaje
principal en aplicaciones de SQL incorporado . . 84
Ejemplo: cómo hacer referencia a variables del
lenguaje principal XML en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 85
Variables del lenguaje principal en aplicaciones
de SQL incorporado C y C++ . . . . . . . 86
Variables del lenguaje principal en COBOL . . 119
Variables del lenguaje principal en FORTRAN 133
Variables del lenguaje principal en aplicaciones
de SQL incorporado REXX . . . . . . . . 142
Ejecución de sentencias de SQL en aplicaciones de
SQL incorporado . . . . . . . . . . . . 150
Ejecución de sentencias de SQL en aplicaciones
de SQL incorporado . . . . . . . . . . 150
Comentarios en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 150
Ejecución de sentencias de SQL estático en
aplicaciones de SQL incorporado . . . . . . 151
Recuperación de información de variables del
lenguaje principal procedente de la estructura
SQLDA en aplicaciones de SQL incorporado . . 152
Ejecución de expresiones XQuery en
aplicaciones de SQL incorporado . . . . . . 166
Suministro de entrada de variables a un SQL
ejecutado dinámicamente mediante marcadores
de parámetros . . . . . . . . . . . . 169
Llamada a procedimientos almacenados en
aplicaciones de SQL incorporado . . . . . . 171
Lectura de los conjuntos de resultados y
desplazamiento por los mismos en aplicaciones
de SQL incorporado . . . . . . . . . . 176
Recuperación de mensajes de error en aplicaciones
de SQL incorporado . . . . . . . . . . . 190
Información de error en los campos SQLCODE,
SQLSTATE y SQLWARN . . . . . . . . 190
Recuperación de mensajes de error en
aplicaciones de SQL incorporado . . . . . . 191
Consideraciones sobre las rutinas de lista de
salida . . . . . . . . . . . . . . . 194
Consideraciones sobre el manejador de
excepciones, señales e interrupciones . . . . 194
Desconexión de aplicaciones de SQL incorporado 195
Capítulo 4. Creación de aplicaciones
de SQL incorporado . . . . . . . . 197
Creación de aplicaciones de SQL incorporado . . 198
Precompilación de aplicaciones de SQL
incorporado con el mandato PRECOMPILE (o
PREP) . . . . . . . . . . . . . . . . 201
Precompilación de aplicaciones de SQL
incorporado con el mandato PRECOMPILE . . 201
Precompilación de aplicaciones de SQL
incorporado que acceden a más de un servidor
de bases de datos . . . . . . . . . . . 203
Paquetes de aplicaciones y planes de acceso de
SQL incorporado . . . . . . . . . . . 204
Calificación de esquema de paquete utilizando
el registro especial CURRENT PACKAGE PATH . 204
Indicaciones horarias generadas por el
precompilador . . . . . . . . . . . . 208
Errores y avisos procedentes de la
precompilación aplicaciones de SQL
incorporado . . . . . . . . . . . . . 209
Compilación y enlace de archivos fuente que
contienen SQL incorporado . . . . . . . . . 209
Vinculación de paquetes de SQL incorporado con
una base de datos mediante el mandato BIND . . 210
Vinculación de paquetes de SQL incorporado
con una base de datos . . . . . . . . . 210
Efecto de la opción de vinculación
DYNAMICRULES en SQL dinámico . . . . . 211
Utilización de registros especiales para controlar
el entorno de compilación de sentencias . . . 214
Cómo volver a crear paquetes utilizando el
mandato BIND y un archivo de vinculación
existente . . . . . . . . . . . . . . 214
Revinculación de paquetes existentes con el
mandato REBIND . . . . . . . . . . . 215
Consideraciones sobre la vinculación . . . . 216
Ventajas de la vinculación diferida . . . . . 217
Mejoras en el rendimiento cuando se utiliza la
opción REOPT del mandato BIND . . . . . 218
Almacenamiento y mantenimiento de paquetes . . 219
Almacenamiento y mantenimiento de paquetes 219
Creación de versiones de paquetes . . . . . 219
Resolución de nombres de tabla no calificados 220
Creación de aplicaciones de SQL incorporado
mediante el script de creación de ejemplo . . . . 221
Creación de aplicaciones de SQL incorporado
mediante el script de creación de ejemplo . . . 221
Programas de utilidad de comprobación de
errores . . . . . . . . . . . . . . . 223
Creación de aplicaciones y rutinas escritas en C
y C++ . . . . . . . . . . . . . . . 225
Creación de aplicaciones y rutinas escritas en
COBOL . . . . . . . . . . . . . . 246
Creación y ejecución de aplicaciones de SQL
incorporado escritas en REXX . . . . . . . 265
Creación de aplicaciones de SQL incorporado
desde la línea de mandatos . . . . . . . . . 268
Creación de aplicaciones de SQL incorporado
desde la línea de mandatos . . . . . . . . 268
Creación de aplicaciones de SQL incorporado
escritas en C o C++ (Windows) . . . . . . 268
Migración de las aplicaciones de SQL incorporado 269
Restricciones de enlazar a libdb2.so . . . . . . 271
Parte 2. Desarrollo de rutinas
incorporadas . . . . . . . . . . . 273
iv Desarrollo de aplicaciones de SQL incorporado
![Page 7: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/7.jpg)
Capítulo 5. Desarrollo de rutinas
externas . . . . . . . . . . . . . 275
Rutinas externas . . . . . . . . . . . . 275
Visión general de las rutinas externas . . . . . 276
Visión general de las rutinas externas . . . . 276
Funciones de rutinas externas . . . . . . . 276
Características de las funciones y métodos
externos . . . . . . . . . . . . . . 277
API y lenguajes de programación soportados 290
Creación de rutinas externas . . . . . . . 297
Estilos de parámetros de rutinas externas . . . 298
Gestión de bibliotecas o clases de rutinas . . . 301
Soporte de 32 bits y 64 bits para rutinas
externas . . . . . . . . . . . . . . 306
Rendimiento de las rutinas con bibliotecas de 32
bits en servidores de bases de datos de 64 bits . 307
Soporte para el tipo de datos XML en las
rutinas externas . . . . . . . . . . . 308
Restricciones de las rutinas externas . . . . . 309
Creación de rutinas externas . . . . . . . 312
Rutinas C y C++ . . . . . . . . . . . . 314
Rutinas C y C++ . . . . . . . . . . . 314
Soporte para el desarrollo de rutinas externas en
C . . . . . . . . . . . . . . . . 315
Soporte para el desarrollo de rutinas externas en
C++ . . . . . . . . . . . . . . . 315
Herramientas para el desarrollo de rutinas C y
C++ . . . . . . . . . . . . . . . 316
Diseño de rutinas C y C++ . . . . . . . . 316
Creación de rutinas C y C++ . . . . . . . 360
Creación del código de rutinas C y C++ . . . 362
Procedimientos COBOL . . . . . . . . . . 388
Procedimientos COBOL . . . . . . . . . 388
Soporte para el desarrollo de procedimientos
externos en COBOL . . . . . . . . . . 390
Creación de rutinas COBOL . . . . . . . 391
Parte 3. Apéndices . . . . . . . . 403
Apéndice A. Ejemplos de SQL
incorporado . . . . . . . . . . . . 405
Ejemplos de C . . . . . . . . . . . . . 405
Ejemplos de COBOL . . . . . . . . . . . 408
Ejemplos de REXX . . . . . . . . . . . 412
Apéndice B. Información técnica
sobre DB2 Database . . . . . . . . 415
Visión general de la información técnica de DB2 415
Comentarios sobre la documentación . . . . 415
Biblioteca técnica de DB2 en formato PDF . . . . 416
Pedido de manuales de DB2 en copia impresa . . 418
Visualización de la ayuda para estados de SQL
desde el procesador de línea de mandatos . . . . 419
Acceso a diferentes versiones del Centro de
información de DB2 . . . . . . . . . . . 420
Visualización de temas en el idioma preferido en el
Centro de información de DB2 . . . . . . . 420
Actualización del Centro de información de DB2
instalado en el sistema o en un servidor de intranet 421
Guías de aprendizaje de DB2 . . . . . . . . 423
Información de resolución de problemas de DB2 423
Términos y condiciones . . . . . . . . . . 424
Apéndice C. Avisos . . . . . . . . . 425
Marcas registradas . . . . . . . . . . . . 427
Índice . . . . . . . . . . . . . . . 429
Cómo ponerse en contacto con IBM 443
Contenido v
![Page 8: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/8.jpg)
vi Desarrollo de aplicaciones de SQL incorporado
![Page 9: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/9.jpg)
Parte 1. Desarrollo de aplicaciones cliente de SQL
incorporado
© Copyright IBM Corp. 1993, 2006 1
![Page 10: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/10.jpg)
2 Desarrollo de aplicaciones de SQL incorporado
![Page 11: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/11.jpg)
Capítulo 1. Introducción a SQL incorporado
Introducción a SQL incorporado . . . . . . . . 3
Incorporación de sentencias de SQL en un lenguaje
principal . . . . . . . . . . . . . . . . 4
Incorporación de sentencias de SQL en un
lenguaje principal . . . . . . . . . . . . 4
Sentencias de SQL incorporado en aplicaciones C
y C++ . . . . . . . . . . . . . . . 5
Sentencias de SQL incorporado en aplicaciones
COBOL . . . . . . . . . . . . . . . 7
Sentencias de SQL incorporado en aplicaciones
FORTRAN . . . . . . . . . . . . . . 8
Sentencias de SQL incorporado en aplicaciones
REXX . . . . . . . . . . . . . . . . 9
Software de desarrollo soportado para aplicaciones
de SQL incorporado . . . . . . . . . . . 12
Configuración del entorno de desarrollo de SQL
incorporado . . . . . . . . . . . . . . 12
Introducción a SQL incorporado
Las aplicaciones de bases de datos de SQL incorporado se conectan a bases de
datos y ejecutan sentencias de SQL incorporado. Las sentencias de SQL
incorporado se incorporan dentro de una aplicación de lenguaje principal. Las
aplicaciones de bases de datos de SQL incorporado dan soporte a la incorporación
de sentencias de SQL que se tienen que ejecutar estática o dinámicamente.
Puede desarrollar aplicaciones de SQL incorporado para DB2 en los siguientes
lenguajes de programación principales: C, C++, COBOL, FORTRAN y REXX.
Nota: El soporte de SQL incorporado en FORTRAN y REXX ha quedado obsoleto
y permanecerá a nivel de DB2 Universal Database , Versión 5.2.
La creación de aplicaciones de SQL incorporado incluye dos pasos previos a la
compilación y enlace de la aplicación.
v Preparación de los archivos fuentes que contienen sentencias de SQL
incorporado mediante el precompilador de DB2.
El mandato PREP (PRECOMPILE) sirve para invocar el precompilador de DB2, que
lee el código fuente, lo analiza y convierte las sentencias de SQL incorporado en
llamadas a las API de servicios de tiempo de ejecución de DB2, y finalmente
escribe la salida en un nuevo archivo fuente modificado. El precompilador
genera planes de acceso para las sentencias de SQL que se almacenan juntas
como un paquete dentro de la base de datos.
v Vinculación de las sentencias de la aplicación con la base de datos de destino.
La vinculación se realiza por omisión durante la precompilación (el mandato
PREP). Si la vinculación se tiene que diferir (por ejemplo, el mandato BIND se
tiene que ejecutar más tarde), se tiene que especificar la opción BINDFILE en el
momento de especificar PREP para que se genere un archivo de vinculación.
Cuando haya precompilado y vinculado la aplicación de SQL incorporado, ya está
lista para que se compile y se enlace mediante las herramientas de desarrollo
específicas del lenguaje principal.
Para ayudar en el desarrollo de aplicaciones de SQL incorporado, puede consultar
la plantilla de SQL incorporado en C. En el directorio %DB2PATH%\SQLLIB\samples,
también se pueden encontrar ejemplos de aplicaciones de ejemplo de SQL
incorporado que funcionan.
Nota: %DB2PATH% es el directorio de instalación de DB2
© Copyright IBM Corp. 1993, 2006 3
![Page 12: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/12.jpg)
SQL estático y dinámico:
Las sentencias de SQL se pueden ejecutar de dos formas: estática y dinámicamente.
Sentencias de SQL ejecutadas estáticamente
Para las sentencias de SQL ejecutadas estáticamente, la sintaxis se conoce
por completo en el momento de la precompilación. La estructura de una
sentencia de SQL se debe especificar por completo para que una sentencia
se considere estática. Por ejemplo, los nombres de las columnas y tablas a
las que se hace referencia en una sentencia se deben conocer por completo
en el momento de la precompilación. La única información que se puede
especificar en el tiempo de ejecución son los valores de las variables del
lenguaje principal a las que hace referencia la sentencia. Sin embargo, la
información sobre variables del lenguaje principal, como por ejemplo, tipos
de datos, debe estar ya precompilada. Debe precompilar, vincular y
compilar las sentencias de SQL ejecutadas estáticamente antes de ejecutar
la aplicación. El SQL estático se utiliza mejor en bases de datos cuyas
estadísticas no cambian mucho.
Sentencias de SQL ejecutadas dinámicamente
La aplicación crea y ejecuta las sentencias de SQL ejecutadas
dinámicamente en el momento de la ejecución. Una aplicación interactiva
que solicita al usuario final partes clave de una sentencia de SQL, como los
nombres de las tablas y las columnas que hay que buscar, es un buen
ejemplo de una situación adecuada para SQL dinámico.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones REXX” en la página 9
v “Sentencias de SQL incorporado en aplicaciones C y C++” en la página 5
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
v “Sentencias de SQL incorporado en aplicaciones FORTRAN” en la página 8
Información relacionada:
v “Mandato PRECOMPILE” en Consulta de mandatos
Incorporación de sentencias de SQL en un lenguaje principal
Incorporación de sentencias de SQL en un lenguaje principal
Structured Query Language (SQL) es un lenguaje estandarizado que se puede
utilizar para manipular objetos de bases de datos y los datos que contienen. A
pesar de las diferencias entre los lenguajes principales, todas las aplicaciones de
SQL incorporado están formadas por tres elementos necesarios para configurar y
ejecutar una sentencia de SQL:
1. Una DECLARE SECTION para declarar variables del lenguaje principal. No es
necesario que la declaración de la estructura SQLCA esté en la sección
DECLARE.
2. El cuerpo principal de la aplicación, la configuración y ejecución de sentencias
de SQL.
3. Colocaciones de lógica que confirma o retrotrae los cambios realizados por las
sentencias de SQL.
4 Desarrollo de aplicaciones de SQL incorporado
![Page 13: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/13.jpg)
Para cada lenguaje principal, hay ciertas diferencias entre las directrices generales
que se aplican a todos los lenguajes y las reglas específicas de los lenguajes
individuales.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones C y C++” en la página 5
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
v “Sentencias de SQL incorporado en aplicaciones FORTRAN” en la página 8
v “Sentencias de SQL incorporado en aplicaciones REXX” en la página 9
Sentencias de SQL incorporado en aplicaciones C y C++
Las aplicaciones C y C++ de SQL incorporado constan de tres elementos
principales para configurar y ejecutar una sentencia de SQL.
v Una DECLARE SECTION para declarar variables del lenguaje principal. La
declaración de la estructura SQLCA no necesita estar en la sección DECLARE.
v El cuerpo principal de la aplicación, la configuración y ejecución de sentencias
de SQL
v Colocaciones de lógica que confirman o retrotraen los cambios realizados por las
sentencias de SQL
Sintaxis correcta de elementos de C y C++
Inicializador de la sentencia EXEC SQL
Serie de la sentencia Cualquier sentencia de SQL válida
Terminador de la sentencia Punto y coma (;)
Por ejemplo, para ejecutar una sentencia de SQL estáticamente dentro de una
aplicación C, podría incluir lo siguiente dentro del código de la aplicación:
EXEC SQL SELECT col INTO :hostvar FROM table;
El ejemplo siguiente muestra cómo ejecutar una sentencia de SQL dinámicamente
utilizando la variable del lenguaje principal stmt1:
strcpy(stmt1, "CREATE TABLE table1(col1 INTEGER)");
EXEC SQL EXECUTE IMMEDIATE :stmt1;
Las siguientes directrices y reglas se aplican a la ejecución de sentencias de SQL
incorporado en aplicaciones C y C++:
v Puede empezar la serie de la sentencia de SQL en la misma línea que el
inicializador de sentencia EXEC SQL.
v No divida EXEC SQL en distintas líneas.
v Debe utilizar el terminador de sentencias de SQL. De no utilizarlo, el
precompilador seguirá hasta el siguiente terminador de la aplicación. Esto puede
producir errores indeterminados.
v Se pueden colocar comentarios de C y C++ delante del inicializador de la
sentencia o detrás del terminador de la sentencia.
v Se pueden poner varias sentencias de SQL y de C o C++ en la misma línea. Por
ejemplo:
EXEC SQL OPEN c1; if (SQLCODE >= 0) EXEC SQL FETCH c1 INTO :hv;
v Los retornos de carro, saltos de línea y tabulaciones se pueden incluir dentro de
una serie entrecomillada. El precompilador de SQL los dejará tal cual.
Capítulo 1. Introducción a SQL incorporado 5
![Page 14: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/14.jpg)
v No utilice la sentencia #include para incluir archivos que contengan sentencias
de SQL. Las sentencias de SQL se precompilan antes de que se compile el
módulo. El precompilador pasará por alto la sentencia #include. En su lugar,
utilice la sentencia INCLUDE de SQL para importar los archivos include.
v Están permitidos los comentarios de SQL en cualquier línea que forme parte de
una sentencia de SQL incorporado, con a excepción de las sentencias ejecutadas
dinámicamente.
– El formato de un comentario de SQL consiste en un guión doble (--), seguido
de una serie compuesta por cero o más caracteres y terminada por un fin de
línea.
– No coloque comentarios de SQL detrás del terminador de la sentencia de
SQL. Estos comentarios de SQL provocan errores de compilación ya que los
compiladores los interpretan como sintaxis de C o C++.
– Puede utilizar comentarios de SQL en una serie de una sentencia estática
siempre que se permitan caracteres en blanco.
– El uso de los delimitadores de comentarios de C y C++ /* */ está permitido
en las sentencias de SQL incorporado tanto estáticas como dinámicas.
– La utilización de comentarios de C++ de estilo // no están permitidos dentro
de sentencias de SQL estáticov Los literales de la serie de SQL y los identificadores delimitados se pueden
continuar con divisiones de línea en las aplicaciones C y C++. Para ello, utilice
una barra inclinada invertida (\) al final de la línea en que desea que se
produzca la división. Por ejemplo, para seleccionar datos de la columna NAME
de la tabla staff donde la columna NAME sea igual a ’Sanders’, podría hacer
algo parecido a lo siguiente:
EXEC SQL SELECT "NA\
ME" INTO :n FROM staff WHERE name=’Sa\
nders’;
Los caracteres de línea nueva (como, por ejemplo, el retorno de carro y el salto
de línea) no se incluyen en la serie que se pasa al gestor de base de datos como
sentencia de SQL.
v La sustitución de caracteres de espacio en blanco, como caracteres de fin de línea
y de tabulación, se produce del siguiente modo:
– Cuando aparecen fuera de las comillas (pero dentro de sentencias de SQL),
los caracteres de fin de línea y tabuladores se sustituyen por un solo espacio.
– Si aparecen dentro de las comillas, los caracteres de fin de línea desaparecen,
siempre que se continúe correctamente la serie para un programa C. Los
tabuladores no se modifican.
Observe que los caracteres reales utilizados para el final de línea y el tabulador
varían según la plataforma. Por ejemplo, los sistemas basados en UNIX y Linux
utilizan un carácter de salto de línea.
Conceptos relacionados:
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
v “Sentencias dinámicas de SQL incorporado” en la página 21
Información relacionada:
v “Sentencias de SQL soportadas” en Desarrollo de SQL y rutinas externas
6 Desarrollo de aplicaciones de SQL incorporado
![Page 15: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/15.jpg)
Sentencias de SQL incorporado en aplicaciones COBOL
Las sentencias de SQL incorporado en aplicaciones COBOL constan de estos tres
elementos:
Elemento Sintaxis correcta en COBOL
Inicializador de la sentencia EXEC SQL
Serie de la sentencia Cualquier sentencia de SQL válida
Terminador de la sentencia END-EXEC.
Por ejemplo:
EXEC SQL SELECT col INTO :hostvar FROM table END-EXEC.
Se aplican las reglas siguientes a las sentencias de SQL incorporado en aplicaciones
COBOL:
v Las sentencias de SQL ejecutables se deben colocar en la sección PROCEDURE
DIVISION. Las sentencias de SQL pueden ir precedidas de un nombre de párrafo,
al igual que una sentencia de COBOL.
v Las sentencias de SQL puede empezar en el Área A (columnas 8 a 11) o en el
Área B (columnas 12 a 72).
v Inicie cada sentencia de SQL con el inicializador de sentencia EXEC SQL y
termínela con el terminador de sentencia END-EXEC. El precompilador SQL
incluye cada una de las sentencias de SQL como comentarios en el archivo
fuente modificado.
v Debe utilizar el terminador de sentencias de SQL. De no utilizarlo, el
precompilador seguirá hasta el siguiente terminador de la aplicación. Esto puede
producir errores indeterminados.
v Están permitidos los comentarios de SQL en cualquier línea que forme parte de
una sentencia de SQL incorporado. Estos comentarios no están permitidos en las
sentencias que se ejecutan de forma dinámica. El formato de un comentario de
SQL consiste en un guión doble (--), seguido de una serie compuesta por cero o
más caracteres y terminada por un fin de línea. No coloque comentarios de SQL
detrás del terminador de la sentencia de SQL, puesto que ocasionarían errores
de compilación debido a que parecería que forman parte del lenguaje COBOL.
v Se permiten comentarios de COBOL en casi todas partes. Las excepciones son:
– No se permiten comentarios entre EXEC y SQL.
– No se permiten comentarios en las sentencias que se ejecutan dinámicamente.v Las sentencias de SQL siguen las mismas normas de continuación de línea que el
lenguaje COBOL. No obstante, no divida el inicializador de sentencia EXEC SQL
en distintas líneas.
v No utilice la sentencia COPY de COBOL para incluir archivos que contengan
sentencias de SQL. Las sentencias de SQL se precompilan antes de que se
compile el módulo. El precompilador pasará por alto la sentencia COPY de
COBOL. En su lugar, utilice la sentencia INCLUDE de SQL para importar los
archivos include.
v Para continuar una constante de serie en la línea siguiente, en la columna 7 de la
línea de continuación debe aparecer un '-' y en la columna 12 o posteriores debe
aparecer un delimitador de serie.
v Los operadores aritméticos de SQL se deben delimitar mediante espacios en
blanco.
v La sustitución de caracteres de espacio en blanco, como caracteres de fin de línea
y de tabulación, se produce del siguiente modo:
Capítulo 1. Introducción a SQL incorporado 7
![Page 16: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/16.jpg)
– Cuando aparecen fuera de las comillas (pero dentro de sentencias de SQL),
los caracteres de fin de línea y tabuladores se sustituyen por un solo espacio.
– Si aparecen dentro de las comillas, los caracteres de fin de línea desaparecen,
siempre que se continúe correctamente la serie para un programa COBOL.
Los tabuladores no se modifican.
Observe que los caracteres reales utilizados como fin de línea y tabulador varían
en función de la plataforma. Por ejemplo, las plataformas basadas en Windows
utilizan el retorno de carro/salto de línea como fin de línea, mientras que los
sistemas basados en UNIX y Linux utilizan simplemente un salto de línea.
Conceptos relacionados:
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
v “Restricciones en el uso de COBOL para programar aplicaciones de SQL
incorporado” en la página 28
Información relacionada:
v “Sentencias de SQL soportadas” en Desarrollo de SQL y rutinas externas
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
v “Archivos include para aplicaciones de SQL incorporado COBOL” en la página
50
Sentencias de SQL incorporado en aplicaciones FORTRAN
Las sentencias de SQL incorporado en aplicaciones FORTRAN constan de estos tres
elementos:
Elemento Sintaxis correcta en FORTRAN
Inicializador de la sentencia EXEC SQL
Serie de la sentencia Cualquier sentencia de SQL válida con blancos
como delimitadores
Terminador de la sentencia Fin de la línea fuente.
El fin de la línea fuente sirve como terminador de sentencia. Si se continúa la línea,
el terminador de sentencia es el fin de la última línea de continuación.
Por ejemplo:
EXEC SQL SELECT COL INTO :hostvar FROM TABLE
Se aplican las reglas siguientes a las sentencias de SQL incorporado en aplicaciones
FORTRAN:
v Codifique las sentencias de SQL únicamente entre las columnas 7 y 72.
v Utilice comentarios de FORTRAN de línea completa, o comentarios de SQL, pero
no utilice el carácter '!' de comentario de fin de línea de FORTRAN en las
sentencias de SQL. Este carácter de comentario se puede utilizar en cualquier
otra parte, incluso en las declaraciones de variables del lenguaje principal.
v Utilice blancos como delimitadores cuando codifique sentencias de SQL
incorporado, aunque las sentencias de FORTRAN no requieren blancos como
delimitadores.
v Utilice únicamente una sentencia de SQL para cada línea fuente en FORTRAN.
Para las sentencias que necesitan más de una línea fuente, se aplican las normas
habituales de continuación de FORTRAN. No divida el inicializador de sentencia
EXEC SQL en distintas líneas.
8 Desarrollo de aplicaciones de SQL incorporado
![Page 17: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/17.jpg)
v Están permitidos los comentarios de SQL en cualquier línea que forme parte de
una sentencia de SQL incorporado. Estos comentarios no están permitidos en las
sentencias que se ejecutan de forma dinámica. El formato de un comentario de
SQL consiste en un guión doble (--) seguido de una serie compuesta por cero o
más caracteres y terminada por un fin de línea.
v Los comentarios FORTRAN están permitidos casi en cualquier lugar de una
sentencia de SQL incorporada. Las excepciones son:
– No se permiten comentarios entre EXEC y SQL.
– No se permiten comentarios en las sentencias que se ejecutan dinámicamente.
– La ampliación de utilizar ! para codificar un comentario FORTRAN al final
de una línea no recibe soporte dentro de una sentencia de SQL incorporado.v Utilice una notación exponencial cuando especifique una constante real en las
sentencias de SQL. El gestor de bases de datos interpreta una serie de dígitos
con una coma decimal en una sentencia de SQL como una constante decimal, no
como una constante real.
v Los números de sentencia no son válidos en las sentencias de SQL que preceden
a la primera sentencia FORTRAN ejecutable. Si una sentencia de SQL tiene
asociado un número de sentencia, el precompilador genera una sentencia
CONTINUE etiquetada que precede directamente a la sentencia de SQL.
v Cuando haga referencia a variables del lenguaje principal dentro de una
sentencia de SQL, utilícelas exactamente tal como se han declarado.
v La sustitución de caracteres de espacio en blanco, como caracteres de fin de línea
y de tabulación, se produce del siguiente modo:
– Cuando aparecen fuera de las comillas (pero dentro de sentencias de SQL),
los caracteres de fin de línea y tabuladores se sustituyen por un solo espacio.
– Si aparecen dentro de las comillas, los caracteres de fin de línea desaparecen,
siempre que se continúe correctamente la serie para un programa FORTRAN.
Los tabuladores no se modifican.
Observe que los caracteres reales utilizados como fin de línea y tabulador varían
en función de la plataforma. Por ejemplo, las plataformas basadas en Windows
utilizan el retorno de carro/salto de línea como fin de línea, mientras que las
plataformas basadas en UNIX y Linux sólo utilizan simplemente un salto de
línea.
Conceptos relacionados:
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
v “Transacciones simultáneas y acceso a base de datos de varias hebras en
aplicaciones de SQL incorporado” en la página 31
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
v “Restricciones en el uso de FORTRAN para programar aplicaciones de SQL
incorporado” en la página 29
Información relacionada:
v “Sentencias de SQL soportadas” en Desarrollo de SQL y rutinas externas
Sentencias de SQL incorporado en aplicaciones REXX
Las aplicaciones REXX utilizan API que les permiten utilizar la mayoría de las
funciones que suministran las API del gestor de bases de datos y SQL. A diferencia
de las aplicaciones escritas en un lenguaje compilado, las aplicaciones REXX no se
precompilan. En su lugar, un manejador de SQL dinámico procesa todas las
Capítulo 1. Introducción a SQL incorporado 9
![Page 18: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/18.jpg)
sentencias de SQL. Al combinar REXX con estas API que se pueden llamar, tiene
acceso a la mayoría de las funciones del gestor de bases de datos. Aunque REXX
no da soporte directamente a algunas API utilizando SQL incorporado, se puede
acceder a las mismas utilizando el procesador de línea de mandatos de DB2 desde
dentro de la aplicación REXX.
Como REXX es un lenguaje interpretado, resultará más fácil desarrollar y depurar
los prototipos de aplicación en REXX que en lenguajes principales compilados.
Aunque las aplicaciones de bases de datos codificadas en REXX no proporcionan el
rendimiento de las aplicaciones de bases de datos que utilizan lenguajes
compilados, proporcional la posibilidad de crear aplicaciones de bases de datos sin
tener que precompilar, compilar, enlazar o utilizar software adicional.
Utilice la rutina SQLEXEC para procesar todas las sentencias de SQL. Los
argumentos de serie de caracteres para la rutina SQLEXEC están formados por los
elementos siguientes:
v Palabras clave de SQL
v Identificadores declarados previamente
v Variables del lenguaje principal de sentencia
Realice cada petición pasando una sentencia de SQL válida a la rutina SQLEXEC.
Utilice la sintaxis siguiente:
CALL SQLEXEC 'sentencia'
Las sentencias de SQL se pueden continuar en más de una línea. Cada parte de la
sentencia se debe encerrar entre comillas, y se debe delimitar mediante una coma
el texto adicional de la sentencia, del modo siguiente:
CALL SQLEXEC 'SQL text',
'additional text',
.
.
.
'final text'
A continuación se muestra un ejemplo de incorporación de una sentencia de SQL
en REXX:
statement = "UPDATE STAFF SET JOB = ’Clerk’ WHERE JOB = ’Mgr’"
CALL SQLEXEC ’EXECUTE IMMEDIATE :statement’
IF ( SQLCA.SQLCODE < 0) THEN
SAY ’Update Error: SQLCODE = ’ SQLCA.SQLCODE
En este ejemplo, el campo SQLCODE de la estructura SQLCA se comprueba para
determinar si la actualización ha resultado satisfactoria.
Se aplican las normas siguientes a las sentencias de SQL incorporado: en
aplicaciones REXX
v Las sentencias de SQL siguientes se pueden pasar directamente a la rutina
SQLEXEC:
– CALL
– CLOSE
– COMMIT
– CONNECT
– CONNECT TO
– CONNECT RESET
– DECLARE
– DESCRIBE
– DISCONNECT
10 Desarrollo de aplicaciones de SQL incorporado
![Page 19: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/19.jpg)
– EXECUTE
– EXECUTE IMMEDIATE
– FETCH
– FREE LOCATOR
– OPEN
– PREPARE
– RELEASE
– ROLLBACK
– SET CONNECTION
Existen otras sentencias de SQL que se deben procesar dinámicamente utilizando
las sentencias EXECUTE IMMEDIATE o PREPARE y EXECUTE junto con la
rutina SQLEXEC.
v No se pueden utilizar variables del lenguaje principal en las sentencias
CONNECT y SET CONNECTION en REXX.
v Los nombres de cursor y los nombres de sentencia están predefinidos del modo
siguiente:
de c1 a c100
Nombres de cursor, que van de c1 a c50 para los cursores declarados sin
la opción WITH HOLD, y de c51 a c100 para los cursores declarados
utilizando la opción WITH HOLD.
El identificador de nombre de cursor se utiliza para las sentencias
DECLARE, OPEN, FETCH y CLOSE. Identifica el cursor utilizado en la
petición de SQL.
de s1 a s100
Nombres de sentencia, que van de s1 a s100.
El identificador de nombre de sentencia se utiliza con las sentencias
DECLARE, DESCRIBE, PREPARE y EXECUTE.Se deben utilizar identificadores declarados previamente para los nombres de
cursor y de sentencia. No se admiten otros nombres.
v Cuando se declaren cursores, el nombre de cursor y el nombre de sentencia
deben corresponder en la sentencia DECLARE. Por ejemplo, si se utiliza c1 como
nombre de cursor, se debe utilizar s1 como nombre de sentencia.
v No utilice comentarios dentro de una sentencia de SQL.
Nota: REXX no da soporte al acceso a bases de datos de varias hebras.
Conceptos relacionados:
v “Sintaxis de las API para REXX” en la página 173
v “Transacciones simultáneas y acceso a base de datos de varias hebras en
aplicaciones de SQL incorporado” en la página 31
v “Restricciones en el uso de REXX para programar aplicaciones de SQL
incorporado” en la página 30
Información relacionada:
v “Ejemplos de REXX” en la página 412
Capítulo 1. Introducción a SQL incorporado 11
![Page 20: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/20.jpg)
Software de desarrollo soportado para aplicaciones de SQL
incorporado
Los sistemas de bases de datos DB2 dan soporte a compiladores, intérpretes y
software de desarrollo relacionado para aplicaciones de SQL incorporado en los
siguientes sistemas operativos:
v AIX
v HP-UX
v Linux
v Solaris
v Windows
Las aplicaciones de SQL incorporado de 32 y de 64 bits se pueden crear a partir de
código fuente de SQL incorporado.
Los siguientes lenguajes principales requieren compiladores específicos para
desarrollar aplicaciones de SQL incorporado:
v C
v C++
v COBOL
v Fortran
v REXX
Conceptos relacionados:
v “Soporte de 32 bits y 64 bits para aplicaciones de SQL incorporado” en la página
26
v “Restricciones en el uso de COBOL para programar aplicaciones de SQL
incorporado” en la página 28
v “Restricciones en el uso de FORTRAN para programar aplicaciones de SQL
incorporado” en la página 29
Configuración del entorno de desarrollo de SQL incorporado
Para poder empezar a crear aplicaciones de SQL incorporado, tiene que instalar el
compilador soportado para el lenguaje principal que va a utilizar para desarrollar
las aplicaciones y configurar el entorno de SQL incorporado.
Requisitos previos:
v Servidor de bases de datos DB2 instalado en una plataforma soportada
v Cliente DB2 instalado
v Software de desarrollo de aplicaciones de SQL incorporado soportado instalado
Procedimiento:
Asigne al usuario la autorización para emitir el mandato PREP y el mandato
BIND.
12 Desarrollo de aplicaciones de SQL incorporado
![Page 21: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/21.jpg)
Para verificar que el entorno de desarrollo de aplicaciones de SQL incorporado está
correctamente configurado, intente crear y ejecutar la plantilla de aplicación de
SQL incorporado que encontrará en el tema: Plantilla de aplicación de SQL
incorporado en C.
Conceptos relacionados:
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
v “Creación de aplicaciones de SQL incorporado” en la página 198
v “Creación de aplicaciones de SQL incorporado desde la línea de mandatos” en la
página 268
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
v “Consideraciones sobre la vinculación” en la página 216
Información relacionada:
v “Soporte para elementos del entorno de desarrollo de aplicaciones de bases de
datos” en Iniciación al desarrollo de aplicaciones de bases de datos
v “Sentencia GRANT (Privilegios de paquete)” en Consulta de SQL, Volumen 2
Capítulo 1. Introducción a SQL incorporado 13
![Page 22: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/22.jpg)
14 Desarrollo de aplicaciones de SQL incorporado
![Page 23: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/23.jpg)
Capítulo 2. Diseño de aplicaciones de SQL incorporado
Diseño de aplicaciones de SQL incorporado . . . 15
Uso de SQL estático . . . . . . . . . . . 16
Uso de SQL dinámico . . . . . . . . . . . 18
Consideraciones sobre autorización para SQL
incorporado . . . . . . . . . . . . . . 19
Ejecución de sentencias de SQL estático y dinámico
en aplicaciones de SQL incorporado . . . . . . 20
Ejecución de sentencias de SQL estático y
dinámico en aplicaciones de SQL incorporado . . 20
Sentencias dinámicas de SQL incorporado . . . 21
Determinación del momento en que deben
ejecutarse sentencias de SQL estática o
dinámicamente en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 22
Rendimiento de aplicaciones de SQL incorporado . 25
Soporte de 32 bits y 64 bits para aplicaciones de
SQL incorporado . . . . . . . . . . . . 26
Restricciones en aplicaciones SQL incorporadas . . 27
Restricciones sobre juegos de caracteres cuando
se utiliza C y C++ para programar aplicaciones
de SQL incorporado . . . . . . . . . . 27
Restricciones en el uso de COBOL para
programar aplicaciones de SQL incorporado . . 28
Restricciones en el uso de FORTRAN para
programar aplicaciones de SQL incorporado . . 29
Restricciones en el uso de REXX para programar
aplicaciones de SQL incorporado . . . . . . 30
Recomendaciones para desarrollar aplicaciones
de SQL incorporado con XML y XQuery . . . . 30
Transacciones simultáneas y acceso a base de datos
de varias hebras en aplicaciones de SQL
incorporado . . . . . . . . . . . . . . 31
Transacciones simultáneas y acceso a base de
datos de varias hebras en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 31
Recomendaciones para utilizar varias hebras . . 34
Consideraciones sobre la página de códigos y el
código de país o región para aplicaciones UNIX
de varias hebras . . . . . . . . . . . . 35
Resolución de problemas de aplicaciones de SQL
incorporado de varias hebras . . . . . . . 36
Diseño de aplicaciones de SQL incorporado
Cuando se diseñan aplicaciones de SQL incorporado, se tienen que utilizar
sentencias de SQL ejecutadas estática o dinámicamente. Las sentencias de SQL
estático son de dos tipos: sentencias que no contienen variables del lenguaje
principal (utilizadas principalmente para inicialización y ejemplos de SQL
sencillos) y sentencias que utilizan variables del lenguaje principal. Las sentencias
de SQL dinámico también son de dos tipos: pueden no contener ningún marcador
de parámetro (típico de interfaces como CLP) o pueden contener marcadores de
parámetro, lo que ofrece mayor flexibilidad dentro de las aplicaciones.
La opción sobre si utilizar sentencias ejecutadas estática o dinámicamente depende
de varios factores que incluyen portabilidad, rendimiento y restricciones de las
aplicaciones de SQL incorporado.
Conceptos relacionados:
v “Soporte de 32 bits y 64 bits para aplicaciones de SQL incorporado” en la página
26
v “Transacciones simultáneas y acceso a base de datos de varias hebras en
aplicaciones de SQL incorporado” en la página 31
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Ejecución de sentencias de SQL estático y dinámico en aplicaciones de SQL
incorporado” en la página 20
© Copyright IBM Corp. 1993, 2006 15
![Page 24: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/24.jpg)
Uso de SQL estático
SQL estático suele utilizarse en aplicaciones de bases de datos de SQL incorporado.
Las sentencias de SQL estático se codifican en un programa de aplicación de SQL
incorporado cuando se escribe el código fuente. El gestor de bases de datos DB2
debe procesar el código fuente utilizando un precompilador de SQL antes de que
se pueda compilar y ejecutar. Durante este proceso, el precompilador de SQL
evalúa referencias a tablas, columnas y tipos de datos declarados de todas las
variables del lenguaje principal y determina qué métodos de conversión de datos
se tienen que utilizar cuando los datos se muevan de la base de datos y a la
misma. Además, el precompilador de SQL realiza una comprobación de errores de
cada sentencia de SQL codificada y asegura que se utilizan los tipos de datos de
variables del lenguaje principal adecuados para sus respectivos valores de
columnas de la tabla. SQL estático se denomina estático porque las sentencias de
SQL del programa no cambian cada vez que se ejecuta el programa. SQL estático
funciona bien en muchas situaciones. De hecho, se puede utilizar en cualquier
aplicación para la que el acceso a los datos se pueda determinar en el momento de
diseñar el programa. Por ejemplo, un programa de entrada de pedidos siempre
utiliza la misma sentencia para insertar un nuevo pedido, y un sistema de reserva
de vuelos siempre utiliza la misma sentencia para cambiar el estado de una plaza
de ’disponible’ a ’reservada’. Cada una de estas sentencias se generalizaría
mediante el uso de variables del lenguaje principal. Se pueden insertar distintos
valores en un pedido de compras y se pueden reservar diferentes plazas. Puesto
que estas sentencias se pueden codificar en el programa, estos programas tienen la
ventaja de que las sentencias se tienen que analizar, validar y optimizar una sola
vez, en el momento de la compilación. Esto da lugar a un código relativamente
rápido en el momento de la ejecución.
Aunque las sentencias de SQL estático son fáciles de utilizar, están limitadas
porque el precompilador debe conocer por anticipado su formato y porque sólo
funcionan con variables del lenguaje principal. Hay muchas situaciones en las que
el programador no conoce por anticipado el contenido de una sentencia de SQL.
Por ejemplo, supongamos que una hoja de cálculo permite a un usuario entrar una
consulta, que la hoja de cálculo envía al sistema de gestión de bases de datos para
recuperar datos. Obviamente, el programador no sabe el contenido de esta consulta
cuando se escribe el programa de la hoja de cálculo.
A continuación se proporcionan detalles sobre la función SQL estático:
Interfaces que dan soporte a la ejecución de SQL estático::
SQL estático se puede ejecutar desde las siguientes interfaces:
v Aplicaciones de SQL incorporado
v Rutinas de SQL incorporado
v Aplicaciones de SQLJ
v Rutinas de SQLJ
v Rutinas de SQL
Implementación fácil de programar:
En general, la programación que utiliza SQL estático es más sencilla que la que
utiliza SQL dinámico incorporado. Las sentencias de SQL estático simplemente se
incorporan en el archivo fuente del lenguaje principal, y el precompilador maneja
la conversión necesaria a las llamadas a API de servicio de tiempo de ejecución del
16 Desarrollo de aplicaciones de SQL incorporado
![Page 25: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/25.jpg)
gestor de bases de datos que puede procesar el compilador del lenguaje principal.
Dentro de los programas de SQL incorporado, hay dos implementaciones
principales de SQL estático:
v SQL estático que no contiene variables del lenguaje principal
– Este tipo de implementación suele ser rara y se utiliza principalmente para el
código de inicialización y en ejemplos sencillos de SQL. SQL estático sin
variables del lenguaje principal funciona muy bien, porque no hay variables
del lenguaje principal que resolver, no hay sobrecarga del rendimiento en el
momento de la ejecución y se puede aprovechar por completo la capacidad
del optimizador de DB2.v SQL estático que contiene variables del lenguaje principal
– Es un estilo antiguo tradicional de SQL estático. Aunque SQL estático con
variables del lenguaje principal funciona mejor en el momento de la ejecución
que SQL dinámico, que necesita preparación de sentencias y el
establecimiento de bloqueos del catálogo durante la compilación de
sentencias, no se puede utilizar la potencia completa del optimizador porque
este no conoce la sentencia de SQL completa. Esto puede resultar un
problema cuando los datos con los que trabaja una sentencia de SQL tienen
una distribución de datos poco uniforme. Por este motivo, SQL estático sin
variables del lenguaje principal puede funcionar mejor. Por supuesto, las
variables del lenguaje principal proporcionan soporte para vincular valores de
variables con una sentencia.
Rendimiento:
En general, la ejecución de una consulta como SQL estático asegura un buen
rendimiento de la consulta. Ambas formas de sentencias de SQL estático descritas
anteriormente se pueden utilizar para conseguir un mejor rendimiento del que
permite la utilización de SQL dinámico. Para programas de SQL sencillos de corta
ejecución, una sentencia de SQL estático se ejecuta más rápido que la misma
sentencia procesada de forma dinámica porque el proceso general de preparación
de un formato ejecutable de la sentencia se realiza en el momento de la
precompilación en lugar de en el tiempo de ejecución.
El rendimiento de SQL estático depende de las estadísticas de la base de datos la
última vez que se vinculó la aplicación. Sin embargo, si estas estadísticas cambian,
el rendimiento de SQL dinámico equivalente puede ser muy diferente. Si, por
ejemplo, se añade un índice a una base de datos posteriormente, una aplicación
que utilice SQL estático no puede aprovechar el índice a no ser que se vuelva a
vincular a la base de datos. Además, si utiliza variables del lenguaje principal en
una sentencia de SQL estático, el optimizador no podrá aprovechar la información
sobre distribución de datos.
Autorización:
La autorización de la persona que vincula un paquete de aplicación se utiliza en el
momento de la ejecución para validar los privilegios necesarios para ejecutar las
sentencias de SQL estático utilizadas en la aplicación. Esto significa que el usuario
final que ejecuta la aplicación no necesita directamente los privilegios para ejecutar
las sentencias individuales del paquete. Por ejemplo, supongamos que tenemos
una aplicación que contiene sentencias de SQL que actualizan una tabla que
almacena datos de inventario. Una vez que alguien con los privilegios necesarios
para actualizar la tabla vincula la base de datos, los demás usuarios podrán
ejecutar ya aplicación y realizar actualizaciones de la tabla de inventario.
Capítulo 2. Diseño de aplicaciones de SQL incorporado 17
![Page 26: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/26.jpg)
La combinación de funciones de SQL estático lo convierten en la opción adecuada
para aplicaciones en las que la sintaxis de las sentencias de SQL se conoce en el
momento de programar la aplicación y en los casos en los que el rendimiento de
las sentencias de SQL resulta crucial para el rendimiento de la aplicación. También
puede facilitar el mantenimiento del código de programación de aplicaciones y
simplificar la gestión de autorizaciones necesarias para ejecutar SQL dentro de
aplicaciones.
Uso de SQL dinámico
SQL dinámico se suele utilizar para enviar sentencias de SQL al gestor de bases de
datos desde interfaces de usuario gráficas e interactivas de creación de consultas y
procesadores de línea de mandatos de SQL, así como desde aplicaciones en las que
la estructura completa de consultas no se conoce en el momento de compilar la
aplicación y la API de programación da soporte a SQL dinámico.
Hay muchas situaciones en las que un usuario o un programador no conoce por
anticipado el contenido de una sentencia de SQL. Por ejemplo, supongamos que
una hoja de cálculo permite a un usuario entrar una consulta, que la hoja de
cálculo envía al sistema de gestión de bases de datos para recuperar datos.
Obviamente, el programador no sabe el contenido de esta consulta cuando se
escribe el programa de la hoja de cálculo. Para resolver el problema, la hoja de
cálculo utiliza una forma de SQL incorporado denominada SQL dinámico. A
diferencia de las sentencias de SQL estático, que están codificadas en el programa,
las sentencias de SQL dinámico se pueden crear en el momento de la ejecución y
colocar en una variable del lenguaje principal de tipo serie (string). Luego se
envían al sistema de gestión de bases de datos para que las procese. Puesto que el
sistema de gestión de bases de datos debe generar un plan de acceso en el
momento de la ejecución para las sentencias de SQL dinámico, este suele ser más
lento que SQL estático. Cuando se compila un programa que contiene sentencias
de SQL dinámico, estas sentencias no se eliminan del programa, como en SQL
estático. En su lugar, se sustituyen por una llamada de función que pasa la
sentencia al DBMS.
Puesto que la creación real de sentencias de SQL dinámico se basa en el flujo de
lógica de programación en el momento de la ejecución de la aplicación, son más
potentes que las sentencias de SQL estático. Sin embargo, puesto que el DBMS
debe pasar por cada uno de los diversos pasos del proceso de una sentencia de
SQL para cada petición dinámica, SQL dinámico tiende a ser más lento que SQL
estático. El gestor de bases de datos DB2 proporciona soporte interno para una
antememoria de sentencias dinámicas, que ayudará a mejorar automáticamente el
rendimiento de las consultas de SQL dinámico.
SQL dinámico se puede utilizar desde las siguientes interfaces:
v Aplicaciones y rutinas externas que utilizan API que dan soporte a SQL
dinámico, que incluyen: SQL incorporado, JDBC, CLI, ADO.NET
v Interfaces interactivas de GUI de DB2 que incluyen: editor de mandatos de DB2
del Centro de control de DB2
v Procesador de línea de mandatos de DB2
v Ventana de mandatos de DB2
18 Desarrollo de aplicaciones de SQL incorporado
![Page 27: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/27.jpg)
Consideraciones sobre autorización para SQL incorporado
Una autorización permite a un usuario o grupo llevar a cabo una tarea general
como conectarse a una base de datos, crear tablas o administrar un sistema. Un
privilegio otorga a un usuario o grupo el derecho a acceder a un objeto de base de
datos específico de una forma especificada. DB2® utiliza un grupo de privilegios
para proteger la información que almacena en el mismo.
La mayoría de las sentencias de SQL necesitan algún tipo de privilegio sobre los
objetos de base de datos que utiliza la sentencia. La mayoría de llamadas a API no
suelen necesitar ningún privilegio sobre los objetos de base de datos que utiliza la
llamada, aunque muchas API necesitan que el usuario tenga la autorización
necesaria para invocarlas. Las API de DB2 le permiten realizar funciones
administrativas de DB2 desde dentro del programa de aplicación. Por ejemplo,
para recrear un paquete almacenado en la base de datos sin necesidad de disponer
de un archivo de vinculación, puede utilizar la API sqlarbnd (o REBIND).
Los grupos proporcionan un medio conveniente para llevar a cabo la autorización
para un conjunto de usuarios sin tener que otorgar ni revocar privilegios
individualmente para cada usuario. La pertenencia a un grupo se tiene en cuenta
en la ejecución de sentencias de SQL dinámico, pero no en sentencias de SQL
estático. Sin embargo, los privilegios PUBLIC se tienen en cuenta en la ejecución de
sentencias de SQL estático. Por ejemplo, suponga que tiene un procedimiento
almacenado de SQL incorporado con consultas de SQL vinculadas estáticamente
sobre una tabla llamada STAFF. Si intenta crear este procedimiento con la sentencia
CREATE PROCEDURE y la cuenta pertenece a un grupo que tiene el privilegio de
selección para la tabla STAFF, la sentencia CREATE fallará con un error SQL0551N.
Para que la sentencia CREATE funcione, la cuenta necesita directamente el privilegio
de selección en la tabla STAFF.
Cuando diseñe la aplicación, tenga en cuenta los privilegios que necesitarán los
usuarios para ejecutar la aplicación. Los privilegios que necesitan los usuarios
dependen de:
v Si la aplicación utiliza SQL dinámico, incluidos JDBC y CLI de DB2, o SQL
estático. Para obtener información sobre los privilegios necesarios para emitir
una sentencia, consulte la descripción de dicha sentencia.
v Qué API utiliza la aplicación. Para obtener información sobre las autorizaciones
y los privilegios necesarios para una llamada a API, consulte la descripción de
dicha API.
Los grupos proporcionan un medio conveniente para llevar a cabo la autorización
para un conjunto de usuarios sin tener que otorgar ni revocar privilegios
individualmente para cada usuario. En general, la pertenencia a un grupo se tiene
en cuenta en sentencias de SQL dinámico, pero no se tiene en cuenta en sentencias
de SQL estático. La excepción a este caso general se da cuando se otorgan
privilegios a PUBLIC: estos privilegios se tienen en cuenta cuando se procesan
sentencias de SQL.
Supongamos que tenemos dos usuarios, PAYROLL y BUDGET, que tienen que
realizar consultas contra la tabla STAFF. PAYROLL es responsable de pagar a los
empleados de la empresa, de modo que tiene que emitir varias sentencias SELECT
al emitir cheques. PAYROLL tiene que poder acceder al salario de cada empleado.
BUDGET es responsable de determinar la cantidad de dinero necesaria para pagar
los salarios. Sin embargo, BUDGET no debería poder ver el salario de ningún
empleado en particular.
Capítulo 2. Diseño de aplicaciones de SQL incorporado 19
![Page 28: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/28.jpg)
Puesto que PAYROLL emite muchas sentencias SELECT diferentes, la aplicación
que diseñe para PAYROLL probablemente podría utilizar de forma eficiente código
SQL dinámico. El código SQL dinámico necesitaría que PAYROLL tuviera el
privilegio SELECT sobre la tabla STAFF. Este requisito no representa un problema
porque PAYROLL necesita acceso completo a la tabla.
Por otro lado, BUDGET no debería tener acceso al salario de cada empleado. Esto
significa que no debe otorgar el privilegio SELECT sobre la tabla STAFF a
BUDGET. Puesto que BUDGET necesita acceso al total de todos los salarios de la
tabla STAFF, podría crear una aplicación de SQL estático para ejecutar una
sentencia SELECT SUM(SALARY) FROM STAFF, vincular la aplicación y otorgar el
privilegio EXECUTE sobre el paquete de la aplicación a BUDGET. Esto permite a
BUDGET obtener la información necesaria sin exponer la información que
BUDGET no debería ver.
Conceptos relacionados:
v “Authorization” en Administration Guide: Planning
v “Consideraciones de autorización para SQL dinámico” en Desarrollo de SQL y
rutinas externas
v “Consideraciones de autorización para SQL estático” en Desarrollo de SQL y
rutinas externas
Ejecución de sentencias de SQL estático y dinámico en aplicaciones
de SQL incorporado
Ejecución de sentencias de SQL estático y dinámico en
aplicaciones de SQL incorporado
La ejecución tanto de sentencias de SQL estático y como de SQL dinámico recibe
soporte en aplicaciones de SQL incorporado. Para decidir si hay que ejecutar las
sentencias de SQL de forma estática o dinámica hay que comprender los paquetes,
cómo se ejecutan las sentencias de SQL en el momento de la ejecución, las
variables del lenguaje principal, los marcadores de parámetro y cómo estos
elementos se relacionan con el rendimiento de la aplicación.
SQL estático en programas de SQL incorporado:
A continuación se muestra un ejemplo de una sentencia ejecutada estáticamente en
C:
/* seleccionar valores de table a variables lenguaje principal */
/* con STATIC SQL e imprimirlos */
EXEC SQL SELECT id, name, dept, salary INTO :id, :name, :dept, :salary
FROM staff WHERE id = 310;
printf(" %3d %-8.8s %4d %7.2f\n\n", id, name, dept, salary);
SQL dinámico en programas de SQL incorporado:
A continuación se muestra un ejemplo de una sentencia ejecutada dinámicamente
en C:
/* Actualizar columna de tabla mediante DYNAMIC SQL*/
strcpy(hostVarStmtDyn, "UPDATE staff SET salary = salary + 1000 WHERE dept = ?");
EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;
EXEC SQL EXECUTE StmtDyn USING :dept;
20 Desarrollo de aplicaciones de SQL incorporado
![Page 29: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/29.jpg)
Conceptos relacionados:
v “Uso de SQL dinámico” en la página 18
v “Uso de SQL estático” en la página 16
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
Sentencias dinámicas de SQL incorporado
Las sentencias de SQL dinámico aceptan una variable del lenguaje principal de
serie de caracteres y un nombre de sentencia como argumentos. La variable del
lenguaje principal contiene la sentencia de SQL que se va a procesar de forma
dinámica en formato de texto. El texto de la sentencia no se procesa cuando se
precompila una aplicación. De hecho, el texto de la sentencia no tiene que existir
en el momento en que se precompila la aplicación. En su lugar, la sentencia de
SQL se trata como una variable del lenguaje principal con fines de precompilación
y se hace referencia a la variable durante la ejecución de la aplicación.
Se necesitan sentencias de soporte de SQL dinámico para transformar la variable
del lenguaje principal que contiene texto de SQL en un formato ejecutable.
Además, las sentencias de soporte de SQL dinámico funcionan en la variable del
lenguaje principal haciendo referencia al nombre de la sentencia. Estas sentencias
de soporte son:
EXECUTE IMMEDIATE
Prepara y ejecuta una sentencia que no utiliza ninguna variable del
lenguaje principal. Utilice esta sentencia como alternativa a las sentencias
PREPARE y EXECUTE.
Por ejemplo, considere la siguiente sentencia en C:
strcpy (qstring,"INSERT INTO WORK_TABLE SELECT *
FROM EMP_ACT WHERE ACTNO >= 100");
EXEC SQL EXECUTE IMMEDIATE :qstring;
PREPARE
Convierte el formato de serie de caracteres de la sentencia de SQL en un
formato ejecutable de la sentencia, asigna un nombre de sentencia y
opcionalmente coloca información sobre la sentencia en una estructura
SQLDA.
EXECUTE
Ejecuta una sentencia de SQL previamente preparada. La sentencia se
puede ejecutar repetidamente dentro de una conexión.
DESCRIBE
Coloca información sobre una sentencia preparada en una SQLDA.
Por ejemplo, considere la siguiente sentencia en C:
strcpy(hostVarStmt, "DELETE FROM org WHERE deptnumb = 15");
EXEC SQL PREPARE Stmt FROM :hostVarStmt;
EXEC SQL DESCRIBE Stmt INTO :sqlda;
EXEC SQL EXECUTE Stmt;
Nota: El contenido de las sentencias de SQL dinámico sigue la misma sintaxis que
las sentencias de SQL estático, con las siguientes excepciones:
v La sentencia no puede comenzar por EXEC SQL.
Capítulo 2. Diseño de aplicaciones de SQL incorporado 21
![Page 30: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/30.jpg)
v La sentencia no puede finalizar con el terminador de sentencia. Una
excepción a esta norma es la sentencia CREATE TRIGGER, que puede
contener un signo de punto y coma (;).
Conceptos relacionados:
v “Uso de SQL dinámico” en la página 18
v “Uso de SQL estático” en la página 16
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
v “Recuperación de información de variables del lenguaje principal procedente de
la estructura SQLDA en aplicaciones de SQL incorporado” en la página 152
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Información relacionada:
v “Sentencias de SQL soportadas” en Desarrollo de SQL y rutinas externas
Determinación del momento en que deben ejecutarse
sentencias de SQL estática o dinámicamente en aplicaciones
de SQL incorporado
Hay algunas consideraciones que deben tenerse en cuenta antes de determinar si
una sentencia de SQL se ejecuta estática o dinámicamente en una aplicación de
SQL incorporado. En las tablas siguientes se listan las consideraciones más
importantes a tener en cuenta, así como las recomendaciones relativas a cuándo se
debe utilizar SQL estático o dinámico, o bien en qué casos ambas opciones son
igualmente adecuadas.
Nota: Esta tabla contiene recomendaciones generales. El requisito de la aplicación,
el uso para el que esté pensada y el entorno de trabajo dictan la opción real.
Cuando tenga dudas, el mejor enfoque consiste en hacer prototipos de sus
sentencias como SQL estático, luego como SQL dinámico y comparar las
diferencias.
Tabla 1. Comparación entre SQL estático y dinámico
Consideraciones
Probablemente la
mejor opción
Tiempo deseado en el que debe ejecutarse la consulta:
v Menos de 2 segundos
v Entre 2 y 10 segundos
v Más de 10 segundos
v Estático
v Cualquiera
v Dinámico
22 Desarrollo de aplicaciones de SQL incorporado
![Page 31: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/31.jpg)
Tabla 1. Comparación entre SQL estático y dinámico (continuación)
Consideraciones
Probablemente la
mejor opción
Uniformidad de datos que se consultan o con los que se trabaja por
parte de la sentencia de SQL
v Distribución de datos uniforme
v Ligera falta de uniformidad
v Distribución nada uniforme
v Estático
v Cualquiera
v Dinámico
Cantidad de predicados de rango en la consulta
v Pocos
v Algunos
v Muchos
v Estático
v Cualquiera
v Dinámico
Posibilidad de la ejecución de sentencias de SQL repetidas
v Se ejecuta muchas veces (10 o más)
v Se ejecuta unas cuantas veces (menos de 10)
v Se ejecuta una vez
v Cualquiera
v Cualquiera
v Estático
Naturaleza de la consulta
v Aleatoria
v Permanente
v Dinámico
v Cualquiera
Tipos de sentencias de SQL (DML/DDL/DCL)
v Proceso de transacciones (sólo DML)
v Mixto (DML y DDL - DDL afecta a los paquetes)
v Mixto (DML y DDL - DDL no afecta a los paquetes)
v Cualquiera
v Dinámico
v Cualquiera
Frecuencia con la que se emite el mandato RUNSTATS
v Muy poco frecuente
v Regular
v Frecuente
v Estático
v Cualquiera
v Dinámico
Las sentencias de SQL siempre se compilan antes de ejecutarlas. La diferencia
estriba en que las sentencias de SQL dinámico se compilan en tiempo de ejecución;
por eso, la aplicación puede ser un poco más lenta debido a la actividad general de
compilar cada sentencia dinámica en tiempo de ejecución de la aplicación, en
comparación con una única fase de compilación inicial, como sucede en el caso de
SQL estático.
En un entorno mixto, la opción entre SQL estático y dinámico debe depender
también de la frecuencia con la que se invalidan paquetes. Si el DDL no invalida
paquetes, SQL dinámico es más eficiente puesto que sólo las consultas ejecutadas
se recompilan cuando se utilizan la siguiente vez. Las otras no se recompilan. Para
SQL estático, el paquete entero se revincula cuando se ha invalidado.
En algunas ocasiones no importará mucho si se utiliza SQL estático o dinámico.
Por ejemplo, podría ser el caso de una aplicación que contenga básicamente
referencias a sentencias de SQL que deben ejecutarse dinámicamente, aunque
podría haber una sentencia que sería más adecuado ejecutarla como SQL estático.
En ese caso, para ser coherente con el código, podría tener más sentido
simplemente ejecutar también esa sentencia dinámicamente. Observe que las
consideraciones de la tabla anterior se listan en líneas generales por orden de
importancia.
No dé por supuesto que una versión estática de una sentencia de SQL se ejecuta
automáticamente más rápido que la misma sentencia procesada de forma
dinámica. En algunos casos, SQL estático es más rápido debido al proceso general
necesario para preparar la sentencia dinámica. En otros casos, la misma sentencia
Capítulo 2. Diseño de aplicaciones de SQL incorporado 23
![Page 32: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/32.jpg)
preparada de forma dinámica se ejecuta más rápido, porque el optimizador puede
utilizar las estadísticas actuales de la base de datos en lugar de las estadísticas de
base de datos disponibles en el momento de la vinculación anterior. Observe que si
la transacción tarda menos de un par de segundos en completarse, SQL estático
suele ser más rápido. Para elegir qué método utilizar, debe crear un prototipo de
ambas formas de vinculación.
Nota: Tanto SQL estático como SQL dinámico vienen en dos tipos, sentencias que
utilizan variables del lenguaje principal y otras que no. Estos tipos son:
1. Sentencias de SQL estático que no contiene variables del lenguaje
principal
Esta es una situación poco probable que sólo verá para:
v Código de inicialización
v Sentencias de SQL muy simples
Las sentencias de SQL simples sin variables del lenguaje principal tienen
un buen rendimiento desde la perspectiva del rendimiento, puesto que
no hay proceso general de rendimiento en tiempo de ejecución y se
pueden aprovechar por completo las funciones del optimizador de DB2.
2. SQL estático que contiene variables del lenguaje principal
Las sentencias de SQL estático que utilizan variables del lenguaje
principal se consideran como el estilo tradicional de las aplicaciones de
DB2. Las sentencias de SQL estático evitan el proceso general en tiempo
de ejecución de una sentencia PREPARE y bloqueos de catálogo
adquiridos durante la compilación de sentencias. Desgraciadamente, no
se puede utilizar la potencia completa del optimizador porque este no
conoce la sentencia de SQL completa. Existe un problema particular con
distribuciones de datos nada uniformes.
3. SQL dinámico que no contiene marcadores de parámetros
Esto es normal en interfaces como CLP, que suele utilizarse para ejecutar
consultas para un propósito concreto. Desde la interfaz CLP, las
sentencias de SQL sólo se pueden ejecutar dinámicamente.
4. SQL dinámico que contiene marcadores de parámetros
La ventaja clave de las sentencias de SQL dinámico es que la presencia
de marcadores de parámetros permite amortizar el coste de la
preparación de la sentencia durante ejecuciones repetidas de la sentencia,
normalmente una sentencia SELECT o INSERT. Esta amortización es real
para todas las aplicaciones de SQL dinámico repetitivas.
Desgraciadamente, al igual que SQL estático con variables del lenguaje
principal, partes del optimizador de DB2 no funcionarán porque no está
disponible la información completa.
La recomendación es utilizar SQL estático con variables del lenguaje
principal o SQL dinámico sin marcadores de parámetros como las
opciones más eficientes.
Conceptos relacionados:
v “Ejemplo de marcadores de parámetros en un programa de SQL ejecutado
dinámicamente” en la página 170
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
Tareas relacionadas:
24 Desarrollo de aplicaciones de SQL incorporado
![Page 33: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/33.jpg)
v “Cómo proporcionar entrada de variables a una sentencia de SQL ejecutada
dinámicamente mediante marcadores de parámetros” en la página 169
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Rendimiento de aplicaciones de SQL incorporado
El rendimiento es un factor importante a tener en cuenta cuando se desarrollan
aplicaciones de bases de datos. Las aplicaciones de SQL estático se pueden ejecutar
bien, porque dan soporte a la ejecución de sentencias de SQL estático y a una
combinación de ejecución de sentencias de SQL estático y dinámico. Debido a la
forma en que se compilan las sentencias de SQL estático, hay pasos que un
desarrollador o administrador de bases de datos debe seguir para asegurarse de
que las aplicaciones de SQL incorporado continúan ejecutándose bien con el
tiempo.
Los siguientes factores pueden afectar al rendimiento de las aplicaciones de SQL
incorporado:
v Cambios en esquemas de bases de datos con el tiempo
v Cambios en las cardinalidades de las tablas (el número de filas de las tablas) con
el tiempo
v Cambios en los valores de las variables del lenguaje principal vinculadas a
sentencias de SQL
El rendimiento de las aplicaciones de SQL incorporado se ve afectado por estos
factores porque el paquete se crea una vez cuando una base de datos puede tener
un determinado conjunto de características. Estas características intervienen en la
creación de los planes de acceso de tiempo de ejecución de paquetes, que definen
la forma en que el gestor de bases de datos ejecutará de la forma más eficiente
posible las sentencias de SQL. Con el tiempo, un esquema de base de datos y los
datos pueden cambiar, lo que hace que los planes de acceso de tiempo de ejecución
dejen de ser los óptimos. Esto puede dar lugar a una degradación del rendimiento
de la aplicación.
Por este motivo, es importante renovar periódicamente la información que se
utiliza para asegurar que los planes de acceso de tiempo de ejecución de los
paquetes se mantienen correctamente.
Se utiliza el mandato RUNSTATS para recopilar estadísticas actuales sobre tablas e
índices, especialmente si se ha producido una actividad de actualización
significativa o se han creado nuevos índices desde la última vez que se ejecutó el
mandato RUNSTATS. Esto proporciona al optimizador la información más precisa con
la que puede determinar el mejor plan de acceso.
El rendimiento de las aplicaciones de SQL incorporado se puede mejorar de varias
formas:
v Ejecutando el mandato RUNSTATS para actualizar estadísticas de base de datos.
Capítulo 2. Diseño de aplicaciones de SQL incorporado 25
![Page 34: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/34.jpg)
v Volviendo a vincular paquetes de aplicación con la base de datos para volver a
generar los planes de acceso de tiempo de ejecución (basados en las estadísticas
actualizadas) que utilizará la base de datos para recuperar físicamente los datos
en disco.
v Utilizando la opción de enlace REOPT en los programas estáticos y dinámicos.
Conceptos relacionados:
v “Improving performance by binding with REOPT” en Performance Guide
v “Query optimization using the REOPT bind option” en Performance Guide
v “Revinculación de paquetes existentes con el mandato REBIND” en la página
215
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Mejoras en el rendimiento cuando se utiliza la opción REOPT del mandato
BIND” en la página 218
v “Utilización de registros especiales para controlar el entorno de compilación de
sentencias” en la página 214
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Información relacionada:
v “API db2Runstats - Actualizar las estadísticas para tablas e índices” en Consulta
de las API administrativas
v “Mandato RUNSTATS” en Consulta de mandatos
Soporte de 32 bits y 64 bits para aplicaciones de SQL incorporado
Las aplicaciones de SQL incorporado se pueden crear en plataformas de 32 y de 64
bits. No obstante, existen consideraciones separadas sobre la creación y la
ejecución. Los scripts de construcción contienen una comprobación para determinar
el ancho de bits. Si el ancho de bits detectado es de 64 bits, se establece un
conjunto de conmutadores adicional para acomodar los cambios necesarios.
Los sistemas de base de datos DB2 están soportados en versiones de 32 y 64 bits
de los sistemas operativos listados más abajo. En la mayoría de estos sistemas
operativos existen diferencias respecto a la forma de crear aplicaciones de SQL
incorporado en los entornos de 32 y 64 bits.
v AIX
v HP-UX
v Linux
v Solaris
v Windows
Las únicas instancias de 32 bits que estarán soportadas en DB2 Versión 9 son:
v Linux en x86
v Windows en x86
26 Desarrollo de aplicaciones de SQL incorporado
![Page 35: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/35.jpg)
v Windows en X64 (al utilizar la imagen de instalación de DB2 para Windows en
x86)
Las únicas instancias de 64 bits que estarán soportadas en DB2 Versión 9 son:
v AIX
v Sun
v HP PA-RISC
v HP IPF
v Linux en x86_64
v Linux en POWER
v Linux en zSeries
v Windows en X64 (al utilizar la imagen de instalación de Windows para X64)
v Windows en IPF
v Linux en IPF
Los sistemas de base de datos DB2 dan soporte a la ejecución de aplicaciones y
rutinas de 32 bits en todos los entornos de sistema operativo de 64 bits soportados
excepto Linux IA64 y Linux zSeries.
Para cada uno de los lenguajes principales, las variables del lenguaje principal
utilizadas pueden ser mejor en plataformas de 32 bits o 64 bits o ambas.
Compruebe los diversos tipos de datos para cada uno de los lenguajes de
programación.
Tareas relacionadas:
v “Migración de las aplicaciones de SQL incorporado” en la página 269
Información relacionada:
v “Tipos de datos para procedimientos, funciones y métodos en aplicaciones de
SQL incorporado C y C++” en la página 65
v “Declaración de variables del lenguaje principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++” en la página 106
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado COBOL” en la página 128
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado FORTRAN” en la página 140
v “Declaración de variables del lenguaje principal de referencia de archivos en
aplicaciones de SQL incorporado REXX” en la página 148
Restricciones en aplicaciones SQL incorporadas
Restricciones sobre juegos de caracteres cuando se utiliza C
y C++ para programar aplicaciones de SQL incorporado
Algunos caracteres del juego de caracteres de C o C++ no están disponibles en
todos los teclados. Dichos caracteres se pueden entrar en un programa fuente C o
C++ utilizando una secuencia de tres caracteres denominada tri-grafo. Los tri-grafos
no se reconocen en las sentencias de SQL. El precompilador reconoce los tri-grafos
siguientes dentro de las declaraciones de variables del lenguaje principal:
Tri-grafo Definición
Capítulo 2. Diseño de aplicaciones de SQL incorporado 27
![Page 36: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/36.jpg)
??( Corchete izquierdo '['
??) Corchete derecho ']'
??< Llave izquierda '{'
??> Llave derecha '}'
Los tri-grafos restantes que se listan a continuación se pueden producir en
cualquier lugar de un programa fuente C o C++:
Tri-grafo Definición
??= Almohadilla '#'
??/ Barra inclinada invertida '\'
??’ Signo de intercalación '^'
??! Barra vertical '|'
??– Tilde '~'
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones C y C++” en la página 5
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado C y C++” en la página 90
Información relacionada:
v “Ejemplos de C” en la página 405
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
v “Tipos de datos para procedimientos, funciones y métodos en aplicaciones de
SQL incorporado C y C++” en la página 65
Restricciones en el uso de COBOL para programar
aplicaciones de SQL incorporado
A continuación se describen las restricciones correspondientes a llamadas a API en
aplicaciones COBOL:
v Todas las variables enteras utilizadas como parámetros de valor en las llamadas
a las API se deben declarar con una cláusula USAGE COMP-5.
En un programa COBOL orientado a objetos:
v Sólo pueden aparecer sentencias de SQL en el primer programa o clase de una
unidad de compilación. Esta restricción se debe a que el precompilador inserta
datos de trabajo temporales en la primera sección Working-Storage que
encuentra.
28 Desarrollo de aplicaciones de SQL incorporado
![Page 37: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/37.jpg)
v Cada clase que contenga sentencias de SQL debe tener una sección
Working-Storage a nivel de clase, aunque esté vacía. Esta sección se utiliza para
almacenar definiciones de datos generadas por el precompilador.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Variables del lenguaje principal en COBOL” en la página 119
v “Tablas de variables de indicador de nulo y de indicador de nulo o de
truncamiento en aplicaciones de SQL incorporado COBOL” en la página 132
v “Variables del lenguaje principal en FORTRAN” en la página 133
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Ejemplos de COBOL” en la página 408
Restricciones en el uso de FORTRAN para programar
aplicaciones de SQL incorporado
El soporte de SQL incorporado de FORTRAN se ha estabilizado en DB2 UDB
Versión 5 y no se ha planificado ninguna mejora para el futuro. Por ejemplo, el
precompilador FORTRAN no puede manejar identificadores de objetos SQL, como
por ejemplo, los nombres de tabla, que tengan una longitud superior a 18 bytes.
Para utilizar las características incorporadas en los sistemas de bases de datos DB2
después de UDB Versión 5, como por ejemplo, los nombres de tabla de longitud
entre 19 y 128 bytes, debe escribir sus aplicaciones en un lenguaje que no sea
FORTRAN.
El desarrollo de aplicaciones de bases de datos FORTRAN no está soportado en
instancias de DB2 en entornos Windows o Linux.
FORTRAN no da soporte al acceso a bases de datos de varias hebras.
Algunos compiladores de FORTRAN tratan las líneas que contienen una 'D' o una
'd' en la columna 1 como líneas condicionales. Estas líneas se pueden compilar
para su depuración o se pueden tratar como comentarios. El precompilador
siempre tratará las líneas que contienen una 'D' o una 'd' en la columna 1 como
comentarios.
Algunos parámetros de las API requieren direcciones en lugar de valores en las
variables de llamada. El gestor de bases de datos proporciona las API GET
ADDRESS, DEREFERENCE ADDRESS y COPY MEMORY, que simplifican la
posibilidad de que el usuario proporcione estos parámetros.
Los elementos siguientes afectan al proceso de precompilación:
v El precompilador sólo admite dígitos, blancos y caracteres de tabulación en las
columnas 1-5 de las líneas de continuación.
v Las constantes Hollerith no se reciben soporte en archivos fuente .sqf.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones FORTRAN” en la página 8
Capítulo 2. Diseño de aplicaciones de SQL incorporado 29
![Page 38: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/38.jpg)
v “Variables de indicador de nulo o de truncamiento en aplicaciones de SQL
incorporado FORTRAN” en la página 141
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
FORTRAN” en la página 70
Restricciones en el uso de REXX para programar aplicaciones
de SQL incorporado
A continuación se describen las restricciones correspondientes a SQL incorporado
en aplicaciones REXX:
v El soporte de SQL de incorporado de REXX se ha estabilizado en DB2 UDB
Versión 5 y no se ha planificado ninguna mejora para el futuro. Por ejemplo,
REXX no puede manejar identificadores de objetos SQL, como por ejemplo, los
nombres de tabla, que tengan una longitud superior a 18 bytes. Para utilizar las
características incorporadas en los sistemas de bases de datos DB2 después de la
Versión 5, como por ejemplo, los nombres de tabla de longitud entre 19 y 128
bytes, debe escribir sus aplicaciones en un lenguaje que no sea REXX.
v En REXX/SQL no se soporta el SQL compuesto.
v REXX no da soporte a SQL estático.
v Las aplicaciones REXX no se soportan en los entornos EUC en japonés o chino
tradicional.
Conceptos relacionados:
v “Sintaxis de las API para REXX” en la página 173
v “Sentencias de SQL incorporado en aplicaciones REXX” en la página 9
Tareas relacionadas:
v “Consideraciones sobre la programación de aplicaciones REXX de SQL
incorporado” en la página 145
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
v “Ejemplos de REXX” en la página 412
Recomendaciones para desarrollar aplicaciones de SQL
incorporado con XML y XQuery
Las siguientes recomendaciones son válidas para usar XML y XQuery en
aplicaciones de SQL incorporado.
v Las aplicaciones deben acceder a todos los datos XML en formato de serie
serializada.
– Debe representar todos los datos, incluidos los datos numéricos y de fecha y
hora, en su formato de serie serializado.v Los datos XML externalizados están limitados a 2 GB.
30 Desarrollo de aplicaciones de SQL incorporado
![Page 39: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/39.jpg)
v Todos los cursores que contengan datos XML son de no bloqueo (cada operación
de captación genera una petición del servidor de bases de datos).
v Cuando las variables del lenguaje principal de tipo carácter contienen datos
XML serializados, se da por supuesto que se utiliza la página de códigos de la
aplicación como la codificación de los datos y debe coincidir con cualquier
codificación interna existente en los datos.
v Debe especificar un tipo de datos LOB como el tipo base para una variable del
lenguaje principal XML.
v Se aplica lo siguiente a SQL estático:
– No se pueden utilizar variables del lenguaje principal de tipo carácter y
binarias para recuperar valores XML de una operación SELECT INTO.
– Si se espera un tipo de datos XML como entrada, el uso de las variables de
lenguaje principal CHAR, VARCHAR, CLOB y BLOB estará sujeto a una
operaciónn XMLPARSE con las características por omisión del manejo de
espacios en blanco (’STRIP WHITESPACE’). Cualquier otro tipo de variable del
lenguaje principal que no sea XML se rechazará.
– No hay soporte para las expresiones de XQuery estático; si se intenta
precompilar una expresión XQuery, la operación fallará con un error. Sólo
puede ejecutar expresiones XQuery a través de la función XMLQUERY.v Una expresión XQuery se puede ejecutar dinámicamente añadiendo a la
expresión la serie ″XQUERY″ como prefijo.
Conceptos relacionados:
v “Errores y avisos procedentes de la precompilación aplicaciones de SQL
incorporado” en la página 209
v “Ejemplo: cómo hacer referencia a variables del lenguaje principal XML en
aplicaciones de SQL incorporado” en la página 85
Tareas relacionadas:
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
v “Ejecución de expresiones XQuery en aplicaciones de SQL incorporado” en la
página 166
Transacciones simultáneas y acceso a base de datos de varias hebras
en aplicaciones de SQL incorporado
Transacciones simultáneas y acceso a base de datos de
varias hebras en aplicaciones de SQL incorporado
Una característica de algunos sistemas operativos es la posibilidad de ejecutar
varias hebras de ejecución en un solo proceso. Las diversas hebras permiten que
una aplicación maneje sucesos asíncronos y facilitan la creación de aplicaciones
dirigidas por sucesos sin recurrir a esquemas de tramas. La siguiente información
explica cómo trabaja el DB2 gestor de bases de datos con varias hebras y se
relacionan algunas directrices de diseño que conviene recordar.
Si no está familiarizado con los términos relacionados con el desarrollo de
aplicaciones de varias hebras (como sección crítica y semáforo), consulte la
documentación sobre programación correspondiente al sistema operativo.
Capítulo 2. Diseño de aplicaciones de SQL incorporado 31
![Page 40: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/40.jpg)
Una aplicación de SQL incorporado DB2 puede ejecutar sentencias de SQL para
varias hebras utilizando contextos. Un contexto es el entorno desde el que una
aplicación ejecuta todas las sentencias de SQL y las llamadas a las API. Todas las
conexiones, unidades de trabajo y otros recursos de base de datos están asociados
a un contexto específico. Cada contexto está asociado a una o más hebras de una
aplicación. El desarrollo de aplicaciones de SQL incorporado de varias hebras con
código con protección de hebras sólo recibe soporte en C y C++. Puede escribir su
propio compilador, que junto con las funciones que proporciona el lenguaje
permita el acceso simultáneo a bases de datos de varias hebras.
Para cada sentencia de SQL ejecutable en un contexto, la primera llamada a los
servicios de tiempo de ejecución siempre intenta obtener un enganche. Si esta
operación resulta satisfactoria, prosigue el proceso. Si no lo es (porque una
sentencia de SQL de otra hebra del mismo contexto ya tiene el enganche), se
bloquea la llamada en un semáforo de señalización hasta que entra en funciones
dicho semáforo, en cuyo momento la llamada obtiene el enganche y prosigue el
proceso. Se mantiene en enganche hasta que se ha completado el proceso,
momento en que lo libera la última llamada a los servicios de tiempo de ejecución
que se ha generado para esa sentencia de SQL en particular.
El resultado neto es que cada sentencia de SQL de un contexto se ejecuta como una
unidad atómica, aunque puede que haya otras hebras que estén intentando
ejecutar sentencias de SQL al mismo tiempo. Esta acción asegura que las distintas
hebras que puedan actuar a la vez no alteran las estructuras internas de los datos.
Las API también utilizan el enganche utilizado por los servicios de tiempo de
ejecución; por consiguiente, las API tienen las mismas restricciones que las rutinas
de los servicios de tiempo de ejecución dentro de cada contexto.
En un proceso, se pueden intercambiar contextos entre hebras, pero no se pueden
intercambiar entre procesos. Un uso de varios contextos consiste en proporcionar
soporte de transacciones simultáneas.
En la implementación por omisión de las aplicaciones de hebras sobre una base de
datos DB2, la serialización del acceso a la base de datos se impone mediante las
API de la base de datos. Si una hebra realiza una llamada a la base de datos, las
llamadas realizadas por otras hebras se bloquearán hasta que finalice la primera
llamada, aunque las siguientes llamadas accedan a objetos de la base de datos que
no estén relacionados con la primera llamada. Además, todas las hebras de un
proceso comparten un ámbito de confirmación. El verdadero acceso simultáneo a
una base de datos sólo se puede conseguir mediante procesos separados o
utilizando las API que se describen en este tema.
Los sistemas de bases de datos DB2 proporcionan API que se pueden utilizar para
asignar y manipular entornos separados (contextos) para el uso de las API de la
base de datos y SQL incorporado. Cada contexto es una entidad separada y
cualquier conexión o enlace realizado mediante un contexto es independiente de
los demás contextos (por lo tanto, de las demás conexiones o enlaces de un
proceso). Para poder trabajar sobre un contexto, primero se debe asociar a una
hebra. Una hebra siempre debe tener un contexto cuando se realizan llamadas a las
API de la base de datos o cuando se utiliza SQL incorporado.
Por omisión, todas las aplicaciones del sistema de bases de datos DB2 son de
varias hebras y pueden utilizar varios contextos. Puede utilizar las siguientes API
de DB2 para utilizar varios contextos. Específicamente, su aplicación puede crear
un contexto para una hebra, conectarse o desconectarse de un contexto
32 Desarrollo de aplicaciones de SQL incorporado
![Page 41: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/41.jpg)
independiente para cada hebra y pasar contextos entre las hebras. Si su aplicación
no llama a ninguna de estas API, DB2 administrará automáticamente los contextos
múltiples para sus aplicaciones:
v sqleAttachToCtx - Enlazar a contexto
v sqleBeginCtx - Crear y enlazar a un contexto de aplicación
v sqleDetachFromCtx - Desenlazar de contexto
v sqleEndCtx - Desenlazar y destruir contexto de aplicación
v sqleGetCurrentCtx - Obtener contexto actual
v sqleInterruptCtx - Interrumpir contexto
Esas API no tienen efecto (es decir, son no-ops) sobre las plataformas que no dan
soporte a hebras de aplicaciones.
Los contextos se tienen que asociar a una determinada hebra durante el tiempo
que dure una conexión o enlace. Una hebra puede enlazarse a un contexto,
conectarse a una base de datos, desenlazarse del contexto y luego una segunda
hebra se puede enlazar al contexto y continuar trabajando utilizando la conexión
de base de datos existente. Los contextos se pueden pasar entre hebras de un
proceso, pero no entre procesos.
Aunque se utilicen las nueva API, las siguientes API continúan estando
serializadas:
v sqlabndx - Vincular
v sqlaprep - Precompilar programa
v sqluexpr - Exportar
v db2Import y sqluimpr - Importar
Notas:
1. La CLI de DB2 utiliza automáticamente múltiples contextos para conseguir
acceso con protección de hebras y simultáneo a la base de datos en las
plataformas que dan soporte a varias hebras. Aunque no resulta recomendable
para DB2, los usuarios pueden inhabilitar de forma explícita esta función si lo
desean.
2. Por omisión, AIX no permite que las aplicaciones de 32 bits se enlacen a más
de 11 segmentos de memoria compartida por proceso, de los cuales un máximo
de 10 se pueden utilizar para conexiones de DB2.
Cuando se alcanza este límite, DB2 devuelve SQLCODE -1224 en SQL
CONNECT. DB2 Connect también tiene un límite de 10 conexiones si los
usuarios locales ejecutan confirmación de dos fases sobre SNA o confirmación
de dos cases con TP Monitor (SNA o TCP/IP).
Se puede utilizar la variable de entorno de AIX EXTSHM para aumentar el
número máximo de segmentos de memoria compartida a los que se puede
enlazar un proceso.
Para utilizar EXTSHM con DB2, haga lo siguiente:
En sesiones cliente:
export EXTSHM=ON
Cuando se inicie el servidor de DB2:
export EXTSHM=ON
db2set DB2ENVLIST=EXTSHM
db2start
En DPF, añada también las siguientes líneas a los archivos userprofile o
usercshrc:
Capítulo 2. Diseño de aplicaciones de SQL incorporado 33
![Page 42: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/42.jpg)
EXTSHM=ON
export EXTSHM
Una alternativa consiste en mover la base de datos local o DB2 Connect a otra
máquina y acceder a la misma de forma remota, o acceder a la base de datos
de DB2 Connect con retorno de bucle TCP/IP, catalogándolo como un nodo
remoto que tiene la dirección TCP/IP de la máquina local.
Conceptos relacionados:
v “Transacciones simultáneas” en Desarrollo de SQL y rutinas externas
v “Recomendaciones para utilizar varias hebras” en la página 34
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
Información relacionada:
v “API de personalización del precompilador” en Consulta de las API
administrativas
v “API sqleAttachToCtx - Enlazar con contexto” en Consulta de las API
administrativas
v “API sqleBeginCtx - Crear y enlazar con un contexto de aplicación” en Consulta
de las API administrativas
v “API sqleDetachFromCtx - Desenlazar del contexto” en Consulta de las API
administrativas
v “API sqleEndCtx - Desenlazar y liberar la memoria asociada con un contexto de
aplicación” en Consulta de las API administrativas
v “API sqleGetCurrentCtx - Obtener contexto actual” en Consulta de las API
administrativas
v “API sqleInterruptCtx - Interrumpir contexto” en Consulta de las API
administrativas
v “API sqleSetTypeCtx - Establecer tipo de contexto de aplicación” en Consulta de
las API administrativas
v “API de administración y migración de aplicaciones” en Consulta de las API
administrativas
v “API y estructuras de datos modificadas” en Consulta de las API administrativas
Ejemplos relacionados:
v “dbthrds.sqc -- How to use multiple context APIs on UNIX (C)”
v “dbthrds.sqC -- How to use multiple context APIs on UNIX (C++)”
Recomendaciones para utilizar varias hebras
Cuando acceda a una base de datos desde aplicaciones de varias hebras, siga estas
directrices:
Coloque en serie la alteración de estructuras de datos.
Las aplicaciones se deben asegurar de que las estructuras de datos,
definidas por el usuario y utilizadas por las sentencias de SQL y por las
rutinas del gestor de bases de datos, no se vean alteradas por una hebra
mientras se esté procesando una sentencia de SQL o una rutina del gestor
de bases de datos en otra hebra. Por ejemplo, no permita que una hebra
reasigne una SQLDA mientras la está utilizando una sentencia de SQL en
otra hebra.
34 Desarrollo de aplicaciones de SQL incorporado
![Page 43: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/43.jpg)
Considere la posibilidad de utilizar estructuras de datos separadas.
Puede resultar más fácil asignar a cada hebra sus propias estructuras de
datos definidas por el usuario, a fin de evitar que se coloque en serie su
uso. Esta directriz es especialmente cierta para la SQLCA, la cual utilizan
no sólo todas las sentencias de SQL ejecutables, sino también todas las
rutinas del gestor de bases de datos. Existen tres alternativas para evitar
este problema con la SQLCA:
v Utilice EXEC SQL INCLUDE SQLCA, pero añada struct sqlca sqlca al
comienzo de cualquier rutina que utilice cualquier hebra que no sea la
primera.
v Coloque EXEC SQL INCLUDE SQLCA dentro de cada rutina que contenga
SQL, en lugar de hacerlo en el ámbito global.
v Sustituya EXEC SQL INCLUDE SQLCA por #include "sqlca.h" y luego
añada "struct sqlca sqlca" al comienzo de cualquier rutina que utilice
SQL.
Conceptos relacionados:
v “Transacciones simultáneas y acceso a base de datos de varias hebras en
aplicaciones de SQL incorporado” en la página 31
v “Resolución de problemas de aplicaciones de SQL incorporado de varias hebras”
en la página 36
Consideraciones sobre la página de códigos y el código de
país o región para aplicaciones UNIX de varias hebras
Esta sección es específica de las aplicaciones de SQL incorporado C y C++.
En AIX, el entorno operativo Solaris y HP-UX, las funciones que se utilizan para
las consultas en tiempo de ejecución de la página de códigos y del código de país
o región que se van a utilizar para una conexión de base de datos tienen ahora
protección de hebras. Pero estas funciones pueden crear cierta contención de
bloqueo (lo que da lugar a una degradación del rendimiento) en una aplicación de
varias hebras que utilice un gran número de conexiones simultáneas de base de
datos.
Puede utilizar la variable de entorno DB2_FORCE_NLS_CACHE para eliminar la
posibilidad de que se produzca contención de bloqueo en aplicaciones de varias
hebras. Cuando DB2_FORCE_NLS_CACHE tiene el valor TRUE, la información sobre
página de códigos y código de país o región se guarda la primera vez que una
hebra accede a la misma. A partir de este punto, cualquier otra hebra que solicite
esta información utilizará la que se encuentra en la antememoria. Guardando esta
información, se suprime la contención de bloqueos y, en determinadas situaciones,
se obtiene una mejora en el rendimiento.
No debe asignar a DB2_FORCE_NLS_CACHE el valor TRUE si la aplicación
cambia los valores de entorno nacional entre conexiones. Si se produce esta
situación, se devolverá la información del entorno nacional original aunque se
hayan cambiado estos valores. En general, las aplicaciones de varias hebras no
cambiarán los valores de entorno nacional, lo cual asegura que la aplicación sigue
estando a salvo de hebras.
Conceptos relacionados:
v “DB2 registry and environment variables” en Performance Guide
Capítulo 2. Diseño de aplicaciones de SQL incorporado 35
![Page 44: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/44.jpg)
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
v “Desconexión de aplicaciones de SQL incorporado” en la página 195
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Sentencias de SQL incorporado en aplicaciones C y C++” en la página 5
Resolución de problemas de aplicaciones de SQL incorporado
de varias hebras
Las secciones siguientes describen problemas que se pueden producir con
aplicaciones de SQL incorporado de varias hebras y cómo evitarlos.
Una aplicación que utiliza varias hebras es más compleja que una aplicación de
una sola hebra. Esta complejidad adicional puede conducir potencialmente a
algunos problemas inesperados. Cuando escriba una aplicación de varias hebras,
tenga precaución con lo siguiente:
Dependencias de base de datos entre dos o más contextos.
Cada contexto de una aplicación tiene sus propios recursos de base de
datos, incluidos los bloqueos sobre objetos de base de datos. Esta
característica posibilita que dos contextos, si están accediendo al mismo
objeto de base de datos, lleguen a un punto muerto. El gestor de bases de
datos puede detectar el punto muerto, uno de los contextos recibirá
SQLCODE -911 y su unidad de trabajo se retrotraerá.
Dependencias de aplicaciones entre dos o más contextos.
Tenga cuidado con las técnicas de programación que establecen
dependencias entre contextos. Los enganches, los semáforos y las secciones
críticas son ejemplos de técnicas de programación que pueden establecer
dichas dependencias. Si una aplicación tiene dos contextos que tienen
dependencias, tanto de aplicación como de base de datos, entre los
contextos, es posible que la aplicación llegue a un punto muerto. Si
algunas de las dependencias están fuera del gestor de bases de datos, no se
detecta el punto muerto, por lo que la aplicación se suspende o se cuelga.
Prevención de puntos muertos para varios contextos.
Puesto que el gestor de bases de datos no detecta puntos muertos entre
hebras, diseñe y codifique la aplicación de modo que impida (o al menos
evite) puntos muertos.
Como ejemplo de un punto muerto que el gestor de bases de datos no
detectaría piense en una aplicación que tiene dos contextos y ambos
acceden a una estructura de datos común. Para evitar problemas en que
ambos contextos cambien simultáneamente la estructura de datos, la
estructura de datos se protege mediante un semáforo. Los contextos tienen
el aspecto siguiente:
contexto 1
SELECT * FROM TAB1 FOR UPDATE....
UPDATE TAB1 SET....
get semaphore
access data structure
release semaphore
COMMIT
contexto 2
get semaphore
36 Desarrollo de aplicaciones de SQL incorporado
![Page 45: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/45.jpg)
access data structure
SELECT * FROM TAB1...
release semaphore
COMMIT
Suponga que el primer contexto ejecuta satisfactoriamente las sentencias
SELECT y UPDATE, mientras que el segundo contexto obtiene el semáforo
y accede a la estructura de datos. Ahora, el primer contexto intenta obtener
el semáforo, pero no puede porque el segundo contexto lo está reteniendo.
A continuación, el segundo contexto intenta leer una fila de la tabla TAB1,
pero se detiene en un bloqueo de la base de datos mantenido por el primer
contexto. La aplicación se encuentra ahora en un estado en que el contexto
1 no puede terminar antes de que lo haga el contexto 2, y el contexto 2 está
esperando a que el contexto 1 termine. La aplicación está en un punto
muerto pero, puesto que el gestor de bases de datos no sabe nada de la
dependencia del semáforo, no se retrotraerá ninguno de los contextos. La
dependencia no resuelta deja la aplicación suspendida.
Puede evitar el punto muerto que se produciría en el ejemplo anterior de
varias formas.
v Libere todos los bloqueos mantenidos antes de obtener el semáforo.
Cambie el código del contexto 1 de forma que realice una confirmación
antes de obtener el semáforo.
v No codifique sentencias de SQL en una sección protegida por semáforos.
Cambie el código del contexto 2 de forma que libere el semáforo antes
de ejecutar SELECT.
v Codifique todas las sentencias de SQL dentro de semáforos.
Cambie el código del contexto 1 de forma que obtenga el semáforo antes
de ejecutar la sentencia SELECT. Aunque esta técnica funcionará, no es
muy recomendable, puesto que los semáforos colocarán en serie el
acceso al gestor de bases de datos, lo cual invalidará potencialmente las
ventajas de utilizar varias hebras.
v Establezca el parámetro de configuración de la base de datos locktimeout
en un valor distinto de -1.
Aunque un valor distinto de -1 no impedirá el punto muerto, permitirá
que se reanude la ejecución. Eventualmente, se retrotraerá el contexto 2,
puesto que no puede obtener el bloqueo solicitado. Cuando maneje el
error de retrotracción, el contexto 2 debe liberar el semáforo. Una vez
que se haya liberado el semáforo, el contexto 1 podrá continuar y el
contexto 2 será libre de reintentar su trabajo.
Las técnicas para evitar puntos muertos se describen en términos del
ejemplo, pero las puede aplicar a todas las aplicaciones de varias hebras.
En general, trate el gestor de bases de datos tal como trataría cualquier
recurso protegido y no experimentará problemas con las aplicaciones de
varias hebras.
Conceptos relacionados:
v “Información de error en los campos SQLCODE, SQLSTATE y SQLWARN” en la
página 190
v “Transacciones simultáneas y acceso a base de datos de varias hebras en
aplicaciones de SQL incorporado” en la página 31
Tareas relacionadas:
Capítulo 2. Diseño de aplicaciones de SQL incorporado 37
![Page 46: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/46.jpg)
v “Inclusión de las variables del lenguaje principal SQLSTATE y SQLCODE en
aplicaciones de SQL incorporado” en la página 83
38 Desarrollo de aplicaciones de SQL incorporado
![Page 47: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/47.jpg)
Capítulo 3. Programación de aplicaciones de SQL
incorporado
Programación de aplicaciones de SQL incorporado 42
Archivos fuente de SQL incorporado . . . . . . 43
Plantilla de aplicación de SQL incorporado en C . . 44
Archivos de inclusión y definiciones necesarios para
aplicaciones de SQL incorporado . . . . . . . 47
Archivos de inclusión y definiciones necesarios
para aplicaciones de SQL incorporado . . . . 47
Archivos include para aplicaciones de SQL
incorporado C y C++ . . . . . . . . . . 48
Archivos include para aplicaciones de SQL
incorporado COBOL . . . . . . . . . . 50
Archivos include para aplicaciones de SQL
incorporado FORTRAN . . . . . . . . . 53
Declaración de la SQLCA para el manejo de errores 56
Manejo de errores utilizando la sentencia
WHENEVER . . . . . . . . . . . . . . 57
Conexión con bases de datos DB2 en aplicaciones de
SQL incorporado . . . . . . . . . . . . 58
Tipos de datos que se correlacionan con tipos de
datos SQL en aplicaciones de SQL incorporado . . 59
Tipos de datos que se correlacionan con tipos de
datos SQL en aplicaciones de SQL incorporado . 59
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado C y C++ . . . 60
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado C y C++ . . 60
Tipos de datos para procedimientos, funciones
y métodos en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 65
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado COBOL . . . 67
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado FORTRAN . . 70
Tipos de datos de SQL soportados en
aplicaciones de SQL incorporado REXX . . . . 72
Variables del lenguaje principal en aplicaciones de
SQL incorporado . . . . . . . . . . . . 74
Variables del lenguaje principal en aplicaciones
de SQL incorporado . . . . . . . . . . 74
Declaración de variables del lenguaje principal en
aplicaciones de SQL incorporado . . . . . . 76
Declaración de variables del lenguaje principal
con el Generador de declaraciones db2dclgn . . 77
Tipos de datos de columna y variables del
lenguaje principal en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 77
Declaración de variables del lenguaje principal
XML en aplicaciones de SQL incorporado . . . 79
Identificar valores XML en una SQLDA . . . . 80
Identificación de valores de SQL nulos con
variables de indicador de nulo . . . . . . . 81
Inclusión de las variables del lenguaje principal
SQLSTATE y SQLCODE en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 83
Cómo hacer referencia a variables del lenguaje
principal en aplicaciones de SQL incorporado . . 84
Ejemplo: cómo hacer referencia a variables del
lenguaje principal XML en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 85
Variables del lenguaje principal en aplicaciones
de SQL incorporado C y C++ . . . . . . . 86
Variables del lenguaje principal en
aplicaciones de SQL incorporado C y C++ . . 86
Nombres de variables del lenguaje principal
en aplicaciones de SQL incorporado C y C++ . 88
Sección declare para variables del lenguaje
principal en aplicaciones de SQL incorporado
C y C++ . . . . . . . . . . . . . 89
Ejemplo: Plantilla de sección declare de SQL
para aplicaciones de SQL incorporado C y
C++ . . . . . . . . . . . . . . . 90
Variables SQLSTATE y SQLCODE en una
aplicación de SQL incorporado C y C++ . . . 92
Declaración de variables numéricas del
lenguaje principal en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 92
Declaración de variables del lenguaje principal
de tipo carácter de longitud fija, terminadas
en nulo y de longitud variable en aplicaciones
de SQL incorporado C y C++ . . . . . . 94
Declaración de variables de tipo graphic del
lenguaje principal en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 96
Tipos de datos wchar_t y sqldbchar para datos
gráficos en aplicaciones de SQL incorporado C
y C++ . . . . . . . . . . . . . . 97
Opción del precompilador WCHARTYPE para
datos gráficos en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 98
Declaración de variables del lenguaje
principal de tipo VARGRAPHIC en el
formato estructurado en aplicaciones de SQL
incorporado C o C++ . . . . . . . . . 101
Declaración de variables de tipo GRAPHIC
del lenguaje principal en formatos de un solo
gráfico y de gráficos terminados en nulo en
aplicaciones de SQL incorporado C y C++ . . 102
Declaración de variables del lenguaje
principal de tipo objeto grande (large object)
en aplicaciones de SQL incorporado C y C++ . 103
Declaración de variables del lenguaje
principal de tipo localizador de objeto grande
(large object locator) en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 105
Declaración de variables del lenguaje
principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++ . . 106
© Copyright IBM Corp. 1993, 2006 39
![Page 48: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/48.jpg)
Declaración de variables del lenguaje
principal como punteros en aplicaciones de
SQL incorporado C y C++ . . . . . . . 107
Declaración de miembros de datos de clase
como variables del lenguaje principal en
aplicaciones de SQL incorporado C++ . . . 108
Resolución de ámbito y operaciones de
miembro de clase en aplicaciones de SQL
incorporado C y C++ . . . . . . . . . 110
Consideraciones sobre EUC en japonés o
chino tradicional y UCS-2 en aplicaciones de
SQL incorporado C y C++ . . . . . . . 110
Almacenamiento binario de valores de
variables mediante la cláusula FOR BIT
DATA en aplicaciones de SQL incorporado C
y C++ . . . . . . . . . . . . . . 112
Inicialización de variables del lenguaje
principal en aplicaciones de SQL incorporado
C y C++ . . . . . . . . . . . . . 112
Expansión de macros y DECLARE SECTION
de aplicaciones de SQL incorporado C y C++ . 112
Soporte de estructuras del lenguaje principal
en la sección de declaración de aplicaciones
de SQL incorporado C y C++ . . . . . . 114
Variables de indicador de nulo o de
truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++ . . 116
Series terminadas en nulo en aplicaciones de
SQL incorporado C y C++ . . . . . . . 117
Variables del lenguaje principal en COBOL . . 119
Variables del lenguaje principal en COBOL 119
Nombres de variables del lenguaje principal
en COBOL . . . . . . . . . . . . 119
Sección declare para variables del lenguaje
principal en aplicaciones de SQL incorporado
COBOL . . . . . . . . . . . . . 120
Ejemplo: Plantilla de sección declare de SQL
para aplicaciones de SQL incorporado
COBOL . . . . . . . . . . . . . 120
Tipos de datos BINARY/COMP-4 en
aplicaciones de SQL incorporado COBOL . . 121
Variables SQLSTATE y SQLCODE en
aplicaciones de SQL incorporado COBOL . . 122
Declaración de variables numéricas del
lenguaje principal en aplicaciones de SQL
incorporado COBOL . . . . . . . . . 122
Declaración de variables del lenguaje
principal de tipo carácter de longitud fija y
longitud variable en aplicaciones de SQL
incorporado COBOL . . . . . . . . . 123
Declaración de variables del lenguaje
principal de tipo graphic de longitud fija y
longitud variable en aplicaciones de SQL
incorporado COBOL . . . . . . . . . 125
Declaración de variables del lenguaje
principal de tipo objeto grande (large object)
en aplicaciones de SQL incorporado COBOL . 126
Declaración de variables del lenguaje
principal de tipo localizador de objeto grande
(large object locator) en aplicaciones de SQL
incorporado COBOL . . . . . . . . . 127
Declaración de variables del lenguaje
principal de referencia de archivos
aplicaciones de SQL incorporado COBOL . . 128
Agrupación de elementos de datos utilizando
REDEFINES en aplicaciones de SQL
incorporado COBOL . . . . . . . . . 128
Consideraciones sobre EUC en japonés o
chino tradicional y UCS-2 para aplicaciones
de SQL incorporado COBOL . . . . . . 129
Almacenamiento binario de valores de
variables mediante la cláusula FOR BIT
DATA en aplicaciones de SQL incorporado
COBOL . . . . . . . . . . . . . 129
Soporte de estructuras del lenguaje principal
en la sección de declaración de aplicaciones
de SQL incorporado COBOL . . . . . . 130
Tablas de variables de indicador de nulo y de
indicador de nulo o de truncamiento en
aplicaciones de SQL incorporado COBOL . . 132
Variables del lenguaje principal en FORTRAN 133
Variables del lenguaje principal en
FORTRAN . . . . . . . . . . . . 133
Nombres de variables del lenguaje principal
en aplicaciones de SQL incorporado
FORTRAN . . . . . . . . . . . . 133
Sección declare para variables del lenguaje
principal en aplicaciones de SQL incorporado
FORTRAN . . . . . . . . . . . . 134
Ejemplo: Plantilla de sección declare de SQL
para aplicaciones de SQL incorporado
FORTRAN . . . . . . . . . . . . 134
Variables SQLSTATE y SQLCODE en
aplicaciones de SQL incorporado FORTRAN . 135
Declaración de variables numéricas del
lenguaje principal en aplicaciones de SQL
incorporado FORTRAN . . . . . . . . 135
Declaración de variables del lenguaje
principal de tipo carácter de longitud fija y
longitud variable en aplicaciones de SQL
incorporado FORTRAN . . . . . . . . 136
Declaración de variables del lenguaje
principal de tipo objeto grande (large object)
en aplicaciones de SQL incorporado
FORTRAN . . . . . . . . . . . . 138
Declaración de variables del lenguaje
principal de tipo localizador de objeto grande
(large object locator) en aplicaciones de SQL
incorporado FORTRAN . . . . . . . . 139
Declaración de variables del lenguaje
principal de referencia de archivos
aplicaciones de SQL incorporado FORTRAN . 140
Consideraciones sobre los juegos de
caracteres gráficos (de varios bytes) en
aplicaciones de SQL incorporado FORTRAN . 140
Consideraciones sobre EUC en japonés o
chino tradicional y UCS-2 para aplicaciones
de SQL incorporado FORTRAN . . . . . 141
Variables de indicador de nulo o de
truncamiento en aplicaciones de SQL
incorporado FORTRAN . . . . . . . . 141
40 Desarrollo de aplicaciones de SQL incorporado
![Page 49: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/49.jpg)
Variables del lenguaje principal en aplicaciones
de SQL incorporado REXX . . . . . . . . 142
Variables del lenguaje principal en REXX . . 142
Nombres de variables del lenguaje principal
en aplicaciones de SQL incorporado REXX . 142
Referencias a variables del lenguaje principal
en aplicaciones de SQL incorporado REXX . 142
Variables de REXX predefinidas . . . . . 143
Consideraciones sobre la programación de
aplicaciones REXX de SQL incorporado . . 145
Declaración de variables del lenguaje
principal de tipo objeto grande (large object)
en aplicaciones de SQL incorporado REXX . 146
Declaración de variables del lenguaje
principal de tipo localizador de objeto grande
(large object locator) en aplicaciones de SQL
incorporado REXX . . . . . . . . . . 147
Declaración de variables del lenguaje
principal de referencia de archivos en
aplicaciones de SQL incorporado REXX . . 148
Borrado de variables del lenguaje principal
de LOB en aplicaciones de SQL incorporado . 149
Variables de indicador de nulo o de
truncamiento en aplicaciones de SQL
incorporado REXX . . . . . . . . . . 149
Ejecución de sentencias de SQL en aplicaciones de
SQL incorporado . . . . . . . . . . . . 150
Ejecución de sentencias de SQL en aplicaciones
de SQL incorporado . . . . . . . . . . 150
Comentarios en aplicaciones de SQL
incorporado . . . . . . . . . . . . . 150
Ejecución de sentencias de SQL estático en
aplicaciones de SQL incorporado . . . . . . 151
Recuperación de información de variables del
lenguaje principal procedente de la estructura
SQLDA en aplicaciones de SQL incorporado . . 152
Recuperación de información de variables del
lenguaje principal procedente de la
estructura SQLDA en aplicaciones de SQL
incorporado . . . . . . . . . . . . 152
Declaración de la estructura SQLDA en un
programa de SQL ejecutado dinámicamente . 153
Preparación de una sentencia de SQL
ejecutada dinámicamente utilizando la
estructura SQLDA mínima . . . . . . . 154
Asignación de una estructura SQLDA con
suficientes entradas SQLVAR para sentencias
de SQL ejecutadas dinámicamente . . . . 156
Descripción de una sentencia SELECT en un
programa de SQL ejecutado dinámicamente . 157
Adquisición de almacenamiento para
albergar una fila . . . . . . . . . . 158
Proceso del cursor en un programa SQL
ejecutado dinámicamente . . . . . . . 159
Asignación de una estructura SQLDA para
un programa de SQL ejecutado
dinámicamente . . . . . . . . . . . 159
Transferencia de datos en un programa de
SQL ejecutado dinámicamente utilizando una
estructura SQLDA . . . . . . . . . . 163
Proceso de sentencias de SQL interactivas en
programas de SQL ejecutados dinámicamente 164
Determinación del tipo de sentencia en
programas de SQL ejecutados dinámicamente 164
Proceso de sentencias SELECT de lista de
variables en programas de SQL ejecutados
dinámicamente . . . . . . . . . . . 165
Cómo guardar peticiones de SQL
procedentes de usuarios finales . . . . . 166
Ejecución de expresiones XQuery en
aplicaciones de SQL incorporado . . . . . . 166
Suministro de entrada de variables a un SQL
ejecutado dinámicamente mediante marcadores
de parámetros . . . . . . . . . . . . 169
Cómo proporcionar entrada de variables a
una sentencia de SQL ejecutada
dinámicamente mediante marcadores de
parámetros . . . . . . . . . . . . 169
Ejemplo de marcadores de parámetros en un
programa de SQL ejecutado dinámicamente . 170
Llamada a procedimientos almacenados en
aplicaciones de SQL incorporado . . . . . . 171
Llamada a procedimientos almacenados en
aplicaciones de SQL incorporado . . . . . 171
Llamada a procedimientos almacenados en
aplicaciones de SQL incorporado C y C++ . . 171
Llamada a procedimientos almacenados
desde REXX . . . . . . . . . . . . 172
Lectura de los conjuntos de resultados y
desplazamiento por los mismos en aplicaciones
de SQL incorporado . . . . . . . . . . 176
Lectura de los conjuntos de resultados y
desplazamiento por los mismos en
aplicaciones de SQL incorporado . . . . . 176
Desplazamiento por datos anteriormente
recuperados en aplicaciones de SQL
incorporado . . . . . . . . . . . . 177
Mantenimiento de una copia de datos
captados aplicaciones de SQL incorporado . 177
Recuperación de datos captados por segunda
vez en aplicaciones de SQL incorporado . . 178
Diferencias en el orden de las filas en tablas
de resultados . . . . . . . . . . . 179
Actualización de datos anteriormente
recuperados en aplicaciones de SQL
incorporado . . . . . . . . . . . . 180
Selección de varias filas mediante un cursor 180
Actualización y supresión de datos
recuperados en una aplicación de SQL
ejecutada estáticamente . . . . . . . . 188
Ejemplo de captación en un programa de
SQL ejecutado estáticamente . . . . . . 189
Recuperación de mensajes de error en aplicaciones
de SQL incorporado . . . . . . . . . . . 190
Información de error en los campos SQLCODE,
SQLSTATE y SQLWARN . . . . . . . . 190
Recuperación de mensajes de error en
aplicaciones de SQL incorporado . . . . . . 191
Consideraciones sobre las rutinas de lista de
salida . . . . . . . . . . . . . . . 194
Capítulo 3. Programación de aplicaciones de SQL incorporado 41
![Page 50: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/50.jpg)
Consideraciones sobre el manejador de
excepciones, señales e interrupciones . . . . 194
Desconexión de aplicaciones de SQL incorporado 195
Programación de aplicaciones de SQL incorporado
La programación de aplicaciones de SQL incorporado implica todos los pasos
necesarios para ensamblar una aplicación en el lenguaje elegido de programación
de SQL incorporado. Una vez determine que SQL incorporado es la API adecuada
para sus necesidades de programación, y tras diseñar la aplicación de SQL
incorporado, estará preparado para programar una aplicación de SQL incorporado.
Requisitos previos:
v Elección de si desea utilizar sentencias de SQL estático o dinámico
v Diseño de una aplicación de SQL incorporado
La programación de aplicaciones de SQL incorporado consta de las siguientes
subtareas:
v Inclusión de los archivos de cabecera necesarios
v Elección de un lenguaje de programación de SQL incorporado soportado
v Declaración de variables del lenguaje principal para representar los valores que
se van a incluir en sentencias de SQL
v Conexión con una fuente de datos
v Ejecución de sentencias de SQL
v Manejo de errores y avisos de SQL relacionados con la ejecución de sentencias
de SQL
v Desconexión de la fuente de datos
Cuando haya completado la aplicación de SQL incorporado, estará listo para
compilar y ejecutar la aplicación: Creación de aplicaciones de SQL incorporado.
Conceptos relacionados:
v “Archivos de inclusión y definiciones necesarios para aplicaciones de SQL
incorporado” en la página 47
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
v “Errores y avisos procedentes de la precompilación aplicaciones de SQL
incorporado” en la página 209
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
42 Desarrollo de aplicaciones de SQL incorporado
![Page 51: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/51.jpg)
Archivos fuente de SQL incorporado
Cuando desarrolla código fuente que incluye SQL incorporado, tiene que seguir
ciertos convenios de denominación de archivos específicos para cada uno de los
lenguajes principales soportados.
Archivos de entrada y de salida para C y C++:
Por omisión, la aplicación fuente puede tener las siguientes extensiones:
.sqc Para archivos C en todos los sistemas operativos soportados
.sqC Para archivos C++ en los sistemas operativos UNIX y Linux
.sqx Para archivos C++ en sistemas operativos Windows
Por omisión, los archivos de salida del precompilador correspondiente tienen las
siguientes extensiones:
.c Para archivos C en todos los sistemas operativos soportados
.C Para archivos C++ en los sistemas operativos UNIX y Linux
.cxx Para archivos C++ en sistemas operativos Windows
Puede utilizar la opción de precompilación OUTPUT para alterar temporalmente el
nombre y la vía de acceso del archivo fuente de salida modificado. Si utiliza las
opciones de precompilación TARGET C o TARGET CPLUSPLUS, no es necesario que el
archivo de entrada tenga ninguna extensión concreta.
Archivos de entrada y salida para COBOL:
Por omisión, la aplicación fuente tiene la extensión:
.sqb Para archivos COBOL en todos los sistemas operativos
Sin embargo, si utiliza la opción de precompilación TARGET, (TARGET
ANSI_COBOL, TARGET IBMCOB o TARGET MFCOB), el archivo de entrada
puede tener la extensión que prefiera.
Por omisión, los archivos de salida del precompilador correspondiente tienen las
siguientes extensiones:
.cbl Para archivos COBOL en todos los sistemas operativos
Sin embargo, puede utilizar la opción de precompilación OUTPUT para especificar
un nuevo nombre y vía de acceso para el archivo fuente modificado de salida.
Archivos de entrada y salida para FORTRAN:
Por omisión, la aplicación fuente tiene la extensión:
.sqf Para archivos FORTRAN en todos los sistemas operativos
Sin embargo, si utiliza la opción de precompilación TARGET con la opción
FORTRAN, el archivo de entrada puede tener la extensión que prefiera.
Por omisión, los archivos de salida del precompilador correspondiente tienen las
siguientes extensiones:
Capítulo 3. Programación de aplicaciones de SQL incorporado 43
![Page 52: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/52.jpg)
.f Para archivos FORTRAN en los sistemas operativos UNIX y Linux
.for Para archivos FORTRAN en sistemas operativos Windows
Sin embargo, puede utilizar la opción de precompilación OUTPUT para especificar
un nuevo nombre y vía de acceso para el archivo fuente modificado de salida.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
v “Creación de aplicaciones de SQL incorporado” en la página 198
v “Creación de aplicaciones de SQL incorporado desde la línea de mandatos” en la
página 268
Plantilla de aplicación de SQL incorporado en C
Esta es una aplicación de SQL incorporado simple que se le proporciona para
probar el entorno de desarrollo de SQL incorporado y como ayuda para aprender
la estructura básica de las aplicaciones de SQL incorporado.
Las aplicaciones de SQL incorporado requieren la siguiente estructura:
v inclusión de los archivos de cabecera necesarios
v declaraciones de variables del lenguaje principal para los valores que se van a
incluir en sentencias de SQL
v una conexión de base de datos
v la ejecución de sentencias de SQL
v el manejo de errores y avisos de SQL relacionados con la ejecución de sentencias
de SQL
v desconexión de la conexión de base de datos
El siguiente código fuente demuestra la estructura básica necesaria para las
aplicaciones de SQL incorporado escritas en C.
44 Desarrollo de aplicaciones de SQL incorporado
![Page 53: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/53.jpg)
#include <stdio.h> �1�
#include <stdlib.h>
#include <string.h>
#include <sqlenv.h>
#include <sqlutil.h>
EXEC SQL BEGIN DECLARE SECTION; �2�
short id;
char name[10];
short dept;
double salary;
char hostVarStmtDyn[50];
EXEC SQL END DECLARE SECTION;
int main()
{
int rc = 0; �3�
EXEC SQL INCLUDE SQLCA; �4�
/* conectar con base de datos */
printf("\n Connecting to database...");
EXEC SQL CONNECT TO "sample"; �5�
if (SQLCODE < 0) �6�
{
printf("\nConnect Error: SQLCODE = %ld \n", SQLCODE);
goto connect_reset;
}
else
{
printf("\n Connected to database.\n");
}
/* ejecutar una sentencia SQL (consulta) mediante SQL estático; copiar
la fila de valores de resultado a variables del lenguaje principal*/
EXEC SQL SELECT id, name, dept, salary �7�
INTO :id, :name, :dept, :salary
FROM staff WHERE id = 310;
if (SQLCODE < 0) �6�
{
printf("Select Error: SQLCODE = %ld \n", SQLCODE);
}
else
{
/* imprimir los valores de variable del lenguaje principal a
salida estándar */
printf("\n Executing a static SQL query statement, searching for
\n the id value equal to 310\n");
printf("\n ID Name DEPT Salary\n");
printf(" %3d %7s %7d %16.2f\n\n", id, name, dept, salary);
}
strcpy(hostVarStmtDyn, "UPDATE staff
SET salary = salary + 1000
WHERE dept = ?");
/* ejecutar una sentencia de SQL (operación) utilizando una variable del
lenguaje principal y DYNAMIC SQL*/
EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;
if (SQLCODE < 0) �6�
{
printf("Prepare Error: SQLCODE = %ld \n", SQLCODE);
}
else
{
EXEC SQL EXECUTE StmtDyn USING :dept; �8�
}
if (SQLCODE < 0) �6�
{
printf("Execute Error: SQLCODE = %ld \n", SQLCODE);
}
Figura 1. Programa de ejemplo: template.sqc (Parte 1 de 2)
Capítulo 3. Programación de aplicaciones de SQL incorporado 45
![Page 54: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/54.jpg)
Nota para la Figura 1 en la página 45:
Nota Descripción
�1� Incluir archivos: esta directriz incluye un archivo en la aplicación fuente.
�2� Sección de declaración: la declaración de variables del lenguaje principal que se
utilizarán para contener valores a los que se hace referencia en las sentencias de
SQL de la aplicación C.
�3� Declaración de variable local: este bloque declara las variables locales a utilizar
en la aplicación. Estas no son variables del lenguaje principal.
�4� Incluyendo la estructura SQLCA: la estructura SQLCA se actualiza tras la
ejecución de cada sentencia de SQL. Esta aplicación de plantilla utiliza
determinados campos de SQLCA para el manejo de errores.
�5� Conexión a una base de datos: el paso inicial al trabajar con la base de datos es
establecer una conexión a la base de datos. Aquí, la conexión se efectúa
ejecutando la sentencia de SQL CONNECT.
�6� Manejo de errores: comprueba si se ha producido un error.
�7� Ejecutar una consulta: la ejecución de esta sentencia de SQL asigna datos
devueltos de una tabla a variables del lenguaje principal. El código C debajo de
la ejecución de la sentencia de SQL imprime los valores de las variables del
lenguaje principal en salida estándar.
/* Leer la fila actualizada mediante STATIC SQL y CURSOR */
EXEC SQL DECLARE posCur1 CURSOR FOR
SELECT id, name, dept, salary
FROM staff WHERE id = 310;
if (SQLCODE < 0) �6�
{
printf("Declare Error: SQLCODE = %ld \n", SQLCODE);
}
EXEC SQL OPEN posCur1;
EXEC SQL FETCH posCur1 INTO :id, :name, :dept, :salary ; �9�
if (SQLCODE < 0) �6�
{
printf("Fetch Error: SQLCODE = %ld \n", SQLCODE);
}
else
{
printf(" Executing an dynamic SQL statement, updating the
\n salary value for the id equal to 310\n");
printf("\n ID Name DEPT Salary\n");
printf(" %3d %7s %7d %16.2f\n\n", id, name, dept, salary);
}
EXEC SQL CLOSE posCur1;
/* Comprometer la transacción */
printf("\n Commit the transaction.\n");
EXEC SQL COMMIT; �10�
if (SQLCODE < 0) �6�
{
printf("Error: SQLCODE = %ld \n", SQLCODE);
}
/* Desconectar de la base de datos */
connect_reset :
EXEC SQL CONNECT RESET; �11�
if (SQLCODE < 0) �6�
{
printf("Connection Error: SQLCODE = %ld \n", SQLCODE);
}
return 0;
} /* end main */
Figura 1. Programa de ejemplo: template.sqc (Parte 2 de 2)
46 Desarrollo de aplicaciones de SQL incorporado
![Page 55: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/55.jpg)
Nota Descripción
�8� Ejecutar una operación: la ejecución de esta sentencia de SQL actualiza un
conjunto de filas de una tabla identificada por su número de departamento. La
preparación (realizada tres líneas antes) es un paso en el que los valores de
variables del lenguaje principal, como a la que se hace referencia en esta
sentencia, están enlazadas a la sentencia de SQL que debe ejecutarse.
�9� Ejecutar una operación: en esta línea y en la línea anterior, esta aplicación
utiliza cursores en SQL estático para seleccionar información de una tabla e
imprimir los datos. Una vez se ha declarado y abierto el cursor, se cargan los
datos y, finalmente, se cierra el cursor.
�10� Comprometer la transacción: la sentencia COMMIT finaliza los cambios de la
base de datos que se realizaron dentro de una unidad de trabajo.
�11� Finalmente, la conexión de base de datos debe desactivarse.
Conceptos relacionados:
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
v “Archivos de inclusión y definiciones necesarios para aplicaciones de SQL
incorporado” en la página 47
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
Información relacionada:
v “SQLCA (área de comunicaciones SQL)” en Consulta de SQL, Volumen 1
v “Sentencia ROLLBACK” en Consulta de SQL, Volumen 2
v “Sentencia COMMIT” en Consulta de SQL, Volumen 2
Archivos de inclusión y definiciones necesarios para aplicaciones de
SQL incorporado
Archivos de inclusión y definiciones necesarios para
aplicaciones de SQL incorporado
Los archivos de inclusión son necesarios para proporcionar funciones y tipos
utilizados dentro de la biblioteca. Deben incluirse para que el programa pueda
utilizar las funciones de biblioteca. Por omisión, estos archivos se instalarán en la
carpeta $HOME/sqllib/include. Cada lenguaje principal tiene sus propios métodos
para incluir archivos, así como para utilizar distintas extensiones de archivo.
Dependiendo del lenguaje especificado, deben tomarse ciertas precauciones, como
especificar vías de acceso de archivo.
Información relacionada:
v “Archivos include para aplicaciones de SQL incorporado C y C++” en la página
48
v “Archivos include para aplicaciones de SQL incorporado COBOL” en la página
50
Capítulo 3. Programación de aplicaciones de SQL incorporado 47
![Page 56: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/56.jpg)
v “Archivos include para aplicaciones de SQL incorporado FORTRAN” en la
página 53
Archivos include para aplicaciones de SQL incorporado C y
C++
Los archivos include específicos del lenguaje principal (archivos de cabecera) para
C y C++ tienen la extensión de archivo .h. Hay dos métodos para incluir archivos:
la sentencia EXEC SQL INCLUDE y la macro #include. El precompilador pasará por
alto #include y sólo procesará los archivos incluidos mediante la sentencia EXEC
SQL INCLUDE. Para localizar los archivos incluidos mediante EXEC SQL INCLUDE, el
precompilador C de DB2 busca en primer lugar en el directorio actual y, a
continuación, en los directorios especificados por la variable de entorno
DB2INCLUDE. Considere los ejemplos siguientes:
v EXEC SQL INCLUDE payroll;
Si el archivo especificado en la sentencia INCLUDE no está encerrado entre
comillas, tal como en el ejemplo anterior, el precompilador C busca payroll.sqc,
y luego payroll.h, en cada uno de los directorios que mira. En los sistemas
operativos UNIX y Linux, el precompilador C++ busca payroll.sqC, luego
payroll.sqx, luego payroll.hpp y luego payroll.h en cada uno de los
directorios que examina. En los sistemas operativos Windows de 32 bits, el
precompilador C++ busca sucesivamente payroll.sqx, payroll.hpp y payroll.h
en cada uno de los directorios que examina.
v EXEC SQL INCLUDE ’pay/payroll.h’;
Si el nombre de archivo está encerrado entre comillas, como en el caso anterior,
no se añade ninguna extensión al nombre.
Si el nombre de archivo entrecomillado no contiene una vía de acceso absoluta,
se utiliza el contenido de DB2INCLUDE para buscar el archivo, y se le añade como
prefijo la vía de acceso especificada en el nombre de archivo de INCLUDE. Por
ejemplo, en los sistemas basados en UNIX y Linux, si DB2INCLUDE se establece en
‘/disk2:myfiles/c’, el precompilador C o C++ busca ‘./pay/payroll.h’, luego
‘/disk2/pay/payroll.h’ y finalmente ‘./myfiles/c/pay/payroll.h’. En los
mensajes del precompilador se muestra la vía de acceso en la que se encuentra
realmente el archivo. En sistemas operativos Windows, sustituya las barras
inclinadas invertidas (\) del ejemplo anterior por barras inclinadas.
Nota: El procesador de línea de mandatos coloca en antememoria el valor de
DB2INCLUDE. Para cambiar el valor de DB2INCLUDE después de haber emitido
mandatos del CLP, entre el mandato TERMINATE, luego vuelva a conectar con
la base de datos y realice una precompilación del modo habitual.
Como ayuda para relacionar los errores del compilador con la fuente original, el
precompilador genera macros #line en el archivo de salida. Esto permite que el
compilador informe de los errores utilizando el nombre de archivo y el número de
línea del archivo fuente o fuente incluido, en lugar del número de línea del archivo
fuente de salida precompilado.
Sin embargo, si se especifica la opción PREPROCESSOR, todas las macros #line
generadas por el precompilador hacen referencia al archivo preprocesado por el
preprocesador C externo. Algunos depuradores y otras herramientas que
relacionan código fuente con código objeto no siempre funcionan bien con la macro
#line. Si la herramienta que desea utilizar se comporta de forma inesperada, utilice
la opción NOLINEMACRO (usada con DB2 PREP) cuando realice la precompilación.
Esta opción evita que se generen macros #line.
48 Desarrollo de aplicaciones de SQL incorporado
![Page 57: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/57.jpg)
A continuación se describen los archivos include destinados a su uso en las
aplicaciones del usuario.
SQLADEF (sqladef.h)
Este archivo contiene prototipos de funciones utilizados por aplicaciones C
y C++ precompiladas.
SQLCA (sqlca.h)
Este archivo define la estructura del Área de comunicaciones de SQL
(SQLCA). El SQLCA contiene variables que utiliza el gestor de bases de
datos para proporcionar a una aplicación información de error sobre la
ejecución de sentencias de SQL y llamadas a API.
SQLCODES (sqlcodes.h)
Este archivo define constantes para el campo SQLCODE de la estructura
SQLCA.
SQLDA (sqlda.h)
Este archivo define la estructura del Área de descriptores de SQL
(SQLDA). La SQLDA se utiliza para pasar datos entre una aplicación y el
gestor de bases de datos.
SQLEXT (sqlext.h)
Este archivo contiene los prototipos y constantes de funciones de aquellas
API de Nivel 1 y Nivel 2 de ODBC que no forman parte de la
especificación de la Interfaz de nivel de llamada de X/Open y, por lo tanto,
se utiliza con permiso de Microsoft Corporation.
SQLE819A (sqle819a.h)
Si la página de códigos de la base de datos es 819 (ISO Latin-1), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
clasificación binaria CCSID 500 (EBCDIC internacional) del sistema
principal. La API CREATE DATABASE utiliza este archivo.
SQLE819B (sqle819b.h)
Si la página de códigos de la base de datos es 819 (ISO Latin-1), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
clasificación binaria CCSID 037 (EBCDIC inglés de EE.UU.) del sistema
principal. La API CREATE DATABASE utiliza este archivo.
SQLE850A (sqle850a.h)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
clasificación binaria CCSID 500 (EBCDIC internacional) del sistema
principal. La API CREATE DATABASE utiliza este archivo.
SQLE850B (sqle850b.h)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
clasificación binaria CCSID 037 (EBCDIC inglés de EE.UU.) del sistema
principal. La API CREATE DATABASE utiliza este archivo.
SQLE932A (sqle932a.h)
Si la página de códigos de la base de datos es 932 (ASCII japonés), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
clasificación binaria CCSID 5035 (EBCDIC japonés) del sistema principal.
La API CREATE DATABASE utiliza este archivo.
SQLE932B (sqle932b.h)
Si la página de códigos de la base de datos es 932 (ASCII japonés), esta
secuencia clasifica series de caracteres que no son FOR BIT DATA según la
Capítulo 3. Programación de aplicaciones de SQL incorporado 49
![Page 58: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/58.jpg)
clasificación binaria CCSID 5026 (EBCDIC japonés) del sistema principal.
La API CREATE DATABASE utiliza este archivo.
SQLJACB (sqljacb.h)
Este archivo define constantes, estructuras y bloques de control
correspondientes a la interfaz de DB2 Connect.
SQLSTATE (sqlstate.h)
Este archivo define constantes correspondientes al campo SQLSTATE de la
estructura SQLCA.
SQLSYSTM (sqlsystm.h)
Este archivo contiene definiciones específicas de la plataforma que utilizan
las API y las estructuras de datos del gestor de bases de datos.
SQLUDF (sqludf.h)
Este archivo define constantes y estructuras de interfaces para escribir
funciones definidas por el usuario (UDF).
SQLUV (sqluv.h)
Este archivo define estructuras, constantes y prototipos para la API
asíncrona de Registro de lecturas y para las API utilizadas por los
proveedores de carga y descarga de tablas.
Información relacionada:
v “Archivos include para las aplicaciones de API de DB2” en Consulta de las API
administrativas
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
v “Ejemplos de C” en la página 405
Archivos include para aplicaciones de SQL incorporado
COBOL
Los archivos include específicos del lenguaje principal para COBOL tienen la
extensión de archivo .cbl. Si se utiliza la característica ″Soporte para tipo de datos
de sistema principal System/390″ del compilador COBOL de IBM, los archivos
include de DB2 para las aplicaciones se encuentran en el directorio siguiente:
$HOME/sqllib/include/cobol_i
Si crea los programas de ejemplo de DB2 con los archivos de script suministrados,
deben cambiar la vía de acceso de archivos include especificada en los archivos de
script por el directorio cobol_i, y no por el directorio cobol_a.
Si no utiliza la característica ″Soporte para tipo de datos de sistema principal
System/390″ del compilador COBOL de IBM, o si utiliza una versión anterior de
este compilador, los archivos include de DB2 para las aplicaciones se encuentran en
el directorio siguiente:
$HOME/sqllib/include/cobol_a
Para localizar archivos INCLUDE, el precompilador COBOL de DB2 busca en
primer lugar en el directorio actual y, a continuación, en los directorios
especificados por la variable de entorno DB2INCLUDE. Considere los ejemplos
siguientes:
v EXEC SQL INCLUDE payroll END-EXEC.
50 Desarrollo de aplicaciones de SQL incorporado
![Page 59: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/59.jpg)
Si el archivo especificado en la sentencia INCLUDE no está encerrado entre
comillas, como en el ejemplo anterior, el precompilador C busca payroll.sqb,
luego payroll.cpy y luego payroll.cbl en cada uno de los directorios que mira.
v EXEC SQL INCLUDE ’pay/payroll.cbl’ END-EXEC.
Si el nombre de archivo está encerrado entre comillas, como en el caso anterior,
no se añade ninguna extensión al nombre.
Si el nombre del archivo entrecomillado no contiene una vía de acceso absoluta,
se utiliza el contenido de DB2INCLUDE para buscar el archivo, añadiéndole
como prefijo la vía de acceso especificada en el nombre del archivo INCLUDE.
Por ejemplo, con sistemas de bases de datos DB2 para AIX, si DB2INCLUDE se
establece en ‘/disk2:myfiles/cobol’, el precompilador busca
‘./pay/payroll.cbl’, luego ‘/disk2/pay/payroll.cbl’ y finalmente
‘./myfiles/cobol/pay/payroll.cbl’. En los mensajes del precompilador se
muestra la vía de acceso en la que se encuentra realmente el archivo. En las
plataformas Windows, sustituya las barras inclinadas invertidas (\) del ejemplo
anterior por barras inclinadas.
Nota: El procesador de línea de mandatos de DB2 coloca en antememoria el valor
de DB2INCLUDE. Para cambiar el valor de DB2INCLUDE después de haber
emitido mandatos del CLP, entre el mandato TERMINATE, luego vuelva a
conectar con la base de datos y realice una precompilación del modo
habitual.
A continuación se describen los archivos include destinados a su uso en las
aplicaciones del usuario.
SQLCA (sqlca.cbl)
Este archivo define la estructura del Área de comunicaciones de
SQL (SQLCA). El SQLCA contiene variables que utiliza el gestor de
bases de datos para proporcionar a una aplicación información de
error sobre la ejecución de sentencias de SQL y llamadas a API.
SQLCA_92 (sqlca_92.cbl)
Este archivo contiene una versión que se ajusta a FIPS SQL92 Entry
Level de la estructura Área de comunicaciones de SQL (SQL
Communications Area (SQLCA)). Debe incluir este archivo en
lugar del archivo sqlca.cbl cuando escriba aplicaciones DB2 que
se ajusten al estándar FIPS SQL92 Entry Level. El precompilador
de DB2 incluye automáticamente el archivo sqlca_92.cbl cuando
la opción LANGLEVEL del precompilador se establece en SQL92E.
SQLCODES (sqlcodes.cbl)
Este archivo define constantes para el campo SQLCODE de la
estructura SQLCA.
SQLDA (sqlda.cbl)
Este archivo define la estructura del Área de descriptores de SQL
(SQLDA). La SQLDA se utiliza para pasar datos entre una
aplicación y el gestor de bases de datos.
SQLEAU (sqleau.cbl)
Este archivo contiene definiciones de constantes y de estructuras
necesarias para las API de auditoría de seguridad de DB2. Si
utiliza estas API, tiene que incluir este archivo en el programa. Este
archivo también contiene definiciones de constantes y de valores
de palabras clave para los campos del registro de seguimiento de
auditoría. Programas externos o de extracción de seguimiento de
auditoría de proveedores pueden utilizar estas definiciones.
Capítulo 3. Programación de aplicaciones de SQL incorporado 51
![Page 60: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/60.jpg)
SQLETSD (sqletsd.cbl)
Este archivo define la estructura Descriptor de espacio de tabla
(Table Space Descriptor), SQLETSDESC, que se pasa a la API para
Crear base de datos, sqlgcrea.
SQLE819A (sqle819a.cbl)
Si la página de códigos de la base de datos es 819 (ISO Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQLE819B (sqle819b.cbl)
Si la página de códigos de la base de datos es 819 (ISO Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 037 (EBCDIC inglés de
EE.UU.) del sistema principal. La API CREATE DATABASE utiliza
este archivo.
SQLE850A (sqle850a.cbl)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQLE850B (sqle850b.cbl)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 037 (EBCDIC inglés de
EE.UU.) del sistema principal. La API CREATE DATABASE utiliza
este archivo.
SQLE932A (sqle932a.cbl)
Si la página de códigos de la base de datos es 932 (ASCII japonés),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 5035 (EBCDIC japonés)
del sistema principal. La API CREATE DATABASE utiliza este
archivo.
SQLE932B (sqle932b.cbl)
Si la página de códigos de la base de datos es 932 (ASCII japonés),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 5026 (EBCDIC japonés)
del sistema principal. La API CREATE DATABASE utiliza este
archivo.
SQL1252A (sql1252a.cbl)
Si la página de códigos de la base de datos es 1252 (Windows
Latin-1), esta secuencia clasifica series de caracteres que no son
FOR BIT DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQL1252B (sql1252b.cbl)
Si la página de códigos de la base de datos es 1252 (Windows
Latin-1), esta secuencia clasifica series de caracteres que no son
FOR BIT DATA según la clasificación binaria CCSID 037 (EBCDIC
inglés de EE.UU.) del sistema principal. La API CREATE
DATABASE utiliza este archivo.
52 Desarrollo de aplicaciones de SQL incorporado
![Page 61: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/61.jpg)
SQLSTATE (sqlstate.cbl)
Este archivo define constantes correspondientes al campo
SQLSTATE de la estructura SQLCA.
SQLUTBCQ (sqlutbcq.cbl)
Este archivo define la estructura de datos (Consulta de contenedor
de espacio de tabla (Table Space Container Query),
SQLB-TBSCONTQRY-DATA, que se utiliza con las API de consulta
del contenedor del espacio de tabla, sqlgstsc, sqlgftcq y sqlgtcq.
SQLUTBSQ (sqlutbsq.cbl)
Este archivo define la estructura de datos Consulta de espacio de
tabla (Table Space Query), SQLB-TBSTQRY-DATA, que se utiliza
con las API de consulta del espacio de tabla, sqlgstsq, sqlgftsq y
sqlgtsq.
Información relacionada:
v “Archivos include para las aplicaciones de API de DB2” en Consulta de las API
administrativas
v “Ejemplos de COBOL” en la página 408
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
Archivos include para aplicaciones de SQL incorporado
FORTRAN
Los archivos include específicos del lenguaje principal correspondientes a
FORTRAN tienen la extensión de archivo .f en los sistemas operativos UNIX y
Linux y .for en los sistemas operativos Windows. Existen dos métodos para
incluir archivos: la sentencia EXEC SQL INCLUDE y la sentencia INCLUDE de
FORTRAN. El precompilador pasará por alto las sentencias INCLUDE de
FORTRAN y sólo procesará los archivos incluidos mediante la sentencia EXEC
SQL. Para localizar el archivo INCLUDE, el precompilador FORTRAN de DB2
busca en primer lugar en el directorio actual y, a continuación, en los directorios
especificados por la variable de entorno DB2INCLUDE.
Considere los ejemplos siguientes:
v EXEC SQL INCLUDE payroll
Si el archivo especificado en la sentencia INCLUDE no está encerrado entre
comillas, como en el ejemplo anterior, el precompilador busca sucesivamente
payroll.sqf y payroll.f (payroll.for en sistemas operativos Windows) en cada
uno de los directorios que examina.
v EXEC SQL INCLUDE ’pay/payroll.f’
Si el nombre de archivo está encerrado entre comillas, como en el caso anterior,
no se añade ninguna extensión al nombre. (Para sistemas operativos Windows,
el archivo se especificaría como ’pay\payroll.for’.)
Si el nombre de archivo entrecomillado no contiene una vía de acceso absoluta,
se utiliza el contenido de DB2INCLUDE para buscar el archivo, y se le añade
como prefijo la vía de acceso especificada en el nombre de archivo de INCLUDE.
Por ejemplo, en DB2 para los sistemas operativos UNIX y Linux, si
DB2INCLUDE tiene el valor ‘/disk2:myfiles/fortran’, el precompilador busca
sucesivamente ‘./pay/payroll.f’, ‘/disk2/pay/payroll.f’ y finalmente
‘./myfiles/cobol/pay/payroll.f’. En los mensajes del precompilador se muestra
la vía de acceso en la que se encuentra realmente el archivo. En los sistemas
Capítulo 3. Programación de aplicaciones de SQL incorporado 53
![Page 62: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/62.jpg)
operativos Windows, sustituya las barras inclinadas invertidas (\) por barras
inclinadas y sustituya ‘for’ por la extensión ‘f’ en el ejemplo anterior.
Nota: El procesador de línea de mandatos de DB2 coloca en antememoria el valor
de DB2INCLUDE. Para cambiar el valor de DB2INCLUDE después de haber
emitido mandatos del CLP, entre el mandato TERMINATE, luego vuelva a
conectar con la base de datos y realice una precompilación del modo
habitual.
Los archivos de cabecera FORTRAN de 32 bits necesarios para el desarrollo de
aplicaciones de bases de datos DB2, que antes se encontraban en
$INSTHOME/sqllib/include ahora se encuentran en $INSTHOME/sqllib/include32.
En la Versión 8.1, estos archivos se encontraban en el directorio
$INSTDIR/sqllib/include, que era un enlace simbólico a uno de los directorios
siguientes: $DB2DIR/include o $DB2DIR/include64 según si se trataba de una
instancia de 32 bits o de 64 bits.
En la Versión 9.1, $DB2DIR/include contendrá todos los archivos include (de 32 bits
y de 64 bits) y $DB2DIR/include32 sólo contendrá los archivos FORTRAN de 32 bits
y un archivo README que indicará que los archivos include de 32 bits son los
mismos que los de 64 bits con la excepción de FORTRAN.
El directorio $DB2DIR/include32 sólo existirá en AIX, Solaris, HP-PA y HP-IPF.
Puede utilizar los siguientes archivos include de FORTRAN en las aplicaciones.
SQLCA (sqlca_cn.f, sqlca_cs.f)
Este archivo define la estructura del Área de comunicaciones de
SQL (SQLCA). El SQLCA contiene variables que utiliza el gestor de
bases de datos para proporcionar a una aplicación información de
error sobre la ejecución de sentencias de SQL y llamadas a API.
Se proporcionan dos archivos SQLCA para las aplicaciones
FORTRAN. El valor por omisión, sqlca_cs.f, define la estructura
SQLCA en un formato compatible con SQL de IBM. El archivo
sqlca_cn.f, precompilado con la opción SQLCA NONE, define la
estructura SQLCA para un mejor rendimiento.
SQLCA_92 (sqlca_92.f)
Este archivo contiene una versión que se ajusta a FIPS SQL92 Entry
Level de la estructura Área de comunicaciones de SQL (SQL
Communications Area (SQLCA)). Se debe incluir este archivo en
lugar de los archivos sqlca_cn.f o sqlca_cs.f cuando se escriban
aplicaciones DB2 que se ajusten al estándar FIPS SQL92 Entry
Level. El precompilador de DB2 incluye automáticamente el
archivo sqlca_92.f cuando la opción LANGLEVEL del
precompilador se establece en SQL92E.
SQLCODES (sqlcodes.f)
Este archivo define constantes para el campo SQLCODE de la
estructura SQLCA.
SQLDA (sqldact.f)
Este archivo define la estructura del Área de descriptores de SQL
(SQLDA). La SQLDA se utiliza para pasar datos entre una
aplicación y el gestor de bases de datos.
54 Desarrollo de aplicaciones de SQL incorporado
![Page 63: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/63.jpg)
SQLEAU (sqleau.f)
Este archivo contiene definiciones de constantes y de estructuras
necesarias para las API de auditoría de seguridad de DB2. Si
utiliza estas API, tiene que incluir este archivo en el programa. Este
archivo también contiene definiciones de constantes y de valores
de palabras clave para los campos del registro de seguimiento de
auditoría. Programas externos o de extracción de seguimiento de
auditoría de proveedores pueden utilizar estas definiciones.
SQLE819A (sqle819a.f)
Si la página de códigos de la base de datos es 819 (ISO Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQLE819B (sqle819b.f)
Si la página de códigos de la base de datos es 819 (ISO Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 037 (EBCDIC inglés de
EE.UU.) del sistema principal. La API CREATE DATABASE utiliza
este archivo.
SQLE850A (sqle850a.f)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQLE850B (sqle850b.f)
Si la página de códigos de la base de datos es 850 (ASCII Latin-1),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 037 (EBCDIC inglés de
EE.UU.) del sistema principal. La API CREATE DATABASE utiliza
este archivo.
SQLE932A (sqle932a.f)
Si la página de códigos de la base de datos es 932 (ASCII japonés),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 5035 (EBCDIC japonés)
del sistema principal. La API CREATE DATABASE utiliza este
archivo.
SQLE932B (sqle932b.f)
Si la página de códigos de la base de datos es 932 (ASCII japonés),
esta secuencia clasifica series de caracteres que no son FOR BIT
DATA según la clasificación binaria CCSID 5026 (EBCDIC japonés)
del sistema principal. La API CREATE DATABASE utiliza este
archivo.
SQL1252A (sql1252a.f)
Si la página de códigos de la base de datos es 1252 (Windows
Latin-1), esta secuencia clasifica series de caracteres que no son
FOR BIT DATA según la clasificación binaria CCSID 500 (EBCDIC
internacional) del sistema principal. La API CREATE DATABASE
utiliza este archivo.
SQL1252B (sql1252b.f)
Si la página de códigos de la base de datos es 1252 (Windows
Capítulo 3. Programación de aplicaciones de SQL incorporado 55
![Page 64: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/64.jpg)
Latin-1), esta secuencia clasifica series de caracteres que no son
FOR BIT DATA según la clasificación binaria CCSID 037 (EBCDIC
inglés de EE.UU.) del sistema principal. La API CREATE
DATABASE utiliza este archivo.
SQLSTATE (sqlstate.f)
Este archivo define constantes correspondientes al campo
SQLSTATE de la estructura SQLCA.
Conceptos relacionados:
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
Información relacionada:
v “Archivos include para las aplicaciones de API de DB2” en Consulta de las API
administrativas
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
Declaración de la SQLCA para el manejo de errores
Puede declarar la SQLCA en el programa de aplicación para que el gestor de bases
de datos pueda devolver información a la aplicación. Cuando preprocesa el
programa, el gestor de bases de datos inserta las declaraciones de variables del
lenguaje principal en lugar de la sentencia INCLUDE. El sistema se comunica con
el programa utilizando las variables para distintivos de aviso, códigos de error e
información de diagnóstico.
Después de ejecutar cada sentencia de SQL, el sistema devuelve un código de
retorno en SQLCODE y en SQLSTATE. SQLCODE es un valor entero que resume
la ejecución de la sentencia y SQLSTATE es un campo de carácter que proporciona
códigos de error comunes entre los productos de bases de datos relacionales de
IBM. SQLSTATE también cumple con los estándares ISO/ANS SQL92 y FIPS 127-2.
Nota: FIPS 127-2 hace referencia a Federal Information Processing Standards
Publication 127-2 for Database Language SQL. ISO/ANS SQL92 hace referencia
a American National Standard Database Language SQL X3.135-1992 e
International Standard ISO/IEC 9075:1992, Database Language SQL.
Observe que si SQLCODE es menor que 0, significa que se ha producido un error
y que la sentencia no se ha procesado. Si SQLCODE es mayor que 0, significa que
se ha emitido un aviso, pero la sentencia se procesa.
Para una aplicación DB2 escrita en C o C++, si la aplicación está formada por
varios archivos fuente, sólo uno de los archivos debería incluir la sentencia EXEC
SQL INCLUDE SQLCA para evitar varias definiciones de SQLCA. El resto de los
archivos fuente deberían utilizar las siguientes líneas:
#include "sqlca.h"
extern struct sqlca sqlca;
Procedimiento:
Para declarar la SQLCA, codifique la sentencia INCLUDE SQLCA en el programa del
siguiente modo:
v Para aplicaciones C o C++ utilice:
EXEC SQL INCLUDE SQLCA;
56 Desarrollo de aplicaciones de SQL incorporado
![Page 65: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/65.jpg)
v En aplicaciones Java no se utiliza de forma explícita la SQLCA. Utilice en su
lugar los métodos de instancia SQLException para obtener los valores de
SQLSTATE y SQLCODE.
v Para aplicaciones COBOL utilice:
EXEC SQL INCLUDE SQLCA END-EXEC.
v Para aplicaciones FORTRAN utilice:
EXEC SQL INCLUDE SQLCA
Si la aplicación debe cumplir con el estándar ISO/ANS SQL92 o FIPS 127-2, no
utilice las sentencias anteriores ni la sentencia INCLUDE SQLCA.
Conceptos relacionados:
v “Manejo de errores utilizando la sentencia WHENEVER” en la página 57
v “Variables SQLSTATE y SQLCODE en una aplicación de SQL incorporado C y
C++” en la página 92
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado COBOL”
en la página 122
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado
FORTRAN” en la página 135
v “Las variables SQLSTATE y SQLCODE en Perl” en Desarrollo de aplicaciones Perl
y PHP
Manejo de errores utilizando la sentencia WHENEVER
La sentencia WHENEVER hace que el precompilador genere código fuente que
indica a la aplicación que vaya a una etiqueta especificada si se produce un error,
un aviso o si no se encuentran filas durante la ejecución. La sentencia WHENEVER
afecta a las siguientes sentencias de SQL ejecutables hasta que otra sentencia
WHENEVER altera la situación.
La sentencia WHENEVER tiene tres formatos básicos:
EXEC SQL WHENEVER SQLERROR acción
EXEC SQL WHENEVER SQLWARNING acción
EXEC SQL WHENEVER NOT FOUND acción
En las sentencias anteriores:
SQLERROR
Identifica cualquier condición en la que SQLCODE < 0.
SQLWARNING
Identifica cualquier condición en la que SQLWARN(0) = W o SQLCODE > 0
pero no es igual a 100.
NOT FOUND
Identifica cualquier condición en la que SQLCODE = 100.
En cada caso, acción puede ser cualquiera de las siguientes:
CONTINUE
Indica que hay que continuar con la siguiente instrucción de la aplicación.
GO TO etiqueta
Indica que hay que ir a la sentencia que va inmediatamente detrás de la
etiqueta especificada después de GO TO. (GO TO puede especificarse
como dos palabras o como una sola, GOTO.)
Capítulo 3. Programación de aplicaciones de SQL incorporado 57
![Page 66: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/66.jpg)
Si no se utiliza la sentencia WHENEVER, la acción por omisión consiste en
continuar el proceso si se produce una condición de error, de aviso o de excepción
durante la ejecución.
La sentencia WHENEVER debe aparecer antes de las sentencias de SQL que desea
que se vean afectadas. De lo contrario, el precompilador no sabe que se debe
generar código de manejo de errores adicional para las sentencias de SQL
ejecutables. En un momento cualquiera puede estar activa una combinación
cualquiera de los tres formatos básicos. El orden en el que declare los tres formatos
no es significativo.
Para evitar una situación de bucle infinito, asegúrese de deshacer el manejo
WHENEVER antes de que se ejecute alguna sentencia de SQL dentro del
manejador. Puede hacerlo utilizando la sentencia WHENEVER SQLERROR
CONTINUE.
Información relacionada:
v “Sentencia WHENEVER” en Consulta de SQL, Volumen 2
Conexión con bases de datos DB2 en aplicaciones de SQL
incorporado
Para poder trabajar con una base de datos, tiene que establecer una conexión con
dicha base de datos. SQL incorporado proporciona varias formas que le permiten
incluir código para establecer conexiones de base de datos. En función del lenguaje
de programación principal de SQL incorporado, puede haber una o varias formas
de hacerlo.
Las conexiones de base de datos se pueden establecer de forma implícita o
explícita. Una conexión implícita es una conexión en la que se supone que el ID de
usuario es el ID de usuario actual. Este tipo de conexión no se recomienda para
aplicaciones de bases de datos. Se recomienda utilizar conexiones de bases de
datos explícitas, que necesitan que se especifique un ID de usuario y una
contraseña.
Conexión con bases de datos DB2 en aplicaciones de SQL incorporado C y C++:
Cuando se trabaja con aplicaciones C y C++, se puede establecer una conexión de
base de datos ejecutando la siguiente sentencia.
EXEC SQL CONNECT TO sample;
Si desea utilizar un id de usuario (herrick) y una contraseña (mypassword)
específicos, utilice la siguiente sentencia:
EXEC SQL CONNECT TO sample USER herrick USING mypassword;
Conexión con bases de datos DB2 en aplicaciones de SQL incorporado COBOL:
Cuando se trabaja con aplicaciones COBOL, se establece una conexión de base de
datos ejecutando la siguiente sentencia. Esta sentencia crea una conexión con la
base de datos sample utilizando el nombre de usuario por omisión.
EXEC SQL CONNECT TO sample END-EXEC.
Si desea utilizar un id de usuario (herrick) y una contraseña (mypassword)
específicos, utilice la siguiente sentencia:
58 Desarrollo de aplicaciones de SQL incorporado
![Page 67: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/67.jpg)
EXEC SQL CONNECT TO sample USER herrick USING mypassword END-EXEC.
Conexión con bases de datos DB2 en aplicaciones de SQL incorporado
FORTRAN:
Cuando se trabaja con aplicaciones FORTRAN, se establece una conexión de base
de datos ejecutando la siguiente sentencia. Esta sentencia crea una conexión con la
base de datos sample utilizando el nombre de usuario por omisión.
EXEC SQL CONNECT TO sample
Si desea utilizar un id de usuario (herrick) y una contraseña (mypassword)
específicos, utilice la siguiente sentencia:
EXEC SQL CONNECT TO sample USER herrick USING mypassword
Conexión con bases de datos DB2 en aplicaciones de SQL incorporado REXX:
Cuando se trabaja con aplicaciones REXX, se establece una conexión de base de
datos ejecutando la siguiente sentencia. Esta sentencia crea una conexión con la
base de datos sample utilizando el nombre de usuario por omisión.
CALL SQLEXEC ’CONNECT TO sample’
Si desea utilizar un id de usuario (herrick) y una contraseña (mypassword)
específicos, utilice la siguiente sentencia:
CALL SQLEXEC ’CONNECT TO sample USER herrick USING mypassword’
Conceptos relacionados:
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
Información relacionada:
v “Sentencia CONNECT (Tipo 1)” en Consulta de SQL, Volumen 2
v “Sentencia CONNECT (Tipo 2)” en Consulta de SQL, Volumen 2
v “Sentencia EXECUTE” en Consulta de SQL, Volumen 2
Tipos de datos que se correlacionan con tipos de datos SQL en
aplicaciones de SQL incorporado
Tipos de datos que se correlacionan con tipos de datos SQL
en aplicaciones de SQL incorporado
Para intercambiar datos entre una aplicación y la base de datos, utilice las
correlaciones de tipos de datos correctas para las variables utilizadas.Cuando el
precompilador encuentra una declaración de una variable del lenguaje principal,
determina el valor del tipo de SQL apropiado. Con cada lenguaje principal hay
reglas de correlación especiales a las que hay que ceñirse, exclusivas para ese
lenguaje específico.
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
Capítulo 3. Programación de aplicaciones de SQL incorporado 59
![Page 68: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/68.jpg)
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
FORTRAN” en la página 70
Tipos de datos de SQL soportados en aplicaciones de SQL
incorporado C y C++
Tipos de datos de SQL soportados en aplicaciones de SQL
incorporado C y C++
Ciertos tipos de datos predefinidos de C y C++ corresponden a los tipos de
columna de base de datos de DB2. Sólo se pueden declarar como variables del
lenguaje principal estos tipos de datos de C y C++.
Las tablas siguientes muestran el equivalente en C y C++ de cada tipo de columna.
Cuando el precompilador encuentra una declaración de una variable del lenguaje
principal, determina el valor del tipo de SQL apropiado. El gestor de bases de
datos utiliza este valor para convertir los datos intercambiados entre la aplicación y
él mismo.
Tabla 2. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
SMALLINT
(500 ó 501)
short
short int
sqlint16
Entero con signo de 16 bits
INTEGER
(496 ó 497)
long
long int
sqlint322
Entero con signo de 32 bits
BIGINT
(492 ó 493)
long long
long
__int64
sqlint643
Entero con signo de 64 bits
REAL4
(480 ó 481)
float Coma flotante de precisión simple
DOUBLE5
(480 ó 481)
double Coma flotante de precisión doble
DECIMAL(p,s)
(484 ó 485)
No existe un equivalente exacto;
utilice double
Decimal empaquetado
(Considere la posibilidad de utilizar las
funciones CHAR y DECIMAL para
manipular los campos decimales
empaquetados como datos de tipo carácter.)
CHAR(1)
(452 ó 453)
char Carácter simple
CHAR(n)
(452 ó 453)
No existe un equivalente exacto;
utilice char[n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=254
Serie de caracteres de longitud fija
60 Desarrollo de aplicaciones de SQL incorporado
![Page 69: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/69.jpg)
Tabla 2. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
VARCHAR(n)
(448 ó 449)
struct tag {
short int;
char[n]
}
1<=n<=32 672
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud
de serie de 2 bytes
Como alternativa, utilice
char[n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=32 672
Serie de caracteres de longitud variable
terminada en nulo
Nota: Se le asigna un tipo SQL de 460/461.
LONG VARCHAR
(456 ó 457)
struct tag {
short int;
char[n]
}
32 673<=n<=32 700
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud
de serie de 2 bytes
CLOB(n)
(408 ó 409)
sql type is
clob(n)
1<=n<=2 147 483 647
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud
de serie de 4 bytes
Variable de localizador
CLOB6
(964 ó 965)
sql type is
clob_locator
Identifica las entidades CLOB que residen en
el servidor
Variable de referencia de
archivo CLOB6
(920 ó 921)
sql type is
clob_file
Descriptor del archivo que contiene datos
CLOB
BLOB(n)
(404 ó 405)
sql type is
blob(n)
1<=n<=2 147 483 647
Serie binaria variable no terminada en nulo
con indicador de longitud de serie de 4 bytes
Variable de localizador
BLOB6
(960 ó 961)
sql type is
blob_locator
Identifica las entidades BLOB del servidor
Variable de referencia de
archivo BLOB6
(916 ó 917)
sql type is
blob_file
Descriptor del archivo que contiene datos
BLOB
DATE
(384 ó 385)
Formato de caracteres terminado
en nulo
Admitir como mínimo 11 caracteres para
acomodar el terminador nulo
Formato estructurado VARCHAR Admitir como mínimo 10 caracteres
TIME
(388 ó 389)
Formato de caracteres terminado
en nulo
Admitir como mínimo 9 caracteres para
acomodar el terminador nulo
Formato estructurado VARCHAR Admitir como mínimo 8 caracteres
TIMESTAMP
(392 ó 393)
Formato de caracteres terminado
en nulo
Admitir como mínimo 27 caracteres para
acomodar el terminador nulo
Formato estructurado VARCHAR Admitir como mínimo 26 caracteres
Capítulo 3. Programación de aplicaciones de SQL incorporado 61
![Page 70: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/70.jpg)
Tabla 2. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
XML7
(988 ó 989)
struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
SQLUDF_CLOB
Valor XML
Los tipos de datos siguientes sólo están disponibles en los entornos DBCS o EUC si
se compilan previamente con la opción WCHARTYPE NOCONVERT.
Tabla 3. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
GRAPHIC(1)
(468 ó 469)
sqldbchar Carácter simple de doble byte
GRAPHIC(n)
(468 ó 469)
No existe un equivalente exacto;
utilice sqldbchar[n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=127
Serie de caracteres de doble byte y longitud
fija
VARGRAPHIC(n)
(464 ó 465)
struct tag {
short int;
sqldbchar[n]
}
1<=n<=16 336
Serie de caracteres de doble byte y longitud
variable no terminada en nulo con indicador
de longitud de serie de 2 bytes
Como alternativa, utilice
sqldbchar[n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=16 336
Serie de caracteres de doble byte y longitud
variable terminada en nulo
Nota: Se le asigna un tipo SQL de 400/401.
LONG VARGRAPHIC
(472 ó 473)
struct tag {
short int;
sqldbchar[n]
}
16 337<=n<=16 350
Serie de caracteres de doble byte y longitud
variable no terminada en nulo con indicador
de longitud de serie de 2 bytes
Los tipos de datos siguientes sólo están disponibles en los entornos DBCS o EUC si
se compilan previamente con la opción WCHARTYPE CONVERT.
Tabla 4. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
GRAPHIC(1)
(468 ó 469)
wchar_t v Carácter amplio simple (para tipo C)
v Carácter de doble byte simple (para tipo de
columna)
62 Desarrollo de aplicaciones de SQL incorporado
![Page 71: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/71.jpg)
Tabla 4. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
GRAPHIC(n)
(468 ó 469)
No existe un equivalente exacto;
utilice wchar_t [n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=127
Serie de caracteres de doble byte y longitud
fija
VARGRAPHIC(n)
(464 ó 465)
struct tag {
short int;
wchar_t [n]
}
1<=n<=16 336
Serie de caracteres de doble byte y longitud
variable no terminada en nulo con indicador
de longitud de serie de 2 bytes
Como alternativa, utilice
char[n+1], donde n es
suficientemente grande para
contener los datos
1<=n<=16 336
Serie de caracteres de doble byte y longitud
variable terminada en nulo
Nota: Se le asigna un tipo SQL de 400/401.
LONG VARGRAPHIC
(472 ó 473)
struct tag {
short int;
wchar_t [n]
}
16 337<=n<=16 350
Serie de caracteres de doble byte y longitud
variable no terminada en nulo con indicador
de longitud de serie de 2 bytes
Los tipos de datos siguientes sólo están disponibles en los entornos DBCS o EUC.
Tabla 5. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
DBCLOB(n)
(412 ó 413)
sql type is
dbclob(n)
1<=n<=1 073 741 823
Serie de caracteres de doble byte y longitud
variable no terminada en nulo con indicador
de longitud de serie de 4 bytes
Variable de localizador
DBCLOB6
(968 ó 969)
sql type is
dbclob_locator
Identifica las entidades DBCLOB que residen
en el servidor
Variable de referencia de
archivos
DBCLOB6
(924 ó 925)
sql type is
dbclob_file
Descriptor del archivo que contiene datos
DBCLOB
Capítulo 3. Programación de aplicaciones de SQL incorporado 63
![Page 72: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/72.jpg)
Tabla 5. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna SQL
Notas:
1. El primer número que se encuentra bajo Tipo de columna SQL indica que no se proporciona una variable de
indicador, y el segundo número indica que se proporciona una variable de indicador. Se necesita una variable de
indicador para indicar los valores nulos (NULL) o para contener la longitud de una serie truncada. Éstos son los
valores que aparecerán en el campo SQLTYPE de la SQLDA para estos tipos de datos.
2. Por razones de compatibilidad entre plataformas, utilice sqlint32. En los sistemas operativos UNIX y Linux de 64
bits, ″long″ es un entero de 64 bits. En los sistemas operativos Windows de 64 bits y UNIX y Linux de 32 bits,
″long″ es un entero de 32 bits.
3. Por razones de compatibilidad entre plataformas, utilice sqlint64. El archivo de cabecera sqlsystm.h del sistema de
bases de datos DB2 definirá el tipo de sqlint64 como ″__int64″ en los sistemas operativos Windows soportados
cuando se utilice el compilador de Microsoft, como ″long long″ en los sistemas operativos UNIX y Linux de 32
bits y como ″long″ en los sistemas operativos UNIX y Linux de 64 bits.
4. FLOAT(n) donde 0 < n < 25 es un sinónimo de REAL. La diferencia entre REAL y DOUBLE en la SQLDA es el
valor de la longitud (4 u 8).
5. Los tipos SQL siguientes son sinónimos de DOUBLE:
v FLOAT
v FLOAT(n) donde 24 < n < 54 es un sinónimo de DOUBLE
v DOUBLE PRECISION
6. Éste no es un tipo de columna, sino un tipo de variable del lenguaje principal.
7. El valor SQL_TYP_XML/SQL_TYP_NXML sólo se devuelve por parte de peticiones DESCRIBE. No se puede
utilizar directamente por parte de la aplicación para vincular recursos de aplicaciones con valores XML.
A continuación mostramos normas adicionales para los tipos de datos C y C++
soportados:
v El tipo de datos char se puede declarar como char o unsigned char.
v El gestor de bases de datos procesa los datos de serie de caracteres de longitud
variable y terminados en nulo del tipo char[n] (tipo de datos 460) como
VARCHAR(m).
– Si LANGLEVEL es SAA1, la longitud de la variable del lenguaje principal m
es igual a la longitud de la serie de caracteres n en char[n] o al número de
bytes que preceden al primer terminador nulo ( \0), el valor más bajo de
ambos.
– Si LANGLEVEL es MIA, la longitud de la variable del lenguaje principal m es
igual al número de bytes que preceden al primer terminador nulo (\0).v El gestor de bases de datos procesa el tipo de datos de serie de caracteres de
gráficos y longitud variable terminados en nulo, wchar_t[n] o sqldbchar[n]
(tipo de datos 400), como VARGRAPHIC(m).
– Si LANGLEVEL es SAA1, la longitud de la variable del lenguaje principal m
es igual a la longitud de la serie de caracteres n en wchar_t[n] o
sqldbchar[n], o al número de caracteres que preceden al primer terminador
nulo de gráficos, el valor más pequeño de ambos.
– Si LANGLEVEL es MIA, la longitud de la variable del lenguaje principal m es
igual al número de caracteres que preceden al primer terminador nulo de
gráficos.v No se soportan los tipos de datos numéricos sin signo.
v El tipo de datos int de C y C++ no está permitido, puesto que su representación
interna depende de la máquina.
Conceptos relacionados:
64 Desarrollo de aplicaciones de SQL incorporado
![Page 73: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/73.jpg)
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado C y C++” en la página 90
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
Información relacionada:
v “Ejemplos de C++” en Temas de ejemplos
v “Ejemplos de C” en la página 405
Tipos de datos para procedimientos, funciones y métodos en
aplicaciones de SQL incorporado C y C++
La tabla siguiente lista las correlaciones soportadas entre tipos de datos de SQL y
tipos de datos de C y C++ para procedimientos, UDF y métodos.
Tabla 6. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna de SQL
SMALLINT
(500 ó 501)
short Entero con signo de 16 bits
INTEGER
(496 ó 497)
sqlint32 Entero con signo de 32 bits
BIGINT
(492 ó 493)
sqlint64 entero con signo de 64 bits
REAL
(480 ó 481)
float Coma flotante de precisión simple
DOUBLE
(480 ó 481)
double Coma flotante de precisión doble
DECIMAL(p,s)
(484 ó 485)
No soportado Para pasar un valor decimal, defina el parámetro
como tipo de datos convertible desde DECIMAL
(por ejemplo, CHAR o DOUBLE) y convierta
explícitamente el argumento a este tipo.
CHAR(n)
(452 ó 453)
char[n+1] donde n es suficientemente
grande para contener los datos
1<=n<=254
Serie de caracteres de longitud fija terminada en
nulo
CHAR(n) FOR BIT DATA
(452 ó 453)
char[n+1] donde n es suficientemente
grande para contener los datos
1<=n<=254
Serie de caracteres de longitud fija
VARCHAR(n)
(448 ó 449) (460 ó 461)
char[n+1] donde n es suficientemente
grande para contener los datos
1<=n<=32 672
Serie de longitud variable terminada en nulo
VARCHAR(n) FOR BIT DATA
(448 ó 449)
struct {
sqluint16 length;
char[n]
}
1<=n<=32 672
Serie de caracteres de longitud variable no
terminada en nulo
Capítulo 3. Programación de aplicaciones de SQL incorporado 65
![Page 74: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/74.jpg)
Tabla 6. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna de SQL
LONG VARCHAR
(456 ó 457)
struct {
sqluint16 length;
char[n]
}
32 673<=n<=32 700
Serie de caracteres de longitud variable no
terminada en nulo
CLOB(n)
(408 ó 409)
struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud de
serie de 4 bytes
BLOB(n)
(404 ó 405)
struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
Serie binaria de longitud variable no terminada en
nulo con indicador de longitud de serie de 4 bytes
DATE
(384 ó 385)
char[11] Formato de caracteres terminado en nulo
TIME
(388 ó 389)
char[9] Formato de caracteres terminado en nulo
TIMESTAMP
(392 ó 393)
char[27] Formato de caracteres terminado en nulo
XML
(988/989)
No soportado Este valor de tipo de descriptor (988/989) se
definirá para que se utilice en la SQLDA para
describir y para indicar datos XML (en su formato
serializado). Los tipos de caracteres y binarios
existentes (incluidos los LOB y los tipos de
referencia de archivos LOB) también se pueden
utilizar para captar e insertar los datos (sólo SQL
dinámico)
Nota: Los tipos de datos siguientes sólo están disponibles en los entornos DBCS o
EUC si se compilan previamente con la opción WCHARTYPE
NOCONVERT.
Tabla 7. Tipos de datos de SQL correlacionados con declaraciones de C y C++
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna de SQL
GRAPHIC(n)
(468 ó 469)
sqldbchar[n+1] donde n es
suficientemente grande para contener
los datos
1<=n<=127
Serie de caracteres de doble byte y longitud fija
terminada en nulo
VARGRAPHIC(n)
(400 ó 401)
sqldbchar[n+1] donde n es
suficientemente grande para contener
los datos
1<=n<=16 336
Serie de caracteres de doble byte y longitud
variable no terminada en nulo
LONG VARGRAPHIC
(472 ó 473)
struct {
sqluint16 length;
sqldbchar[n]
}
16 337<=n<=16 350
Serie de caracteres de doble byte y longitud
variable no terminada en nulo
66 Desarrollo de aplicaciones de SQL incorporado
![Page 75: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/75.jpg)
Tabla 7. Tipos de datos de SQL correlacionados con declaraciones de C y C++ (continuación)
Tipo de columna SQL1 Tipo de datos de C y C++ Descripción del tipo de columna de SQL
DBCLOB(n)
(412 ó 413)
struct {
sqluint32 length;
sqldbchar data[n];
}
1<=n<=1 073 741 823
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud de
serie de 4 bytes
Notas:
1. El primer número que se encuentra bajo Tipo de columna SQL indica que no se proporciona una variable de indicador, y el
segundo número indica que se proporciona una variable de indicador. Es necesaria una variable de indicador para indicar los
valores NULL o para que contenga la longitud de una serie truncada. Éstos son los valores que aparecerían en el campo
SQLTYPE de la SQLDA para estos tipos de datos.
Conceptos relacionados:
v “Variables de indicador de nulo o de truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++” en la página 116
v “Llamada a procedimientos almacenados en aplicaciones de SQL incorporado C
y C++” en la página 171
Tipos de datos de SQL soportados en aplicaciones de SQL
incorporado COBOL
Ciertos tipos de datos de COBOL predefinidos corresponden a tipos de columna
de base de datos DB2. Sólo estos tipos de datos de COBOL se pueden declarar
como variables del lenguaje principal.
La tabla siguiente muestra el equivalente en COBOL de cada tipo de columna.
Cuando el precompilador encuentra una declaración de variable del lenguaje
principal, determina el valor del tipo de SQL adecuado. El gestor de bases de datos
utiliza este valor para convertir los datos intercambiados entre la aplicación y él
mismo.
No se reconoce cada descripción de datos posible para las variables del lenguaje
principal. Los elementos de datos de COBOL deben ser coherentes con los
descritos en la tabla siguiente. Si utiliza otros elementos de datos, se puede
producir un error.
Tabla 8. Tipos de datos de SQL correlacionados con declaraciones de COBOL
Tipo de columna de SQL1 Tipo de datos de COBOL
Descripción del tipo de
columna de SQL
SMALLINT
(500 ó 501)
01 name PIC S9(4) COMP-5. Entero con signo de 16 bits
INTEGER
(496 ó 497)
01 name PIC S9(9) COMP-5. Entero con signo de 32 bits
BIGINT
(492 ó 493)
01 name PIC S9(18) COMP-5. Entero con signo de 64 bits
DECIMAL(p,s)
(484 ó 485)
01 name PIC S9(m)V9(n) COMP-3. Decimal empaquetado
REAL2
(480 ó 481)
01 name USAGE IS COMP-1. Coma flotante de precisión
simple
DOUBLE3
(480 ó 481)
01 name USAGE IS COMP-2. Coma flotante de precisión
doble
CHAR(n)
(452 ó 453)
01 name PIC X(n). Serie de caracteres de longitud
fija
Capítulo 3. Programación de aplicaciones de SQL incorporado 67
![Page 76: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/76.jpg)
Tabla 8. Tipos de datos de SQL correlacionados con declaraciones de COBOL (continuación)
Tipo de columna de SQL1 Tipo de datos de COBOL
Descripción del tipo de
columna de SQL
VARCHAR(n)
(448 ó 449)
01 name.
49 length PIC S9(4) COMP-5.
49 name PIC X(n).
1<=n<=32 672
Serie de caracteres de longitud
variable
LONG VARCHAR
(456 ó 457)
01 name.
49 length PIC S9(4) COMP-5.
49 data PIC X(n).
32 673<=n<=32 700
Serie de caracteres de longitud
variable larga
CLOB(n)
(408 ó 409)
01 MY-CLOB USAGE IS SQL TYPE IS CLOB(n).
1<=n<=2 147 483 647
Serie de caracteres de longitud
variable y objeto grande
Variable de localizador de
CLOB4
(964 ó 965)
01 MY-CLOB-LOCATOR USAGE IS SQL TYPE IS
CLOB-LOCATOR.
Identifica entidades CLOB que
residen en el servidor
Variable de referencia a archivos
CLOB4
(920 ó 921)
01 MY-CLOB-FILE USAGE IS SQL TYPE IS CLOB-FILE. Descriptor de un archivo que
contiene datos CLOB
BLOB(n)
(404 ó 405)
01 MY-BLOB USAGE IS SQL TYPE IS BLOB(n).
1<=n<=2 147 483 647
Serie binaria de longitud
variable y objeto grande
Variable de localizador de
BLOB4
(960 ó 961)
01 MY-BLOB-LOCATOR USAGE IS SQL TYPE IS
BLOB-LOCATOR.
Identifica entidades BLOB que
residen en el servidor
Variable de referencia a archivos
BLOB4
(916 ó 917)
01 MY-BLOB-FILE USAGE IS SQL TYPE IS BLOB-FILE. Descriptor del archivo que
contiene datos BLOB
DATE
(384 ó 385)
01 identifier PIC X(10). Serie de caracteres de 10 bytes
TIME
(388 ó 389)
01 identifier PIC X(8). Serie de caracteres de 8 bytes
TIMESTAMP
(392 ó 393)
01 identifier PIC X(26). Serie de caracteres de 26 bytes
XML5
(988 ó 989)
01 name USAGE IS SQL TYPE IS XML AS CLOB ( size ). Valor XML
Los tipos de datos siguientes sólo están disponibles en el entorno DBCS.
Tabla 9. Tipos de datos de SQL correlacionados con declaraciones de COBOL
Tipo de columna de SQL1 Tipo de datos de COBOL
Descripción del tipo de
columna de SQL
GRAPHIC(n)
(468 ó 469)
01 name PIC G(n) DISPLAY-1. Serie de caracteres de doble
byte de longitud fija
VARGRAPHIC(n)
(464 ó 465)
01 name.
49 length PIC S9(4) COMP-5.
49 name PIC G(n) DISPLAY-1.
1<=n<=16 336
Serie de caracteres de doble
byte de longitud variable con
indicador de longitud de serie
de 2 bytes
68 Desarrollo de aplicaciones de SQL incorporado
![Page 77: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/77.jpg)
Tabla 9. Tipos de datos de SQL correlacionados con declaraciones de COBOL (continuación)
Tipo de columna de SQL1 Tipo de datos de COBOL
Descripción del tipo de
columna de SQL
LONG VARGRAPHIC
(472 ó 473)
01 name.
49 length PIC S9(4) COMP-5.
49 name PIC G(n) DISPLAY-1.
16 337<=n<=16 350
Serie de caracteres de doble
byte de longitud variable con
indicador de longitud de serie
de 2 bytes
DBCLOB(n)
(412 ó 413)
01 MY-DBCLOB USAGE IS SQL TYPE IS DBCLOB(n).
1<=n<=1 073 741 823
Serie de caracteres de doble
byte de longitud variable y de
objeto grande con indicador
de longitud de serie de 4
bytes
Variable de localizador de
DBCLOB4
(968 ó 969)
01 MY-DBCLOB-LOCATOR USAGE IS SQL TYPE IS
DBCLOB-LOCATOR.
Identifica entidades DBCLOB
que residen en el servidor
Variable de referencia a archivos
DBCLOB4
(924 ó 925)
01 MY-DBCLOB-FILE USAGE IS SQL TYPE IS
DBCLOB-FILE.
Descriptor de un archivo que
contiene datos DBCLOB
Notas:
1. El primer número debajo de Tipo de columna de SQL indica que no se proporciona una variable de indicador, y el segundo
número indica que sí se proporciona dicha variable. Es necesaria una variable de indicador para indicar los valores NULL o para
que contenga la longitud de una serie truncada. Éstos son los valores que aparecerían en el campo SQLTYPE de la SQLDA para
estos tipos de datos.
2. FLOAT(n) donde 0 < n < 25 es un sinónimo de REAL. La diferencia entre REAL y DOUBLE en la SQLDA es el valor de la
longitud (4 u 8).
3. Los tipos de SQL siguientes son sinónimos de DOUBLE:
v FLOAT
v FLOAT(n) donde 24 < n < 54 es sinónimo de DOUBLE.
v DOUBLE PRECISION
4. No es un tipo de columna, sino un tipo de variable del lenguaje principal.
5. El valor SQL_TYP_XML/SQL_TYP_NXML sólo se devuelve por parte de peticiones DESCRIBE. No se puede utilizar
directamente por parte de la aplicación para vincular recursos de aplicaciones con valores XML.
A continuación, se facilitan reglas adicionales para los tipos de datos de COBOL
soportados:
v PIC S9 y COMP-3/COMP-5 son necesarios donde se muestran.
v Se puede utilizar el número de nivel 77 en lugar del 01 para todos los tipos de
columna, excepto VARCHAR, LONG VARCHAR, VARGRAPHIC, LONG
VARGRAPHIC y todos los tipos de variable de LOB.
v Utilice las reglas siguientes al declarar variables del lenguaje principal para los
tipos de columna DECIMAL(p,s). Vea el ejemplo siguiente:
01 identifier PIC S9(m)V9(n) COMP-3
– Utilice V para indicar la coma decimal.
– Los valores para n y m deben ser superiores o equivalentes a 1.
– El valor de n + m no puede ser superior a 31.
– El valor para s equivale al valor para n.
– El valor para p equivale al valor de n + m.
– Los factores de repetición (n) y (m) son opcionales. Todos los ejemplos
siguientes resultan válidos:
01 identifier PIC S9(3)V COMP-3
01 identifier PIC SV9(3) COMP-3
01 identifier PIC S9V COMP-3
01 identifier PIC SV9 COMP-3
– Se puede utilizar PACKED-DECIMAL en lugar de COMP-3.v Las matrices no están soportadas por el precompilador de COBOL.
Capítulo 3. Programación de aplicaciones de SQL incorporado 69
![Page 78: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/78.jpg)
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Ejemplo: cómo hacer referencia a variables del lenguaje principal XML en
aplicaciones de SQL incorporado” en la página 85
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado COBOL” en la página 120
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
v “Tablas de variables de indicador de nulo y de indicador de nulo o de
truncamiento en aplicaciones de SQL incorporado COBOL” en la página 132
Tareas relacionadas:
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
v “Ejecución de expresiones XQuery en aplicaciones de SQL incorporado” en la
página 166
Información relacionada:
v “Ejemplos de COBOL” en la página 408
Tipos de datos de SQL soportados en aplicaciones de SQL
incorporado FORTRAN
Ciertos tipos de datos de FORTRAN predefinidos corresponden a tipos de columna
de base de datos DB2. Sólo se pueden declarar como variables del lenguaje
principal estos tipos de datos de FORTRAN.
La tabla siguiente muestra el equivalente en FORTRAN de cada tipo de columna.
Cuando el precompilador encuentra una declaración de una variable del lenguaje
principal, determina el valor del tipo de SQL apropiado. El gestor de bases de
datos utiliza este valor para convertir los datos intercambiados entre la aplicación y
él mismo.
Tabla 10. Tipos de datos SQL correlacionados con declaraciones FORTRAN
Tipo de columna SQL1 Tipo de datos FORTRAN Descripción del tipo de columna SQL
SMALLINT
(500 ó 501)
INTEGER*2 Entero con signo de 16 bits
INTEGER
(496 ó 497)
INTEGER*4 Entero con signo de 32 bits
REAL2
(480 ó 481)
REAL*4 Coma flotante de precisión simple
DOUBLE3
(480 ó 481)
REAL*8 Coma flotante de precisión doble
DECIMAL(p,s)
(484 ó 485)
No existe un equivalente exacto;
utilice REAL*8
Decimal empaquetado
CHAR(n)
(452 ó 453)
CHARACTER*n Serie de caracteres de longitud fija con longitud n,
donde n va de 1 a 254
VARCHAR(n)
(448 ó 449)
SQL TYPE IS VARCHAR(n), donde n
va de 1 a 32 672
Serie de caracteres de longitud variable
LONG VARCHAR
(456 ó 457)
SQL TYPE IS VARCHAR(n), donde n
va de 32 673 a 32 700
Serie de caracteres de longitud variable larga
CLOB(n)
(408 ó 409)
SQL TYPE IS CLOB (n) donde n va de
1 a 2 147 483 647
Serie de caracteres de longitud variable y objeto
grande
70 Desarrollo de aplicaciones de SQL incorporado
![Page 79: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/79.jpg)
Tabla 10. Tipos de datos SQL correlacionados con declaraciones FORTRAN (continuación)
Tipo de columna SQL1 Tipo de datos FORTRAN Descripción del tipo de columna SQL
Variable de localizador
CLOB4
(964 ó 965)
SQL TYPE IS CLOB_LOCATOR Identifica las entidades CLOB que residen en el
servidor
Variable de referencia de
archivo CLOB4
(920 ó 921)
SQL TYPE IS CLOB_FILE Descriptor de archivo que contiene datos CLOB
BLOB(n)
(404 ó 405)
SQL TYPE IS BLOB (n) donde n va de
1 a 2 147 483 647
Serie binaria de longitud variable y objeto grande
Variable de
localizador BLOB4
(960 ó 961)
SQL TYPE IS BLOB_LOCATOR Identifica las entidades BLOB del servidor
Variable de referencia de
archivo BLOB4
(916 ó 917)
SQL TYPE IS BLOB_FILE Descriptor del archivo que contiene datos BLOB
DATE
(384 ó 385)
CHARACTER*10 Serie de caracteres de 10 bytes
TIME
(388 ó 389)
CHARACTER*8 Serie de caracteres de 8 bytes
TIMESTAMP
(392 ó 393)
CHARACTER*26 Serie de caracteres de 26 bytes
XML
(988 ó 989)
SQL_TYP_XML No hay soporte de XML para FORTRAN; las
aplicaciones pueden obtener el tipo de descripción,
pero no pueden utilizarlo.
Notas:
1. El primer número que se encuentra bajo Tipo de columna SQL indica que no se proporciona una variable de indicador, y el
segundo número indica que se proporciona una variable de indicador. Se necesita una variable de indicador para indicar los
valores nulos (NULL) o para contener la longitud de una serie truncada. Éstos son los valores que aparecerán en el campo
SQLTYPE de la SQLDA para estos tipos de datos.
2. FLOAT(n) donde 0 < n < 25 es un sinónimo de REAL. La diferencia entre REAL y DOUBLE en la SQLDA es el valor de la
longitud (4 u 8).
3. Los tipos SQL siguientes son sinónimos de DOUBLE:
v FLOAT
v FLOAT(n) donde 24 < n < 54 es sinónimo de DOUBLE.
v DOUBLE PRECISION
4. Éste no es un tipo de columna, sino un tipo de variable del lenguaje principal.
A continuación mostramos una norma adicional para los tipos de datos FORTRAN
soportados:
v Puede definir sentencias de SQL dinámicas que contengan más de 254 caracteres
utilizando las variables del lenguaje principal VARCHAR, LONG VARCHAR o
CLOB.
Conceptos relacionados:
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Variables de indicador de nulo o de truncamiento en aplicaciones de SQL
incorporado FORTRAN” en la página 141
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
Capítulo 3. Programación de aplicaciones de SQL incorporado 71
![Page 80: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/80.jpg)
Información relacionada:
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado FORTRAN” en la página 140
Tipos de datos de SQL soportados en aplicaciones de SQL
incorporado REXX
Ciertos tipos de datos de REXX predefinidos corresponden a tipos de columna de
base de datos DB2. Sólo se pueden declarar como variables del lenguaje principal
estos tipos de datos de REXX. La tabla siguiente muestra cómo SQLEXEC y
SQLDBS interpretan variables de REXX para convertir su contenido en tipos de
datos de DB2.
Tabla 11. Tipos de columna de SQL correlacionados con declaraciones de REXX
Tipo de columna SQL1 Tipo de datos de REXX Descripción del tipo de columna SQL
SMALLINT
(500 ó 501)
Un número sin coma decimal que va de -32 768
a 32 767
Entero con signo de 16 bits
INTEGER
(496 ó 497)
Un número sin coma decimal que va de
-2 147 483 648 a 2 147 483 647
Entero con signo de 32 bits
REAL2
(480 ó 481)
Un número en notación científica que va de
-3.40282346 x 1038 a 3.40282346 x 1038
Coma flotante de precisión única
DOUBLE3
(480 ó 481)
Un número en notación científica que va de
-1.79769313 x 10308 a 1.79769313 x 10308
Coma flotante de precisión doble
DECIMAL(p,s)
(484 ó 485)
Un número con una coma decimal Decimal empaquetado
CHAR(n)
(452 ó 453)
Una serie con una comilla inicial y otra final (’),
cuya longitud es n después de eliminar las dos
comillas
Una serie de longitud n sin ningún carácter no
numérico, aparte de los blancos inicial y final o
la E en notación científica
Serie de caracteres de longitud fija con longitud
n, donde n va de 1 a 254
VARCHAR(n)
(448 ó 449)
Equivalente a CHAR(n) Serie de caracteres de longitud variable con
longitud n, donde n va de 1 a 4000
LONG VARCHAR
(456 ó 457)
Equivalente a CHAR(n) Serie de caracteres de longitud variable con
longitud n, donde n va de 1 a 32 700
CLOB(n)
(408 ó 409)
Equivalente a CHAR(n) Serie de caracteres de longitud variable y de
objeto grande con longitud n, donde n va de 1 a
2 147 483 647
Variable de localizador
CLOB4
(964 ó 965)
DECLARE :nombre_var LANGUAGE TYPE
CLOB LOCATOR
Identifica las entidades CLOB que residen en el
servidor
Variable de referencia de
archivo CLOB4
(920 ó 921)
DECLARE :nombre_var LANGUAGE TYPE
CLOB FILE
Descriptor de archivo que contiene datos CLOB
BLOB(n)
(404 ó 405)
Una serie con un apóstrofo inicial y uno final,
precedida de BIN, que contiene n caracteres
después de eliminar el BIN precedente y los dos
apóstrofos.
Serie binaria de longitud variable y de objeto
grande con longitud n, donde n va de 1 a
2 147 483 647
Variable de localizador
BLOB4
(960 ó 961)
DECLARE :nombre_var LANGUAGE TYPE
BLOB LOCATOR
Identifica las entidades BLOB del servidor
Variable de referencia de
archivo BLOB4
(916 ó 917)
DECLARE :nombre_var LANGUAGE TYPE
BLOB FILE
Descriptor del archivo que contiene datos BLOB
DATE
(384 ó 385)
Equivalente a CHAR(10) Serie de caracteres de 10 bytes
72 Desarrollo de aplicaciones de SQL incorporado
![Page 81: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/81.jpg)
Tabla 11. Tipos de columna de SQL correlacionados con declaraciones de REXX (continuación)
Tipo de columna SQL1 Tipo de datos de REXX Descripción del tipo de columna SQL
TIME
(388 ó 389)
Equivalente a CHAR(8) Serie de caracteres de 8 bytes
TIMESTAMP
(392 ó 393)
Equivalente a CHAR(26) Serie de caracteres de 26 bytes
XML
(988 ó 989)
SQL_TYP_XML No hay soporte de XML para REXX; las
aplicaciones pueden obtener el tipo de
descripción, pero no pueden utilizarlo.
Los tipos de datos siguientes sólo están disponibles en el entorno DBCS.
Tabla 12. Tipos de columna de SQL correlacionados con declaraciones de REXX
Tipo de columna SQL1 Tipo de datos de REXX Descripción del tipo de columna SQL
GRAPHIC(n)
(468 ó 469)
Una serie con un apóstrofo inicial y uno
final, precedida de una G o una N, que
contiene n caracteres DBCS después de
eliminar el carácter precedente y los dos
apóstrofos
Serie gráfica de longitud fija con longitud
n, donde n va de 1 a 127
VARGRAPHIC(n)
(464 ó 465)
Equivalente a GRAPHIC(n) Serie gráfica de longitud variable con
longitud n, donde n va de 1 a 2000
LONG VARGRAPHIC
(472 ó 473)
Equivalente a GRAPHIC(n) Serie gráfica de longitud variable larga con
longitud n, donde n va de 1 a 16 350
DBCLOB(n)
(412 ó 413)
Equivalente a GRAPHIC(n) Serie gráfica de longitud variable y de
objeto grande con longitud n, donde n va
de 1 a 1 073 741 823
Variable de localizador
DBCLOB4
(968 ó 969)
DECLARE :nombre_var LANGUAGE TYPE
DBCLOB LOCATOR
Identifica las entidades DBCLOB que
residen en el servidor
Variable de referencia de
archivos DBCLOB4
(924 ó 925)
DECLARE :nombre_var LANGUAGE TYPE
DBCLOB FILE
Descriptor de archivo que contiene datos
DBCLOB
Notas:
1. El primer número que se encuentra bajo Tipo de columna SQL indica que no se proporciona una variable de indicador, y el
segundo número indica que se proporciona una variable de indicador. Se necesita una variable de indicador para indicar los
valores nulos (NULL) o para contener la longitud de una serie truncada.
2. FLOAT(n) donde 0 < n < 25 es un sinónimo de REAL. La diferencia entre REAL y DOUBLE en la SQLDA es el valor de la
longitud (4 u 8).
3. Los tipos SQL siguientes son sinónimos de DOUBLE:
v FLOAT
v FLOAT(n) donde 24 < n < 54 es sinónimo de DOUBLE.
v DOUBLE PRECISION
4. Éste no es un tipo de columna, sino un tipo de variable del lenguaje principal.
Conceptos relacionados:
v “Variables de indicador de nulo o de truncamiento en aplicaciones de SQL
incorporado REXX” en la página 149
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
v “Referencias a variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
Información relacionada:
v “Declaración de variables del lenguaje principal de referencia de archivos en
aplicaciones de SQL incorporado REXX” en la página 148
Capítulo 3. Programación de aplicaciones de SQL incorporado 73
![Page 82: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/82.jpg)
v “Ejemplos de REXX” en la página 412
Variables del lenguaje principal en aplicaciones de SQL incorporado
Variables del lenguaje principal en aplicaciones de SQL
incorporado
Las variables del lenguaje principal son variables a las que hacen referencia las
sentencias de SQL incorporado. Se utilizan para intercambiar valores de datos entre
el servidor de bases de datos y la aplicación de SQL incorporado. Las aplicaciones
de SQL incorporado también pueden incluir declaraciones de variables del
lenguaje principal para consultas de SQL relacional. Además, se puede utilizar una
variable del lenguaje principal para que contenga una expresión XQuery que se va
a ejecutar. Sin embargo, no hay ningún mecanismo para pasar valores a parámetros
en expresiones XQuery.
Las variables del lenguaje principal se declaran utilizando la sintaxis de
declaración de variables específica del lenguaje principal en una sección de
declaración.
Una sección de declaración es la parte de una aplicación de SQL incorporado que
se encuentra junto a la parte superior de un archivo de código fuente de SQL
incorporado y que se vincula mediante dos sentencias de SQL no ejecutables:
v BEGIN DECLARE SECTION
v END DECLARE SECTION
Estas sentencias permiten al precompilador encontrar las declaraciones de las
variables. Cada declaración de variable del lenguaje principal debe aparecer entre
estas dos sentencias; de lo contrario, las variables se consideran variables normales.
Las siguientes normas se aplican a secciones de declaración de variables del
lenguaje principal:
v Todas las variables del lenguaje principal se deben declarar en el archivo fuente,
dentro de una sección de declaración bien formada, antes de que se haga
referencia a las mismas, excepto para las variables del lenguaje principal que
hacen referencia a estructuras SQLDA.
v Se pueden utilizar varias secciones declare en un archivo fuente.
v Los nombres de variables del lenguaje principal deben ser exclusivos dentro de
un archivo fuente. Esto se debe a que el precompilador de DB2 no es
responsable de las normas de ámbito de variables específicas del lenguaje
principal. Como tal, sólo hay un ámbito para las variables del lenguaje principal.
Nota: Esto no significa que el precompilador de DB2 cambie el ámbito de
variables del lenguaje principal por global para que se pueda acceder a
las mismas fuera del ámbito en el que se han definido.
Supongamos que tenemos el siguiente ejemplo:
foo1(){
.
.
.
BEGIN SQL DECLARE SECTION;
int x;
END SQL DECLARE SECTION;
74 Desarrollo de aplicaciones de SQL incorporado
![Page 83: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/83.jpg)
x=10;
.
.
.
}
foo2(){
.
.
.
y=x;
.
.
.
}
En función del lenguaje, el ejemplo anterior no se podrá compilar porque la
variable x no está declarada en la función foo2() o el valor de x no se establecerá
en 10 en foo2(). Para evitar este problema, debe declarar x como una variable
global o pasar x como parámetro a la función foo2() del siguiente modo:
foo1(){
.
.
.
BEGIN SQL DECLARE SECTION;
int x;
END SQL DECLARE SECTION;
x=10;
foo2(x);
.
.
.
}
foo2(int x){
.
.
.
y=x;
.
.
.
}
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Declaración de variables del lenguaje principal con el Generador de
declaraciones db2dclgn” en la página 77
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Información relacionada:
Capítulo 3. Programación de aplicaciones de SQL incorporado 75
![Page 84: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/84.jpg)
v “Sentencia END DECLARE SECTION” en Consulta de SQL, Volumen 2
v “Sentencia BEGIN DECLARE SECTION” en Consulta de SQL, Volumen 2
Declaración de variables del lenguaje principal en
aplicaciones de SQL incorporado
Para transmitir datos entre el servidor de bases de datos y la aplicación, tiene que
declarar variables del lenguaje principal en el código fuente de la aplicación para
cosas como consultas de SQL relacional y declaraciones de variables del lenguaje
principal para expresiones de XQuery.
Procedimiento:
La tabla siguiente contiene ejemplos de declaraciones de variables del lenguaje
principal para lenguajes principales de SQL incorporado.
Tabla 13. Declaraciones de variables del lenguaje principal por lenguaje principal
Lenguaje Código fuente de ejemplo
C y C++ EXEC SQL BEGIN DECLARE SECTION;
short dept=38, age=26;
double salary;
char CH;
char name1[9], NAME2[9];
short nul_ind;
EXEC SQL END DECLARE SECTION;
COBOL EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 age PIC S9(4) COMP-5 VALUE 26.
01 DEPT PIC S9(9) COMP-5 VALUE 38.
01 salary PIC S9(6)V9(3) COMP-3.
01 CH PIC X(1).
01 name1 PIC X(8).
01 NAME2 PIC X(8).
01 nul-ind PIC S9(4) COMP-5.
EXEC SQL END DECLARE SECTION END-EXEC.
FORTRAN EXEC SQL BEGIN DECLARE SECTION
integer*2 age /26/
integer*4 dept /38/
real*8 salary
character ch
character*8 name1,NAME2
integer*2 nul_ind
EXEC SQL END DECLARE SECTION
Conceptos relacionados:
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
Tareas relacionadas:
v “Declaración de variables del lenguaje principal con el Generador de
declaraciones db2dclgn” en la página 77
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
76 Desarrollo de aplicaciones de SQL incorporado
![Page 85: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/85.jpg)
Declaración de variables del lenguaje principal con el
Generador de declaraciones db2dclgn
Puede utilizar el Generador de declaraciones para generar declaraciones
correspondientes a una determinada tabla de una base de datos. Éste crea archivos
fuente de declaración en SQL incorporado que puede insertar fácilmente en las
aplicaciones. db2dclgn da soporte a los lenguajes C/C++, Java, COBOL y
FORTRAN.
Procedimiento:
Para generar archivos de declaración, entre el mandato db2dclgn en el siguiente
formato:
db2dclgn -d database-name -t table-name [options]
Por ejemplo, para generar las declaraciones para la tabla STAFF en la base de datos
SAMPLE en C en el archivo de salida staff.h, emita el siguiente mandato:
db2dclgn -d sample -t staff -l C
El archivo staff.h resultante contiene:
struct
{
short id;
struct
{
short length;
char data[9];
} name;
short dept;
char job[6];
short years;
double salary;
double comm;
} staff;
Información relacionada:
v “db2dclgn - Mandato Generador de declaraciones” en Consulta de mandatos
Tipos de datos de columna y variables del lenguaje principal
en aplicaciones de SQL incorporado
A cada columna de cada tabla de DB2 se asigna un tipo de datos de SQL cuando se
crea la columna. Para obtener información sobre cómo se asignan estos tipos a
columnas, consulte la sentencia CREATE TABLE.
Notas:
1. Cada tipo de datos soportado puede tener el atributo NOT NULL. Esto se trata
como otro tipo.
2. Los de tipos de datos se puede ampliar definiendo tipos diferenciados
definidos por el usuario (UDT). Los UDT son tipos de datos separados que
utilizan la representación de uno de los tipos de SQL integrados.
Los lenguajes principales de SQL incorporado soportados tienen tipos de datos que
corresponden con la mayoría de los tipos de datos del gestor de bases de datos.
Sólo estos tipos de datos de lenguajes principales se pueden utilizar en
declaraciones de variables del lenguaje principal. Cuando el precompilador
Capítulo 3. Programación de aplicaciones de SQL incorporado 77
![Page 86: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/86.jpg)
encuentra una declaración de variable del lenguaje principal, determina el valor de
tipo de datos de SQL adecuado. El gestor de bases de datos utiliza este valor para
convertir los datos intercambiados entre él mismo y la aplicación.
Como programador de aplicaciones, es importante que comprenda el modo en que
el gestor de bases de datos maneja comparaciones y asignaciones entre distintos
tipos de datos. Explicado de forma sencilla, los tipos de datos deben ser
compatibles entre sí durante las operaciones de asignación y comparación, tanto si
el gestor de bases de datos trabaja con dos tipos de datos de columnas de SQL
como si lo hace con dos tipos de datos de lenguaje principal o con uno de cada.
La norma general de la compatibilidad de tipos de datos establece que todos los
tipos de datos numéricos soportados del lenguaje de sistema principal se pueden
comparar y asignar con todos los tipos de datos numéricos del gestor de bases de
datos y que todos los tipos de caracteres del lenguaje de sistema principal son
compatibles con todos los tipos de caracteres del gestor de bases de datos; los tipos
numéricos son incompatibles con los tipos de caracteres. Sin embargo, también hay
algunas excepciones a esta normal general, en función de la idiosincrasia del
lenguaje de sistema principal y de las limitaciones impuestas cuando se trabaja con
objetos grandes.
Dentro de sentencias de SQL, DB2 proporciona conversiones entre tipos de datos
compatibles. Por ejemplo, en la siguiente sentencia SELECT, SALARY y BONUS
son columnas de tipo DECIMAL; sin embargo, la compensación total de cada
empleado se devuelve como datos de tipo DOUBLE:
SELECT EMPNO, DOUBLE(SALARY+BONUS) FROM EMPLOYEE
Observe que la ejecución de la sentencia anterior incluye la conversión entre los
tipos de datos DECIMAL y DOUBLE.
Para que los resultados de la consulta resulten más fáciles de leer en pantalla,
puede utilizar la siguiente sentencia SELECT:
SELECT EMPNO, DIGIT(SALARY+BONUS) FROM EMPLOYEE
La función DIGITS utilizada en el ejemplo anterior devuelve una representación de
un número como una serie de caracteres.
Para convertir datos dentro de la aplicación, póngase en contacto con el proveedor
del compilador para obtener rutinas, clases, tipos integrados o API adicionales que
den soporte a esta conversión.
Si la página de códigos de la aplicación no coincide con la página de códigos de la
base de datos, es posible que los tipos de datos de caracteres también estén sujetos
a la conversión de caracteres.
Conceptos relacionados:
v “Consideraciones sobre la conversión de datos” en Desarrollo de SQL y rutinas
externas
v “Conversión de caracteres entre distintas páginas de códigos” en Desarrollo de
SQL y rutinas externas
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
Información relacionada:
78 Desarrollo de aplicaciones de SQL incorporado
![Page 87: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/87.jpg)
v “Sentencia CREATE TABLE” en Consulta de SQL, Volumen 2
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
FORTRAN” en la página 70
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
Declaración de variables del lenguaje principal XML en
aplicaciones de SQL incorporado
Para intercambiar datos XML entre el servidor de bases de datos y una aplicación
de SQL incorporado, tiene que declarar las variables del lenguaje principal en el
código fuente de la aplicación.
DB2 V9.1 incorpora un tipo de datos XML que almacena los datos XML en un
conjunto estructurado de nodos en un formato de árbol. Las columnas con este
tipo de datos XML se describen como un SQLTYPE de columna SQL_TYP_XML y
las aplicaciones pueden vincular varios tipos de datos específicos del lenguaje
como entradas o salidas en estas columnas o parámetros. Se puede acceder
directamente a las columnas XML mediante SQL, las extensiones de SQL/XML o
XQuery. El tipo de datos XML se aplica a más elementos que columnas. Las
funciones pueden tener argumentos de valores XML o generar valores XML. De
forma similar, los procedimientos almacenados pueden tomar valores XML como
parámetros de entrada y de salida. Finalmente, las expresiones de XQuery generan
valores XML independientemente de si acceden a columnas XML o no.
Los datos XML son de tipo carácter por naturaleza y tienen una codificación que
especifica el juego de caracteres utilizado. La codificación de los datos XML puede
determinarse externamente, que se deriva del tipo de aplicación base que contiene
la representación de serie serializada del documento XML. También puede
determinarse internamente, que requiere la interpretación de los datos. Para los
documentos codificados en Unicode, se recomienda utilizar un marcador de orden
de bytes (BOM), consistente en un código de carácter Unicode al principio de una
corriente de datos. El BOM se utiliza como una signatura que define el orden de
los bytes y el formato de codificación Unicode.
Los tipos existentes de carácter y binarios, que incluyen CHAR, VARCHAR, CLOB
y BLOB, se pueden utilizar además de las variables del lenguaje principal para
captar e insertar datos. Sin embargo, no estarán sujetos al análisis de XML
implícito, como lo estarían las variables del lenguaje principal XML. En su lugar, se
inserta y se aplica una función XMLPARSE explícita con eliminación de espacios
en blanco por omisión.
Restricciones:
Restricciones de XML y XQuery al desarrollar aplicaciones de SQL incorporado
Procedimiento:
Para declarar variables del lenguaje principal XML en aplicaciones de SQL
incorporado:
Capítulo 3. Programación de aplicaciones de SQL incorporado 79
![Page 88: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/88.jpg)
En la sección de declaración de la aplicación, declare las variables del lenguaje
principal XML como tipos de datos LOB:
v SQL TYPE IS XML AS CLOB(n) <nombre_varpral>
donde <nombre_varpral> es una variable del lenguaje principal CLOB que
contiene datos XML codificados en la página de códigos mixta de la aplicación.
v SQL TYPE IS XML AS DBCLOB(n) <nombre_varpral>
donde <nombre_varpral> es una variable del lenguaje principal DBCLOB que
contiene datos XML codificados en la página de códigos gráfica de la aplicación.
v SQL TYPE IS XML AS BLOB(n) <nombre_varpral>
donde <nombre_varpral> es una variable del lenguaje principal BLOB que
contiene datos XML codificados internamente1.
v SQL TYPE IS XML AS CLOB_FILE <nombre_varpral>
donde <nombre_varpral> es un archivo CLOB que contiene datos XML
codificados en la página de códigos mixta de la aplicación.
v SQL TYPE IS XML AS DBCLOB_FILE <nombre_varpral>
donde <nombre_varpral> es un archivo DBCLOB que contiene datos XML
codificados en la página de códigos gráfica de la aplicación.
v SQL TYPE IS XML AS BLOB_FILE <nombre_varpral>
donde <nombre_varpral> es un archivo BLOB que contiene datos XML
codificados internamente1.
Notas:
1. Consulte el algoritmo para determinar la codificación con especificaciones XML
1.0 (http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info).
Conceptos relacionados:
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
v “Ejemplo: cómo hacer referencia a variables del lenguaje principal XML en
aplicaciones de SQL incorporado” en la página 85
v “Background information on XML internal encoding” en XML Guide
v “XML data encoding” en XML Guide
Tareas relacionadas:
v “Ejecución de expresiones XQuery en aplicaciones de SQL incorporado” en la
página 166
Información relacionada:
v “Recomendaciones para desarrollar aplicaciones de SQL incorporado con XML y
XQuery” en la página 30
Identificar valores XML en una SQLDA
Para indicar que un tipo base alberga datos XML, el campo sqlname de SQLVAR se
debe actualizar del siguiente modo:
v sqlname.length debe ser 8
v Los dos primeros bytes de sqlname.data deben ser X’0000’
v El tercer y cuarto bytes de sqlname.data deben ser X’0000’
80 Desarrollo de aplicaciones de SQL incorporado
![Page 89: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/89.jpg)
v El quinto byte de sqlname.data debe ser X’01’ (que recibe el nombre del
indicador de subtipo de XML sólo cuando se cumplen las dos primeras
condiciones)
v Los restantes bytes deben ser X’000000’
Si el indicador de subtipo de XML está establecido en una SQLVAR cuyo SQLTYPE
es no LOB, se devolverá un error SQL0804 (rc=115) en el momento de la ejecución.
Nota: SQL_TYP_XML sólo se puede devolver desde la sentencia DESCRIBE. Este
tipo no se puede utilizar para ninguna otra petición. La aplicación debe
modificar la SQLDA para que contenga un tipo binario o de carácter válido
y debe establecer el campo sqlname de forma adecuada para que indique los
los datos son XML.
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
Tareas relacionadas:
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
Identificación de valores de SQL nulos con variables de
indicador de nulo
Las aplicaciones de SQL incorporado deben prepararse para recibir valores nulos
asociando una variable de indicador de nulo con cualquier variable del lenguaje
principal que pueda recibir un nulo. El gestor de bases de datos y la aplicación del
sistema principal comparten una variable de indicador. Por lo tanto, esta variable
se tiene que declarar en la aplicación como una variable del lenguaje principal, que
corresponde al tipo de datos de SQL SMALLINT.
Una variable de indicador de nulo se coloca en una sentencia de SQL
inmediatamente después de la variable del lenguaje principal y va precedida por
un signo de dos puntos. Un espacio puede separar la variable de indicador de nulo
de la variable del lenguaje principal, aunque no es necesario. Sin embargo, no
coloque una coma entre la variable del lenguaje principal y la variable de
indicador de nulo. También puede especificar una variable de indicador de nulo
utilizando la palabra clave INDICATOR opcional, que debe colocar entre la
variable del lenguaje principal y su indicador de nulo.
Se examina la variable de indicador de nulo para ver si contiene un valor negativo.
Si el valor no es negativo, la aplicación puede utilizar el valor devuelto de la
variable del lenguaje principal. Si el valor es negativo, el valor captado es nulo y la
variable del lenguaje principal no se debe utilizar. En este caso, el gestor de bases
de datos no cambia el valor de la variable del lenguaje principal.
Nota: Si el parámetro de configuración de base de datos dft_sqlmathwarn tiene el
valor ’YES’, el valor de la variable de indicador de nulo puede ser -2. Este
valor indica un nulo causado por la evaluación de una expresión con un
Capítulo 3. Programación de aplicaciones de SQL incorporado 81
![Page 90: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/90.jpg)
error aritmético o por un desbordamiento al intentar convertir el valor de
resultado numérico en la variable del lenguaje principal.
Si el tipo de datos puede manejar valores nulos, la aplicación debe proporcionar un
indicador de nulo. De lo contrario, puede producirse un error. Si no se utiliza un
indicador de valor nulo, se devuelve un SQLCODE -305 (SQLSTATE 22002).
Si la estructura SQLCA indica un aviso de truncamiento, se pueden examinar las
variables de indicador de nulo para ver si hay algún truncamiento. Si una variable
de indicador de nulo tiene un valor positivo, significa que se ha producido un
truncamiento.
v Si la parte de segundos de un tipo de datos TIME está truncada, el valor del
indicador de nulo contiene la parte en segundos de los datos truncados.
v Para todos los demás tipos de datos de serie, excepto para objetos grandes
(LOB), el valor del indicador de nulo representa la longitud real de los datos
devueltos. Los tipos diferenciados definidos por el usuario (UDT) se manejan del
mismo modo que su tipo base.
Cuando se procesan sentencias INSERT o UPDATE, el gestor de bases de datos
comprueba la variable de indicador de nulo, si la hay. Si la variable de indicador
es negativa, el gestor de bases de datos establece el valor de la columna de destino
en nulo, si se permiten valores nulos.
Si la variable de indicador de nulo es cero o positiva, el gestor de bases de datos
utiliza el valor de la variable del lenguaje principal asociada.
El campo SQLWARN1 de la estructura SQLCA puede contener un valor X o W si el
valor de una columna de serie está truncado cuando se asigna a una variable del
lenguaje principal. El campo contiene un valor N si un terminador de valores nulos
está truncado.
El gestor de bases de datos devuelve un valor X sólo si se cumplen todas las
condiciones siguientes:
v Existe una conexión de página de códigos combinada en la que la conversión de
datos de serie de caracteres de la página de códigos de la base de datos a la
página de códigos de la aplicación implica un cambio en la longitud de los
datos.
v Un cursor está bloqueado.
v La aplicación proporciona una variable de indicador de nulo.
El valor devuelto en la variable de indicador de nulo tendrá la longitud de la serie
de caracteres resultante en la página de códigos de la aplicación.
En los demás casos en los que interviene un truncamiento de datos (en contraste
con el truncamiento del terminador de nulo), el gestor de bases de datos devuelve
un valor W. En este caso, el gestor de bases de datos devuelve un valor en la
variable de indicador de nulo a la aplicación que tiene la longitud de la serie de
caracteres resultante en la página de códigos del elemento de lista select (la página
de códigos de la aplicación, la página de códigos de la base de datos o ninguna).
Para poder utilizar variables de indicador de nulo en el lenguaje principal, tiene
que declarar las variables de indicador de nulo. En el siguiente ejemplo, programas
C y C++ adecuados, la variable de indicador de nulo cmind se puede declarar del
siguiente modo:
82 Desarrollo de aplicaciones de SQL incorporado
![Page 91: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/91.jpg)
EXEC SQL BEGIN DECLARE SECTION;
char cm[3];
short cmind;
EXEC SQL END DECLARE SECTION;
La tabla siguiente contiene ejemplos correspondientes a los lenguajes principales
soportados:
Tabla 14. Variables de indicador de nulo por lenguaje principal
Lenguaje Código fuente de ejemplo
C y C++ EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind;
if ( cmind < 0 )
printf( "Commission is NULL\n" );
COBOL EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind END-EXEC
IF cmind LESS THAN 0
DISPLAY ’Commission is NULL’
FORTRAN EXEC SQL FETCH C1 INTO :cm INDICATOR :cmind
IF ( cmind .LT. 0 ) THEN
WRITE(*,*) ’Commission is NULL’
ENDIF
REXX CALL SQLEXEC ’FETCH C1 INTO :cm INDICATOR :cmind’
IF ( cmind < 0 )
SAY ’Commission is NULL’
Conceptos relacionados:
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
v “Información de error en los campos SQLCODE, SQLSTATE y SQLWARN” en la
página 190
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Declaración de variables del lenguaje principal con el Generador de
declaraciones db2dclgn” en la página 77
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Información relacionada:
v “Tipos de datos de columna y variables del lenguaje principal en aplicaciones de
SQL incorporado” en la página 77
Inclusión de las variables del lenguaje principal SQLSTATE y
SQLCODE en aplicaciones de SQL incorporado
La información de error se devuelve en los campos SQLCODE y SQLSTATE de la
estructura SQLCA, que se actualiza tras cada sentencia de SQL ejecutable y tras la
mayoría de las llamadas a API del gestor de bases de datos. Si la aplicación
cumple con el estándar FIPS 127-2, puede declarar las variables del lenguaje
principal llamadas SQLSTATE y SQLCODE en lugar de declarar de forma explícita
la estructura SQLCA en aplicaciones de SQL incorporado.
Capítulo 3. Programación de aplicaciones de SQL incorporado 83
![Page 92: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/92.jpg)
Requisitos previos:
v Se tiene que especificar la opción de PREP LANGLEVEL SQL92E
Procedimiento:
En el siguiente ejemplo, la aplicación comprueba el campo SQLCODE de la estructura
SQLCA para determinar si la actualización se ha realizado satisfactoriamente.
Tabla 15. Incorporación de sentencias de SQL en un lenguaje principal
Lenguaje Código fuente de ejemplo
C y C++ EXEC SQL UPDATE staff SET job = ’Clerk’ WHERE job = ’Mgr’;
if ( SQLCODE < 0 )
printf( "Update Error: SQLCODE = %ld \n", SQLCODE );
COBOL EXEC SQL UPDATE staff SET job = ’Clerk’ WHERE job = ’Mgr’ END_EXEC.
IF SQLCODE LESS THAN 0
DISPLAY ’UPDATE ERROR: SQLCODE = ’, SQLCODE.
FORTRAN EXEC SQL UPDATE staff SET job = ’Clerk’ WHERE job = ’Mgr’
if ( sqlcode .lt. 0 ) THEN
write(*,*) ’Update error: sqlcode = ’, sqlcode
Conceptos relacionados:
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
Tareas relacionadas:
v “Declaración de la SQLCA para el manejo de errores” en la página 56
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
Cómo hacer referencia a variables del lenguaje principal en
aplicaciones de SQL incorporado
Cuando haya declarado una variable del lenguaje principal en el código de la
aplicación de SQL incorporado, puede hacer referencia a la misma posteriormente
en la aplicación. Cuando utilice una variable del lenguaje principal en una
sentencia de SQL, preceda su nombre con un signo de dos puntos (:). Si utiliza una
variable del lenguaje principal en sintaxis de programación del lenguaje principal,
omita el signo de dos puntos.
Procedimiento:
Haga referencia a las variables del lenguaje principal utilizando la sintaxis
correspondiente al lenguaje principal que esté utilizando. La tabla siguiente
contiene ejemplos.
Tabla 16. Referencias a variables del lenguaje principal por lenguaje principal
Lenguaje Código fuente de ejemplo
C o C++ EXEC SQL FETCH C1 INTO :cm;
printf( "Commission = %f\n", cm );
84 Desarrollo de aplicaciones de SQL incorporado
![Page 93: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/93.jpg)
Tabla 16. Referencias a variables del lenguaje principal por lenguaje principal (continuación)
Lenguaje Código fuente de ejemplo
COBOL EXEC SQL FETCH C1 INTO :cm END-EXEC
DISPLAY ’Commission = ’ cm
FORTRAN EXEC SQL FETCH C1 INTO :cm
WRITE(*,*) ’Commission = ’, cm
REXX CALL SQLEXEC ’FETCH C1 INTO :cm’
SAY ’Commission = ’ cm
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Plantilla de aplicación de SQL incorporado en C” en la página 44
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Declaración de variables del lenguaje principal con el Generador de
declaraciones db2dclgn” en la página 77
Ejemplo: cómo hacer referencia a variables del lenguaje
principal XML en aplicaciones de SQL incorporado
Las siguientes aplicaciones de ejemplo hacen una demostración de cómo hacer
referencia a las variable del lenguaje principal XML en C y en COBOL.
Ejemplo: aplicación C de SQL incorporado:
El siguiente ejemplo de código se ha formateado para clarificarlo:
EXEC SQL BEGIN DECLARE;
SQL TYPE IS XML AS CLOB( 10K ) xmlBuf;
SQL TYPE IS XML AS BLOB( 10K ) xmlblob;
SQL TYPE IS CLOB( 10K ) clobBuf;
EXEC SQL END DECLARE SECTION;
// como XML AS CLOB
// Al valor de XML escrito en xmlBuf se añadirá como prefijo una declaración
// de XML parecida a: <?xml version = "1.0" encoding = "ISO-8859-1" ?>
// Nota: el nombre de codificación dependerá de la página de códigos de la
// aplicación
EXEC SQL SELECT xmlCol INTO :xmlBuf
FROM myTable
WHERE id = ’001’;
EXEC SQL UPDATE myTable
SET xmlCol = :xmlBuf
WHERE id = ’001’;
// como XML AS BLOB
// Al valor de XML escrito en xmlblob se añadirá como prefijo una declaración
// de XML parecida a: <?xml version = "1.0" encoding = "UTF-8"?>
EXEC SQL SELECT xmlCol INTO :xmlblob
FROM myTable
WHERE id = ’001’;
EXEC SQL UPDATE myTable
SET xmlCol = :xmlblob
WHERE id = ’001’;
// como CLOB
Capítulo 3. Programación de aplicaciones de SQL incorporado 85
![Page 94: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/94.jpg)
// La salida estará codificada en la página de códigos de caracteres de la
// aplicación, pero nt contendrá una declaración XML
EXEC SQL SELECT XMLSERIALIZE (xmlCol AS CLOB(10K)) INTO :clobBuf
FROM myTable
WHERE id = ’001’;
EXEC SQL UPDATE myTable
SET xmlCol = XMLPARSE (:clobBuf PRESERVE WHITESPACE)
WHERE id = ’001’;
Ejemplo: aplicación COBOL de SQL incorporado:
El siguiente ejemplo de código se ha formateado para clarificarlo:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 xmlBuf USAGE IS SQL TYPE IS XML as CLOB(5K).
01 clobBuf USAGE IS SQL TYPE IS CLOB(5K).
01 xmlblob USAGE IS SQL TYPE IS BLOB(5K).
EXEC SQL END DECLARE SECTION END-EXEC.
* como XML
EXEC SQL SELECT xmlCol INTO :xmlBuf
FROM myTable
WHERE id = ’001’.
EXEC SQL UPDATE myTable
SET xmlCol = :xmlBuf
WHERE id = ’001’.
* como BLOB
EXEC SQL SELECT xmlCol INTO :xmlblob
FROM myTable
WHERE id = ’001’.
EXEC SQL UPDATE myTable
SET xmlCol = :xmlblob
WHERE id = ’001’.
* como CLOB
EXEC SQL SELECT XMLSERIALIZE(xmlCol AS CLOB(10K)) INTO :clobBuf
FROM myTable
WHERE id= ’001’.
EXEC SQL UPDATE myTable
SET xmlCol = XMLPARSE(:clobBuf) PRESERVE WHITESPACE
WHERE id = ’001’.
Tareas relacionadas:
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
v “Ejecución de expresiones XQuery en aplicaciones de SQL incorporado” en la
página 166
Información relacionada:
v “Recomendaciones para desarrollar aplicaciones de SQL incorporado con XML y
XQuery” en la página 30
Variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++
Variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++
Las variables del lenguaje principal son variables de los lenguajes C o C++ a las
que se hace referencia en las sentencias de SQL. Permiten a una aplicación
intercambiar datos con el gestor de bases de datos. Una vez que se ha
precompilado la aplicación, el compilador utiliza las variables del lenguaje
86 Desarrollo de aplicaciones de SQL incorporado
![Page 95: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/95.jpg)
principal como cualquier otra variable de C o C++. Cuando denomine, declare y
utilice variables del lenguaje principal, siga las normas descritas en los apartados
siguientes.
Consideraciones sobre variables de tipo long:
En aplicaciones que construyen la SQLDA de forma manual, no se pueden utilizar
variables tipo long cuando sqlvar::sqltype==SQL_TYP_INTEGER. En su lugar se
deben utilizar los tipos sqlint32. Este problema es idéntico a utilizar variables
long en declaraciones de variables del lenguaje principal, excepto en que con una
SQLDA construida de forma manual el precompilador no revelará este error y se
producirán errores en el tiempo de ejecución.
Las conversiones de long y unsigned long que se utilizan para acceder a
información sqlvar::sqldata se deben cambiar por sqlint32 y sqluint32
respectivamente.Los miembros Val correspondientes a las estructuras sqloptions y
sqla_option se declaran como sqluintptr. Por lo tanto, la asignación de miembros
de puntero en miembros sqla_option::val o sqloptions::val deben utilizar
conversiones sqluintptr en lugar de conversiones unsigned long. Este cambio no
ocasionará problemas en el tiempo de ejecución en los sistemas operativos UNIX y
Linux, pero se debe realizar como preparación para aplicaciones Windows de 64
bits, en las que el tipo long sólo es de 32 bits.
Consideraciones sobre la codificación de varios bytes:
Algunos esquemas de codificación de caracteres, especialmente aquéllos que
proceden de los países del este asiático, necesitan varios bytes para representar un
carácter. Esta representación externa de los datos se denomina representación de
un carácter por medio de código de caracteres de varios bytes e incluye los caracteres
de doble byte (caracteres representados por dos bytes). Las variables del lenguaje
principal se elegirán consecuentemente, puesto que los datos gráficos de DB2
constan de caracteres de doble byte.
Para manipular series de caracteres que contienen caracteres de doble byte puede
resultar conveniente que una aplicación utilice una representación interna de los
datos. Esta representación interna se denomina representación de caracteres de
doble byte por medio de código de caracteres amplios y es el formato utilizado
habitualmente en el tipo de datos wchar_t de C o C++. Se dispone de subrutinas
que se ajustan a C de ANSI y a X/OPEN Portability Guide 4 (XPG4) para procesar
los datos de caracteres amplios y para convertir los datos que se encuentran en
este formato al formato de varios bytes, y viceversa.
Observe que, aunque una aplicación puede procesar datos de tipo carácter en
formato de varios bytes o en formato de caracteres amplios, la interacción con el
gestor de bases de datos sólo se realiza con códigos de caracteres DBCS (de varios
bytes). Es decir, los datos se almacenan y se recuperan de las columnas GRAPHIC
en formato DBCS. Se proporciona la opción WCHARTYPE del precompilador para
permitir que los datos de una aplicación que están en formato de caracteres
amplios se conviertan al formato de varios bytes, y viceversa, cuando se produce el
intercambio de datos con el motor de la base de datos.
Conceptos relacionados:
v “Declaración de variables de tipo graphic del lenguaje principal en aplicaciones
de SQL incorporado C y C++” en la página 96
Capítulo 3. Programación de aplicaciones de SQL incorporado 87
![Page 96: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/96.jpg)
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado C y C++” en la página 114
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado C y C++” en la página 90
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija,
terminadas en nulo y de longitud variable en aplicaciones de SQL incorporado C
y C++” en la página 94
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++” en la página 106
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado C y C++” en la página 103
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado C y C++” en la
página 105
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado C y C++” en la página 92
Nombres de variables del lenguaje principal en aplicaciones de
SQL incorporado C y C++
El precompilador SQL identifica las variables del lenguaje principal por el nombre
declarado para éstas. Se aplican las normas siguientes:
v Los nombres de las variables del lenguaje principal no deben superar los 255
caracteres de longitud.
v Los nombres de las variables del lenguaje principal no deben utilizar el prefijo
SQL, sql, DB2 ni db2, que están reservados para uso del sistema. Por ejemplo:
EXEC SQL BEGIN DECLARE SECTION;
char varsql; /* permitido */
char sqlvar; /* no permitido */
char SQL_VAR; /* no permitido */
EXEC SQL END DECLARE SECTION;
v El precompilador considera los nombres de variables del lenguaje principal
como globales respecto a un módulo. Sin embargo, esto no significa que las
variables del lenguaje principal se tengan que definir como variables globales; es
perfectamente aceptable que se declaren variables del lenguaje principal como
variables locales dentro de funciones. Por ejemplo, el código siguiente
funcionará correctamente:
void f1(int i)
{
EXEC SQL BEGIN DECLARE SECTION;
short host_var_1;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT COL1 INTO :host_var_1 from TBL1;
}
void f2(int i)
{
EXEC SQL BEGIN DECLARE SECTION;
88 Desarrollo de aplicaciones de SQL incorporado
![Page 97: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/97.jpg)
short host_var_2;
EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO TBL1 VALUES (:host_var_2);
}
También es posible tener varias variables del lenguaje principal locales con el
mismo nombre, siempre que sean del mismo tipo y tamaño. Para ello, declare la
primera aparición de la variable del lenguaje principal, ante el precompilador,
entre sentencias BEGIN DECLARE SECTION y END DECLARE SECTION, y
deje las declaraciones posteriores de la variable fuente de las secciones de
declaración. El código siguiente muestra un ejemplo de este caso:
void f3(int i)
{
EXEC SQL BEGIN DECLARE SECTION;
char host_var_3[25];
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT COL2 INTO :host_var_3 FROM TBL2;
}
void f4(int i)
{
char host_var_3[25];
EXEC SQL INSERT INTO TBL2 VALUES (:host_var_3);
}
Puesto que f3 y f4 están en el mismo módulo y host_var_3 tiene el mismo tipo
y longitud en ambas funciones, basta una sola declaración ante el precompilador
para utilizarla en ambos lugares.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
Información relacionada:
v “Ejemplos de C” en la página 405
v “Ejemplos de C++” en Temas de ejemplos
v “Tipos de datos para procedimientos, funciones y métodos en aplicaciones de
SQL incorporado C y C++” en la página 65
Sección declare para variables del lenguaje principal en
aplicaciones de SQL incorporado C y C++
Se debe utilizar una sección de declaración de SQL para identificar las
declaraciones de variables del lenguaje principal. Esto alerta al precompilador
acerca de las variables del lenguaje principal a las que se puede hacer referencia en
sentencias de SQL posteriores. Por ejemplo:
EXEC SQL BEGIN DECLARE SECTION;
char varsql; /* permitido */
EXEC SQL END DECLARE SECTION;
El precompilador C o C++ sólo reconoce un subconjunto de declaraciones de C o
C++ válidas como declaraciones de variables del lenguaje principal válidas. Estas
declaraciones definen variables numéricas o de tipo carácter. No se admiten las
definiciones de tipo para los tipos de variable del lenguaje principal. Las variables
del lenguaje principal se pueden agrupar en una sola estructura de lenguaje
principal. Puede declarar miembros de datos de clase C++ como variables del
lenguaje principal.
Capítulo 3. Programación de aplicaciones de SQL incorporado 89
![Page 98: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/98.jpg)
Una variable numérica del lenguaje principal se puede utilizar como variable de
entrada o de salida para cualquier valor numérico de entrada o salida de SQL. Una
variable del lenguaje principal de tipo carácter se puede utilizar como variable de
entrada o de salida para cualquier valor de tipo carácter, de fecha, de hora o de
indicación horaria, de entrada o salida de SQL. La aplicación se tiene que asegurar
de que las variables de salida sean lo suficientemente largas como para contener
los valores que reciben.
Conceptos relacionados:
v “Declaración de miembros de datos de clase como variables del lenguaje
principal en aplicaciones de SQL incorporado C++” en la página 108
v “Declaración de variables de tipo graphic del lenguaje principal en aplicaciones
de SQL incorporado C y C++” en la página 96
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado C y C++” en la página 114
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija,
terminadas en nulo y de longitud variable en aplicaciones de SQL incorporado C
y C++” en la página 94
Tareas relacionadas:
v “Declaración de variables del lenguaje principal con el Generador de
declaraciones db2dclgn” en la página 77
v “Declaración de variables del lenguaje principal de tipo estructurado” en
Desarrollo de SQL y rutinas externas
Información relacionada:
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado C y C++” en la página 92
Ejemplo: Plantilla de sección declare de SQL para aplicaciones
de SQL incorporado C y C++
A continuación se muestra una sección de declaración de SQL de ejemplo con
variables del lenguaje principal declaradas para tipos de datos SQL soportados:
EXEC SQL BEGIN DECLARE SECTION;
... short age = 26; /* tipo de SQL 500 */
short year; /* tipo de SQL 500 */
sqlint32 salary; /* tipo de SQL 496 */
sqlint32 deptno; /* tipo de SQL 496 */
float bonus; /* tipo de SQL 480 */
double wage; /* tipo de SQL 480 */
char mi; /* tipo de SQL 452 */
char name[6]; /* tipo de SQL 460 */
struct {
short len;
char data[24];
} address; /* tipo de SQL 448 */
struct {
short len;
char data[32695];
} voice; /* tipo de SQL 456 */
sql type is clob(1m)
chapter; /* tipo de SQL 408 */
sql type is clob_locator
chapter_locator; /* tipo de SQL 964 */
90 Desarrollo de aplicaciones de SQL incorporado
![Page 99: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/99.jpg)
sql type is clob_file
chapter_file_ref; /* tipo de SQL 920 */
sql type is blob(1m)
video; /* tipo de SQL 404 */
sql type is blob_locator
video_locator; /* tipo de SQL 960 */
sql type is blob_file
video_file_ref; /* tipo de SQL 916 */
sql type is dbclob(1m)
tokyo_phone_dir; /* tipo de SQL 412 */
sql type is dbclob_locator
tokyo_phone_dir_lctr; /* tipo de SQL 968 */
sql type is dbclob_file
tokyo_phone_dir_flref; /* tipo de SQL 924 */
struct {
short len;
sqldbchar data[100];
} vargraphic1; /* tipo de SQL 464 */
/* Precompilado con la
opción WCHARTYPE NOCONVERT */
struct {
short len;
wchar_t data[100];
} vargraphic2; /* tipo de SQL 464 */
/* Precompilado con la
opción WCHARTYPE CONVERT */
struct {
short len;
sqldbchar data[10000];
} long_vargraphic1; /* tipo de SQL 472 */
/* Precompilado con la
opción WCHARTYPE NOCONVERT */
struct {
short len;
wchar_t data[10000];
} long_vargraphic2; /* tipo de SQL 472 */
/* Precompilado con la
opción WCHARTYPE CONVERT */
sqldbchar graphic1[100]; /* tipo de SQL 468 */
/* Precompilado con la
opción WCHARTYPE NOCONVERT */
wchar_t graphic2[100]; /* tipo de SQL 468 */
/* Precompilado con la
opción WCHARTYPE CONVERT */
char date[11]; /* tipo de SQL 384 */
char time[9]; /* tipo de SQL 388 */
char timestamp[27]; /* tipo de SQL 392 */
short wage_ind; /* Indicador de nulo */
... EXEC SQL END DECLARE SECTION;
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
Capítulo 3. Programación de aplicaciones de SQL incorporado 91
![Page 100: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/100.jpg)
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
Variables SQLSTATE y SQLCODE en una aplicación de SQL
incorporado C y C++
Cuando se utiliza la opción de precompilación LANGLEVEL con un valor de
SQL92E, se pueden incluir las dos declaraciones siguientes como variables del
lenguaje principal:
EXEC SQL BEGIN DECLARE SECTION;
char SQLSTATE[6]
sqlint32 SQLCODE;
EXEC SQL END DECLARE SECTION;
Se supone la declaración SQLCODE durante el paso de precompilación. Observe
que, si se utiliza esta opción, no se debe especificar la sentencia INCLUDE SQLCA.
En una aplicación formada por varios archivos fuente, las variables SQLCODE y
SQLSTATE se pueden definir en el primer archivo fuente, tal como en el ejemplo
anterior. Los archivos fuente posteriores deben modificar las definiciones del modo
siguiente:
extern sqlint32 SQLCODE;
extern char SQLSTATE[6];
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Información de error en los campos SQLCODE, SQLSTATE y SQLWARN” en la
página 190
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
Declaración de variables numéricas del lenguaje principal en
aplicaciones de SQL incorporado C y C++
A continuación se muestra la sintaxis para declarar variables numéricas del
lenguaje principal en C o C++.
��
auto
extern
static
register
const
volatile
(1)
float
(2)
double
(3)
short
int
INTEGER (SQLTYPE 496)
BIGINT (SQLTYPE 492)
�
92 Desarrollo de aplicaciones de SQL incorporado
![Page 101: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/101.jpg)
�
�
�
,
nombrevar
=
valor
*
&
const
volatile
;
��
INTEGER (SQLTYPE 496)
sqlint32
(4)
long
int
BIGINT (SQLTYPE 492)
sqlint64
__int64
long long
int
(5)
long
int
Notas:
1 REAL (SQLTYPE 480), longitud 4
2 DOUBLE (SQLTYPE 480), longitud 8
3 SMALLINT (SQLTYPE 500)
4 Para obtener una portabilidad máxima de las aplicaciones utilice,
respectivamente, sqlint32 y sqlint64 para las variables del lenguaje principal
INTEGER y BIGINT. Por omisión, el uso de variables del lenguaje principal
tipo long tiene como consecuencia el error del precompilador SQL0402 en las
plataformas en que la longitud es una cantidad de 64 bits, como por ejemplo
en UNIX de 64 BITS. Utilice la opción LONGERROR NO de PREP para
imponer que DB2 acepte variables long como tipos de variable del lenguaje
principal aceptables y las trate como variables BIGINT.
5 Para obtener una portabilidad máxima de las aplicaciones utilice,
respectivamente, sqlint32 y sqlint64 para las variables del lenguaje
principal INTEGER y BIGINT. Para utilizar el tipo de datos BIGINT, la
plataforma tiene que soportar valores enteros de 64 bits. Por omisión, el uso
de variables del lenguaje principal tipo long tiene como consecuencia el error
del precompilador SQL0402 en las plataformas en que la longitud es una
cantidad de 64 bits, como por ejemplo en UNIX de 64 BITS. Utilice la opción
LONGERROR NO de PREP para imponer que DB2 acepte variables long
como tipos de variable del lenguaje principal aceptables y las trate como
variables BIGINT.
Conceptos relacionados:
Capítulo 3. Programación de aplicaciones de SQL incorporado 93
![Page 102: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/102.jpg)
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
Declaración de variables del lenguaje principal de tipo carácter
de longitud fija, terminadas en nulo y de longitud variable en
aplicaciones de SQL incorporado C y C++
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de tipo carácter fijas, terminadas en nulo (formato 1) y de longitud variable en C o
C++.
Formato 1: Sintaxis correspondiente a variables del lenguaje principal de tipo
carácter fijas y terminadas en nulo en aplicaciones de SQL incorporado en C
o C++
��
auto
extern
static
register
const
volatile
char
unsigned �
�
�
,
CHAR
Serie C
=
valor
;
��
CHAR
�
(1)
nombrevar
*
&
const
volatile
Serie C
�
(2)
nombrevar
[longitud]
(
nombrevar
)
*
&
const
volatile
Notas:
1 CHAR (SQLTYPE 452), length 1
2 Serie C terminada en nulo (SQLTYPE 460); la longitud puede ser cualquier
expresión constante válida
94 Desarrollo de aplicaciones de SQL incorporado
![Page 103: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/103.jpg)
Formato 2: Sintaxis correspondiente a variables del lenguaje principal de tipo
carácter de longitud variable en aplicaciones de SQL incorporado C y C++
��
auto
extern
static
register
const
volatile
struct
código �
� (1)
{
short
var1
;
char
var2
[longitud]
;
}
int
unsigned
�
�
�
�
,
nombrevar
Valores
*
&
const
volatile
;
��
Valores
= { valor-1 , valor-2 }
Notas:
1 En el formato 2, la longitud puede ser cualquier expresión constante válida.
Su valor después de una evaluación determina si la variable del lenguaje
principal es VARCHAR (SQLTYPE 448) o LONG VARCHAR (SQLTYPE 456).
Consideraciones sobre las variables del lenguaje principal de tipo carácter de
longitud variable:
1. Aunque el gestor de bases de datos convierte los datos de tipo carácter al
formato 1 o al formato 2 siempre que es posible, el formato 1 corresponde a los
tipos de columna CHAR o VARCHAR, mientras que el formato 2 corresponde
a los tipos de columna VARCHAR y LONG VARCHAR.
2. Si se utiliza el formato 1 con un especificador de longitud [n], el valor
correspondiente al especificador de longitud tras la evaluación no debe ser
mayor que 32672 y la serie contenida en la variable debe terminar en nulo.
3. Si se utiliza el formato 2, el valor correspondiente al especificador de longitud
tras la evaluación no debe ser mayor que 32700.
4. En el formato 2, var1 y var2 deben ser simples referencias a variables (y no
operadores) y no se pueden utilizar como variables del lenguaje principal
(nombrevar es la variable del lenguaje principal).
5. nombrevar puede ser un simple nombre de variable o puede incluir operadores,
como por ejemplo *nombrevar. Consulte la descripción de los tipos de datos de
puntero en C y C++ para obtener más información.
6. El precompilador determina el SQLTYPE y la SQLLEN de todas las variables
del lenguaje principal. Si una variable del lenguaje principal aparece en una
sentencia de SQL con una variable de indicador, mientras dure esa sentencia se
asigna como SQLTYPE el SQLTYPE base más uno.
Capítulo 3. Programación de aplicaciones de SQL incorporado 95
![Page 104: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/104.jpg)
7. El precompilador permite algunas declaraciones que no son válidas
sintácticamente en C ni en C++. Si tiene dudas acerca de la sintaxis de una
declaración determinada, consulte la documentación del compilador.
Conceptos relacionados:
v “Series terminadas en nulo en aplicaciones de SQL incorporado C y C++” en la
página 117
v “Variables de indicador de nulo o de truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++” en la página 116
Declaración de variables de tipo graphic del lenguaje principal
en aplicaciones de SQL incorporado C y C++
Para manejar datos gráficos en aplicaciones C o C++, utilice variables de lenguaje
principal basadas en el tipo de datos wchar_t de C o C++ o en el tipo de datos
sqldbchar proporcionado por DB2. Puede asignar estos tipos de variables del
lenguaje principal a las columnas de una tabla que sean GRAPHIC, VARGRAPHIC
o DBCLOB. Por ejemplo, puede actualizar o seleccionar datos DBCS de las
columnas GRAPHIC o VARGRAPHIC de una tabla.
Existen tres formatos válidos para una variable gráfica del lenguaje principal:
v Formato de gráfico simple
Las variables de gráfico simple del lenguaje principal tienen para SQLTYPE el
valor 468/469, lo que equivale al tipo de datos GRAPHIC(1) de SQL.
v Formato de gráfico terminado en nulo
Terminado en nulo hace referencia a una situación en que todos los bytes del
último carácter de la serie gráfica contienen ceros binarios ('\0's). Su tipo de
datos de SQL es 400/401.
v Formato estructurado VARGRAPHIC
Las variables de formato estructurado VARGRAPHIC del lenguaje principal
tienen para SQLTYPE el valor 464/465 si su longitud está comprendida entre 1 y
16.336 bytes. Tienen para SQLTYPE el valor 472/473 si su longitud está
comprendida entre 2.000 y 16.350 bytes.
Conceptos relacionados:
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado C y C++” en la página 114
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Variables de indicador de nulo o de truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++” en la página 116
v “Tipos de datos wchar_t y sqldbchar para datos gráficos en aplicaciones de SQL
incorporado C y C++” en la página 97
v “Opción del precompilador WCHARTYPE para datos gráficos en aplicaciones de
SQL incorporado C y C++” en la página 98
Información relacionada:
96 Desarrollo de aplicaciones de SQL incorporado
![Page 105: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/105.jpg)
v “Declaración de variables del lenguaje principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++” en la página 106
v “Declaración de variables de tipo GRAPHIC del lenguaje principal en formatos
de un solo gráfico y de gráficos terminados en nulo en aplicaciones de SQL
incorporado C y C++” en la página 102
v “Declaración de variables del lenguaje principal de tipo VARGRAPHIC en el
formato estructurado en aplicaciones de SQL incorporado C o C++” en la página
101
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado C y C++” en la página 103
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado C y C++” en la
página 105
Tipos de datos wchar_t y sqldbchar para datos gráficos en
aplicaciones de SQL incorporado C y C++
Mientras que el tamaño y la codificación de datos gráficos de DB2 son constantes
en todas las plataformas para una página de códigos determinada, el tamaño y el
formato interno del tipo de datos wchar_t de C o de C++ de ANSI dependen del
compilador que se utilice y de la plataforma en que se encuentre. No obstante,
DB2 define el tipo de datos sqldbchar con un tamaño de dos bytes, y se pretende
que constituya una manera portátil de manipular los datos DBCS y UCS-2 en el
mismo formato en que están almacenados en la base de datos.
Puede definir todos los tipos de variables del lenguaje principal de gráficos C de
DB2 mediante wchar_t o sqldbchar. Debe utilizar wchar_t si crea la aplicación
mediante la opción de precompilación WCHARTYPE CONVERT.
Nota: Cuando especifique la opción WCHARTYPE CONVERT en un sistema
operativo Windows, tenga en cuenta que wchar_t en sistemas operativos
Windows es Unicode. Por lo tanto, si el wchar_t del compilador C o C++ no
es Unicode, es posible que la llamada a la función wcstombs() falle con
SQLCODE -1421 (SQLSTATE=22504). Si esto sucede, puede especificar la
opción WCHARTYPE NOCONVERT y llamar a las funciones wcstombs() y
mbstowcs() de forma explícita desde dentro del programa.
Si crea la aplicación con la opción de precompilación WCHARTYPE NOCONVERT,
debe utilizar sqldbchar para conseguir una portabilidad máxima entre distintas
plataformas de cliente y servidor DB2. Puede utilizar wchar_t con WCHARTYPE
NOCONVERT, pero sólo en aquellas plataformas en que wchar_t esté definido con
una longitud de dos bytes.
Si utiliza incorrectamente wchar_t o sqldbchar en declaraciones de variables del
lenguaje principal, durante la precompilación recibirá un SQLCODE 15 (sin
SQLSTATE).
Conceptos relacionados:
v “Consideraciones sobre el juego de códigos EUC y UCS-2 japonés y chino
tradicional” en Desarrollo de SQL y rutinas externas
v “Opción del precompilador WCHARTYPE para datos gráficos en aplicaciones de
SQL incorporado C y C++” en la página 98
Capítulo 3. Programación de aplicaciones de SQL incorporado 97
![Page 106: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/106.jpg)
Opción del precompilador WCHARTYPE para datos gráficos en
aplicaciones de SQL incorporado C y C++
Mediante la opción WCHARTYPE del precompilador, puede especificar el formato
de caracteres gráficos que desea utilizar en la aplicación C o C++. Esta opción
proporciona flexibilidad para elegir entre tener los datos gráficos en formato de
varios bytes o en formato de caracteres amplios. La opción WCHARTYPE tiene dos
valores posibles:
CONVERT
Si se selecciona la opción WCHARTYPE CONVERT, se convierten los
códigos de caracteres entre la variable de gráficos del lenguaje principal y
el gestor de bases de datos. Para las variables del lenguaje principal de
entrada de gráficos, la conversión de código de caracteres del formato de
caracteres amplios a formato de caracteres DBCS de varios bytes se realiza
antes de enviar los datos al gestor de bases de datos, mediante la función
wcstombs() de C de ANSI. Para las variables del lenguaje principal de
salida de gráficos, la conversión de código de caracteres del formato de
caracteres DBCS de varios bytes al formato de caracteres amplios se realiza
antes de que los datos recibidos del gestor de bases de datos se almacenen
en la variable del lenguaje principal, mediante la función mbstowcs() de C
de ANSI.
La ventaja de utilizar WCHARTYPE CONVERT es que permite que la
aplicación aproveche plenamente los mecanismos de C de ANSI para tratar
las series de caracteres amplios (literales L, funciones de serie ’wc’, etc.) sin
tener que convertir los datos de forma explícita al formato de varios bytes
antes de establecer comunicación con el gestor de bases de datos. El
inconveniente es que las conversiones implícitas puede tener un impacto
sobre el rendimiento de la aplicación durante la ejecución de ésta y pueden
incrementar los requisitos de memoria.
Si selecciona WCHARTYPE CONVERT, declare todas las variables del
lenguaje principal de gráficos mediante wchar_t en lugar de mediante
sqldbchar.
Si desea el comportamiento de WCHARTYPE CONVERT pero no es
necesario precompilar la aplicación (por ejemplo, una aplicación CLI),
defina la macro SQL_WCHART_CONVERT del preprocesador de C durante la
compilación. Así se asegurará de que determinadas definiciones de los
archivos de cabecera de DB2 utilicen el tipo de datos wchar_t en lugar de
sqldbchar.
Nota: La opción de precompilación WCHARTYPE CONVERT no recibe
soporte en programas que se ejecutan en el cliente DB2 Windows
3.1. Para estos programas, utilice el valor por omisión
(WCHARTYPE NOCONVERT).
NOCONVERT (valor por omisión)
Si se elige la opción WCHARTYPE NOCONVERT o no se especifica
ninguna opción WCHARTYPE, no se produce ninguna conversión
implícita del código de caracteres entre la aplicación y el gestor de bases
de datos. Los datos de una variable del lenguaje principal de gráficos se
envían al gestor de bases de datos y se reciben del mismo como caracteres
DBCS inalterados. Esto tiene la ventaja de que se mejora el rendimiento,
pero el inconveniente de que la aplicación debe abstenerse de utilizar datos
de caracteres amplios en las variables del lenguaje principal wchar_t, o
tiene que llamar explícitamente a las funciones wcstombs() y mbstowcs()
98 Desarrollo de aplicaciones de SQL incorporado
![Page 107: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/107.jpg)
para convertir los datos al formato de varios bytes, o viceversa, cuando
interactúe con el gestor de bases de datos.
Si selecciona WCHARTYPE NOCONVERT, declare todas las variables del
lenguaje principal de gráficos utilizando el tipo sqldbchar, a fin de obtener
la máxima portabilidad a otras plataformas cliente/servidor de DB2.
Hay otras directrices que debe tener en cuenta, que son las siguientes:
v Puesto que se utiliza el soporte de wchar_t o sqldbchar para manejar datos
DBCS, su uso requiere que el hardware y el software tengan capacidad de DBCS
o EUC. Este soporte sólo está disponible en el entorno DBCS de DB2 Database
para Linux, UNIX y Windows, o para tratar datos GRAPHIC en cualquier
aplicación (incluidas las aplicaciones de un solo byte) conectada a una base de
datos UCS-2.
v Los caracteres que no sean DBCS, y los caracteres amplios que se pueden
convertir en caracteres no DBCS, no se deben utilizar en series gráficas.
Caracteres que no sean DBCS hace referencia a los caracteres de un solo byte y a
los caracteres que no son de doble byte. Las series gráficas no se validan para
asegurar que sus valores únicamente contienen puntos de código de caracteres
de doble byte. Las variables del lenguaje principal de gráficos sólo deben
contener datos DBCS o, si WCHARTYPE CONVERT está en vigor, datos de
caracteres amplios que se convierten en datos DBCS. Debe almacenar los datos
que contienen una mezcla de caracteres de doble byte y de un solo byte en
variables del lenguaje principal de tipo carácter. Observe que las variables del
lenguaje principal de datos mixtos no se ven afectadas por el establecimiento de
la opción WCHARTYPE.
v En las aplicaciones en que se utiliza la opción de precompilación WCHARTYPE
NOCONVERT, no se deben utilizar literales L junto con variables del lenguaje
principal de gráficos, puesto que los literales L están en formato de caracteres
amplios. Un literal L es una serie de caracteres amplios C que tiene como prefijo
la letra L y como tipo de datos "array of wchar_t". Por ejemplo,
L"dbcs-string" es un literal L.
v En las aplicaciones en que se utiliza la opción de precompilación WCHARTYPE
CONVERT, se pueden utilizar literales L para inicializar variables del lenguaje
principal wchar_t, pero no se pueden utilizar en sentencias de SQL. En lugar de
utilizar literales L, las sentencias de SQL deben usar constantes de serie de
gráficos, que son independientes del valor de WCHARTYPE.
v El valor de la opción WCHARTYPE afecta a los datos de gráficos que se pasan
al gestor de bases de datos y que se reciben de éste utilizando la estructura
SQLDA, así como a las variables del lenguaje principal. Si WCHARTYPE
CONVERT está en vigor, se supondrá que los datos gráficos recibidos de la
aplicación mediante una SQLDA están en formato de caracteres amplios, y se
convertirán al formato DBCS a través de una llamada implícita a wcstombs(). De
forma parecida, los datos de salida de gráficos recibidos por una aplicación se
habrán convertido al formato de caracteres amplios antes de colocarlos en el
almacenamiento de la aplicación.
v Los procedimientos almacenados sin barrera se deben precompilar con la opción
WCHARTYPE NOCONVERT. Los procedimientos almacenados normales con
barrera se pueden precompilar con las opciones CONVERT o NOCONVERT, lo
cual afectará al formato de los datos gráficos manipulados por las sentencias de
SQL contenidas en el procedimiento almacenado. No obstante, y en cualquier
caso, los datos gráficos que se pasen al procedimiento almacenado mediante la
SQLDA estarán en formato DBCS. De la misma forma, los datos que se pasen
desde el procedimiento almacenado mediante la SQLDA deben estar en formato
DBCS.
Capítulo 3. Programación de aplicaciones de SQL incorporado 99
![Page 108: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/108.jpg)
v Si una aplicación llama a un procedimiento almacenado a través de la interfaz
Database Application Remote Interface (DARI) (la API sqleproc()), los datos
gráficos de la SQLDA de entrada tienen que estar en formato DBCS, o en UCS-2
si está conectada a una base de datos UCS-2, independientemente del estado del
valor de WCHARTYPE de la aplicación que realiza la llamada. Asimismo, los
datos gráficos de la SQLDA de salida se devolverán en formato DBCS, o en
UCS-2 si está conectada a una base de datos UCS-2, independientemente del
valor de WCHARTYPE.
v Si una aplicación llama a un procedimiento almacenado mediante la sentencia
CALL de SQL, se producirá una conversión de los datos gráficos en la SQLDA,
según el valor de WCHARTYPE de la aplicación que realiza la llamada.
v Los datos gráficos que se pasen a funciones definidas por el usuario (UDF)
siempre estarán en formato DBCS. De la misma forma, se supondrá que los
datos gráficos devueltos desde una UDF están en formato DBCS para las bases
de datos DBCS, y en formato UCS-2 para las bases de datos EUC y UCS-2.
v Los datos almacenados en archivos DBCLOB mediante el uso de variables de
referencia a archivos DBCLOB se almacenan en formato DBCS o, en el caso de
bases de datos UCS-2, en formato UCS-2. Del mismo modo, los datos de entrada
procedentes de archivos DBCLOB se recuperan en formato DBCS o, en el caso
de bases de datos UCS-2, en formato UCS-2.
Notas:
1. En el caso de DB2 para sistemas operativos Windows, la opción WCHARTYPE
CONVERT está soportada para aplicaciones compiladas con el compilador
Microsoft Visual C++. Sin embargo, no utilice la opción CONVERT con este
compilador si la aplicación inserta datos en una base de datos DB2 en una
página de códigos que sea diferente a la de la base de datos. En esta situación,
el servidor DB2 suele efectuar una conversión de página de códigos; no
obstante, el entorno de tiempo de ejecución de Microsoft C no maneja
caracteres de sustitución para algunos caracteres de doble byte. Esto podría
producir errores de conversión en tiempo de ejecución.
2. Si se precompilan aplicaciones C utilizando la opción WCHARTYPE
CONVERT, DB2 valida los datos gráficos de la aplicación tanto de entrada
como de salida, puesto que los datos se pasan a través de las funciones de
conversión. Si no se utiliza la opción CONVERT, no se produce ninguna
conversión de los datos gráficos, por lo que tampoco se produce ninguna
validación. En un entorno mixto de CONVERT/NOCONVERT, se pueden
ocasionar problemas si una aplicación NOCONVERT inserta datos gráficos no
válidos que luego son captados por una aplicación CONVERT. Estos datos no
se pueden convertir con SQLCODE -1421 (SQLSTATE 22504) en una operación
FETCH de la aplicación CONVERT.
Conceptos relacionados:
v “Declaración de variables de tipo graphic del lenguaje principal en aplicaciones
de SQL incorporado C y C++” en la página 96
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
v “Declaración de variables de tipo GRAPHIC del lenguaje principal en formatos
de un solo gráfico y de gráficos terminados en nulo en aplicaciones de SQL
incorporado C y C++” en la página 102
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado C y C++” en la página 103
100 Desarrollo de aplicaciones de SQL incorporado
![Page 109: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/109.jpg)
v “Archivos include para aplicaciones de SQL incorporado C y C++” en la página
48
Declaración de variables del lenguaje principal de tipo
VARGRAPHIC en el formato estructurado en aplicaciones de
SQL incorporado C o C++
A continuación se muestra la sintaxis para declarar una variable del lenguaje
principal gráfica mediante el formato estructurado VARGRAPHIC.
��
auto
extern
static
register
const
volatile
struct
código �
� (1) (2)
{
short
var-1
;
sqldbchar
var-2
[longitud
]
;
}
int
wchar_t
�
�
�
�
,
Variable
;
*
&
const
volatile
��
Variable:
nombre-variable
=
{
valor-1
,
valor-2
}
Notas:
1 Para determinar cuál de los dos tipos gráficos debe utilizar, consulte la
descripción de los tipos de datos wchar_t y sqldbchar en C y C++.
2 longitud puede ser cualquier expresión de constante válida. Su valor después
de una evaluación determina si la variable del lenguaje principal es
VARGRAPHIC (SQLTYPE 464) o LONG VARGRAPHIC (SQLTYPE 472). El
valor de longitud debe ser mayor o igual que 1 y menor o igual que la
longitud máxima de LONG VARGRAPHIC, que es 16350.
Consideraciones sobre la declaración de gráfico (formato estructurado
VARGRAPHIC):
1. var-1 y var-2 deben ser simples referencias a variables (y no operadores) y no se
pueden utilizar como variables del lenguaje principal.
2. valor-1 y valor-2 son inicializadores de var-1 y var-2. valor-1 debe ser un entero y
valor-2 debe ser un literal de serie de caracteres amplios (literal L) si se utiliza
la opción WCHARTYPE CONVERT del precompilador.
3. Se puede utilizar el código struct para definir otras áreas de datos, pero no se
puede utilizar por sí mismo como variable del lenguaje principal.
Conceptos relacionados:
Capítulo 3. Programación de aplicaciones de SQL incorporado 101
![Page 110: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/110.jpg)
v “Tipos de datos wchar_t y sqldbchar para datos gráficos en aplicaciones de SQL
incorporado C y C++” en la página 97
Declaración de variables de tipo GRAPHIC del lenguaje principal
en formatos de un solo gráfico y de gráficos terminados en nulo
en aplicaciones de SQL incorporado C y C++
A continuación se muestra la sintaxis para declarar una variable del lenguaje
principal gráfica mediante el formato de un solo gráfico y el formato de gráfico
terminado en nulo.
��
auto
extern
static
register
const
volatile
(1)
sqldbchar
wchar_t
�
�
�
,
CHAR
Serie C
=
valor
;
��
CHAR
�
(2)
nombrevar
*
&
const
volatile
Serie C
�
(3)
nombrevar
[longitud]
(
nombrevar
)
*
&
const
volatile
Notas:
1 Para determinar cuál de los dos tipos gráficos debe utilizar, consulte la
descripción de los tipos de datos wchar_t y sqldbchar en C y C++.
2 GRAPHIC (SQLTYPE 468), longitud 1
3 Serie gráfica terminada en nulo (SQLTYPE 400)
Consideraciones sobre variables del lenguaje principal de tipo graphic:
1. El formato de un solo gráfico declara una variable del lenguaje principal de
serie gráfica y longitud fija de longitud 1 con un SQLTYPE de 468 ó 469.
102 Desarrollo de aplicaciones de SQL incorporado
![Page 111: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/111.jpg)
2. valor es un inicializador. Se debe utilizar un literal de serie de caracteres
amplios (literal L) si se utiliza la opción WCHARTYPE CONVERT del
precompilador.
3. longitud puede ser cualquier expresión constante válida, y su valor después de
una evaluación tiene que ser mayor o igual a 1 y no mayor que la longitud
máxima de VARGRAPHIC, que es 16336.
4. Las series gráficas terminadas en nulo se manejan de forma distinta en función
del valor del establecimiento de opciones de precompilación de nivel estándar.
Conceptos relacionados:
v “Series terminadas en nulo en aplicaciones de SQL incorporado C y C++” en la
página 117
v “Tipos de datos wchar_t y sqldbchar para datos gráficos en aplicaciones de SQL
incorporado C y C++” en la página 97
Declaración de variables del lenguaje principal de tipo objeto
grande (large object) en aplicaciones de SQL incorporado C y
C++
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de objeto grande (LOB) en C o C++.
��
auto
extern
static
register
const
volatile
SQL TYPE IS
XML AS BLOB
CLOB
DBCLOB
�
� (1)
(longitud
)
�
�
�
�
,
nombre-variable
Datos LOB
*
&
const
volatile
;
��
Datos LOB
={long-inic,″datos-inic″}
=SQL_BLOB_INIT(″datos-inic″)
=SQL_CLOB_INIT(″datos-inic″)
=SQL_DBCLOB_INIT(″datos-inic″)
Notas:
1 longitud puede ser cualquier expresión de constante válida en la que se
pueden utilizar las constantes K, M o G. El valor de la longitud después de
Capítulo 3. Programación de aplicaciones de SQL incorporado 103
![Page 112: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/112.jpg)
una evaluación para BLOB y CLOB debe ser 1 <= longitud <= 2.147.483.647.
El valor de longitud tras la evaluación correspondiente a DBCLOB debe ser 1
<= longitud <= 1.073.741.823.
Consideraciones sobre variables del lenguaje principal de tipo LOB:
1. Es necesaria la cláusula TYPE IS de SQL para poder distinguir los tres tipos de
LOB entre sí, de forma que se puedan llevar a cabo una comprobación del tipo
y una resolución de la función para las variables de lenguaje principal de tipo
LOB que se pasan a las funciones.
2. SQL TYPE IS, BLOB, CLOB, DBCLOB, K, M, G se pueden especificar en una
mezcla de mayúsculas y minúsculas.
3. La longitud máxima permitida para la serie de inicialización ″datos-inic″ es
32702 bytes, incluidos los delimitadores de la serie (igual al límite existente en
series C y C++ dentro del precompilador).
4. La longitud de inicialización, long-inic, tiene que ser una constante numérica
(por ejemplo, no puede incluir K, M ni G).
5. Se debe especificar una longitud para el LOB; es decir, que la declaración
siguiente no está permitida:
SQL TYPE IS BLOB my_blob;
6. Si el LOB no se inicializa dentro de la declaración, no se realizará ninguna
inicialización en el código generado por el precompilador.
7. Si se inicializa un DBCLOB, es responsabilidad del usuario añadirle a la serie el
prefijo ’L’ (que indica una serie de caracteres amplios).
Nota: Los literales de caracteres amplios, por ejemplo L"Hello", sólo se deben
utilizar en un programa precompilado si se selecciona la opción
WCHARTYPE CONVERT de precompilación.
8. El precompilador genera un código de estructura que se puede utilizar para
pasarlo al tipo de la variable del lenguaje principal.
Ejemplo de BLOB:
La declaración:
static Sql Type is Blob(2M) my_blob=SQL_BLOB_INIT("mydata");
Tiene como resultado la generación de la estructura siguiente:
static struct my_blob_t {
sqluint32 length;
char data[2097152];
} my_blob=SQL_BLOB_INIT("mydata");
Ejemplo de CLOB:
La declaración:
volatile sql type is clob(125m) *var1, var2 = {10, "data5data5"};
Tiene como resultado la generación de la estructura siguiente:
volatile struct var1_t {
sqluint32 length;
char data[131072000];
} * var1, var2 = {10, "data5data5"};
Ejemplo de DBCLOB:
La declaración:
104 Desarrollo de aplicaciones de SQL incorporado
![Page 113: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/113.jpg)
SQL TYPE IS DBCLOB(30000) my_dbclob1;
Si se precompila con la opción WCHARTYPE NOCONVERT, tiene como resultado
la generación de la estructura siguiente:
struct my_dbclob1_t {
sqluint32 length;
sqldbchar data[30000];
} my_dbclob1;
La declaración:
SQL TYPE IS DBCLOB(30000) my_dbclob2 = SQL_DBCLOB_INIT(L"mydbdata");
Si se precompila con la opción WCHARTYPE CONVERT, tiene como resultado la
generación de la estructura siguiente:
struct my_dbclob2_t {
sqluint32 length;
wchar_t data[30000];
} my_dbclob2 = SQL_DBCLOB_INIT(L"mydbdata");
Conceptos relacionados:
v “Declaración de variables del lenguaje principal como punteros en aplicaciones
de SQL incorporado C y C++” en la página 107
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
v “Indicaciones horarias generadas por el precompilador” en la página 208
Tareas relacionadas:
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
Declaración de variables del lenguaje principal de tipo
localizador de objeto grande (large object locator) en
aplicaciones de SQL incorporado C y C++
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de localizador de objeto grande (LOB) en C o C++.
��
auto
extern
static
register
const
volatile
SQL TYPE IS BLOB_LOCATOR
CLOB_LOCATOR
DBCLOB_LOCATOR
�
�
�
,
Variable
;
��
Variable
Capítulo 3. Programación de aplicaciones de SQL incorporado 105
![Page 114: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/114.jpg)
�
*
nombre-variable
&
const
= valor-inic
volatile
Consideraciones sobre variables del lenguaje principal de tipo localizador de
LOB:
1. SQL TYPE IS, BLOB_LOCATOR, CLOB_LOCATOR, DBCLOB_LOCATOR se
pueden especificar en una mezcla de mayúsculas y minúsculas.
2. valor-inic permite la inicialización de variables de localizador de puntero y
referencia. Otros tipos de inicialización no tendrán ningún significado.
Ejemplo de localizador de CLOB (las declaraciones de otros tipos de localizadores
de LOB son similares):
La declaración:
SQL TYPE IS CLOB_LOCATOR my_locator;
Tiene como resultado la generación de la declaración siguiente:
sqluint32 my_locator;
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++” en la página 106
Declaración de variables del lenguaje principal de tipo referencia
de archivos en aplicaciones de SQL incorporado C y C++
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de referencia de archivos en C o C++.
106 Desarrollo de aplicaciones de SQL incorporado
![Page 115: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/115.jpg)
Nota: SQL TYPE IS, BLOB_FILE, CLOB_FILE, DBCLOB_FILE se pueden
especificar en una mezcla de mayúsculas y minúsculas.
Ejemplo de referencia de archivos CLOB (las declaraciones de otros tipos de
referencias de archivos LOB son similares):
La declaración:
static volatile SQL TYPE IS BLOB_FILE my_file;
Tiene como resultado la generación de la estructura siguiente:
static volatile struct {
sqluint32 name_length;
sqluint32 data_length;
sqluint32 file_options;
char name[255];
} my_file;
Nota: La estructura anterior es equivalente a la estructura de sqlfile que se
encuentra en la cabecera sql.h. Consulte la Figura 2 para ver el diagrama de
sintaxis.
Conceptos relacionados:
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
Declaración de variables del lenguaje principal como punteros
en aplicaciones de SQL incorporado C y C++
Las variables del lenguaje principal se pueden declarar como punteros a tipos de
datos específicos, con las restricciones siguientes:
v Si una variable del lenguaje principal se declara como puntero, no se puede
declarar ninguna otra variable del lenguaje principal con el mismo nombre
dentro del mismo archivo fuente. El ejemplo siguiente no está permitido:
char mystring[20];
char (*mystring)[20];
Sintaxis para variables del lenguaje principal de referencia de archivos en C o C++
��
auto
extern
static
register
const
volatile
SQL TYPE IS
XML AS
BLOB_FILE
CLOB_FILE
DBCLOB_FILE
�
,
Variable
;
��
Variable
�
*
nombre-variable
&
const
= valor-inic
volatile
Figura 2. Diagrama de sintaxis
Capítulo 3. Programación de aplicaciones de SQL incorporado 107
![Page 116: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/116.jpg)
v Cuando declare un puntero a una matriz de caracteres terminada en nulo, utilice
paréntesis. En todos los casos restantes, no se permiten paréntesis. Por ejemplo:
EXEC SQL BEGIN DECLARE SECTION;
char (*arr)[10]; /* correcto */
char *(arr); /* incorrecto */
char *arr[10]; /* incorrecto */
EXEC SQL END DECLARE SECTION;
La primera declaración es un puntero a una matriz de caracteres de 10 bytes.
Esta variable del lenguaje principal es válida. La segunda declaración no es
válida. Los paréntesis no están permitidos en un puntero a un carácter. La
tercera declaración es una matriz de punteros. Este tipo de datos no se soporta.
La declaración de variable del lenguaje principal:
char *ptr;
se acepta, pero no significa serie de caracteres terminada en nulo de longitud
indeterminada; significa puntero a una variable del lenguaje principal de un solo
carácter y de longitud fija. Es posible que esto no fuera lo que se pretendía. Para
definir una variable del lenguaje principal de puntero que pueda indicar
distintas series de caracteres, utilice el primero de los formatos de declaración
anteriores.
v Cuando se utilizan variables del lenguaje principal de puntero en sentencias de
SQL, deben tener como prefijo el mismo número de asteriscos con que se han
declarado, tal como en el ejemplo siguiente:
EXEC SQL BEGIN DECLARE SECTION;
char (*mychar)[20]; /* Puntero a matriz de caracteres de 20 bytes */
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT column INTO :*mychar FROM table; /* Correcta */
v Sólo se puede utilizar el asterisco como operador en un nombre de variable del
lenguaje principal.
v La longitud máxima de un nombre de variable del lenguaje principal no se ve
afectada por el número de asteriscos especificados, puesto que no se considera
que los asteriscos formen parte del nombre.
v Siempre que utilice una variable de puntero en una sentencia de SQL, debe dejar
la opción de precompilación del nivel de optimización (OPTLEVEL) en su valor
por omisión, que es 0 (sin optimización). Esto significa que el gestor de bases de
datos no realizará ninguna optimización de la SQLDA.
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 88
v “Series terminadas en nulo en aplicaciones de SQL incorporado C y C++” en la
página 117
v “Variables de indicador de nulo o de truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++” en la página 116
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija,
terminadas en nulo y de longitud variable en aplicaciones de SQL incorporado C
y C++” en la página 94
Declaración de miembros de datos de clase como variables del
lenguaje principal en aplicaciones de SQL incorporado C++
Puede declarar miembros de datos de clase como variables del lenguaje principal
(pero no clases u objetos en sí mismos). El ejemplo siguiente ilustra el método a
utilizar:
108 Desarrollo de aplicaciones de SQL incorporado
![Page 117: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/117.jpg)
class STAFF
{
private:
EXEC SQL BEGIN DECLARE SECTION;
char staff_name[20];
short int staff_id;
double staff_salary;
EXEC SQL END DECLARE SECTION;
short staff_in_db;
.
.
};
A los miembros de datos sólo se puede acceder directamente en sentencias de SQL
mediante el puntero this implícito proporcionado por el compilador C++ en las
funciones de miembros de clases. No se puede calificar explícitamente una
instancia de un objeto (como, por ejemplo, SELECT name INTO :my_obj.staff_name
...) en una sentencia de SQL.
Si se hace una referencia directa a miembros de datos de clase en sentencias de
SQL, el gestor de bases de datos resuelve la referencia utilizando el puntero this.
Por este motivo, debe dejar la opción de precompilación del nivel de optimización
(OPTLEVEL) en su valor por omisión, que es 0 (sin optimización).
El ejemplo siguiente muestra cómo se pueden utilizar directamente los miembros
de datos de clase que ha declarado como variables del lenguaje principal en una
sentencia de SQL.
class STAFF
{
... public:
... short int hire( void )
{
EXEC SQL INSERT INTO staff ( name,id,salary )
VALUES ( :staff_name, :staff_id, :staff_salary );
staff_in_db = (sqlca.sqlcode == 0);
return sqlca.sqlcode;
}
};
En este ejemplo, los miembros de datos de clase staff_name, staff_id y
staff_salary se utilizan directamente en la sentencia INSERT. Puesto que se han
declarado como variables del lenguaje principal (consulte el primer ejemplo de esta
sección), están calificados de forma implícita para el objeto actual con el puntero
this. En sentencias de SQL también se puede hacer referencia a miembros de datos
a los que no se pueda acceder mediante el puntero this. Esto se logra haciendo una
referencia indirecta a ellos mediante variables del lenguaje principal de puntero o
de referencia.
El ejemplo siguiente muestra un nuevo método, asWellPaidAs, que toma un
segundo objeto, otherGuy. Este método hace referencia a sus miembros
indirectamente, mediante una variable del lenguaje principal de puntero local o de
referencia, puesto que no se puede hacer una referencia directa a sus miembros
dentro de la sentencia de SQL.
Capítulo 3. Programación de aplicaciones de SQL incorporado 109
![Page 118: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/118.jpg)
short int STAFF::asWellPaidAs( STAFF otherGuy )
{
EXEC SQL BEGIN DECLARE SECTION;
short &otherID = otherGuy.staff_id
double otherSalary;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT SALARY INTO :otherSalary
FROM STAFF WHERE id = :otherID;
if( sqlca.sqlcode == 0 )
return staff_salary >= otherSalary;
else
return 0;
}
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
Información relacionada:
v “Tipos de datos para procedimientos, funciones y métodos en aplicaciones de
SQL incorporado C y C++” en la página 65
v “Sentencia INSERT” en Consulta de SQL, Volumen 2
Resolución de ámbito y operaciones de miembro de clase en
aplicaciones de SQL incorporado C y C++
No puede utilizar el operador de resolución de ámbito de C++ '::', ni los operadores
de miembro de C y C++ '.' ni '->' en sentencias de SQL incorporado. Se puede
lograr fácilmente lo mismo mediante el uso de variables de puntero o de referencia
locales, que se establecen fuera de la sentencia de SQL, de forma que apunten a la
variable de ámbito que se desee y luego se utilizan dentro de la sentencia de SQL
para hacer referencia a ésta. El ejemplo siguiente muestra el método correcto a
utilizar:
EXEC SQL BEGIN DECLARE SECTION;
char (& localName)[20] = ::name;
EXEC SQL END DECLARE SECTION;
EXEC SQL
SELECT name INTO :localName FROM STAFF
WHERE name = ’Sanders’;
Conceptos relacionados:
v “Declaración de variables del lenguaje principal como punteros en aplicaciones
de SQL incorporado C y C++” en la página 107
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo referencia de archivos en
aplicaciones de SQL incorporado C y C++” en la página 106
Consideraciones sobre EUC en japonés o chino tradicional y
UCS-2 en aplicaciones de SQL incorporado C y C++
Si la página de códigos de la aplicación es EUC en japonés o chino tradicional, o si
la aplicación conecta con una base de datos UCS-2, puede acceder a columnas
GRAPHIC del servidor de bases de datos utilizando las opciones CONVERT o
NOCONVERT y las variables del lenguaje principal de gráficos wchar_t o
sqldbchar, o las SQLDA de entrada/salida. En este apartado, formato DBCS hace
referencia al esquema de codificación de UCS-2 para datos EUC. Considere los
casos siguientes:
110 Desarrollo de aplicaciones de SQL incorporado
![Page 119: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/119.jpg)
v Se utiliza la opción CONVERT
El cliente DB2 convierte los datos gráficos del formato de caracteres amplios a la
página de códigos de la aplicación, y luego a UCS-2, antes de enviar la SQLDA
de entrada al servidor de bases de datos. Los datos gráficos se envían al
servidor de bases de datos identificados por el identificador de página de
códigos de UCS-2. Los datos de tipo carácter mixtos se identifican con el
identificador de página de códigos de la aplicación. Cuando un cliente recupera
datos gráficos de una base de datos, éstos se identifican con el identificador de
página de códigos de UCS-2. El cliente DB2 convierte los datos de UCS-2 a la
página de códigos de la aplicación cliente y luego al formato de caracteres
amplios. Si se utiliza una SQLDA de entrada en lugar de una variable del
lenguaje principal, se requiere al usuario que se asegure de que los datos
gráficos se han codificado utilizando el formato de caracteres amplios. Estos
datos se convertirán a UCS-2 y luego se enviarán al servidor de bases de datos.
Estas conversiones tendrán impacto en el rendimiento.
v Se utiliza la opción NOCONVERT
DB2 supone que los datos se han codificado utilizando UCS-2 y están
identificados por la página de códigos de UCS-2, y no se produce ninguna
conversión. DB2 supone que la variable del lenguaje principal de gráficos se
utiliza simplemente como contenedor. Si no se selecciona la opción
NOCONVERT, los datos gráficos recuperados del servidor de bases de datos se
pasan a la aplicación codificados mediante UCS-2. Las posibles conversiones de
la página de códigos de la aplicación a UCS-2 y de UCS-2 a la página de códigos
de la aplicación son responsabilidad del usuario. Los datos identificados como
UCS-2 se envían al servidor de bases de datos sin que se produzca ninguna
conversión ni alteración.
Para minimizar las conversiones, puede utilizar la opción NOCONVERT y manejar
las conversiones en la aplicación, o bien no utilizar columnas GRAPHIC. Para los
entornos de cliente en que la codificación wchar_t es en Unicode de dos bytes, por
ejemplo en Windows 2000 o AIX versión 5.1 y posteriores, puede utilizar la opción
NOCONVERT y trabajar directamente con UCS-2. En estos casos, la aplicación
debe manejar la diferencia entre las arquitecturas big-endian y little-endian. Con la
opción NOCONVERT, los sistemas de bases de datos DB2 utilizan sqldbchar, que
es siempre un big-endian de dos bytes.
No asigne datos IBM-eucJP/IBM-eucTW CS0 (ASCII de 7 bits) e IBM-eucJP CS2
(Katakana) a variables gráficas de lenguaje principal después de una conversión a
UCS-2 (si se especifica NOCONVERT) ni mediante una conversión al formato de
caracteres amplios (si se especifica CONVERT). Esto es así porque los caracteres de
estos juegos de códigos EUC pasan a tener un solo byte cuando se convierten de
UCS-2 a DBCS de PC.
En general, aunque eucJP y eucTW almacenan los datos gráficos (GRAPHIC) como
UCS-2, los datos GRAPHIC contenidos en estas bases de datos siguen siendo datos
eucJP o eucTW no ASCII. Concretamente, cualquier espacio rellenado en estos
datos GRAPHIC es espacio DBCS (también conocido como espacio ideográfico en
UCS-2, U+3000). Sin embargo, para una base de datos UCS-2, los datos GRAPHIC
pueden contener cualquier carácter UCS-2 y el relleno del espacio se realiza con
espacio UCS-2, U+0020. Tenga presente esta diferencia cuando codifique
aplicaciones para recuperar datos UCS-2 de una base de datos UCS-2, en
comparación con la recuperación de datos UCS-2 de bases de datos eucJP y eucTW.
Conceptos relacionados:
Capítulo 3. Programación de aplicaciones de SQL incorporado 111
![Page 120: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/120.jpg)
v “Consideraciones sobre el juego de códigos EUC y UCS-2 japonés y chino
tradicional” en Desarrollo de SQL y rutinas externas
v “Declaración de variables de tipo graphic del lenguaje principal en aplicaciones
de SQL incorporado C y C++” en la página 96
v “Tipos de datos wchar_t y sqldbchar para datos gráficos en aplicaciones de SQL
incorporado C y C++” en la página 97
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
Tareas relacionadas:
v “Transferencia de datos en un programa de SQL ejecutado dinámicamente
utilizando una estructura SQLDA” en la página 163
Almacenamiento binario de valores de variables mediante la
cláusula FOR BIT DATA en aplicaciones de SQL incorporado C y
C++
No se debe utilizar el tipo de serie estándar de C o C++, 460, para las columnas
designadas como FOR BIT DATA. El gestor de bases de datos trunca este tipo de
datos cuando se encuentra un carácter nulo. Utilice las estructuras VARCHAR (tipo
de SQL 448) o CLOB (tipo de SQL 408).
Conceptos relacionados:
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado C y C++” en la página 90
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
Inicialización de variables del lenguaje principal en aplicaciones
de SQL incorporado C y C++
En las secciones declare de C y C++, puede declarar e inicializar varias variables
en una sola línea. Sin embargo, las variables se deben inicializar utilizando el
símbolo ″=″, no mediante paréntesis. El ejemplo siguiente muestra los métodos
correcto e incorrecto de inicialización en una sección de declaración:
EXEC SQL BEGIN DECLARE SECTION;
short my_short_2 = 5; /* correcto */
short my_short_1(5); /* incorrecto */
EXEC SQL END DECLARE SECTION;
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
Expansión de macros y DECLARE SECTION de aplicaciones de
SQL incorporado C y C++
El precompilador C o C++ no puede procesar directamente ninguna macro de C
utilizada en una declaración dentro de una sección de declaración. En lugar de
esto, en primer lugar se debe preprocesar el archivo fuente mediante un
112 Desarrollo de aplicaciones de SQL incorporado
![Page 121: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/121.jpg)
preprocesador de C externo. Para ello, especifique el mandato exacto para invocar
un preprocesador de C para el precompilador mediante la opción
PREPROCESSOR.
Cuando se especifica la opción PREPROCESSOR, el precompilador procesa en
primer lugar todas las sentencias de SQL INCLUDE, incorporando al archivo
fuente el contenido de todos los archivos a los que se hace referencia en la
sentencia de SQL INCLUDE. A continuación, el precompilador invoca al
preprocesador de C externo, utilizando el mandato que se especifique con el
archivo fuente modificado como entrada. El archivo preprocesado, del cual el
precompilador siempre espera que tenga la extensión .i, se utiliza como el nuevo
archivo fuente para el resto del proceso de precompilación.
Cualquier macro #line generada por el precompilador deja de hacer referencia al
archivo fuente original, pasando a hacerla al archivo preprocesado. Para relacionar
los errores del compilador con el archivo fuente original, mantenga comentarios en
el archivo preprocesado. Le serán de ayuda para localizar diversas secciones de los
archivos fuente originales, incluidos los archivos de cabecera. La opción para
mantener comentarios suele estar disponible en los preprocesadores C y la puede
incluir en el mandato que especifique mediante la opción PREPROCESSOR. No
debe hacer que el preprocesador de C produzca por sí mismo como salida ninguna
macro #line, puesto que se podrían mezclar incorrectamente con las generadas por
el precompilador.
Notas sobre la utilización de la expansión de macros:
1. El mandato que especifique mediante la opción PREPROCESSOR debe incluir
todas las opciones deseadas, pero no el nombre del archivo de entrada. Por
ejemplo, para IBM C en AIX, puede utilizar la opción:
xlC -P -DMYMACRO=1
2. El precompilador espera que el mandato genere un archivo preprocesado con la
extensión .i. Sin embargo, no se puede utilizar la redirección para generar el
archivo preprocesado. Por ejemplo, no se puede utilizar la opción siguiente
para generar un archivo preprocesado:
xlC -E > x.i
3. Los errores que encuentre el preprocesador de C externo se notifican en un
archivo que tiene el nombre correspondiente al archivo fuente original pero con
la extensión .err.
Por ejemplo, puede utilizar la expansión de macros en el código fuente tal como se
indica a continuación:
#define SIZE 3
EXEC SQL BEGIN DECLARE SECTION;
char a[SIZE+1];
char b[(SIZE+1)*3];
struct
{
short length;
char data[SIZE*6];
} m;
SQL TYPE IS BLOB(SIZE+1) x;
SQL TYPE IS CLOB((SIZE+2)*3) y;
SQL TYPE IS DBCLOB(SIZE*2K) z;
EXEC SQL END DECLARE SECTION;
Las declaraciones anteriores se resuelven de la manera siguiente después de
utilizar la opción PREPROCESSOR:
Capítulo 3. Programación de aplicaciones de SQL incorporado 113
![Page 122: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/122.jpg)
EXEC SQL BEGIN DECLARE SECTION;
char a[4];
char b[12];
struct
{
short length;
char data[18];
} m;
SQL TYPE IS BLOB(4) x;
SQL TYPE IS CLOB(15) y;
SQL TYPE IS DBCLOB(6144) z;
EXEC SQL END DECLARE SECTION;
Conceptos relacionados:
v “Programas de utilidad de comprobación de errores” en la página 223
Información relacionada:
v “Archivos include para aplicaciones de SQL incorporado C y C++” en la página
48
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
Soporte de estructuras del lenguaje principal en la sección de
declaración de aplicaciones de SQL incorporado C y C++
Con el soporte de estructuras del lenguaje principal, el precompilador C o C++
permite agrupar las variables del lenguaje principal en una sola estructura del
lenguaje principal. Esta función brinda una nota taquigráfica para hacer referencia
a ese mismo conjunto de variables del lenguaje principal en una sentencia de SQL.
Por ejemplo, se puede utilizar la siguiente estructura del lenguaje principal para
acceder a algunas de las columnas de la tabla STAFF de la base de datos SAMPLE:
struct tag
{
short id;
struct
{
short length;
char data[10];
} name;
struct
{
short years;
double salary;
} info;
} staff_record;
Los campos de una estructura del lenguaje principal pueden ser de cualquiera de
los tipos de variable del lenguaje principal válidos. Los tipos válidos incluyen
todos los tipos numéricos, de carácter y de objetos grande. También se soportan
estructuras del lenguaje principal anidadas hasta 25 niveles. En el ejemplo anterior,
el campo info es una subestructura, mientras que el campo name no lo es, puesto
que representa un campo VARCHAR. Se aplica el mismo principio a LONG
VARCHAR, VARGRAPHIC y LONG VARGRAPHIC. Asimismo, se soportan
punteros a las estructuras del lenguaje principal.
Existen dos maneras de hacer referencia a las variables del lenguaje principal
agrupadas en una estructura del lenguaje principal en una sentencia de SQL:
v Se puede hacer referencia al nombre de la estructura del lenguaje principal en
una sentencia de SQL.
114 Desarrollo de aplicaciones de SQL incorporado
![Page 123: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/123.jpg)
EXEC SQL SELECT id, name, years, salary
INTO :staff_record
FROM staff
WHERE id = 10;
El precompilador convierte la referencia a staff_record en una lista de todos los
campos declarados en la estructura del lenguaje principal, separados por comas.
Cada campo se califica con los nombres de estructura del lenguaje principal de
todos los niveles, a fin de evitar conflictos de denominación con otras variables
del lenguaje principal o campos. Esto es equivalente al método siguiente.
v Se puede hacer referencia a nombres de estructuras del lenguaje principal
completamente calificadas en una sentencia de SQL.
EXEC SQL SELECT id, name, years, salary
INTO :staff_record.id, :staff_record.name,
:staff_record.info.years, :staff_record.info.salary
FROM staff
WHERE id = 10;
Las referencias a nombres de campos se deben calificar por completo aunque no
existan otras variables del lenguaje principal que tengan el mismo nombre.
También se puede hacer referencia a subestructuras calificadas. En el ejemplo
anterior, se puede utilizar :staff_record.info para sustituir a
:staff_record.info.years, :staff_record.info.salary.
Puesto que una referencia a una estructura del lenguaje principal (primer ejemplo)
es equivalente a una lista de sus campos, separados por comas, existen casos en
que este tipo de referencia puede conducir a un error. Por ejemplo:
EXEC SQL DELETE FROM :staff_record;
Aquí, la sentencia DELETE espera una sola variable del lenguaje principal basada
en caracteres. Si en su lugar se proporciona una estructura del lenguaje principal,
la sentencia tiene como resultado un error durante la precompilación:
SQL0087N La variable del lenguaje principal "staff_record" es una estructura
que se utiliza donde no se permiten referencias a estructuras.
Otros usos de las estructuras del lenguaje principal que pueden ocasionar que se
produzca un error SQL0087N incluyen: PREPARE, EXECUTE IMMEDIATE, CALL,
variables de indicador y referencias a SQLDA. Las estructuras del lenguaje
principal que tengan exactamente un campo están permitidas en estas situaciones,
puesto que constituyen referencias a campos individuales (segundo ejemplo).
Conceptos relacionados:
v “Variables de indicador de nulo o de truncamiento y tablas de indicadores en
aplicaciones de SQL incorporado C y C++” en la página 116
v “Declaración de variables de tipo graphic del lenguaje principal en aplicaciones
de SQL incorporado C y C++” en la página 96
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado C y C++” en la página 103
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado C y C++” en la página 92
Capítulo 3. Programación de aplicaciones de SQL incorporado 115
![Page 124: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/124.jpg)
Variables de indicador de nulo o de truncamiento y tablas de
indicadores en aplicaciones de SQL incorporado C y C++
Para cada variable del lenguaje principal que pueda recibir valores nulos, declare
variables de indicador como un tipo de datos short.
Una tabla de indicadores es un conjunto de variables de indicador que se
utilizarán con una estructura del lenguaje principal. Se debe declarar como matriz
de enteros cortos. Por ejemplo:
short ind_tab[10];
El ejemplo anterior declara una tabla de indicadores con 10 elementos. El siguiente
ejemplo muestra la manera en que se puede utilizar en una sentencia de SQL:
EXEC SQL SELECT id, name, years, salary
INTO :staff_record INDICATOR :ind_tab
FROM staff
WHERE id = 10;
A continuación se lista cada campo de la estructura del lenguaje principal con la
variable de indicador correspondiente en la tabla:
staff_record.id ind_tab[0]
staff_record.name ind_tab[1]
staff_record.info.years ind_tab[2]
staff_record.info.salary ind_tab[3]
Nota: En una sentencia de SQL no se puede hacer referencia, de forma individual,
a un elemento de una tabla de indicadores, por ejemplo ind_tab[1]. La
palabra clave INDICATOR es opcional. No es necesario que el número de
campos de estructura y de indicadores coincida; los indicadores de más no
se utilizan ni tampoco los campos de más que no tienen indicadores
asignados.
En lugar de una tabla de indicadores, también se puede utilizar una variable de
indicador escalar para proporcionar un indicador para el primer campo de la
estructura del lenguaje principal. Esto equivale a tener una tabla de indicadores
con un solo elemento. Por ejemplo:
short scalar_ind;
EXEC SQL SELECT id, name, years, salary
INTO :staff_record INDICATOR :scalar_ind
FROM staff
WHERE id = 10;
Si se especifica una tabla de indicadores junto con una variable del lenguaje
principal en lugar de una estructura del lenguaje principal, sólo se utilizará el
primer elemento de la tabla de indicadores, por ejemplo ind_tab[0]:
EXEC SQL SELECT id
INTO :staff_record.id INDICATOR :ind_tab
FROM staff
WHERE id = 10;
Si se declara una matriz de enteros cortos en una estructura del lenguaje principal:
116 Desarrollo de aplicaciones de SQL incorporado
![Page 125: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/125.jpg)
struct tag
{
short i[2];
} test_record;
La matriz se expandirá en sus elementos cuando se haga referencia a test_record
en una sentencia de SQL, haciendo que :test_record sea equivalente a
:test_record.i[0], :test_record.i[1].
Conceptos relacionados:
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado C y C++” en la página 114
v “Variables del lenguaje principal en aplicaciones de SQL incorporado C y C++”
en la página 86
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 89
v “Inicialización de variables del lenguaje principal en aplicaciones de SQL
incorporado C y C++” en la página 112
Series terminadas en nulo en aplicaciones de SQL incorporado
C y C++
Las series terminadas en nulo de C y C++ tienen su propio SQLTYPE (460/461
para caracteres y 468/469 para gráficos).
Las series terminadas en nulo de C y C++ se manejan de forma distinta en función
del valor de la opción LANGLEVEL del precompilador. Si se especifica una
variable del lenguaje principal con uno de estos valores SQLTYPE y la longitud
declarada n dentro de una sentencia de SQL y el número de bytes de datos (para
tipos de carácter) o de caracteres de doble byte (para tipos gráficos) es k, sucede lo
siguiente:
v Si la opción LANGLEVEL del mandato PREP es SAA1 (valor por omisión):
Para la salida:
Si... Sucede que...
k > n Se mueven n caracteres a la variable del lenguaje
principal de destino, SQLWARN1 se establece en
'W' y SQLCODE es 0 (SQLSTATE 01004). No se
coloca ningún terminador nulo en la serie. Si se
ha especificado una variable de indicador con la
variable del lenguaje principal, el valor de la
variable de indicador se establece en k.
k = n Se mueven k caracteres a la variable del lenguaje
principal de destino, SQLWARN1 se establece en
'N' y SQLCODE es 0 (SQLSTATE 01004). No se
coloca ningún terminador nulo en la serie. Si se
ha especificado una variable de indicador con la
variable del lenguaje principal, el valor de la
variable de indicador se establece en 0.
k < n Se mueven k caracteres a la variable del lenguaje
principal de destino y se coloca un carácter nulo
en el carácter k + 1. Si se ha especificado una
Capítulo 3. Programación de aplicaciones de SQL incorporado 117
![Page 126: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/126.jpg)
variable de indicador con la variable del lenguaje
principal, el valor de la variable de indicador se
establece en 0.
Para entrada: Cuando el gestor de bases de datos encuentre una variable del
lenguaje principal de entrada que tiene uno de estos valores
SQLTYPE y no finaliza por un terminador nulo, supondrá que el
carácter n+1 contendrá el carácter terminador nulo.v Si la opción LANGLEVEL del mandato PREP es MIA:
Para salida:
Si... Sucede que...
k >= n Se mueven n - 1 caracteres a la variable del
lenguaje principal de destino, SQLWARN1 se
establece en 'W' y SQLCODE es 0 (SQLSTATE
01004). El carácter número n se establece como
terminador nulo. Si se ha especificado una
variable de indicador con la variable del lenguaje
principal, el valor de la variable de indicador se
establece en k.
k + 1 = n Se mueven k caracteres a la variable del lenguaje
principal de destino y se coloca el terminador
nulo en el carácter n. Si se ha especificado una
variable de indicador con la variable del lenguaje
principal, el valor de la variable de indicador se
establece en 0.
k + 1 < n Se mueven k caracteres a la variable del lenguaje
principal de destino, se añaden n - k -1 blancos a
la derecha, a partir del carácter k + 1, y luego se
coloca el terminador nulo en el carácter n. Si se
ha especificado una variable de indicador con la
variable del lenguaje principal, el valor de la
variable de indicador se establece en 0.
Para entrada: Cuando el gestor de bases de datos encuentre una variable del
lenguaje principal de entrada que tenga uno de estos valores
SQLTYPE y no finalice por un carácter nulo, se devolverá
SQLCODE -302 (SQLSTATE 22501).
Si se especifica en cualquier otro contexto de SQL, una variable del lenguaje
principal con SQLTYPE 460 y longitud n se trata como el tipo de datos VARCHAR
con longitud n, tal como se ha definido anteriormente. Si se especifica en cualquier
otro contexto de SQL, una variable del lenguaje principal con SQLTYPE 468 y
longitud n se trata como el tipo de datos VARGRAPHIC con longitud n, tal como
se ha definido anteriormente.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones C y C++” en la página 5
Tareas relacionadas:
v “Declaración de la SQLCA para el manejo de errores” en la página 56
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
118 Desarrollo de aplicaciones de SQL incorporado
![Page 127: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/127.jpg)
Variables del lenguaje principal en COBOL
Variables del lenguaje principal en COBOL
Las variables del lenguaje principal son variables del lenguaje COBOL a las que se
hace referencia en las sentencias de SQL. Permiten a una aplicación intercambiar
datos con el gestor de bases de datos. Una vez que se ha precompilado la
aplicación, el compilador utiliza las variables del lenguaje principal como cualquier
otra variable de COBOL. Cuando denomine, declare y utilice variables del lenguaje
principal, siga las normas descritas en los apartados siguientes.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado COBOL” en la página 120
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
Nombres de variables del lenguaje principal en COBOL
El precompilador SQL identifica las variables del lenguaje principal por el nombre
declarado para éstas. Se aplican las normas siguientes:
v Especifique nombres de variables con una longitud máxima de 255 caracteres.
v Empiece los nombres de variables con prefijos que no sean SQL, sql, DB2 ni db2,
que están reservados para uso del sistema.
v Los elementos FILLER que utilizan las sintaxis de declaración descritas a
continuación están permitidos en las declaraciones de variables del lenguaje
principal de grupos y el precompilador los pasará por alto. Sin embargo, si se
utiliza FILLER más de una vez dentro de una sección DECLARE de SQL, el
precompilador fallará. No se pueden incluir elementos FILLER en declaraciones
VARCHAR, LONG VARCHAR, VARGRAPHIC ni LONG VARGRAPHIC.
v Puede utilizar guiones en los nombres de variables del lenguaje principal.
SQL interpreta un guión encerrado entre espacios como un operador de resta.
Utilice guiones sin espacios en los nombres de variables del lenguaje principal.
v La cláusula REDEFINES está permitida en las declaraciones de variables del
lenguaje principal.
v Las declaraciones de nivel 88 están permitidas en la sección de declaración de
variables del lenguaje principal, pero se pasan por alto.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
Información relacionada:
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado COBOL” en la página 128
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
123
v “Declaración de variables del lenguaje principal de tipo graphic de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
125
Capítulo 3. Programación de aplicaciones de SQL incorporado 119
![Page 128: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/128.jpg)
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado COBOL” en la página 126
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado COBOL” en la
página 127
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado COBOL” en la página 122
Sección declare para variables del lenguaje principal en
aplicaciones de SQL incorporado COBOL
Se debe utilizar una sección de declaración de SQL para identificar las
declaraciones de variables del lenguaje principal. Esta sección alerta al
precompilador acerca de las variables del lenguaje principal a las que se puede
hacer referencia en sentencias de SQL posteriores. Por ejemplo:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
77 dept pic s9(4) comp-5.
01 userid pic x(8).
01 passwd.
EXEC SQL END DECLARE SECTION END-EXEC.
El precompilador COBOL sólo reconoce un subconjunto de las declaraciones
válidas de COBOL.
Tareas relacionadas:
v “Declaración de variables del lenguaje principal de tipo estructurado” en
Desarrollo de SQL y rutinas externas
Información relacionada:
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado COBOL” en la página 128
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
123
v “Declaración de variables del lenguaje principal de tipo graphic de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
125
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado COBOL” en la página 126
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado COBOL” en la
página 127
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado COBOL” en la página 122
Ejemplo: Plantilla de sección declare de SQL para aplicaciones
de SQL incorporado COBOL
A continuación se muestra un ejemplo de sección de declaración de SQL con una
variable del lenguaje principal declarada para los tipos de datos SQL soportados.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
*
01 age PIC S9(4) COMP-5. /* SQL tipo 500 */
01 divis PIC S9(9) COMP-5. /* SQL tipo 496 */
01 salary PIC S9(6)V9(3) COMP-3. /* SQL tipo 484 */
120 Desarrollo de aplicaciones de SQL incorporado
![Page 129: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/129.jpg)
01 bonus USAGE IS COMP-1. /* SQL tipo 480 */
01 wage USAGE IS COMP-2. /* SQL tipo 480 */
01 nm PIC X(5). /* SQL tipo 452 */
01 varchar.
49 leng PIC S9(4) COMP-5. /* SQL tipo 448 */
49 strg PIC X(14). /* SQL tipo 448 */
01 longvchar.
49 len PIC S9(4) COMP-5. /* SQL tipo 456 */
49 str PIC X(6027). /* SQL tipo 456 */
01 MY-CLOB USAGE IS SQL TYPE IS CLOB(1M). /* SQL tipo 408 */
01 MY-CLOB-LOCATOR USAGE IS SQL TYPE IS CLOB-LOCATOR. /* SQL tipo 964 */
01 MY-CLOB-FILE USAGE IS SQL TYPE IS CLOB-FILE. /* SQL tipo 920 */
01 MY-BLOB USAGE IS SQL TYPE IS BLOB(1M). /* SQL tipo 404 */
01 MY-BLOB-LOCATOR USAGE IS SQL TYPE IS BLOB-LOCATOR. /* SQL tipo 960 */
01 MY-BLOB-FILE USAGE IS SQL TYPE IS BLOB-FILE. /* SQL tipo 916 */
01 MY-DBCLOB USAGE IS SQL TYPE IS DBCLOB(1M). /* SQL tipo 412 */
01 MY-DBCLOB-LOCATOR USAGE IS SQL TYPE IS DBCLOB-LOCATOR. /* SQL tipo 968 */
01 MY-DBCLOB-FILE USAGE IS SQL TYPE IS DBCLOB-FILE. /* SQL tipo 924 */
01 MY-PICTURE PIC G(16000) USAGE IS DISPLAY-1. /* SQL tipo 464 */
01 dt PIC X(10). /* SQL tipo 384 */
01 tm PIC X(8). /* SQL tipo 388 */
01 tmstmp PIC X(26). /* SQL tipo 392 */
01 wage-ind PIC S9(4) COMP-5. /* SQL tipo 464 */
*
EXEC SQL END DECLARE SECTION END-EXEC.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
Tipos de datos BINARY/COMP-4 en aplicaciones de SQL
incorporado COBOL
El precompilador COBOL de DB2 da soporte al uso de los tipos de datos BINARY,
COMP y COMP-4 dondequiera que estén permitidas las variables del lenguaje
principal y los indicadores, siempre que el compilador COBOL de destino vea (o se
pueda hacer que vea) los tipos de datos BINARY, COMP o COMP-4 como
equivalentes al tipo de datos COMP-5. En los ejemplos proporcionados, estas
variables del lenguaje principal e indicadores se muestran con el tipo COMP-5. Los
compiladores de destino soportados por DB2 que tratan COMP, COMP-4, BINARY
COMP y COMP-5 como equivalentes son:
v IBM COBOL Set para AIX
v Micro Focus COBOL para AIX
Conceptos relacionados:
v “Tablas de variables de indicador de nulo y de indicador de nulo o de
truncamiento en aplicaciones de SQL incorporado COBOL” en la página 132
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Variables del lenguaje principal en COBOL” en la página 119
Capítulo 3. Programación de aplicaciones de SQL incorporado 121
![Page 130: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/130.jpg)
Variables SQLSTATE y SQLCODE en aplicaciones de SQL
incorporado COBOL
Cuando se utiliza la opción de precompilación LANGLEVEL con el valor SQL92E,
se pueden incluir las dos declaraciones siguientes como variables del lenguaje
principal:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 SQLSTATE PIC X(5).
01 SQLCODE PIC S9(9) USAGE COMP.
.
.
.
EXEC SQL END DECLARE SECTION END-EXEC.
Si no se especifica ninguna de ellas, se supone la declaración SQLCODE durante el
paso de precompilación. Las variables SQLCODE y SQLSTATE se pueden declarar
utilizando el nivel 01 (como se ha mostrado anteriormente) o el nivel 77. Observe
que, si se utiliza esta opción, no se debe especificar la sentencia INCLUDE SQLCA.
Para las aplicaciones formadas por varios archivos fuente, las declaraciones
SQLCODE y SQLSTATE se pueden incluir en cada uno de los archivos fuente, tal
como en el ejemplo anterior.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
v “Variables del lenguaje principal en COBOL” en la página 119
Declaración de variables numéricas del lenguaje principal en
aplicaciones de SQL incorporado COBOL
A continuación se muestra la sintaxis de las variables numéricas del lenguaje
principal.
��
01
77
nombre-variable
PICTURE
PIC
IS
serie-imagen
�
� (1)
COMP-3
IS
COMPUTATIONAL-3
USAGE
COMP-5
COMPUTATIONAL-5
.
IS
VALUE
valor
��
Notas:
1 Una alternativa de COMP-3 es PACKED-DECIMAL.
Coma flotante
122 Desarrollo de aplicaciones de SQL incorporado
![Page 131: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/131.jpg)
��
01
77
nombre-variable
IS
USAGE
(1)
COMPUTATIONAL-1
COMP-1
(2)
COMPUTATIONAL-2
COMP-2
�
� IS
VALUE
valor
. ��
Notas:
1 REAL (SQLTYPE 480), Longitud 4
2 DOUBLE (SQLTYPE 480), Longitud 8
Consideraciones sobre las variables numéricas del lenguaje principal:
1. Serie-imagen debe tener uno de los formatos siguientes:
v S9(m)V9(n)
v S9(m)V
v S9(m)2. Los nueves se pueden expandir (por ejemplo, ″S999″ en lugar de S9(3)″)
3. m y n deben ser enteros positivos.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado COBOL” en la página 130
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
Declaración de variables del lenguaje principal de tipo carácter
de longitud fija y longitud variable en aplicaciones de SQL
incorporado COBOL
A continuación se muestra la sintaxis de las variables de tipo carácter del lenguaje
principal.
Longitud fija
��
01
77
nombre-variable
PICTURE
PIC
IS
serie-imagen
�
� IS
VALUE
valor
. ��
Longitud variable
�� 01 nombre-variable . ��
Capítulo 3. Programación de aplicaciones de SQL incorporado 123
![Page 132: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/132.jpg)
��
49
identificador-1
PICTURE
PIC
IS
S9(4)
�
� COMP-5
IS
COMPUTATIONAL-5
USAGE
IS
VALUE
valor
. ��
��
49
identificador-2
PICTURE
PIC
IS
serie-imagen
�
� IS
VALUE
valor
. ��
Consideración sobre las variables del lenguaje principal de tipo carácter:
1. Serie-imagen debe tener el formato X(m). Como alternativa, se pueden expandir
las X (por ejemplo, ″XXX″ en lugar de ″X(3)″).
2. m va de 1 a 254 para las series de longitud fija.
3. m va de 1 a 32 700 para las series de longitud variable.
4. Si m es mayor que 32 672, la variable del lenguaje principal se tratará como una
serie LONG VARCHAR y su uso puede estar restringido.
5. Utilice X y 9 como caracteres de imagen en cualquier cláusula PICTURE. No
están permitidos otros caracteres.
6. Las series de longitud variable constan de un elemento de longitud y un
elemento de valor. Puede utilizar nombres aceptables de COBOL para el
elemento de longitud y para el elemento de serie. No obstante, haga referencia
a las series de longitud variable por el nombres colectivo en las sentencias de
SQL.
7. En una sentencia CONNECT, como por ejemplo la que se muestra a
continuación, a las variables del lenguaje principal de serie de caracteres en
COBOL dbname y userid se les eliminarán los blancos de cola antes del proceso:
EXEC SQL CONNECT TO :dbname USER :userid USING :p-word
END-EXEC.
Sin embargo, y puesto que los espacios en blanco pueden ser significativos en
las contraseñas, la variable del lenguaje principal p-word se debe declarar como
un elemento de datos VARCHAR, de forma que la aplicación pueda indicar
explícitamente la longitud significativa de la contraseña para la sentencia
CONNECT, del modo siguiente:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 dbname PIC X(8).
01 userid PIC X(8).
01 p-word.
49 L PIC S9(4) COMP-5.
49 D PIC X(18).
EXEC SQL END DECLARE SECTION END-EXEC.
PROCEDURE DIVISION.
MOVE "sample" TO dbname.
MOVE "userid" TO userid.
124 Desarrollo de aplicaciones de SQL incorporado
![Page 133: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/133.jpg)
MOVE "password" TO D OF p-word.
MOVE 8 TO L of p-word.
EXEC SQL CONNECT TO :dbname USER :userid USING :p-word
END-EXEC.
Conceptos relacionados:
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
Información relacionada:
v “Sentencia CONNECT (Tipo 1)” en Consulta de SQL, Volumen 2
Declaración de variables del lenguaje principal de tipo graphic
de longitud fija y longitud variable en aplicaciones de SQL
incorporado COBOL
A continuación se muestra la sintaxis de las variables de tipo graphic del lenguaje
principal.
Longitud fija
��
01
77
nombre-variable
PICTURE
PIC
IS
serie-imagen
USAGE
�
� IS
DISPLAY-1
IS
VALUE
valor
.
��
Longitud variable
�� 01 nombre-variable . ��
��
49
identificador-1
PICTURE
PIC
IS
S9(4)
�
� COMP-5
IS
COMPUTATIONAL-5
USAGE
IS
VALUE
valor
. ��
��
49
identificador-2
PICTURE
PIC
IS
serie-imagen
USAGE
�
Capítulo 3. Programación de aplicaciones de SQL incorporado 125
![Page 134: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/134.jpg)
� IS
DISPLAY-1
IS
VALUE
valor
.
��
Consideraciones sobre las variables gráficas del lenguaje principal:
1. Serie-imagen debe tener el formato G(m). Como alternativa, se pueden expandir
las G (por ejemplo, ″GGG″ en lugar de ″G(3)″).
2. m va de 1 a 127 para las series de longitud fija.
3. m va de 1 a 16 350 para las series de longitud variable.
4. Si m es mayor que 16 336, la variable del lenguaje principal se tratará como una
serie LONG VARGRAPHIC y su uso puede estar restringido.
Conceptos relacionados:
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado COBOL” en la página 120
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
Declaración de variables del lenguaje principal de tipo objeto
grande (large object) en aplicaciones de SQL incorporado
COBOL
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de objeto grande (LOB) en COBOL.
�� 01 nombre-variable
USAGE
IS
SQL TYPE IS BLOB
CLOB
DBCLOB
�
� ( longitud ) .
K
M
G
��
Consideraciones sobre variables del lenguaje principal de tipo LOB:
1. Para BLOB y CLOB 1 <= longitud-lob <= 2 147 483 647.
2. Para DBCLOB 1 <= longitud-lob <= 1 073 741 823.
3. SQL TYPE IS, BLOB, CLOB, DBCLOB, K, M, G se pueden especificar en
mayúsculas, en minúsculas o en una mezcla de ambas.
4. No se permite la inicialización dentro de la declaración LOB.
5. El nombre de la variable del lenguaje principal es el prefijo de LENGTH y
DATA en el código generado por el precompilador.
Ejemplo de BLOB:
La declaración:
01 MY-BLOB USAGE IS SQL TYPE IS BLOB(2M).
Tiene como resultado la generación de la estructura siguiente:
126 Desarrollo de aplicaciones de SQL incorporado
![Page 135: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/135.jpg)
01 MY-BLOB.
49 MY-BLOB-LENGTH PIC S9(9) COMP-5.
49 MY-BLOB-DATA PIC X(2097152).
Ejemplo de CLOB:
La declaración:
01 MY-CLOB USAGE IS SQL TYPE IS CLOB(125M).
Tiene como resultado la generación de la estructura siguiente:
01 MY-CLOB.
49 MY-CLOB-LENGTH PIC S9(9) COMP-5.
49 MY-CLOB-DATA PIC X(131072000).
Ejemplo de DBCLOB:
La declaración:
01 MY-DBCLOB USAGE IS SQL TYPE IS DBCLOB(30000).
Tiene como resultado la generación de la estructura siguiente:
01 MY-DBCLOB.
49 MY-DBCLOB-LENGTH PIC S9(9) COMP-5.
49 MY-DBCLOB-DATA PIC G(30000) DISPLAY-1.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
v “Soporte de estructuras del lenguaje principal en la sección de declaración de
aplicaciones de SQL incorporado COBOL” en la página 130
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
Declaración de variables del lenguaje principal de tipo
localizador de objeto grande (large object locator) en
aplicaciones de SQL incorporado COBOL
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de localizador de objeto grande (LOB) en COBOL.
�� 01 nombre-variable
USAGE
IS
SQL TYPE IS BLOB-LOCATOR
CLOB-LOCATOR
DBCLOB-LOCATOR
. ��
Consideraciones sobre variables del lenguaje principal de tipo localizador de
LOB:
1. SQL TYPE IS, BLOB-LOCATOR, CLOB-LOCATOR, DBCLOB-LOCATOR se
pueden especificar en mayúsculas, en minúsculas o en una mezcla de ambas.
2. No se permite la inicialización de localizadores.
Ejemplo de localizador de BLOB (existen otros tipos de localizadores de LOB
parecidos):
La declaración:
01 MY-LOCATOR USAGE SQL TYPE IS BLOB-LOCATOR.
Capítulo 3. Programación de aplicaciones de SQL incorporado 127
![Page 136: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/136.jpg)
Tiene como resultado la generación de la declaración siguiente:
01 MY-LOCATOR PIC S9(9) COMP-5.
Conceptos relacionados:
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado COBOL” en la página 120
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
Declaración de variables del lenguaje principal de referencia de
archivos aplicaciones de SQL incorporado COBOL
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de referencia de archivos en COBOL.
�� 01 nombre-variable
USAGE
IS
SQL TYPE IS BLOB-FILE
CLOB-FILE
DBCLOB-FILE
. ��
v SQL TYPE IS, BLOB-FILE, CLOB-FILE, DBCLOB-FILE se pueden especificar en
mayúsculas, en minúsculas o en una mezcla de ambas.
Ejemplo de referencia de archivos BLOB (existen otros tipos de LOB parecidos):
La declaración:
01 MY-FILE USAGE IS SQL TYPE IS BLOB-FILE.
Tiene como resultado la generación de la declaración siguiente:
01 MY-FILE.
49 MY-FILE-NAME-LENGTH PIC S9(9) COMP-5.
49 MY-FILE-DATA-LENGTH PIC S9(9) COMP-5.
49 MY-FILE-FILE-OPTIONS PIC S9(9) COMP-5.
49 MY-FILE-NAME PIC X(255).
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en COBOL” en la página 119
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado COBOL” en la página 120
Agrupación de elementos de datos utilizando REDEFINES en
aplicaciones de SQL incorporado COBOL
Cuando declare variables del lenguaje principal, puede utilizar la cláusula
REDEFINES. Si declara un miembro de un elemento de datos de grupo con la
cláusula REDEFINES y se hace referencia a ese elemento de datos de grupo como
un todo en una sentencia de SQL, los elementos subordinados que contienen la
cláusula REDEFINES no se expanden. Por ejemplo:
01 foo.
10 a pic s9(4) comp-5.
10 a1 redefines a pic x(2).
10 b pic x(10).
La referencia a foo en una sentencia de SQL es como sigue:
... INTO :foo ...
La sentencia anterior es equivalente a:
128 Desarrollo de aplicaciones de SQL incorporado
![Page 137: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/137.jpg)
... INTO :foo.a, :foo.b ...
Es decir, el elemento subordinado a1, que se declara con la cláusula REDEFINES,
no se expande automáticamente en estas situaciones. Si a1 es inequívoco, se puede
hacer una referencia explícita a un subordinado que tenga una cláusula
REDEFINES en una sentencia de SQL, del modo siguiente:
... INTO :foo.a1 ...
o
... INTO :a1 ...
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
Consideraciones sobre EUC en japonés o chino tradicional y
UCS-2 para aplicaciones de SQL incorporado COBOL
Los datos gráficos enviados desde una aplicación que se ejecuta bajo un juego de
códigos eucJp o eucTW, o se conecta a una base de datos UCS-2, se identifican con
el identificador de la página de códigos UCS-2. La aplicación debe convertir una
serie de caracteres gráficos a UCS-2 antes de enviarla al servidor de bases de datos.
Del mismo modo, los datos gráficos recuperados de una base de datos UCS-2 por
una aplicación, o de cualquier base de datos por una aplicación que se ejecute bajo
una página de códigos EUC eucJP o eucTW, se codifican utilizando UCS-2. Esto
requiere que la aplicación realice internamente una conversión de UCS-2 a la
página de códigos de la aplicación, a menos que se vayan a presentar datos UCS-2
al usuario.
La aplicación es responsable de convertir a UCS-2 y desde UCS-2, puesto que esta
conversión se debe llevar a cabo antes de copiar los datos a la SQLDA o desde
esta. DB2 Database para Linux, UNIX y Windows no suministra ninguna rutina de
conversión que resulte accesible para la aplicación. En cambio, se deben utilizar las
llamadas del sistema disponibles desde el sistema operativo. En el caso de una
base de datos UCS-2, también puede considerar la posibilidad de utilizar las
funciones escalares VARCHAR y VARGRAPHIC.
Conceptos relacionados:
v “Consideraciones sobre el juego de códigos EUC y UCS-2 japonés y chino
tradicional” en Desarrollo de SQL y rutinas externas
Información relacionada:
v “Función escalar VARCHAR” en Consulta de SQL, Volumen 1
v “Función escalar VARGRAPHIC” en Consulta de SQL, Volumen 1
v “Declaración de variables del lenguaje principal de tipo graphic de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
125
Almacenamiento binario de valores de variables mediante la
cláusula FOR BIT DATA en aplicaciones de SQL incorporado
COBOL
Determinadas columnas de bases de datos se pueden declarar FOR BIT DATA.
Estas columnas, que generalmente contienen caracteres, se utilizan para contener
información binaria. Los tipos de datos CHAR(n), VARCHAR, LONG VARCHAR y
Capítulo 3. Programación de aplicaciones de SQL incorporado 129
![Page 138: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/138.jpg)
BLOB son los tipos de variable del lenguaje principal de COBOL que pueden
contener datos binarios. Utilice estos tipos de datos cuando trabaje con columnas
que tengan el atributo FOR BIT DATA.
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado COBOL” en la página 126
Soporte de estructuras del lenguaje principal en la sección de
declaración de aplicaciones de SQL incorporado COBOL
El precompilador COBOL soporta declaraciones de elementos de datos de grupos
en la sección de declaración de variables del lenguaje principal. Entre otras cosas,
esto proporciona un sistema taquigráfico para hacer referencia a un conjunto de
elementos de datos elementales en una sentencia de SQL. Por ejemplo, se puede
utilizar el siguiente elemento de datos de grupo para acceder a algunas de las
columnas de la tabla STAFF de la base de datos SAMPLE:
01 staff-record.
05 staff-id pic s9(4) comp-5.
05 staff-name.
49 l pic s9(4) comp-5.
49 d pic x(9).
05 staff-info.
10 staff-dept pic s9(4) comp-5.
10 staff-job pic x(5).
Los elementos de datos de grupos de la sección de declaración pueden tener, como
elementos de datos subordinados, cualquiera de los tipos válidos de variable del
lenguaje principal descritos anteriormente. Esto incluye todos los tipos de datos
numéricos y de tipo carácter, así como los tipos de objeto grande. Los elementos de
datos de grupos se pueden anidar hasta un máximo de 10 niveles. Observe que
debe declarar los tipos de caracteres VARCHAR con los elementos subordinados al
nivel 49, tal como en el ejemplo anterior. Si no están al nivel 49, VARCHAR se
trata como elemento de datos de grupos con dos subordinados y está sujeto a las
normas de declaración y utilización de elementos de datos de grupos. En el
ejemplo anterior, staff-info es un elemento de datos de grupos, mientras que
staff-name es VARCHAR. Se aplica el mismo principio a LONG VARCHAR,
VARGRAPHIC y LONG VARGRAPHIC. Puede declarar elementos de datos de
grupos a cualquier nivel entre 02 y 49.
Puede utilizar elementos de datos de grupos y los subordinados de los mismos de
cuatro maneras:
Método 1.
Se puede hacer referencia al grupo entero como una sola variable del lenguaje
principal en una sentencia de SQL:
EXEC SQL SELECT id, name, dept, job
INTO :staff-record
FROM staff WHERE id = 10 END-EXEC.
El precompilador convierte la referencia a staff-record en una lista de todos los
elementos subordinados declarados dentro de staff-record, separados por comas.
130 Desarrollo de aplicaciones de SQL incorporado
![Page 139: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/139.jpg)
Cada elemento elemental se califica con los nombres de grupo de todos los niveles,
a fin de evitar conflictos de denominación con otros elementos. Esto es equivalente
al método siguiente.
Método 2.
La segunda manera de utilizar elementos de datos de grupos:
EXEC SQL SELECT id, name, dept, job
INTO
:staff-record.staff-id,
:staff-record.staff-name,
:staff-record.staff-info.staff-dept,
:staff-record.staff-info.staff-job
FROM staff WHERE id = 10 END-EXEC.
Nota: La referencia a staff-id se califica con su nombre de grupo utilizando el
prefijo staff-record., y no staff-id de staff-record como se hace en
COBOL puro.
Suponiendo que no existen otras variables del lenguaje principal que tengan los
mismos nombres que los subordinados de staff-record, la sentencia anterior
también se puede codificar como en el método 3, eliminando la calificación
explícita de grupo.
Método 3.
Aquí, se hace referencia a los elementos subordinados de la forma típica de
COBOL, sin calificarlos con su elemento de grupo concreto:
EXEC SQL SELECT id, name, dept, job
INTO
:staff-id,
:staff-name,
:staff-dept,
:staff-job
FROM staff WHERE id = 10 END-EXEC.
Como en COBOL puro, este método resulta aceptable para el precompilador
siempre que un elemento subordinado determinado se pueda calificar de forma
exclusiva. Por ejemplo, si staff-job aparece más de una vez en un grupo, el
precompilador emite un error indicando que se ha producido una referencia
ambigua:
SQL0088N La variable del lenguaje principal "staff-job" es ambigua.
Método 4.
Para resolver la referencia ambigua, puede utilizar una calificación parcial del
elemento subordinado, por ejemplo:
EXEC SQL SELECT id, name, dept, job
INTO
:staff-id,
:staff-name,
:staff-info.staff-dept,
:staff-info.staff-job
FROM staff WHERE id = 10 END-EXEC.
Puesto que una referencia a un solo elemento de grupo, como en el método 1, es
equivalente a una lista de sus subordinados, separados por comas, existen casos en
que este tipo de referencia conduce a un error. Por ejemplo:
Capítulo 3. Programación de aplicaciones de SQL incorporado 131
![Page 140: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/140.jpg)
EXEC SQL CONNECT TO :staff-record END-EXEC.
Aquí, la sentencia CONNECT espera una sola variable del lenguaje principal
basada en caracteres. Proporcionando en su lugar el elemento de datos de grupos
staff-record, la variable del lenguaje principal tiene como resultado el error de
precompilación siguiente:
SQL0087N La variable del lenguaje principal "staff-record" es una estructura
que se utiliza donde no se permiten referencias a estructuras.
Otros usos de los elementos de grupos que pueden ocasionar que se produzca un
error SQL0087N incluyen: PREPARE, EXECUTE IMMEDIATE, CALL, variables de
indicador y referencias a SQLDA. Los grupos que sólo tienen un subordinado
están permitidos en ambas situaciones, puesto que se trata de referencias a
subordinados individuales, como en los métodos 2, 3 y 4 anteriores.
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado COBOL” en la página 126
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado COBOL” en la página 122
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija
y longitud variable en aplicaciones de SQL incorporado COBOL” en la página
123
Tablas de variables de indicador de nulo y de indicador de nulo
o de truncamiento en aplicaciones de SQL incorporado COBOL
Las variables de indicador de nulo se deben declarar con tipo de datos PIC S9(4)
COMP-5.
El precompilador COBOL da soporte a la declaración de tablas de variables de
indicador de nulo (denominadas tablas de indicadores), que es conveniente utilizar
con elementos de datos de grupos. Se declaran del modo siguiente:
01 <indicator-table-name>.
05 <indicator-name> pic s9(4) comp-5
occurs <table-size> times.
Por ejemplo:
01 staff-indicator-table.
05 staff-indicator pic s9(4) comp-5
occurs 7 times.
Esta tabla de indicadores se puede utilizar eficazmente con el primer formato de
referencia de elementos de grupos indicado anteriormente:
EXEC SQL SELECT id, name, dept, job
INTO :staff-record :staff-indicator
FROM staff WHERE id = 10 END-EXEC.
Aquí, el precompilador detecta que staff-indicator se ha declarado como tabla
de indicadores y la expande en referencias a indicadores individuales cuando
procesa la sentencia de SQL. staff-indicator(1) se asocia a staff-id de
staff-record, staff-indicator(2) se asocia a staff-name de staff-record, y así
sucesivamente.
132 Desarrollo de aplicaciones de SQL incorporado
![Page 141: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/141.jpg)
Nota: Si en la tabla de indicadores existen k entradas de indicador más que
subordinados tiene el elemento de datos (por ejemplo, si staff-indicator
tiene 10 entradas, haciendo que k=6), se pasan por alto las k entradas de
más que se encuentran al final de la tabla de indicadores. Del mismo modo,
si hay k entradas de indicador menos que subordinados, los k últimos
subordinados del elemento de grupo no tienen asociado ningún indicador.
Tenga en cuenta que puede hacer referencia a elementos individuales en una tabla de
indicadores en una sentencia de SQL.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado COBOL” en la página 120
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
Variables del lenguaje principal en FORTRAN
Variables del lenguaje principal en FORTRAN
Las variables del lenguaje principal son variables del lenguaje FORTRAN a las que
se hace referencia en sentencias de SQL. Permiten a una aplicación intercambiar
datos con el gestor de bases de datos. Una vez que se ha precompilado la
aplicación, el compilador utiliza las variables del lenguaje principal como cualquier
otra variable de FORTRAN. Cuando denomine, declare y utilice variables del
lenguaje principal, siga las normas descritas en los apartados siguientes.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
Nombres de variables del lenguaje principal en aplicaciones de
SQL incorporado FORTRAN
El precompilador SQL identifica las variables del lenguaje principal por el nombre
declarado para éstas. Se aplican las sugerencias siguientes:
v Especifique nombres de variables con una longitud máxima de 255 caracteres.
v Empiece los nombres de variables con prefijos que no sean SQL, sql, DB2 ni db2,
que están reservados para uso del sistema.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija
y longitud variable en aplicaciones de SQL incorporado FORTRAN” en la
página 136
Capítulo 3. Programación de aplicaciones de SQL incorporado 133
![Page 142: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/142.jpg)
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado FORTRAN” en la página 140
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado FORTRAN” en la página 138
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado FORTRAN” en
la página 139
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado FORTRAN” en la página 135
Sección declare para variables del lenguaje principal en
aplicaciones de SQL incorporado FORTRAN
Se debe utilizar una sección de declaración de SQL para identificar las
declaraciones de variables del lenguaje principal. Esto alerta al precompilador
acerca de las variables del lenguaje principal a las que se puede hacer referencia en
sentencias de SQL posteriores.
El precompilador FORTRAN sólo reconoce un subconjunto de declaraciones de
FORTRAN válidas como declaraciones de variables del lenguaje principal válidas.
Estas declaraciones definen variables numéricas o de tipo carácter. Una variable
numérica del lenguaje principal se puede utilizar como variable de entrada o de
salida para cualquier valor numérico de entrada o salida de SQL. Una variable del
lenguaje principal de tipo carácter se puede utilizar como variable de entrada o de
salida para cualquier valor de tipo carácter, de fecha, de hora o de indicación de la
hora, de entrada o salida de SQL. El programador se tiene que asegurar de que las
variables de salida sean lo suficientemente largas como para contener los valores
que van a recibir.
Tareas relacionadas:
v “Declaración de variables del lenguaje principal de tipo estructurado” en
Desarrollo de SQL y rutinas externas
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo carácter de longitud fija
y longitud variable en aplicaciones de SQL incorporado FORTRAN” en la
página 136
v “Declaración de variables del lenguaje principal de referencia de archivos
aplicaciones de SQL incorporado FORTRAN” en la página 140
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado FORTRAN” en la página 138
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado FORTRAN” en
la página 139
v “Declaración de variables numéricas del lenguaje principal en aplicaciones de
SQL incorporado FORTRAN” en la página 135
Ejemplo: Plantilla de sección declare de SQL para aplicaciones
de SQL incorporado FORTRAN
A continuación se muestra un ejemplo de sección de declaración de SQL con una
variable del lenguaje principal declarada para cada tipo de datos soportado:
134 Desarrollo de aplicaciones de SQL incorporado
![Page 143: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/143.jpg)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*2 AGE /26/ /* SQL tipo 500 */
INTEGER*4 DEPT /* SQL tipo 496 */
REAL*4 BONUS /* SQL tipo 480 */
REAL*8 SALARY /* SQL tipo 480 */
CHARACTER MI /* SQL tipo 452 */
CHARACTER*112 ADDRESS /* SQL tipo 452 */
SQL TYPE IS VARCHAR (512) DESCRIPTION /* SQL tipo 448 */
SQL TYPE IS VARCHAR (32000) COMMENTS /* SQL tipo 448 */
SQL TYPE IS CLOB (1M) CHAPTER /* SQL tipo 408 */
SQL TYPE IS CLOB_LOCATOR CHAPLOC /* SQL tipo 964 */
SQL TYPE IS CLOB_FILE CHAPFL /* SQL tipo 920 */
SQL TYPE IS BLOB (1M) VIDEO /* SQL tipo 404 */
SQL TYPE IS BLOB_LOCATOR VIDLOC /* SQL tipo 960 */
SQL TYPE IS BLOB_FILE VIDFL /* SQL tipo 916 */
CHARACTER*10 DATE /* SQL tipo 384 */
CHARACTER*8 TIME /* SQL tipo 388 */
CHARACTER*26 TIMESTAMP /* SQL tipo 392 */
INTEGER*2 WAGE_IND /* SQL tipo 500 */
EXEC SQL END DECLARE SECTION
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
FORTRAN” en la página 70
Variables SQLSTATE y SQLCODE en aplicaciones de SQL
incorporado FORTRAN
Cuando se utiliza la opción de precompilación LANGLEVEL con el valor SQL92E,
se pueden incluir las dos declaraciones siguientes como variables del lenguaje
principal:
EXEC SQL BEGIN DECLARE SECTION;
CHARACTER*5 SQLSTATE
INTEGER SQLCOD
.
.
.
EXEC SQL END DECLARE SECTION
Se supone la declaración SQLCOD durante el paso de precompilación. La variable
denominada SQLSTATE también puede ser SQLSTA. Observe que, si se utiliza esta
opción, no se debe especificar la sentencia INCLUDE SQLCA.
Para aplicaciones que contienen varios archivos fuente, se pueden incluir las
declaraciones de SQLCOD y SQLSTATE en cada archivo fuente, tal como se ha
mostrado anteriormente.
Información relacionada:
v “Mandato PRECOMPILE” en Consulta de mandatos
v “Sentencia INCLUDE” en Consulta de SQL, Volumen 2
Declaración de variables numéricas del lenguaje principal en
aplicaciones de SQL incorporado FORTRAN
A continuación se muestra la sintaxis de las variables numéricas del lenguaje
principal en FORTRAN.
Capítulo 3. Programación de aplicaciones de SQL incorporado 135
![Page 144: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/144.jpg)
��
INTEGER*2
INTEGER*4
REAL*4
REAL *8
DOUBLE PRECISION
�
,
nombrevar
/ valor-inicial /
��
Consideraciones sobre las variables numéricas del lenguaje principal:
1. REAL*8 y DOUBLE PRECISION son equivalentes.
2. Utilice una E en lugar de una D como indicador de exponente para las
constantes REAL*8.
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
Declaración de variables del lenguaje principal de tipo carácter
de longitud fija y longitud variable en aplicaciones de SQL
incorporado FORTRAN
A continuación se muestra la sintaxis de las variables de tipo carácter de longitud
fija del lenguaje principal.
Longitud fija
Sintaxis de las variables del lenguaje principal de tipo carácter en FORTRAN:
Longitud fija
��
�
,
CHARACTER
nombrevar
*n
/ valor-inicial /
��
A continuación se muestra la sintaxis de las variables de tipo carácter de longitud
variable del lenguaje principal.
Longitud variable
��
�
,
SQL TYPE IS VARCHAR
(longitud)
nombrevar
��
Consideraciones sobre variables del lenguaje principal de tipo carácter:
1. *n tiene un valor máximo de 254.
2. Si la longitud está entre 1 y 32 672, ambos inclusive, la variable del lenguaje
principal es de tipo VARCHAR(SQLTYPE 448).
3. Si la longitud está entre 32 673 y 32 700, ambos inclusive, la variable del
lenguaje principal es de tipo LONG VARCHAR(SQLTYPE 456).
136 Desarrollo de aplicaciones de SQL incorporado
![Page 145: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/145.jpg)
4. No está permitida la inicialización de variables del lenguaje principal
VARCHAR y LONG VARCHAR dentro de la declaración.
Ejemplo de VARCHAR:
La declaración:
sql type is varchar(1000) my_varchar
Tiene como resultado la generación de la estructura siguiente:
character my_varchar(1000+2)
integer*2 my_varchar_length
character my_varchar_data(1000)
equivalence( my_varchar(1),
+ my_varchar_length )
equivalence( my_varchar(3),
+ my_varchar_data )
La aplicación puede manipular tanto my_varchar_length como my_varchar_data;
por ejemplo, para establecer o examinar el contenido de la variable del lenguaje
principal. El nombre base (en este caso, my_varchar), se utiliza en las sentencias de
SQL para hacer referencia a la VARCHAR como un todo.
Ejemplo de LONG VARCHAR:
La declaración:
sql type is varchar(10000) my_lvarchar
Tiene como resultado la generación de la estructura siguiente:
character my_lvarchar(10000+2)
integer*2 my_lvarchar_length
character my_lvarchar_data(10000)
equivalence( my_lvarchar(1),
+ my_lvarchar_length )
equivalence( my_lvarchar(3),
+ my_lvarchar_data )
La aplicación puede manipular tanto my_lvarchar_length como my_lvarchar_data;
por ejemplo, para establecer o examinar el contenido de la variable del lenguaje
principal. El nombre base (en este caso, my_lvarchar) se utiliza en las sentencias de
SQL para hacer referencia a la LONG VARCHAR como un todo.
Nota: En una sentencia CONNECT, como por ejemplo la que se muestra a
continuación, a las variables del lenguaje principal de serie de caracteres en
FORTRAN dbname y userid se les eliminarán los blancos de cola antes del
proceso.
EXEC SQL CONNECT TO :dbname USER :userid USING :passwd
No obstante, puesto que los blancos pueden ser significativos en las
contraseñas, debe declarar las variables del lenguaje principal para
contraseñas como VARCHAR, y hacer que el campo de longitud establecido
refleje la longitud real de la contraseña:
EXEC SQL BEGIN DECLARE SECTION
character*8 dbname, userid
sql type is varchar(18) passwd
EXEC SQL END DECLARE SECTION
character*18 passwd_string
equivalence(passwd_data,passwd_string)
dbname = ’sample’
Capítulo 3. Programación de aplicaciones de SQL incorporado 137
![Page 146: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/146.jpg)
userid = ’userid’
passwd_length= 8
passwd_string = ’password’
EXEC SQL CONNECT TO :dbname USER :userid USING :passwd
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
Información relacionada:
v “Sentencia CONNECT (Tipo 1)” en Consulta de SQL, Volumen 2
Declaración de variables del lenguaje principal de tipo objeto
grande (large object) en aplicaciones de SQL incorporado
FORTRAN
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de objeto grande (LOB) en FORTRAN.
��
�
,
SQL TYPE IS
BLOB
(longitud
)
nombre-variable
CLOB
K
M
G
��
Consideraciones sobre variables del lenguaje principal de tipo LOB:
1. Los tipos GRAPHIC no se soportan en FORTRAN.
2. SQL TYPE IS, BLOB, CLOB, K, M, G se pueden especificar en mayúsculas, en
minúsculas o en una mezcla de ambas.
3. Para BLOB y CLOB 1 <= longitud-lob <= 2 147 483 647.
4. No se permite la inicialización de un LOB dentro de una declaración LOB.
5. El nombre de la variable del lenguaje principal es el prefijo de ’longitud? y
’datos’ en el código generado por el precompilador.
Ejemplo de BLOB:
La declaración:
sql type is blob(2m) my_blob
Tiene como resultado la generación de la estructura siguiente:
character my_blob(2097152+4)
integer*4 my_blob_length
character my_blob_data(2097152)
equivalence( my_blob(1),
+ my_blob_length )
equivalence( my_blob(5),
+ my_blob_data )
Ejemplo de CLOB:
138 Desarrollo de aplicaciones de SQL incorporado
![Page 147: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/147.jpg)
La declaración:
sql type is clob(125m) my_clob
Tiene como resultado la generación de la estructura siguiente:
character my_clob(131072000+4)
integer*4 my_clob_length
character my_clob_data(131072000)
equivalence( my_clob(1),
+ my_clob_length )
equivalence( my_clob(5),
+ my_clob_data )
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
Declaración de variables del lenguaje principal de tipo
localizador de objeto grande (large object locator) en
aplicaciones de SQL incorporado FORTRAN
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de localizador de objeto grande (LOB) en FORTRAN.
��
�
,
SQL TYPE IS
BLOB_LOCATOR
nombre-variable
CLOB_LOCATOR
��
Consideraciones sobre variables del lenguaje principal de tipo localizador de
LOB:
1. Los tipos GRAPHIC no se soportan en FORTRAN.
2. SQL TYPE IS, BLOB_LOCATOR, CLOB_LOCATOR se pueden especificar en
mayúsculas, en minúsculas o en una mezcla de ambas.
3. No se permite la inicialización de localizadores.
Ejemplo de localizador de CLOB (El localizador de BLOB es parecido):
La declaración:
SQL TYPE IS CLOB_LOCATOR my_locator
Tiene como resultado la generación de la declaración siguiente:
integer*4 my_locator
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
Capítulo 3. Programación de aplicaciones de SQL incorporado 139
![Page 148: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/148.jpg)
Declaración de variables del lenguaje principal de referencia de
archivos aplicaciones de SQL incorporado FORTRAN
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de referencia de archivos en FORTRAN.
��
�
,
SQL TYPE IS
BLOB_FILE
nombre-variable
CLOB_FILE
��
Consideraciones sobre variables del lenguaje principal de referencia de
archivos:
1. Los tipos GRAPHIC no se soportan en FORTRAN.
2. SQL TYPE IS, BLOB-FILE, CLOB-FILE se pueden especificar en mayúsculas, en
minúsculas o en una mezcla de ambas.
Ejemplo de una variable de referencia de archivos BLOB (La variable de
referencia de archivos CLOB es parecida):
SQL TYPE IS BLOB_FILE my_file
Tiene como resultado la generación de la declaración siguiente:
character my_file(267)
integer*4 my_file_name_length
integer*4 my_file_data_length
integer*4 my_file_file_options
character*255 my_file_name
equivalence( my_file(1),
+ my_file_name_length )
equivalence( my_file(5),
+ my_file_data_length )
equivalence( my_file(9),
+ my_file_file_options )
equivalence( my_file(13),
+ my_file_name )
Conceptos relacionados:
v “Consideraciones sobre los juegos de caracteres gráficos (de varios bytes) en
aplicaciones de SQL incorporado FORTRAN” en la página 140
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo objeto grande (large
object) en aplicaciones de SQL incorporado FORTRAN” en la página 138
Consideraciones sobre los juegos de caracteres gráficos (de
varios bytes) en aplicaciones de SQL incorporado FORTRAN
En FORTRAN no se da soporte a ningún tipo de datos de variables del lenguaje
principal de gráficos (de varios bytes). Sólo se da soporte a variables del lenguaje
principal de tipo carácter mixtas mediante el tipo de datos character. Sin embargo,
se puede crear una SQLDA de usuario que contenga datos gráficos.
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 133
140 Desarrollo de aplicaciones de SQL incorporado
![Page 149: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/149.jpg)
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
Tareas relacionadas:
v “Transferencia de datos en un programa de SQL ejecutado dinámicamente
utilizando una estructura SQLDA” en la página 163
Consideraciones sobre EUC en japonés o chino tradicional y
UCS-2 para aplicaciones de SQL incorporado FORTRAN
Los datos gráficos enviados desde una aplicación que se ejecuta bajo un juego de
códigos eucJp o eucTW, o se conecta a una base de datos UCS-2, se identifican con
el identificador de la página de códigos UCS-2. La aplicación debe convertir una
serie de caracteres gráficos a UCS-2 antes de enviarla al servidor de bases de datos.
Del mismo modo, los datos gráficos recuperados de una base de datos UCS-2 por
una aplicación, o de cualquier base de datos por una aplicación que se ejecute bajo
una página de códigos EUC eucJP o eucTW, se codifican utilizando UCS-2. Esto
requiere que la aplicación realice internamente una conversión de UCS-2 a la
página de códigos de la aplicación, a menos que se vayan a presentar datos UCS-2
al usuario.
La aplicación es responsable de convertir a UCS-2 y desde UCS-2, puesto que esta
conversión se debe llevar a cabo antes de copiar los datos a la SQLDA o desde
esta. Los sistemas de bases de datos DB2 no suministran ninguna rutina de
conversión que resulte accesible para la aplicación. En cambio, se deben utilizar las
llamadas del sistema disponibles desde el sistema operativo. En el caso de una
base de datos UCS-2, también puede considerar la posibilidad de utilizar las
funciones escalares VARCHAR y VARGRAPHIC.
Conceptos relacionados:
v “Consideraciones sobre el juego de códigos EUC y UCS-2 japonés y chino
tradicional” en Desarrollo de SQL y rutinas externas
Información relacionada:
v “Función escalar VARCHAR” en Consulta de SQL, Volumen 1
v “Función escalar VARGRAPHIC” en Consulta de SQL, Volumen 1
Variables de indicador de nulo o de truncamiento en
aplicaciones de SQL incorporado FORTRAN
Las variables de indicador se deben declarar con tipo de datos INTEGER*2.
Conceptos relacionados:
v “Sección declare para variables del lenguaje principal en aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Ejemplo: Plantilla de sección declare de SQL para aplicaciones de SQL
incorporado FORTRAN” en la página 134
v “Variables del lenguaje principal en FORTRAN” en la página 133
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
FORTRAN” en la página 70
Capítulo 3. Programación de aplicaciones de SQL incorporado 141
![Page 150: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/150.jpg)
Variables del lenguaje principal en aplicaciones de SQL
incorporado REXX
Variables del lenguaje principal en REXX
Las variables del lenguaje principal son variables del lenguaje REXX a las que se
hace referencia en las sentencias de SQL. Permiten a una aplicación intercambiar
datos con el gestor de bases de datos. Una vez que se ha precompilado la
aplicación, el compilador utiliza las variables del lenguaje principal como cualquier
otra variable de REXX. Cuando denomine, declare y utilice variables del lenguaje
principal, siga las normas descritas en los apartados siguientes.
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
v “Referencias a variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
Tareas relacionadas:
v “Consideraciones sobre la programación de aplicaciones REXX de SQL
incorporado” en la página 145
Información relacionada:
v “Variables de REXX predefinidas” en la página 143
Nombres de variables del lenguaje principal en aplicaciones de
SQL incorporado REXX
Cualquier variable de REXX correctamente denominada se puede utilizar como
variable del lenguaje principal. Un nombre de variable puede tener una longitud
máxima de 64 caracteres. No termine el nombre con un punto. Un nombre de
variable del lenguaje principal puede constar de números, caracteres alfabéticos y
los caracteres @, _, !, ., ? y $.
Conceptos relacionados:
v “Referencias a variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
Información relacionada:
v “Ejemplos de REXX” en la página 412
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
Referencias a variables del lenguaje principal en aplicaciones de
SQL incorporado REXX
El intérprete de REXX examina cada serie que no tiene comillas de un
procedimiento. Si la serie representa a una variable en la agrupación actual de
variables de REXX, éste sustituye la serie por el valor actual. A continuación se
muestra un ejemplo de cómo se puede hacer referencia a una variable del lenguaje
principal en REXX:
CALL SQLEXEC ’FETCH C1 INTO :cm’
SAY ’Commission = ’ cm
142 Desarrollo de aplicaciones de SQL incorporado
![Page 151: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/151.jpg)
Para asegurarse de que una serie de caracteres no se convierta a un tipo de datos
numérico, encierre la serie entre comillas tal como en el ejemplo siguiente:
VAR = ’100’
REXX establece la variable VAR en la serie de caracteres de 3 bytes 100. Si se tienen
que incluir comillas como parte de la serie, siga este ejemplo:
VAR = "’100’"
Cuando se insertan datos numéricos en un campo de tipo CHARACTER, el
intérprete de REXX trata los datos numéricos como datos enteros, por lo que
deberá concatenar explícitamente las series numéricas y encerrarlas entre comillas.
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
v “Ejemplos de REXX” en la página 412
Variables de REXX predefinidas
SQLEXEC, SQLDBS y SQLDB2 establecen variables de REXX predefinidas como
consecuencia de determinadas operaciones. Estas variables son:
RESULT
Cada operación establece este código de retorno. Los valores posibles son:
n Donde n es un valor positivo que indica el número de bytes de un
mensaje formateado. La API GET ERROR MESSAGE sola devuelve
este valor.
0 Se ha ejecutado la API. La SQLCA de la variable de REXX contiene
el estado de terminación de la API. Si SQLCA.SQLCODE es
distinto de cero, SQLMSG contiene el mensaje de texto asociado a
este valor.
–1 No se dispone de suficiente memoria para completar la API. No se
ha devuelto el mensaje solicitado.
–2 SQLCA.SQLCODE se establece en 0. No se ha devuelto ningún
mensaje.
–3 SQLCA.SQLCODE contenía un SQLCODE que no era válido. No
se ha devuelto ningún mensaje.
–6 No se ha podido crear la variable SQLCA de REXX. Esto indica
que no había suficiente memoria disponible o que la agrupación de
variables de REXX no estaba disponible por algún motivo.
–7 No se ha podido crear la variable SQLMSG de REXX. Esto indica
que no había suficiente memoria disponible o que la agrupación de
variables de REXX no estaba disponible por algún motivo.
–8 No se ha podido captar la variable SQLCA.SQLCODE de REXX de
la agrupación de variables de REXX.
–9 La variable SQLCA.SQLCODE de REXX se ha truncado durante la
captación. La longitud máxima para esta variable es de 5 bytes.
–10 La variable SQLCA.SQLCODE de REXX no se ha podido convertir
de ASCII a un entero largo válido.
Capítulo 3. Programación de aplicaciones de SQL incorporado 143
![Page 152: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/152.jpg)
–11 No se ha podido captar la variable SQLCA.SQLERRML de REXX
de la agrupación de variables de REXX.
–12 La variable SQLCA.SQLERRML de REXX se ha truncado durante
la captación. La longitud máxima para esta variable es de 2 bytes.
–13 La variable SQLCA.SQLERRML de REXX no se ha podido
convertir de ASCII a un entero corto válido.
–14 No se ha podido captar la variable SQLCA.SQLERRMC de REXX
de la agrupación de variables de REXX.
–15 La variable SQLCA.SQLERRMC de REXX se ha truncado durante
la captación. La longitud máxima para esta variable es de 70 bytes.
–16 No se ha podido establecer la variable de REXX especificada para
el texto del error.
–17 No se ha podido captar la variable SQLCA.SQLSTATE de REXX de
la agrupación de variables de REXX.
–18 La variable SQLCA.SQLSTATE de REXX se ha truncado durante la
captación. La longitud máxima para esta variable es de 2 bytes.
Nota: Los valores –8 a –18 sólo los devuelve la API GET ERROR
MESSAGE.
SQLMSG
Si SQLCA.SQLCODE es distinto de cero, esta variable contiene el mensaje
de texto asociado al código de error.
SQLISL
Nivel de aislamiento. Los valores posibles son:
RR Lectura repetible.
RS Estabilidad de lectura.
CS Estabilidad del cursor. Éste es el valor por omisión.
UR Lectura no confirmada.
NC Sin confirmación. (NC sólo recibe soporte de algunos servidores de
sistema principal, AS/400 o iSeries.)
SQLCA
La estructura SQLCA actualizada después de que se procesen las
sentencias de SQL y se llame a las API de DB2.
SQLRODA
La estructura SQLDA de entrada/salida para procedimientos almacenados
invocados mediante la sentencia CALL. También es la estructura SQLDA
de salida para procedimientos almacenados invocados mediante la API
Database Application Remote Interface (DARI).
SQLRIDA
La estructura SQLDA de entrada para procedimientos almacenados
invocados mediante la API Database Application Remote Interface (DARI).
SQLRDAT
Una estructura SQLCHAR para procedimientos de servidor invocados
mediante la API Database Application Remote Interface (DARI).
Conceptos relacionados:
v “Sintaxis de las API para REXX” en la página 173
v “Errores y avisos procedentes de la precompilación aplicaciones de SQL
incorporado” en la página 209
144 Desarrollo de aplicaciones de SQL incorporado
![Page 153: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/153.jpg)
Tareas relacionadas:
v “Declaración de la SQLCA para el manejo de errores” en la página 56
Información relacionada:
v “Estructura de datos SQLCA” en Consulta de las API administrativas
v “Estructura de datos sqlchar” en Consulta de las API administrativas
v “Estructura de datos SQLDA” en Consulta de las API administrativas
Consideraciones sobre la programación de aplicaciones REXX
de SQL incorporado
REXX es un lenguaje interpretado. Por lo tanto, no se utiliza ningún
precompilador, compilador ni enlazador. En su lugar, se utilizan tres API de DB2
para crear aplicaciones DB2 en REXX. Utilice dichas API para acceder a distintos
elementos de DB2.
SQLEXEC
Da soporte al lenguaje SQL.
SQLDBS
Da soporte a las versiones de línea de mandatos de las API de DB2.
SQLDB2
Da soporte a una interfaz específica de REXX con el procesador de línea de
mandatos. Consulte la descripción de la sintaxis de la API para REXX para
ver detalles y restricciones sobre cómo se puede utilizar esta interfaz.
Antes de utilizar cualquiera de las API de DB2 o emitir sentencias de SQL en una
aplicación, debe registrar las rutinas SQLDBS, SQLDB2 y SQLEXEC. Así se notifica
al intérprete de REXX sobre los puntos de entrada de REXX/SQL. El método que
utilice para realizar el registro variará ligeramente entre las plataformas basadas en
Windows y AIX.
Procedimiento:
Utilice los ejemplos siguientes para ver la sintaxis correcta para registrar cada
rutina:
Registro de ejemplo en sistemas operativos basados en Windows
/* ------------ Registrar SQLDBS con REXX -------------------------*/
If Rxfuncquery('SQLDBS') <> 0 then
rcy = Rxfuncadd('SQLDBS','DB2AR','SQLDBS')
If rcy \= 0 then
do
say ’SQLDBS was not successfully added to the REXX environment’
signal rxx_exit
end
/* ------------ Registrar SQLDB2 con REXX -------------------------*/
If Rxfuncquery('SQLDB2') <> 0 then
rcy = Rxfuncadd('SQLDB2','DB2AR','SQLDB2')
If rcy \= 0 then
do
say ’SQLDB2 was not successfully added to the REXX environment’
signal rxx_exit
end
/* ----------------- Registrar SQLEXEC con REXX --------------------*/
If Rxfuncquery('SQLEXEC') <> 0 then
rcy = Rxfuncadd('SQLEXEC','DB2AR','SQLEXEC')
Capítulo 3. Programación de aplicaciones de SQL incorporado 145
![Page 154: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/154.jpg)
If rcy \= 0 then
do
say ’SQLEXEC was not successfully added to the REXX environment’
signal rxx_exit
end
Registro de ejemplo en AIX
/* ------------ Registrar SQLDBS, SQLDB2 y SQLEXEC con REXX --------*/
rcy = SysAddFuncPkg("db2rexx")
If rcy \= 0 then
do
say ’db2rexx was not successfully added to the REXX environment’
signal rxx_exit
end
En plataformas basadas en Windows, sólo es necesario ejecutar una vez el mandato
RxFuncAdd para todas las sesiones.
En AIX, se debe ejecutar SysAddFuncPkg en cada aplicación REXX/SQL.
En la documentación de REXX para plataformas basadas en Windows y AIX,
respectivamente, encontrará detalles sobre las API Rxfuncadd y SysAddFuncPkg.
Es posible que los símbolos que se encuentren dentro de sentencias o mandatos
que se pasen a las rutinas SQLEXEC, SQLDBS y SQLDB2 puedan corresponder a
variables de REXX. En este caso, el intérprete de REXX sustituye el valor de la
variable antes de llamar a SQLEXEC, SQLDBS o SQLDB2.
Para evitar esta situación, encierre las series de sentencias entre comillas (’ ’ o ″ ″).
Si no utiliza comillas, el intérprete de REXX resolverá los nombres de variable
conflictivos, en lugar de que se pasen a las rutinas SQLEXEC, SQLDBS o SQLDB2.
Conceptos relacionados:
v “Sintaxis de las API para REXX” en la página 173
Declaración de variables del lenguaje principal de tipo objeto
grande (large object) en aplicaciones de SQL incorporado REXX
Cuando se capte una columna LOB en una variable del lenguaje principal REXX,
esta se almacenará como una serie simple (es decir, descontada). Esto se maneja del
mismo modo que todos los tipos de SQL basados en caracteres (tales como CHAR,
VARCHAR, GRAPHIC, LONG, etc.). En la entrada, si el tamaño del contenido de
la variable del lenguaje principal es superior a 32 K, o si cumple con otros criterios
establecidos más adelante, se le asignará el tipo de LOB apropiado.
En SQL de REXX, los tipos de SQL se determinan a partir del contenido de la serie
de la variable del lenguaje principal, del modo siguiente:
Contenido de la serie de variable del lenguaje principal Tipo de LOB resultante
:hv1=’serie normal entre comillas de más de 32 K ...’ CLOB
:hv2=″’serie con comillas de delimitación incorporadas ″,
″de más de 32 K...’″
CLOB
:hv3=″G’serie DBCS con comillas de delimitación incorporadas, ″,
″que empieza por G, de más de 32 K...’″
DBCLOB
:hv4=″BIN’serie con comillas de delimitación incorporadas, ″,
″que empieza por BIN, de cualquier longitud...’″
BLOB
146 Desarrollo de aplicaciones de SQL incorporado
![Page 155: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/155.jpg)
Conceptos relacionados:
v “Borrado de variables del lenguaje principal de LOB en aplicaciones de SQL
incorporado” en la página 149
Información relacionada:
v “Declaración de variables del lenguaje principal de tipo localizador de objeto
grande (large object locator) en aplicaciones de SQL incorporado REXX” en la
página 147
Declaración de variables del lenguaje principal de tipo
localizador de objeto grande (large object locator) en
aplicaciones de SQL incorporado REXX
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de localizador de LOB en REXX:
��
�
,
DECLARE
:
nombre-variable
LANGUAGE TYPE
BLOB
LOCATOR
CLOB
DBCLOB
��
Debe declarar las variables del lenguaje principal de localizador de LOB en la
aplicación. Cuando REXX/SQL encuentra estas declaraciones, trata las variables
del lenguaje principal declaradas como localizadores durante el resto del
programa. Los valores de localizadores se almacenan en variables de REXX, en un
formato interno.
Ejemplo:
CALL SQLEXEC ’DECLARE :hv1, :hv2 LANGUAGE TYPE CLOB LOCATOR’
Los datos representados por localizadores de LOB devueltos por el mecanismo se
pueden liberar en REXX/SQL mediante la sentencia FREE LOCATOR, que tiene el
formato siguiente:
Sintaxis de la sentencia FREE LOCATOR
��
�
,
FREE
LOCATOR
:
nombre-variable
��
Ejemplo:
CALL SQLEXEC ’FREE LOCATOR :hv1, :hv2’
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
Información relacionada:
v “Sentencia FREE LOCATOR” en Consulta de SQL, Volumen 2
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
v “Ejemplos de REXX” en la página 412
Capítulo 3. Programación de aplicaciones de SQL incorporado 147
![Page 156: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/156.jpg)
Declaración de variables del lenguaje principal de referencia de
archivos en aplicaciones de SQL incorporado REXX
Debe declarar las variables del lenguaje principal de referencia de archivos LOB en
la aplicación. Cuando REXX/SQL encuentra estas declaraciones, trata las variables
del lenguaje principal declaradas como referencias de archivos LOB durante el
resto del programa.
A continuación se muestra la sintaxis para declarar variables del lenguaje principal
de referencia de archivos LOB en REXX:
��
�
,
DECLARE
:
nombre-variable
LANGUAGE TYPE
BLOB
FILE
CLOB
DBCLOB
��
Ejemplo:
CALL SQLEXEC ’DECLARE :hv3, :hv4 LANGUAGE TYPE CLOB FILE’
Las variables de referencia de archivos en REXX contienen tres campos. Para el
ejemplo anterior, éstos son:
hv3.FILE_OPTIONS.
Establecido por la aplicación para indicar cómo se utilizará el archivo.
hv3.DATA_LENGTH.
Establecido por DB2 para indicar el tamaño del archivo.
hv3.NAME.
Establecido por la aplicación con el nombre del archivo LOB.
Para FILE_OPTIONS, la aplicación establece las palabras clave siguientes:
Palabra clave (valor entero)
Significado
READ (2) El archivo se va a utilizar como entrada. Se trata de un archivo
normal que se puede abrir, leer y cerrar. La longitud de los datos
del archivo (en bytes) se calcula (lo hace el código solicitante de la
aplicación) al abrir el archivo.
CREATE (8) En la salida, crear un nuevo archivo. Si el archivo ya existe, es un
error. La longitud (en bytes) del archivo se devuelve en el campo
DATA_LENGTH de la estructura de la variable de referencia de
archivos.
OVERWRITE (16)
En la salida, se sobregraba el archivo, si ya existe; de lo contrario,
se crea un nuevo archivo. La longitud (en bytes) del archivo se
devuelve en el campo DATA_LENGTH de la estructura de la variable
de referencia de archivos.
APPEND (32) La salida se añade al archivo, si existe; de lo contrario, se crea un
nuevo archivo. La longitud (en bytes) de los datos que se han
añadido al archivo (y no la longitud total del archivo) se devuelve
en el campo DATA_LENGTH de la estructura de la variable de
referencia de archivos.
148 Desarrollo de aplicaciones de SQL incorporado
![Page 157: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/157.jpg)
Nota: Una variable del lenguaje principal de referencia de archivos es una variable
compuesta en REXX, por lo que debe establecer valores para los campos
NAME, NAME_LENGTH y FILE_OPTIONS además de declararlas.
Conceptos relacionados:
v “Nombres de variables del lenguaje principal en aplicaciones de SQL
incorporado REXX” en la página 142
Información relacionada:
v “Ejemplos de REXX” en la página 412
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
Borrado de variables del lenguaje principal de LOB en
aplicaciones de SQL incorporado
En plataformas basadas en Windows, puede ser necesario borrar explícitamente las
declaraciones de variables del lenguaje principal de referencia de archivos y de
localizador de LOB de SQL de REXX, puesto que permanecen en vigor una vez
que finaliza el programa de aplicación. Esto es debido a que el proceso de la
aplicación no sale hasta que se cierra la sesión en la que se ejecuta. Si no se borran
las declaraciones de LOB del SQL para REXX, pueden interferir con otras
aplicaciones que se ejecuten en la misma sesión después de que se haya ejecutado
una aplicación de LOB.
La sintaxis para borrar la declaración es:
CALL SQLEXEC "CLEAR SQL VARIABLE DECLARATIONS"
Debe codificar esta sentencia al final de las aplicaciones de LOB. Observe que la
puede codificar en cualquier lugar, como medida de precaución, para borrar las
declaraciones que puedan haber quedado de aplicaciones anteriores (por ejemplo,
al principio de una aplicación SQL en REXX).
Conceptos relacionados:
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
Tareas relacionadas:
v “Creación y ejecución de aplicaciones de SQL incorporado escritas en REXX” en
la página 265
Variables de indicador de nulo o de truncamiento en
aplicaciones de SQL incorporado REXX
El tipo de datos de una variable de indicador en REXX es un número sin coma
decimal. A continuación se muestra un ejemplo de variable de indicador en REXX
que utiliza la palabra clave INDICATOR.
CALL SQLEXEC ’FETCH C1 INTO :cm INDICATOR :cmind’
IF ( cmind < 0 )
SAY ’Commission is NULL’
En el ejemplo anterior, se examina que cmind tenga un valor negativo. Si no es
negativo, la aplicación puede utilizar el valor devuelto de cm. Si es negativo, el
valor captado es NULL y no se debe utilizar cm. En este caso, el gestor de bases de
datos no cambia el valor de la variable del lenguaje principal.
Capítulo 3. Programación de aplicaciones de SQL incorporado 149
![Page 158: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/158.jpg)
Conceptos relacionados:
v “Variables del lenguaje principal en REXX” en la página 142
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
Ejecución de sentencias de SQL en aplicaciones de SQL incorporado
Ejecución de sentencias de SQL en aplicaciones de SQL
incorporado
La ejecución de sentencias de SQL en aplicaciones de SQL incorporado es distinta
para sentencias ejecutadas estáticamente y dinámicamente, aunque ambas utilizan
el mandato EXEC SQL. Las sentencias estáticas están codificadas de manera fija en el
código fuente de una aplicación de SQL incorporado. Las sentencias dinámicas se
diferencian de las estáticas en que se compilan en tiempo de ejecución y pueden
prepararse con parámetros de entrada. La información leída puede almacenarse en
un medio denominado cursor, que entonces permite a los usuarios desplazarse
libremente por los datos y realizar las actualizaciones correspondientes. La
información de errores de SQLCODE, SQLSTATE y SQLWARN es una herramienta
útil para la ayuda para resolver problemas de una aplicación.
Conceptos relacionados:
v “Llamada a procedimientos almacenados en aplicaciones de SQL incorporado”
en la página 171
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
v “Ejecución de sentencias de SQL estático en aplicaciones de SQL incorporado”
en la página 151
v “Lectura de los conjuntos de resultados y desplazamiento por los mismos en
aplicaciones de SQL incorporado” en la página 176
Tareas relacionadas:
v “Cómo proporcionar entrada de variables a una sentencia de SQL ejecutada
dinámicamente mediante marcadores de parámetros” en la página 169
Comentarios en aplicaciones de SQL incorporado
Los comentarios en cualquier aplicación son importantes para que el código de la
aplicación se pueda entender. Esta sección trata sobre cómo añadir comentarios en
aplicaciones de SQL incorporado.
Comentarios en aplicaciones de SQL incorporado C y C++:
Cuando se trabaja con aplicaciones C y C++, se pueden insertar comentarios de
SQL dentro del bloque EXEC SQL. Por ejemplo:
/* Aquí sólo se permiten comentarios de C o C++ */
EXEC SQL
-- Aquí se permiten comentarios de SQL
/* o comentarios de C */
150 Desarrollo de aplicaciones de SQL incorporado
![Page 159: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/159.jpg)
// o comentarios de C++
DECLARE C1 CURSOR FOR sname;
/* Aquí sólo se permiten comentarios de C o C++ */
Comentarios en aplicaciones de SQL incorporado COBOL:
Cuando se trabaja con aplicaciones COBOL, se pueden insertar comentarios de
SQL dentro del bloque EXEC SQL. Por ejemplo:
* Consulte la documentación de COBOL para conocer
* las reglas sobre comentarios
* Aquí sólo se permiten comentarios de COBOL
EXEC SQL
-- Aquí se permiten comentarios de SQL
* o comentarios de COBOL de línea completa
DECLARE C1 CURSOR FOR sname END-EXEC.
* Aquí sólo se permiten comentarios de COBOL
Comentarios en aplicaciones de SQL incorporado FORTRAN:
Cuando se trabaja con aplicaciones FORTRAN, se pueden insertar comentarios de
SQL dentro del bloque EXEC SQL. Por ejemplo:
C Aquí sólo se permiten comentarios de FORTRAN
EXEC SQL
+ -- comentarios de SQL y
C comentarios de FORTRAN de línea completa
+ DECLARE C1 CURSOR FOR sname
I=7 ! Fin de línea Se permiten comentarios de FORTRAN
C Aquí sólo se permiten comentarios de FORTRAN
Comentarios en aplicaciones de SQL incorporado REXX:
Los comentarios de SQL no están soportados en aplicaciones REXX.
Conceptos relacionados:
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
Ejecución de sentencias de SQL estático en aplicaciones de
SQL incorporado
Las sentencias de SQL se pueden ejecutar estáticamente en un lenguaje principal
utilizando el siguiente enfoque:
v C o C++ (tut_mod.sqc/tut_mod.sqC)
Los tres ejemplos siguientes proceden del ejemplo tut_mod. Consulte este
ejemplo para ver un programa completo que muestra cómo modificar datos de
tablas en C o C++.
El siguiente ejemplo muestra cómo insertar datos de tablas:
EXEC SQL INSERT INTO staff(id, name, dept, job, salary)
VALUES(380, ’Pearce’, 38, ’Clerk’, 13217.50),
(390, ’Hachey’, 38, ’Mgr’, 21270.00),
(400, ’Wagland’, 38, ’Clerk’, 14575.00);
El siguiente ejemplo muestra cómo actualizar datos de tablas:
EXEC SQL UPDATE staff
SET salary = salary + 10000
WHERE id >= 310 AND dept = 84;
El siguiente ejemplo muestra cómo suprimir datos de una tabla:
Capítulo 3. Programación de aplicaciones de SQL incorporado 151
![Page 160: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/160.jpg)
EXEC SQL DELETE
FROM staff
WHERE id >= 310 AND salary > 20000;
v COBOL (updat.sqb)
Los tres ejemplos siguientes proceden del ejemplo updat. Consulte este ejemplo
para ver un programa completo que muestra cómo modificar datos de tablas en
COBOL.
El siguiente ejemplo muestra cómo insertar datos de tablas:
EXEC SQL INSERT INTO staff
VALUES (999, ’Testing’, 99, :job-update, 0, 0, 0)
END-EXEC.
El siguiente ejemplo muestra cómo actualizar datos de una tabla; job-update es
una referencia a una variable del lenguaje principal declarada en la sección de
declaración del código fuente:
EXEC SQL UPDATE staff
SET job=:job-update
WHERE job=’Mgr’
END-EXEC.
El siguiente ejemplo muestra cómo suprimir datos de una tabla:
EXEC SQL DELETE
FROM staff
WHERE job=:job-update
END-EXEC.
Conceptos relacionados:
v “Determinación del momento en que deben ejecutarse sentencias de SQL estática
o dinámicamente en aplicaciones de SQL incorporado” en la página 22
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
v “Ejecución de sentencias de SQL estático y dinámico en aplicaciones de SQL
incorporado” en la página 20
Recuperación de información de variables del lenguaje
principal procedente de la estructura SQLDA en aplicaciones
de SQL incorporado
Recuperación de información de variables del lenguaje principal
procedente de la estructura SQLDA en aplicaciones de SQL
incorporado
Con SQL estático, las variables del lenguaje principal utilizadas en sentencias de
SQL incorporado se conocen en el momento de compilar la aplicación. Con SQL
dinámico, las sentencias de SQL incorporado y por lo tanto las variables del
lenguaje principal no se conocen hasta el momento de ejecutar la aplicación. Por lo
tanto, para aplicaciones de SQL dinámico, tiene que trabajar con la lista de las
variables del lenguaje principal que se utilizan en la aplicación. Puede utilizar la
sentencia DESCRIBE para obtener información sobre variables del lenguaje
principal para cualquier sentencia SELECT que se haya preparado (mediante
PREPARE) y almacenar dicha información en el área del descriptor de SQL
(SQLDA).
Cuando la sentencia DESCRIBE se ejecuta en la aplicación, el gestor de bases de
datos define las variables del lenguaje principal en una SQLDA. Cuando las
152 Desarrollo de aplicaciones de SQL incorporado
![Page 161: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/161.jpg)
variables del lenguaje principal se han definido en la SQLDA, puede utilizar la
sentencia FETCH para asignar valores a las variables del lenguaje principal,
mediante un cursor.
Conceptos relacionados:
v “Ejemplo de un cursor en una aplicación de SQL ejecutada dinámicamente” en
la página 187
v “Determinación del momento en que deben ejecutarse sentencias de SQL estática
o dinámicamente en aplicaciones de SQL incorporado” en la página 22
Información relacionada:
v “Sentencia DESCRIBE” en Consulta de SQL, Volumen 2
v “Sentencia FETCH” en Consulta de SQL, Volumen 2
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
v “Estructura de datos SQLDA” en Consulta de las API administrativas
Declaración de la estructura SQLDA en un programa de SQL
ejecutado dinámicamente
La SQLDA contiene un número de ocurrencias de variables de entradas SQLVAR,
cada una de las cuales contiene un grupo de campos que describen una columna
de una fila de datos, tal como se muestra en la siguiente figura. Hay dos tipos de
entradas SQLVAR: entradas SQLVAR base y entradas SQLVAR secundarias.
Procedimiento:
Puesto que el número de entradas SQLVAR necesario depende del número de
columnas de la tabla de resultados, una aplicación debe ser capaz de asignar un
número adecuado de elementos SQLVAR cuando se necesiten. Utilice uno de los
siguientes métodos:
v Proporcione la SQLDA de mayor tamaño (es decir, la que tenga el mayor
número de entradas SQLVAR) que se necesite. El número máximo de columnas
que se pueden devolver en una tabla de resultados es 255. Si cualquiera de las
columnas devueltas es un tipo LOB o un tipo diferenciado, el valor de SQLN se
Figura 3. El Área de descriptores de SQL (SQLDA)
Capítulo 3. Programación de aplicaciones de SQL incorporado 153
![Page 162: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/162.jpg)
dobla y el número de entradas SQLVAR necesarias para albergar la información
se dobla a 510. Sin embargo, puesto que la mayoría de sentencias SELECT no
recuperan ni 255 columnas, la mayoría del espacio asignado no se utiliza.
v Proporcione una SQLDA de menor tamaño con menos entradas SQLVAR. En
este caso, si hay más columnas en el resultado que entradas SQLVAR permitidas
en la SQLDA, no se devuelve ninguna descripción. En su lugar, el gestor de
bases de datos devuelve el número de elementos de lista de selección detectado
en la sentencia SELECT. La aplicación asigna una SQLDA con el número de
entradas SQLVAR necesario y utiliza la sentencia DESCRIBE para adquirir las
descripciones de columnas.
v Cuando el número de columnas devuelto es del tipo LOB o definido por el
usuario, proporcione una SQLDA con el número exacto de entradas SQLVAR.
Para los tres métodos, la duda es cuántas entradas SQLVAR iniciales se deben
asignar. Cada elemento SQLVAR utiliza un máximo de 44 bytes de almacenamiento
(sin contar el almacenamiento asignado para los campos SQLDATA y SQLIND). Si
hay memoria suficiente, el primer método de proporcionar una SQLDA de tamaño
máximo resulta más fácil de implementar.
El segundo método de asignar una SQLDA de menor tamaño sólo se aplica a
lenguajes de programación, como C y C++, que dan soporte a la asignación
dinámica de memoria. Para lenguajes como COBOL y FORTRAN, que no dan
soporte a la asignación dinámica de memoria, utilice el primer método.
Conceptos relacionados:
v “Identificar valores XML en una SQLDA” en la página 80
Tareas relacionadas:
v “Asignación de una estructura SQLDA para un programa de SQL ejecutado
dinámicamente” en la página 159
v “Asignación de una estructura SQLDA con suficientes entradas SQLVAR para
sentencias de SQL ejecutadas dinámicamente” en la página 156
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
v “Preparación de una sentencia de SQL ejecutada dinámicamente utilizando la
estructura SQLDA mínima” en la página 154
Información relacionada:
v “Estructura de datos SQLDA” en Consulta de las API administrativas
Preparación de una sentencia de SQL ejecutada dinámicamente
utilizando la estructura SQLDA mínima
Utilice la información de este tema como ejemplo sobre cómo asignar la estructura
SQLDA mínima para una sentencia.
Restricciones:
Sólo puede asignar una estructura SQLDA de menor tamaño con lenguajes de
programación, como C y C++, que den soporte a la asignación dinámica de
memoria.
Procedimiento:
154 Desarrollo de aplicaciones de SQL incorporado
![Page 163: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/163.jpg)
Supongamos que una aplicación declara una estructura SQLDA denominada
minsqlda que no contiene ninguna entrada SQLVAR. El campo SQLN de la SQLDA
describe el número de entradas SQLVAR que se asignan. En este caso, SQLN se
debe establecer en 0. A continuación, para preparar una sentencia desde la serie de
caracteres dstring y para entrar su descripción en minsqlda, emita la siguiente
sentencia de SQL (suponiendo que se utiliza sintaxis de C y que minsqlda se
declara como un puntero a una estructura SQLDA):
EXEC SQL
PREPARE STMT INTO :*minsqlda FROM :dstring;
Supongamos que la sentencia contenida es dstring es una sentencia SELECT que
devuelve 20 columnas en cada fila. Después de la sentencia PREPARE (o de una
sentencia DESCRIBE), el campo SQLD de la SQLDA contiene el número de
columnas de la tabla de resultados correspondiente a la sentencia SELECT
preparada.
Las entradas SQLVAR de la SQLDA se establecen en los casos siguientes:
v SQLN >= SQLD y ninguna columna tiene el tipo LOB ni un tipo diferenciado.
Las primeras entradas SQLVAR de SQLD se establecen y SQLDOUBLED se
establece en blanco.
v SQLN >= 2*SQLD y al menos una columna es de tipo LOB o tiene un tipo
diferenciado.
2* entradas SQLVAR de SQLD se establecen y SQLDOUBLED se establece en 2.
v SQLD <= SQLN < 2*SQLD y al menos una columna tiene un tipo diferenciado,
pero no hay ninguna columna LOB.
Las primeras entradas SQLVAR de SQLD se establecen y SQLDOUBLED se
establece en blanco. Si la opción de vinculación SQLWARN tiene el valor YES, se
emite un aviso SQLCODE +237 (SQLSTATE 01594).
Las entradas SQLVAR de la SQLDA no se establecen (es necesaria la asignación de
espacio adicional y otra sentencia DESCRIBE) en los casos siguientes:
v SQLN < SQLD y ninguna columna tiene el tipo LOB ni un tipo diferenciado.
No se establece ninguna entrada SQLVAR y SQLDOUBLED se establece en
blanco. Si la opción de vinculación SQLWARN tiene el valor YES, se emite un
aviso SQLCODE +236 (SQLSTATE 01005).
Asigne entradas SQLVAR de SQLD para lograr una operación DESCRIBE
satisfactoria.
v SQLN < SQLD y al menos una columna tiene un tipo diferenciado, pero no hay
ninguna columna LOB.
No se establece ninguna entrada SQLVAR y SQLDOUBLED se establece en
blanco. Si la opción de vinculación SQLWARN tiene el valor YES, se emite un
aviso SQLCODE +239 (SQLSTATE 01005).
Asigne 2*SQLD entradas SQLVAR para lograr una operación DESCRIBE
satisfactoria, incluidos los nombres de los tipos diferenciados.
v SQLN < 2*SQLD y al menos una columna es de tipo LOB.
No se establece ninguna entrada SQLVAR y SQLDOUBLED se establece en
blanco. Se emite un aviso SQLCODE +238 (SQLSTATE 01005)
(independientemente del valor de la opción de vinculación SQLWARN).
Asigne 2*SQLD entradas SQLVAR para lograr una operación DESCRIBE
satisfactoria.
Capítulo 3. Programación de aplicaciones de SQL incorporado 155
![Page 164: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/164.jpg)
La opción SQLWARN del mandato BIND sirve para controlar si DESCRIBE (o
PREPARE...INTO) devolverá los siguientes avisos:
v SQLCODE +236 (SQLSTATE 01005)
v SQLCODE +237 (SQLSTATE 01594)
v SQLCODE +239 (SQLSTATE 01005).
Se recomienda que el código de la aplicación siempre tenga en cuenta que se
pueden devolver estos valores SQLCODE. Siempre se devuelve el aviso SQLCODE
+238 (SQLSTATE 01005) cuando hay columnas LOB en la lista de selección y hay
un número insuficiente de entradas SQLVAR en la SQLDA. Esta es la única manera
que tiene la aplicación para saber que el número de entradas SQLVAR se debe
doblar debido a una columna LOB en el conjunto de resultados.
Tareas relacionadas:
v “Asignación de una estructura SQLDA para un programa de SQL ejecutado
dinámicamente” en la página 159
v “Asignación de una estructura SQLDA con suficientes entradas SQLVAR para
sentencias de SQL ejecutadas dinámicamente” en la página 156
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
Asignación de una estructura SQLDA con suficientes entradas
SQLVAR para sentencias de SQL ejecutadas dinámicamente
Después de determinar el número de columnas de la tabla de resultados, asigne
almacenamiento para un segundo SQLDA de tamaño completo. El primer SQLDA
se utiliza para parámetros de entrada y el segundo SQLDA de tamaño completo se
utiliza para parámetros de salida.
Procedimiento:
Supongamos que la tabla de resultados tiene 20 columnas (ninguna de las cuales es
de tipo LOB). En esta situación, debe asignar una segunda estructura SQLDA,
fulsqlda, con un mínimo de 20 elementos SQLVAR (o 40 elementos si la tabla de
resultados contiene algún LOB o tipo diferenciado). Para el resto de este ejemplo,
supongamos que no hay ningún LOB ni tipo diferenciado en la tabla de resultados.
Cuando calcule los requisitos de almacenamiento para estructuras de SQLDA,
incluya lo siguiente:
v Una cabecera de longitud fija, de 16 bytes de longitud, que contiene campos
como SQLN y SQLD
v Una matriz de longitud variable de entradas SQLVAR, de la cual cada elemento
tiene 44 bytes de longitud en plataformas de 32 bits y 56 bytes de longitud en
plataformas de 64 bits.
El número de entradas SQLVAR necesarias para fulsqlda se especifica en el campo
SQLD de minsqlda. Supongamos que este valor es 20. Por lo tanto, la asignación de
almacenamiento necesaria para fulsqlda es:
16 + (20 * sizeof(struct sqlvar))
Este valor representa el tamaño de la cabecera más 20 multiplicado por el tamaño
de cada entrada SQLVAR, lo que da un total de 896 bytes.
156 Desarrollo de aplicaciones de SQL incorporado
![Page 165: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/165.jpg)
Puede utilizar la macro SQLDASIZE para no tener que realizar sus propios
cálculos y para evitar dependencias específicas de cada versión.
Tareas relacionadas:
v “Asignación de una estructura SQLDA para un programa de SQL ejecutado
dinámicamente” en la página 159
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
v “Preparación de una sentencia de SQL ejecutada dinámicamente utilizando la
estructura SQLDA mínima” en la página 154
Descripción de una sentencia SELECT en un programa de SQL
ejecutado dinámicamente
Después de asignar espacio suficiente para el segundo SQLDA (en este ejemplo,
denominado fulsqlda), debe codificar la aplicación para que describa la sentencia
SELECT.
Procedimiento:
Codifique la aplicación para que lleve a cabo los pasos siguientes:
1. Almacenar el valor 20 en el campo SQLN de fulsqlda (en este ejemplo se
supone que la tabla de resultados contiene 20 columnas y que ninguna de ellas
es una columna LOB).
2. Obtener información sobre la sentencia SELECT mediante la segunda estructura
SQLDA, fulsqlda. Hay dos métodos disponibles:
v Utilizar otra sentencia PREPARE, especificando fulsqlda en lugar de
minsqlda.
v Utilizar la sentencia DESCRIBE especificando fulsqlda.
Es preferible utilizar la sentencia DESCRIBE porque se evita el coste de preparar la
sentencia por segunda vez. La sentencia DESCRIBE simplemente reutiliza la
información obtenida previamente durante la operación de preparación para llenar
la nueva estructura SQLDA. Se puede emitir la siguiente sentencia:
EXEC SQL DESCRIBE STMT INTO :fulsqlda
Una vez ejecutada esta sentencia, cada elemento SQLVAR contiene una descripción
de una columna de la tabla de resultados.
Conceptos relacionados:
v “Recuperación de información de variables del lenguaje principal procedente de
la estructura SQLDA en aplicaciones de SQL incorporado” en la página 152
Tareas relacionadas:
v “Adquisición de almacenamiento para albergar una fila” en la página 158
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
v “Sentencia SELECT” en Consulta de SQL, Volumen 2
v “Sentencia DESCRIBE” en Consulta de SQL, Volumen 2
Capítulo 3. Programación de aplicaciones de SQL incorporado 157
![Page 166: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/166.jpg)
Adquisición de almacenamiento para albergar una fila
Para que una aplicación pueda captar una fila de la tabla de resultados utilizando
una estructura SQLDA, la aplicación debe antes asignar almacenamiento para la
fila.
Procedimiento:
Codifique la aplicación de modo que haga lo siguiente:
1. Analice cada descripción de SQLVAR para determinar cuánto espacio se
necesita para el valor de dicha columna.
Tenga en cuenta que, para valores LOB, cuando se describe la sentencia
SELECT, los datos que se proporcionan en la SQLVAR son SQL_TYP_xLOB.
Este tipo de datos corresponde a una variable del lenguaje principal LOB plana,
es decir, el LOB completo se almacena en memoria de una sola vez. Esto
funciona para LOB pequeños (de un máximo de unos pocos MB), pero no
puede utilizar este tipo de datos para LOB grandes (por ejemplo, de 1 GB)
porque la pila no puede asignar suficiente memoria. Será necesario que la
aplicación cambie su definición de columna en la SQLVAR para que sea
SQL_TYP_xLOB_LOCATOR o SQL_TYPE_xLOB_FILE. (Tenga en que cuenta
que, si se cambia el campo SQLTYPE de la SQLVAR, también se tiene que
cambiar el campo SQLLEN.) Después de cambiar la definición de columna en
la SQLVAR, la aplicación puede asignar la cantidad correcta de almacenamiento
correspondiente al nuevo tipo.
2. Asigne almacenamiento para el valor de dicha columna.
3. Almacene la dirección del almacenamiento asignado en el campo SQLDATA de
la estructura SQLDA.
Estos pasos se deben llevar a cabo analizando la descripción de cada columna y
sustituyendo el contenido de cada campo SQLDATA por la dirección de un área de
almacenamiento lo suficientemente grande como para albergar cualquier valor
procedente de dicha columna. El atributo de longitud se determina a partir del
campo SQLLEN de cada entrada SQLVAR correspondiente a elementos de datos
que no son de tipo LOB. Para elementos con un tipo BLOB, CLOB o DBCLOB, el
atributo de longitud se determina a partir del campo SQLLONGLEN de la entrada
SQLVAR secundaria.
Además, si la columna especificada permite nulos, la aplicación debe sustituir el
contenido del campo SQLIND por la dirección de una variable de indicador
correspondiente a la columna.
Conceptos relacionados:
v “Recuperación de información de variables del lenguaje principal procedente de
la estructura SQLDA en aplicaciones de SQL incorporado” en la página 152
v “Uso de objetos grandes” en Desarrollo de SQL y rutinas externas
Tareas relacionadas:
v “Asignación de una estructura SQLDA para un programa de SQL ejecutado
dinámicamente” en la página 159
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
v “Proceso del cursor en un programa SQL ejecutado dinámicamente” en la página
159
158 Desarrollo de aplicaciones de SQL incorporado
![Page 167: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/167.jpg)
v “Transferencia de datos en un programa de SQL ejecutado dinámicamente
utilizando una estructura SQLDA” en la página 163
Proceso del cursor en un programa SQL ejecutado
dinámicamente
Después de asignar correctamente la estructura SQLDA, el cursor asociado con la
sentencia SELECT se puede abrir y se pueden captar filas.
Procedimiento:
Para procesar el cursor asociado con una sentencia SELECT, primero abra el cursor
y luego capte filas especificando la cláusula USING DESCRIPTOR de la sentencia
FETCH. Por ejemplo, una aplicación C podría tener lo siguiente:
EXEC SQL OPEN pcurs
EMB_SQL_CHECK( "OPEN" ) ;
EXEC SQL FETCH pcurs USING DESCRIPTOR :*sqldaPointer
EMB_SQL_CHECK( "FETCH" ) ;
Para procesar una operación FETCH satisfactoriamente, podría escribir la
aplicación de modo que obtuviera los datos de la SQLDA y mostrara las cabeceras
de columna. Por ejemplo:
display_col_titles( sqldaPointer ) ;
Una vez visualizados los datos, debería cerrar el cursor y liberar la memoria
asignada de forma dinámica. Por ejemplo:
EXEC SQL CLOSE pcurs ;
EMB_SQL_CHECK( "CLOSE CURSOR" ) ;
Conceptos relacionados:
v “Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado” en la página 181
v “Ejemplo de un cursor en una aplicación de SQL ejecutada dinámicamente” en
la página 187
Tareas relacionadas:
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
v “Transferencia de datos en un programa de SQL ejecutado dinámicamente
utilizando una estructura SQLDA” en la página 163
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
v “Colocación de un cursor en una fila con un determinado valor de columna” en
la página 183
v “Declaración y utilización de cursores en una aplicación de SQL ejecutada
dinámicamente” en la página 185
Asignación de una estructura SQLDA para un programa de SQL
ejecutado dinámicamente
Asigne una estructura SQLDA correspondiente a la aplicación de modo que pueda
utilizarla para pasar datos a la aplicación y para recibir datos de esta.
Procedimiento:
Capítulo 3. Programación de aplicaciones de SQL incorporado 159
![Page 168: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/168.jpg)
Para crear una estructura SQLDA con C, incorpore la sentencia INCLUDE SQLDA
en el lenguaje principal o incluya el archivo include de SQLDA para obtener la
definición de estructura. Luego, debido a que el tamaño de una SQLDA no es fijo,
la aplicación debe declarar un puntero a una estructura SQLDA y asignar
almacenamiento para la misma. El tamaño real de la estructura SQLDA depende
del número de elementos de datos diferenciados que se pasan mediante la SQLDA.
En el lenguaje de programación C y C++, se proporciona una macro que facilita la
asignación de SQLDA. Esta macro tiene el siguiente formato:
#define SQLDASIZE(n) (offsetof(struct sqlda, sqlvar) \
+ (n) × sizeof(struct sqlvar))
El efecto de esta macro es calcular el almacenamiento necesario para una SQLDA
con n elementos SQLVAR.
Para crear una estructura SQLDA con COBOL, puede incorporar una sentencia
INCLUDE SQLDA o utilizar la sentencia COPY. Utilice la sentencia COPY cuando
desee controlar el número máximo de entradas SQLVAR y por tanto la cantidad de
espacio de almacenamiento ocupado por la SQLDA. Por ejemplo, para cambiar el
número por omisión de entradas SQLVAR de 1489 a 1, utilice la siguiente sentencia
COPY:
COPY "sqlda.cbl"
replacing --1489--
by --1--.
El lenguaje FORTRAN no da soporte directamente a las estructuras de datos
autodefinidas ni a la asignación dinámica. No se proporciona ningún archivo
include de SQLDA para FORTRAN porque no es posible dar soporte a la SQLDA
como una estructura de datos en FORTRAN. El precompilador pasará por alto la
sentencia INCLUDE SQLDA en un programa FORTRAN.
Sin embargo, puede crear algo parecido a una estructura SQLDA estática en un
programa FORTRAN y utilizar dicha estructura siempre que se pueda utilizar una
SQLDA. El archivo sqldact.f contiene constantes que ayudan a declarar una
estructura SQLDA en FORTRAN.
Ejecute llamadas a SQLGADDR para asignar valores de puntero a elementos de
SQLDA que los necesiten.
La tabla siguiente muestra la declaración y uso de una estructura SQLDA con un
elemento SQLVAR.
Lenguaje Código fuente de ejemplo
C y C++
#include
struct sqlda *outda = (struct sqlda *)malloc(SQLDASIZE(1));
/* DECLARAR VARIABLES LOCALES PARA ALBERGAR DATOS REALES */
double sal = 0;
short salind = 0;
/* INICIALIZAR UN ELEMENTO DE SQLDA */
memcpy( outda->sqldaid,"SQLDA ",sizeof(outda->sqldaid));
outda->sqln = outda->sqld = 1;
outda->sqlvar[0].sqltype = SQL_TYP_NFLOAT;
outda->sqlvar[0].sqllen = sizeof( double );.
outda->sqlvar[0].sqldata = (unsigned char *)&sal;
outda->sqlvar[0].sqlind = (short *)&salind;
160 Desarrollo de aplicaciones de SQL incorporado
![Page 169: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/169.jpg)
Lenguaje Código fuente de ejemplo
COBOL
WORKING-STORAGE SECTION.
77 SALARY PIC S99999V99 COMP-3.
77 SAL-IND PIC S9(4) COMP-5.
EXEC SQL INCLUDE SQLDA END-EXEC
* O codificar un modo útil para guardar entradas SQLVAR no utilizadas.
* COPY "sqlda.cbl" REPLACING --1489-- BY --1--.
01 decimal-sqllen pic s9(4) comp-5.
01 decimal-parts redefines decimal-sqllen.
05 precision pic x.
05 scale pic x.
* Inicializar un elemento de SQLDA de salida
MOVE 1 TO SQLN
MOVE 1 TO SQLD
MOVE SQL-TYP-NDECIMAL TO SQLTYPE(1)
* Longitud = 7 dígitos de precisión y 2 dígitos de escala
MOVE x"07" TO PRECISION.
MOVE x"02" TO SCALE.
MOVE DECIMAL-SQLLEN TO O-SQLLEN(1).
SET SQLDATA(1) TO ADDRESS OF SALARY
SET SQLIND(1) TO ADDRESS OF SAL-IND
Capítulo 3. Programación de aplicaciones de SQL incorporado 161
![Page 170: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/170.jpg)
Lenguaje Código fuente de ejemplo
FORTRAN
include ’sqldact.f’
integer*2 sqlvar1
parameter ( sqlvar1 = sqlda_header_sz + 0*sqlvar_struct_sz )
C Declarar una SQLDA de salida -- 1 Variable
character out_sqlda(sqlda_header_sz + 1*sqlvar_struct_sz)
character*8 out_sqldaid ! Cabecera
integer*4 out_sqldabc
integer*2 out_sqln
integer*2 out_sqld
integer*2 out_sqltype1 ! Primera variable
integer*2 out_sqllen1
integer*4 out_sqldata1
integer*4 out_sqlind1
integer*2 out_sqlnamel1
character*30 out_sqlnamec1
equivalence( out_sqlda(sqlda_sqldaid_ofs), out_sqldaid )
equivalence( out_sqlda(sqlda_sqldabc_ofs), out_sqldabc )
equivalence( out_sqlda(sqlda_sqln_ofs), out_sqln )
equivalence( out_sqlda(sqlda_sqld_ofs), out_sqld )
equivalence( out_sqlda(sqlvar1+sqlvar_type_ofs), out_sqltype1 )
equivalence( out_sqlda(sqlvar1+sqlvar_len_ofs), out_sqllen1 )
equivalence( out_sqlda(sqlvar1+sqlvar_data_ofs), out_sqldata1 )
equivalence( out_sqlda(sqlvar1+sqlvar_ind_ofs), out_sqlind1 )
equivalence( out_sqlda(sqlvar1+sqlvar_name_length_ofs),
+ out_sqlnamel1 )
equivalence( out_sqlda(sqlvar1+sqlvar_name_data_ofs),
+ out_sqlnamec1 )
C Declarar variables locales para albergar los datos devueltos.
real*8 salary
integer*2 sal_ind
C Inicializar la SQLDA de salida (cabecera)
out_sqldaid = ’OUT_SQLDA’
out_sqldabc = sqlda_header_sz + 1*sqlvar_struct_sz
out_sqln = 1
out_sqld = 1
C Inicializar VAR1
out_sqltype1 = SQL_TYP_NFLOAT
out_sqllen1 = 8
rc = sqlgaddr( %ref(salary), %ref(out_sqldata1) )
rc = sqlgaddr( %ref(sal_ind), %ref(out_sqlind1) )
Nota: El ejemplo anterior se ha escrito para FORTRAN de 32 bits.
En lenguajes que no dan soporte a la asignación dinámica de memoria, se debe
declarar de forma explícita en el lenguaje principal una SQLDA con el número
deseado de elementos SQLVAR. Asegúrese de declarar el número suficiente de
elementos SQLVAR según los requisitos de la aplicación.
Tareas relacionadas:
v “Asignación de una estructura SQLDA con suficientes entradas SQLVAR para
sentencias de SQL ejecutadas dinámicamente” en la página 156
v “Transferencia de datos en un programa de SQL ejecutado dinámicamente
utilizando una estructura SQLDA” en la página 163
162 Desarrollo de aplicaciones de SQL incorporado
![Page 171: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/171.jpg)
v “Preparación de una sentencia de SQL ejecutada dinámicamente utilizando la
estructura SQLDA mínima” en la página 154
Transferencia de datos en un programa de SQL ejecutado
dinámicamente utilizando una estructura SQLDA
Puede obtener una mayor flexibilidad si transfiere datos mediante una SQLDA que
si utiliza listas de variables del lenguaje principal. Por ejemplo, puede utilizar una
SQLDA para transferir datos que no tienen ningún equivalente en el lenguaje
principal, como datos DECIMAL en lenguaje C.
Procedimiento:
Utilice la siguiente tabla como listado de referencias cruzadas que muestra cómo se
relacionan los valores numéricos y los nombres simbólicos.
Tabla 17. Tipos de SQL de SQLDA de DB2. Valores numéricos y nombres simbólicos correspondientes
Tipo de columna SQL
Valor numérico
SQLTYPE Nombre simbólico SQLTYPE1
DATE 384/385 SQL_TYP_DATE / SQL_TYP_NDATE
TIME 388/389 SQL_TYP_TIME / SQL_TYP_NTIME
TIMESTAMP 392/393 SQL_TYP_STAMP / SQL_TYP_NSTAMP
n/d2 400/401 SQL_TYP_CGSTR / SQL_TYP_NCGSTR
BLOB 404/405 SQL_TYP_BLOB / SQL_TYP_NBLOB
CLOB 408/409 SQL_TYP_CLOB / SQL_TYP_NCLOB
DBCLOB 412/413 SQL_TYP_DBCLOB / SQL_TYP_NDBCLOB
VARCHAR 448/449 SQL_TYP_VARCHAR / SQL_TYP_NVARCHAR
CHAR 452/453 SQL_TYP_CHAR / SQL_TYP_NCHAR
LONG VARCHAR 456/457 SQL_TYP_LONG / SQL_TYP_NLONG
n/d3 460/461 SQL_TYP_CSTR / SQL_TYP_NCSTR
VARGRAPHIC 464/465 SQL_TYP_VARGRAPH / SQL_TYP_NVARGRAPH
GRAPHIC 468/469 SQL_TYP_GRAPHIC / SQL_TYP_NGRAPHIC
LONG VARGRAPHIC 472/473 SQL_TYP_LONGRAPH / SQL_TYP_NLONGRAPH
FLOAT 480/481 SQL_TYP_FLOAT / SQL_TYP_NFLOAT
REAL4 480/481 SQL_TYP_FLOAT / SQL_TYP_NFLOAT
DECIMAL5 484/485 SQL_TYP_DECIMAL / SQL_TYP_DECIMAL
INTEGER 496/497 SQL_TYP_INTEGER / SQL_TYP_NINTEGER
SMALLINT 500/501 SQL_TYP_SMALL / SQL_TYP_NSMALL
n/d 804/805 SQL_TYP_BLOB_FILE / SQL_TYPE_NBLOB_FILE
n/d 808/809 SQL_TYP_CLOB_FILE / SQL_TYPE_NCLOB_FILE
n/d 812/813 SQL_TYP_DBCLOB_FILE / SQL_TYPE_NDBCLOB_FILE
n/d 960/961 SQL_TYP_BLOB_LOCATOR / SQL_TYP_NBLOB_LOCATOR
n/d 964/965 SQL_TYP_CLOB_LOCATOR / SQL_TYP_NCLOB_LOCATOR
n/d 968/969 SQL_TYP_DBCLOB_LOCATOR / SQL_TYP_NDBCLOB_LOCATOR
XML 988/989 SQL_TYP_XML / SQL_TYP_XML
Capítulo 3. Programación de aplicaciones de SQL incorporado 163
![Page 172: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/172.jpg)
Tabla 17. Tipos de SQL de SQLDA de DB2 (continuación). Valores numéricos y nombres simbólicos
correspondientes
Tipo de columna SQL
Valor numérico
SQLTYPE Nombre simbólico SQLTYPE1
Nota: Estos tipos definidos se encuentran en el archivo include sql.h del subdirectorio include del directorio sqllib.
(Por ejemplo, sqllib/include/sql.h para el lenguaje de programación C.)
1. Para el lenguaje de programación COBOL, el nombre SQLTYPE no utiliza el signo de subrayado (_) sino un guión
(-).
2. Es una serie gráfica terminada en nulo.
3. Es una serie de caracteres terminada en nulo.
4. La diferencia entre REAL y DOUBLE en la SQLDA es el valor de la longitud (4 u 8).
5. La precisión está en el primer byte. La escala está en el segundo byte.
Tareas relacionadas:
v “Adquisición de almacenamiento para albergar una fila” en la página 158
v “Descripción de una sentencia SELECT en un programa de SQL ejecutado
dinámicamente” en la página 157
v “Proceso del cursor en un programa SQL ejecutado dinámicamente” en la página
159
Proceso de sentencias de SQL interactivas en programas de
SQL ejecutados dinámicamente
Una aplicación que utiliza SQL dinámico se puede escribir de modo que procese
sentencias arbitrarias de SQL. Por ejemplo, si una aplicación acepta sentencias de
SQL del usuario, la aplicación debe ser capaz de ejecutar las sentencias sin
conocimiento previo de las mismas. Los valores desconocidos hasta el momento de
la ejecución se pueden representar mediante marcadores de parámetro, que se
indican mediante signos de interrogación. Los marcadores de parámetro permiten
la interacción entre el usuario y la aplicación y se parecen a las variables del
lenguaje principal para sentencias de SQL estático.
Procedimiento:
Utilice las sentencias PREPARE y DESCRIBE con una estructura SQLDA de modo
que la aplicación pueda determinar el tipo de sentencia de SQL que se ejecutan y
actuar consecuentemente.
Conceptos relacionados:
v “Determinación del tipo de sentencia en programas de SQL ejecutados
dinámicamente” en la página 164
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
v “Sentencia DESCRIBE” en Consulta de SQL, Volumen 2
Determinación del tipo de sentencia en programas de SQL
ejecutados dinámicamente
Cuando se prepara una sentencia de SQL, la información sobre el tipo de sentencia
se puede determinar examinando la estructura SQLDA. Esta información se coloca
164 Desarrollo de aplicaciones de SQL incorporado
![Page 173: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/173.jpg)
en la estructura SQLDA en el momento de la preparación de la sentencia con la
cláusula INTO o emitiendo una sentencia DESCRIBE contra una sentencia
preparada anteriormente.
En cualquier caso, el gestor de bases de datos coloca un valor en el campo SQLD
de la estructura SQLDA que indica el número de columnas de la tabla de
resultados generada por la sentencia de SQL. Si el campo SQLD contiene un cero
(0), significa que la sentencia no es una sentencia SELECT. Puesto que la sentencia
ya está preparada, se puede ejecutar inmediatamente mediante la sentencia
EXECUTE.
Si la sentencia contiene marcadores de parámetros, se debe especificar la cláusula
USING. La cláusula USING puede especificar una lista de variables del lenguaje
principal o una estructura SQLDA.
Si el campo SQLD es mayor que cero, significa que la sentencia es una sentencia
SELECT y se debe procesar tal como se describe en las siguientes secciones.
Información relacionada:
v “Sentencia EXECUTE” en Consulta de SQL, Volumen 2
v “Sentencia SELECT INTO” en Consulta de SQL, Volumen 2
v “Sentencia DESCRIBE” en Consulta de SQL, Volumen 2
Proceso de sentencias SELECT de lista de variables en
programas de SQL ejecutados dinámicamente
Una sentencia SELECT de lista de variables es una sentencia en la que el número y
los tipos de columnas que se tienen que devolver no se conocen en el momento de
la precompilación. En este caso, la aplicación no sabe con antelación las variables
exactas del lenguaje principal que se tienen que declarar para albergar una fila de
la tabla de resultados.
Procedimiento:
Para procesar una sentencia SELECT de lista de variables, codifique la aplicación
de modo que haga lo siguiente:
1. Declare una SQLDA.
Se debe utilizar una estructura SQLDA para procesar las sentencias SELECT de
lista de variables.
2. PREPARE la sentencia mediante la cláusula INTO.
Luego la aplicación determina si la estructura SQLDA declarada tiene
suficientes elementos SQLVAR. Si no es así, la aplicación asigna otra estructura
SQLDA con el número necesario de elementos SQLVAR y emite una sentencia
DESCRIBE adicional mediante el nuevo SQLDA.
3. Asigne los elementos SQLVAR.
Asigne almacenamiento para las variables del lenguaje principal e indicadores
necesarios para cada SQLVAR. Este paso incluye la colocación de las
direcciones asignadas para los datos y variables de indicador en cada elemento
SQLVAR.
4. Procese la sentencia SELECT.
Se asocia un cursor con la sentencia preparada, se abre y las filas se captan
mediante la estructura SQLDA correctamente asignada.
Capítulo 3. Programación de aplicaciones de SQL incorporado 165
![Page 174: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/174.jpg)
Tareas relacionadas:
v “Adquisición de almacenamiento para albergar una fila” en la página 158
v “Asignación de una estructura SQLDA con suficientes entradas SQLVAR para
sentencias de SQL ejecutadas dinámicamente” en la página 156
v “Declaración de la estructura SQLDA en un programa de SQL ejecutado
dinámicamente” en la página 153
v “Descripción de una sentencia SELECT en un programa de SQL ejecutado
dinámicamente” en la página 157
v “Preparación de una sentencia de SQL ejecutada dinámicamente utilizando la
estructura SQLDA mínima” en la página 154
v “Proceso del cursor en un programa SQL ejecutado dinámicamente” en la página
159
Cómo guardar peticiones de SQL procedentes de usuarios
finales
Si los usuarios de la aplicación pueden emitir peticiones de SQL desde la
aplicación, es posible que desee guardar dichas peticiones.
Procedimiento:
Si la aplicación permite a los usuarios guardar sentencias arbitrarias de SQL, las
puede guardar en una tabla con una columna que tenga el tipo VARCHAR, LONG
VARCHAR, CLOB, VARGRAPHIC, LONG VARGRAPHIC o DBCLOB. Tenga en
cuenta que los tipos de datos VARGRAPHIC, LONG VARGRAPHIC y DBCLOB
sólo están disponibles en entornos de juego de caracteres de doble byte (DBCS) y
de Extended UNIX Code (EUC).
Debe guardar los elementos SQL fuente, no las versiones preparadas. Esto significa
que debe recuperar y luego preparar cada sentencia antes de ejecutar la versión
almacenada en la tabla. Básicamente, la aplicación prepara una sentencia de SQL a
partir de una serie de caracteres y ejecuta esta sentencia de forma dinámica.
Conceptos relacionados:
v “Ejemplo de marcadores de parámetros en un programa de SQL ejecutado
dinámicamente” en la página 170
Tareas relacionadas:
v “Cómo proporcionar entrada de variables a una sentencia de SQL ejecutada
dinámicamente mediante marcadores de parámetros” en la página 169
Ejecución de expresiones XQuery en aplicaciones de SQL
incorporado
Puede almacenar datos XML en las tablas y utilizar aplicaciones de SQL
incorporado para acceder a columnas XML mediante expresiones XQuery. Para
acceder a datos XML, utilice variables del lenguaje principal XML en lugar de
convertir los datos a tipos de datos de carácter o binarios. Si no utiliza las variables
del lenguaje principal XML, la mejor alternativa para acceder a datos XML es
mediante FOR BIT DATA o con tipos de datos BLOB para evitar conversiones de
páginas de códigos.
Requisitos previos:
166 Desarrollo de aplicaciones de SQL incorporado
![Page 175: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/175.jpg)
v Declare las variables del lenguaje principal XML dentro de las aplicaciones de
SQL incorporado.
Restricciones:
v Se debe utilizar un tipo XML para recuperar valores de XML en una sentencia
de SQL estático SELECT INTO.
v Si se utiliza una variable del lenguaje principal CHAR, VARCHAR, CLOB o
BLOB para entrada donde se espera un valor XML, el valor estará sujeto a una
operación de función XMLPARSE con manejo por omisión de espacios en blanco
(STRIP). De lo contrario, se necesita una variable del lenguaje principal XML.
Procedimiento:
Para ejecutar expresiones XQuery en la aplicación de SQL incorporado
directamente, añada al principio de la expresión la palabra clave ″XQUERY″. Para
SQL estático, utilice la función XMLQUERY. Cuando se llama a la función
XMLQUERY, la expresión XQuery no tiene el prefijo ″XQUERY″.
Ejemplo 1: Ejecución de expresiones XQuery directamente en SQL dinámico C y
C++ añadiendo como prefijo la palabra clave ″XQUERY″:
En aplicaciones C y C++, las expresiones XQuery se pueden ejecutar del siguiente
modo:
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char stmt[16384];
SQL TYPE IS XML AS BLOB( 10K ) xmlblob;
EXEC SQL END DECLARE SECTION;
sprintf( stmt, "XQUERY (10, xs:integer(1) to xs:integer(4))" );
EXEC SQL PREPARE s1 FROM :stmt;
EXEC SQL DECLARE c1 CURSOR FOR s1;
EXEC SQL OPEN c1;
while( sqlca.sqlcode == SQL_RC_OK )
{
EXEC SQL FETCH c1 INTO :xmlblob;
/* Mostrar resultados */
}
EXEC SQL CLOSE c1;
EXEC SQL COMMIT;
Ejemplo 2: Ejecución de expresiones XQuery en SQL estático utilizando la
función XMLQUERY:
Las sentencias de SQL que contienen la función XMLQUERY se pueden preparar
de forma estática, del siguiente modo:
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
SQL TYPE IS XML AS BLOB( 10K ) xmlblob;
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE C1 CURSOR FOR SELECT XMLQUERY( ’(10, xs:integer(1) to
xs:integer(4))’ RETURNING SEQUENCE BY REF) from SYSIBM.SYSDUMMY1;
EXEC SQL OPEN c1;
while( sqlca.sqlcode == SQL_RC_OK )
Capítulo 3. Programación de aplicaciones de SQL incorporado 167
![Page 176: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/176.jpg)
{
EXEC SQL FETCH c1 INTO :xmlblob;
/* Mostrar resultados */
}
EXEC SQL CLOSE c1;
EXEC SQL COMMIT;
Ejemplo 3: Ejecución de expresiones XQuery en aplicaciones de SQL
incorporado COBOL:
En aplicaciones COBOL, las expresiones XQuery se pueden ejecutar del siguiente
modo:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 stmt pic x(80).
01 xmlBuff USAGE IS SQL TYPE IS XML AS BLOB (10K).
EXEC SQL END DECLARE SECTION END-EXEC.
MOVE "XQUERY (10, xs:integer(1) to xs:integer(4))" TO stmt.
EXEC SQL PREPARE s1 FROM :stmt END-EXEC.
EXEC SQL DECLARE c1 CURSOR FOR s1 END-EXEC.
EXEC SQL OPEN c1 USING :host-var END-EXEC.
*Llamar a FETCH y al bucle UPDATE.
Perform Fetch-Loop through End-Fetch-Loop
until SQLCODE does not equal 0.
EXEC SQL CLOSE c1 END-EXEC.
EXEC SQL COMMIT END-EXEC.
Fetch-Loop Section.
EXEC SQL FETCH c1 INTO :xmlBuff END-EXEC.
if SQLCODE not equal 0
go to End-Fetch-Loop.
* Mostrar resultados
End-Fetch-Loop. exit.
Conceptos relacionados:
v “Almacenamiento binario de valores de variables mediante la cláusula FOR BIT
DATA en aplicaciones de SQL incorporado C y C++” en la página 112
v “Almacenamiento binario de valores de variables mediante la cláusula FOR BIT
DATA en aplicaciones de SQL incorporado COBOL” en la página 129
v “Tipos de datos que se correlacionan con tipos de datos SQL en aplicaciones de
SQL incorporado” en la página 59
v “Ejemplo: cómo hacer referencia a variables del lenguaje principal XML en
aplicaciones de SQL incorporado” en la página 85
v “XML serialization” en XML Guide
Tareas relacionadas:
v “Declaración de variables del lenguaje principal XML en aplicaciones de SQL
incorporado” en la página 79
Información relacionada:
v “Recomendaciones para desarrollar aplicaciones de SQL incorporado con XML y
XQuery” en la página 30
168 Desarrollo de aplicaciones de SQL incorporado
![Page 177: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/177.jpg)
Suministro de entrada de variables a un SQL ejecutado
dinámicamente mediante marcadores de parámetros
Cómo proporcionar entrada de variables a una sentencia de SQL
ejecutada dinámicamente mediante marcadores de parámetros
Una sentencia de SQL dinámico no puede contener variables del lenguaje
principal, porque la información de las variables del lenguaje principal (tipo de
datos y longitud) sólo está disponible durante la precompilación de la aplicación.
En el momento de la ejecución, la información de las variables del lenguaje
principal no está disponible.
En SQL dinámico, se utilizan marcadores de parámetros en lugar de variables del
lenguaje principal. Los marcadores de parámetros se indican mediante un signo de
interrogación (?)e indican dónde se debe sustituir una variable del lenguaje
principal dentro de una sentencia de SQL.
Procedimiento:
Supongamos que la aplicación utiliza SQL dinámico y que desea que pueda
realizar una operación DELETE. Una serie de caracteres que contenga un marcador
de parámetros puede tener un aspecto parecido al siguiente:
DELETE FROM TEMPL WHERE EMPNO = ?
Cuando se ejecuta esta sentencia, se especifica una variable del lenguaje principal o
una estructura SQLDA mediante la cláusula USING de la sentencia EXECUTE. El
contenido de la variable del lenguaje principal se utiliza cuando se ejecuta la
sentencia.
El marcador de parámetros adopta un tipo de datos y longitud supuestos que
dependen del contexto de su uso dentro de la sentencia de SQL. Si el tipo de datos
de un marcador de parámetros no resulta obvio a partir del contexto de la
sentencia en la que se utiliza, utilice CAST para especificar el tipo. Dicho marcador
de parámetros se considera un a marcador de parámetros tipificado. Los marcadores
de parámetros tipificados se tratan como una variable del lenguaje principal del
tipo determinado. Por ejemplo, la sentencia SELECT ? FROM SYSCAT.TABLES no es
válida porque DB2 no conoce el tipo de la columna de resultados. Sin embargo, la
sentencia SELECT CAST(? AS INTEGER) FROM SYSCAT.TABLES es válida porque cast
indica que el marcador de parámetros representa un INTEGER, de modo que DB2
conoce el tipo de la columna de resultados.
Si la sentencia de SQL contiene más de un marcador de parámetros, la cláusula
USING de la sentencia EXECUTE debe especificar una lista de variables del
lenguaje principal (una para cada marcador de parámetros) o debe identificar una
SQLDA que tenga una entrada SQLVAR para cada marcador de parámetros.
(Observe que para los LOB, existen dos entradas SQLVAR por cada marcador de
parámetros.) La lista de variables del lenguaje principal o entradas SQLVAR se
comparan de acuerdo con el orden de los marcadores de parámetros en la
sentencia y deben tener tipos de datos compatibles.
Nota: El utilizar un marcador de parámetros con SQL dinámico es como utilizar
variables del lenguaje principal con SQL estático. En cualquier caso, el
optimizador no utiliza estadísticas de distribución y es posible que no elija
el mejor plan de acceso.
Capítulo 3. Programación de aplicaciones de SQL incorporado 169
![Page 178: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/178.jpg)
Las normas que se aplican a marcadores de parámetros se describen con la
sentencia PREPARE.
Conceptos relacionados:
v “Ejemplo de marcadores de parámetros en un programa de SQL ejecutado
dinámicamente” en la página 170
Información relacionada:
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
v “Sentencia EXECUTE” en Consulta de SQL, Volumen 2
v “Conversiones entre tipos de datos” en Consulta de SQL, Volumen 1
Ejemplo de marcadores de parámetros en un programa de SQL
ejecutado dinámicamente
Los siguientes ejemplos muestran cómo utilizar marcadores de parámetros en un
programa de SQL dinámico:
v C y C++ (dbuse.sqc/dbuse.sqC)
La función DynamicStmtWithMarkersEXECUTEusingHostVars() del ejemplo de
lenguaje C dbuse.sqc muestra cómo realizar una supresión mediante un
marcador de parámetro con una variable del lenguaje principal:
EXEC SQL BEGIN DECLARE SECTION;
char hostVarStmt1[50];
short hostVarDeptnumb;
EXEC SQL END DECLARE SECTION;
/* preparar la sentencia con un marcador de parámetros */
strcpy(hostVarStmt1, "DELETE FROM org WHERE deptnumb = ?");
EXEC SQL PREPARE Stmt1 FROM :hostVarStmt1;
/* ejecutar la sentencia correspondiente a hostVarDeptnumb = 15 */
hostVarDeptnumb = 15;
EXEC SQL EXECUTE Stmt1 USING :hostVarDeptnumb;
v COBOL (varinp.sqb)
El siguiente ejemplo procede del ejemplo de COBOL varinp.sqb y muestra cómo
utilizar un marcador de parámetros en condiciones de búsqueda y actualización:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 pname pic x(10).
01 dept pic s9(4) comp-5.
01 st pic x(127).
01 parm-var pic x(5).
EXEC SQL END DECLARE SECTION END-EXEC.
move "SELECT name, dept FROM staff
- " WHERE job = ? FOR UPDATE OF job" to st.
EXEC SQL PREPARE s1 FROM :st END-EXEC.
EXEC SQL DECLARE c1 CURSOR FOR s1 END-EXEC.
move "Mgr" to parm-var.
EXEC SQL OPEN c1 USING :parm-var END-EXEC
move "Clerk" to parm-var.
move "UPDATE staff SET job = ? WHERE CURRENT OF c1" to st.
EXEC SQL PREPARE s2 from :st END-EXEC.
* llamar a FETCH y al bucle UPDATE.
170 Desarrollo de aplicaciones de SQL incorporado
![Page 179: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/179.jpg)
perform Fetch-Loop thru End-Fetch-Loop
until SQLCODE not equal 0.
EXEC SQL CLOSE c1 END-EXEC.
Conceptos relacionados:
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
Ejemplos relacionados:
v “dbuse.out -- HOW TO USE A DATABASE (C)”
v “dbuse.sqc -- How to use a database (C)”
v “dbuse.out -- HOW TO USE A DATABASE (C++)”
v “dbuse.sqC -- How to use a database (C++)”
Llamada a procedimientos almacenados en aplicaciones de
SQL incorporado
Llamada a procedimientos almacenados en aplicaciones de SQL
incorporado
Se puede llamar a procedimientos almacenados desde aplicaciones de SQL
incorporado formulando y ejecutando la sentencia CALL con los parámetros y
referencia a procedimiento adecuados. La sentencia CALL se puede ejecutar de
forma estática o dinámica dentro de aplicaciones de SQL incorporado. Sin
embargo, para cada lenguaje de programación hay distintos métodos para ejecutar
este mandato. Independientemente del lenguaje principal, cada variable del
lenguaje principal utilizada en el procedimiento almacenado se tiene que declarar
de modo que coincida con el tipo de datos necesario.
Las aplicaciones cliente y la llamada de rutinas intercambian información con los
procedimientos a través de parámetros y conjuntos de resultados. Los parámetros
correspondientes a procedimientos están definidos por la dirección en que viajan
los datos (la modalidad de parámetro).
Existen tres tipos de parámetros para los procedimientos:
v Parámetros IN: los datos pasados al procedimiento.
v Parámetros OUT: los datos devueltos por el procedimiento.
v Parámetros INOUT: los datos pasados al procedimiento que, durante la ejecución
del mismo, se sustituyen por datos que el procedimiento debe devolver.
La modalidad de los parámetros y sus tipos de datos se definen cuando se registra
un procedimiento con la sentencia CREATE PROCEDURE.
Conceptos relacionados:
v “Llamada a procedimientos almacenados desde REXX” en la página 172
v “Llamada a procedimientos almacenados en aplicaciones de SQL incorporado C
y C++” en la página 171
Llamada a procedimientos almacenados en aplicaciones de SQL
incorporado C y C++
Llamada a procedimientos almacenados en aplicaciones de SQL incorporado C y
C++:
Capítulo 3. Programación de aplicaciones de SQL incorporado 171
![Page 180: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/180.jpg)
DB2 da soporte al uso de parámetros de entrada, de salida y de entrada y salida
en procedimientos de SQL. Las palabras clave IN, OUT e INOUT en la sentencia
CREATE PROCEDURE indican la modalidad o el uso deseado del parámetro. Los
parámetros IN y OUT se pasan por valor, y los parámetros INOUT se pasan por
referencia.
Cuando se trabaja con aplicaciones C y C++, se puede llamar a un procedimiento
almacenado, INOUT_PARAM, mediante la siguiente sentencia:
EXEC SQL CALL INOUT_PARAM(:inout_median:medianind, :out_sqlcode:codeind,
:out_buffer:bufferind);
donde inout_median, out_sqlcode y out_buffer son variables del lenguaje principal
y medianind, codeind y bufferind son variables de indicadores de nulo.
Nota: También se puede llamar a procedimientos almacenados dinámicamente
preparando una sentencia CALL.
Conceptos relacionados:
v “Rutinas: Procedimientos” en Desarrollo de SQL y rutinas externas
Información relacionada:
v “Ejemplos de procedimientos ” en Temas de ejemplos
Llamada a procedimientos almacenados desde REXX
Llamada a procedimientos almacenados desde REXX: El procedimiento
almacenado puede estar escrito en cualquier lenguaje soportado en dicho servidor,
a excepción de REXX en los sistemas AIX. (Las aplicaciones cliente pueden estar
escritas en REXX en los sistemas AIX, pero, al igual que en otros lenguajes, no
pueden llamar a un procedimiento almacenado escrito en REXX en AIX.)
Conceptos relacionados:
v “Procedimientos almacenados en REXX” en la página 172
Procedimientos almacenados en REXX: La sentencia CALL permite que una
aplicación cliente pase datos a un procedimiento almacenado en un servidor, y
reciba datos del mismo. La interfaz para los datos tanto de entrada como de salida
es una lista de variables del lenguaje principal. Puesto que REXX suele determinar
el tipo y el tamaño de las variables del lenguaje principal en base a su contenido,
las variables que sean sólo de salida y se pasen a CALL se deben inicializar con
datos ficticios, parecidos en tipo y tamaño a la salida esperada.
También se pueden pasar datos a los procedimientos almacenados a través de las
variables SQLDA de REXX, mediante la sintaxis USING DESCRIPTOR de la
sentencia CALL. La lista siguiente muestra cómo se establece la SQLDA. En la
lista, ':value' es la raíz de una variable del lenguaje principal REXX que contiene
los valores necesarios para la aplicación. Para DESCRIPTOR, 'n' es un valor
numérico que indica un elemento sqlvar específico de la SQLDA. Los números que
aparecen a la derecha hacen referencia a las notas que siguen a la lista.
SQLDA de REXX de la parte cliente para procedimientos almacenados que
utilizan la sentencia CALL:
USING DESCRIPTOR
v :value.SQLD 1
172 Desarrollo de aplicaciones de SQL incorporado
![Page 181: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/181.jpg)
v :value.n.SQLTYPE 1
v :value.n.SQLLEN 1
v :value.n.SQLDATA 1 2
v :value.n.SQLDIND 1 2
Notas:
1. Antes de invocar al procedimiento almacenado, la aplicación cliente tiene que
inicializar la variable de REXX con los datos apropiados.
Cuando se ejecuta la sentencia CALL de SQL, el gestor de bases de datos
asigna almacenamiento y recupera el valor de la variable de REXX de la
agrupación de variables de REXX. Para una SQLDA utilizada en una sentencia
CALL, el gestor de bases de datos asigna almacenamiento para los campos
SQLDATA y SQLIND en base a los valores de SQLTYPE y SQLLEN.
En el caso de un procedimiento almacenado REXX (es decir, el propio
procedimiento invocado está escrito en REXX basado en Windows), los datos
pasados por el cliente desde cualquiera de los dos tipos de sentencia CALL o
de la API DARI se colocan en la agrupación de variables de REXX en el
servidor de bases de datos, utilizando los nombres predefinidos siguientes:
SQLRIDA
Nombre predefinido para la variable SQLDA de entrada de REXX
SQLRODA
Nombre predefinido para la variable SQLDA de salida de REXX2. Cuando termina el procedimiento almacenado, el gestor de bases de datos
recupera también el valor de las variables del procedimiento almacenado. Los
valores se devuelven a la aplicación cliente y se colocan en la agrupación de
variables de REXX del cliente.
Conceptos relacionados:
v “Consideraciones del cliente para llamar a procedimientos almacenados en
REXX” en la página 175
v “Recuperación de valores de precisión y escala (SCALE) de campos decimales de
la SQLDA” en la página 175
v “Consideraciones del servidor para llamar a procedimientos almacenados en
REXX” en la página 175
Información relacionada:
v “Sentencia CALL” en Consulta de SQL, Volumen 2
Sintaxis de las API para REXX: Utilice la rutina SQLDBS para llamar a las API de
DB2 con la sintaxis siguiente:
CALL SQLDBS ’command string’
Si no puede llamar a una API de DB2® que desea utilizar mediante la rutina
SQLDBS, puede llamar a la API efectuando una llamada al procesador de línea de
mandatos (CLP) de DB2 desde dentro de la aplicación REXX. Sin embargo, puesto
que el CLP de DB2 dirige la salida al dispositivo de salida estándar o a un archivo
especificado, la aplicación REXX no puede acceder directamente a la salida de la
API de DB2 a la que se ha llamado, ni puede tomar fácilmente la determinación de
si la API llamada ha resultado satisfactoria o no. La API SQLDB2 proporciona una
interfaz con el CLP de DB2 que proporciona información directa a la aplicación
REXX sobre el éxito o fracaso de cada API llamada, estableciendo la variable
compuesta SQLCA de REXX después de cada llamada.
Capítulo 3. Programación de aplicaciones de SQL incorporado 173
![Page 182: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/182.jpg)
Puede utilizar la rutina SQLDB2 para llamar a las API de DB2 utilizando la
sintaxis siguiente:
CALL SQLDB2 ’command string’
donde ’command string’ es una serie que puede procesar el procesador de línea de
mandatos (CLP).
El hecho de llamar a una API de DB2 mediante SQLDB2 es equivalente a llamar
directamente al CLP, excepto en los aspectos siguientes:
v La llamada al ejecutable del CLP se sustituye por la llamada a SQLDB2 (el resto
de opciones y parámetros del CLP se especifican de la misma manera).
v La variable compuesta SQLCA de REXX se establece después de llamar a
SQLDB2, pero no se establece después de llamar al ejecutable del CLP.
v La salida de visualización por omisión del CLP se establece como desactivada
cuando se llama a SQLDB2, mientras que se establece como salida activada
cuando se llama al ejecutable del CLP. Observe que puede activar la salida de
visualización del CLP pasando las opciones +o o −o− a SQLDB2.
Puesto que la única variable de REXX que se establece después de llamar a
SQLDB2 es la SQLCA, sólo debe utilizar esta rutina para llamar a las API de DB2
que no devuelvan datos distintos de la SQLCA y que no estén implementadas
actualmente mediante la interfaz SQLDBS. Así pues, SQLDB2 únicamente soporta
las API de DB2 siguientes:
v Activar base de datos
v Añadir nodo
v Vincular para DB2 Versión 1(1) (2)
v Vincular para DB2 Versión 2 ó 5(1)
v Crear base de datos en nodo
v Eliminar base de datos en nodo
v Verificar eliminación de nodo
v Desactivar base de datos
v Desregistrar
v Cargar(3)
v Cargar consulta
v Precompilar programa(1)
v Revincular paquete(1)
v Redistribuir grupo de particiones de base de datos
v Registrar
v Iniciar gestor de la base de datos
v Detener gestor de la base de datos
Notas sobre las API de DB2 soportadas por SQLDB2:
1. Estos mandatos requieren una sentencia CONNECT a través de la interfaz
SQLDB2. Las conexiones que utilizan la interfaz SQLDB2 no están accesibles
para la interfaz SQLEXEC, y las conexiones que utilizan la interfaz SQLEXEC
no están accesible para la interfaz SQLDB2.
2. Está soportado en las plataformas basadas en Windows® mediante la interfaz
SQLDB2.
3. El parámetro de salida opcional, pLoadInfoOut para la API Cargar no se
devuelve a la aplicación en REXX.
Nota: Aunque la rutina SQLDB2 ha sido pensada para uso únicamente de las API
de DB2 relacionadas anteriormente, también se puede utilizar para otras API
174 Desarrollo de aplicaciones de SQL incorporado
![Page 183: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/183.jpg)
de DB2 que no se soportan a través de la rutina SQLDBS. Alternativamente,
se puede acceder a las API de DB2 a través del CLP desde la aplicación
REXX.
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones REXX” en la página 9
Consideraciones del cliente para llamar a procedimientos almacenados en
REXX: Cuando utilice variables del lenguaje principal en la sentencia CALL,
inicialice cada una de las variables del lenguaje principal con un valor que sea de
un tipo compatible con los datos que se devuelvan a la variable del lenguaje
principal desde el procedimiento del servidor. Debe realizar esta inicialización
aunque el indicador correspondiente sea negativo.
Cuando utilice descriptores, SQLDATA debe estar inicializada y contener datos que
sean de un tipo compatible con los datos que se devuelvan desde el procedimiento
del servidor. Debe realizar esta inicialización aunque el campo SQLIND contenga
un valor negativo.
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado REXX”
en la página 72
Consideraciones del servidor para llamar a procedimientos almacenados en
REXX: Asegúrese de que todos los campos SQLDATA y SQLIND (si es de un tipo
anulable) de la SQLRODA de SQLDA de salida predefinida estén inicializados. Por
ejemplo, si SQLRODA.SQLD es 2, los campos siguientes deben contener datos
(aunque los indicadores correspondientes sean negativos y no se pasen datos al
cliente):
v SQLRODA.1.SQLDATA
v SQLRODA.2.SQLDATA
Conceptos relacionados:
v “Procedimientos almacenados en REXX” en la página 172
Recuperación de valores de precisión y escala (SCALE) de campos decimales de
la SQLDA: Para recuperar los valores de precisión y escala para campos
decimales de la estructura SQLDA devuelta por el gestor de bases de datos, utilice
los valores sqllen.scale y sqllen.precision cuando inicialice la salida de la
SQLDA en el programa REXX. Por ejemplo:
.
.
.
/* INICIALIZAR UN ELEMENTO DE SQLDA DE SALIDA */
io_sqlda.sqld = 1
io_sqlda.1.sqltype = 485 /* TIPO DE DATOS DECIMAL */
io_sqlda.1.sqllen.scale = 2 /* DÍGITOS A LA DERECHA DE LA COMA DECIMAL */
io_sqlda.1.sqllen.precision = 7 /* ANCHURA DEL DECIMAL */
io_sqlda.1.sqldata = 00000.00 /* FORMATO DE DATOS DE DEFINICIÓN DE AYUDAS */
io_sqlda.1.sqlind = -1 /* SIN DATOS DE ENTRADA */
.
.
.
Conceptos relacionados:
v “Recuperación de información de variables del lenguaje principal procedente de
la estructura SQLDA en aplicaciones de SQL incorporado” en la página 152
Capítulo 3. Programación de aplicaciones de SQL incorporado 175
![Page 184: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/184.jpg)
v “Procedimientos almacenados en REXX” en la página 172
Lectura de los conjuntos de resultados y desplazamiento por
los mismos en aplicaciones de SQL incorporado
Lectura de los conjuntos de resultados y desplazamiento por los
mismos en aplicaciones de SQL incorporado
Una de las tareas más comunes de un programa de aplicación de SQL incorporado
es recuperar datos. Esta tarea se lleva a cabo utilizando la sentencia select, que es
una forma de consulta que busca filas de tablas de la base de datos que cumplen
con las condiciones de búsqueda especificadas. Si existen dichas filas, los datos se
recuperan y se colocan en variables especificadas en el programa de sistema
principal, donde se pueden utilizar con el fin para el que está diseñado.
Nota: Las aplicaciones de SQL incorporado pueden llamar a procedimientos
almacenados con cualquiera de las implementaciones de procedimientos
almacenados soportadas y pueden recuperar valores de parámetros de salida
y de entrada-salida; sin embargo, las aplicaciones de SQL incorporado no
pueden leer los conjuntos de resultados devueltos por procedimientos
almacenados ni desplazarse por los mismos.
Después de escribir una sentencia select, codifique las sentencias de SQL que
definen el modo en que la información se pasará a la aplicación.
Puede entender el resultado de una sentencia select como una tabla que tiene filas
y columnas, parecida a una tabla de la base de datos. Si sólo se devuelve una fila,
puede distribuir los resultados directamente en variables del lenguaje principal
especificadas por la sentencia SELECT INTO.
Si se devuelve más de una fila, debe utilizar un cursor para captarlas de una en
una. Un cursor es una estructura de control con nombre que es utilizada por un
programa de aplicación para apuntar a una fila específica dentro de un conjunto
ordenado de filas.
Conceptos relacionados:
v “Ejemplo de un cursor en una aplicación de SQL ejecutada estáticamente” en la
página 186
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
Tareas relacionadas:
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Identificación de valores de SQL nulos con variables de indicador de nulo” en
la página 81
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Ejemplos relacionados:
176 Desarrollo de aplicaciones de SQL incorporado
![Page 185: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/185.jpg)
v “spclient.sqc -- Call various stored procedures (C)”
Desplazamiento por datos anteriormente recuperados en
aplicaciones de SQL incorporado
Cuando una aplicación recupera datos de la base de datos, la sentencia FETCH le
permite desplazarse hacia adelante por los datos; sin embargo, no hay ninguna
sentencia de SQL que le permita desplazarse hacia atrás por el conjunto de
resultados (equivalente a una operación FETCH hacia atrás). Sin embargo, la CLI
de DB2 y el controlador DB2 Universal JDBC dan soporte a la operación FETCH
hacia atrás mediante cursores desplazables de sólo lectura.
Procedimiento:
Para aplicaciones de SQL incorporado, puede utilizar las siguientes técnicas para
desplazarse por los datos que se han recuperado:
v Conserve una copia de los datos que se han captado en la memoria de la
aplicación y desplácese por los mismos mediante alguna técnica de
programación.
v Utilice SQL para recuperar de nuevo los datos, normalmente mediante una
segunda sentencia SELECT.
Tareas relacionadas:
v “Mantenimiento de una copia de datos captados aplicaciones de SQL
incorporado” en la página 177
v “Recuperación de datos captados por segunda vez en aplicaciones de SQL
incorporado” en la página 178
Información relacionada:
v “Cursor positioning rules for SQLFetchScroll() (CLI)” en Call Level Interface Guide
and Reference, Volume 2
v “SQLFetchScroll function (CLI) - Fetch rowset and return data for all bound
columns” en Call Level Interface Guide and Reference, Volume 2
Mantenimiento de una copia de datos captados aplicaciones de
SQL incorporado
En algunas situaciones, puede resultar útil mantener una copia de los datos que
capta la aplicación.
Procedimiento:
Para conservar una copia de los datos, la aplicación puede hacer lo siguiente:
v Guardar los datos captados en almacenamiento virtual.
v Grabar los datos en un archivo temporal (si los datos no caben en
almacenamiento virtual). Un efecto de este enfoque es que un usuario que se
desplace hacia atrás siempre ve exactamente los mismos datos que se han
captado, incluso si mientras tanto una transacción ha modificado los datos de la
base de datos.
v Utilizando un nivel de aislamiento de lectura repetida, los datos que recupera de
una transacción se pueden volver a recuperar cerrando y abriendo un cursor.
Otras aplicaciones no pueden actualizar los datos del conjunto de resultados.
Los niveles de aislamiento y el bloqueo pueden afectar al modo en que los
usuarios actualizan datos.
Capítulo 3. Programación de aplicaciones de SQL incorporado 177
![Page 186: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/186.jpg)
Conceptos relacionados:
v “Diferencias en el orden de las filas en tablas de resultados” en la página 179
v “Isolation levels and performance” en Performance Guide
Tareas relacionadas:
v “Recuperación de datos captados por segunda vez en aplicaciones de SQL
incorporado” en la página 178
v “Specifying the isolation level” en Performance Guide
Recuperación de datos captados por segunda vez en
aplicaciones de SQL incorporado
La técnica que utilice para recuperar datos por segunda vez dependerá del orden
en el que desee volver a ver los datos.
Procedimiento:
Puede recuperar datos por segunda vez mediante cualquiera de los métodos
siguientes:
v Recuperar datos desde el principio
Para volver a recuperar los datos desde el principio de la tabla de resultados,
cierre el cursor activo y vuélvalo a abrir. Esta acción coloca el cursor al principio
de la tabla de resultados. Pero, a no ser que la aplicación retenga bloqueos en la
tabla, es posible que otros la hayan modificado, de modo que puede que la que
era la primera fila de la tabla de resultados ya no lo sea.
v Recuperar datos desde el medio
Para recuperar datos por segunda vez desde algún punto del medio de la tabla
de resultados, ejecute una segunda sentencia SELECT y declare un segundo
cursor en la sentencia. Por ejemplo, supongamos que la primera sentencia
SELECT era la siguiente:
SELECT * FROM DEPARTMENT
WHERE LOCATION = 'CALIFORNIA'
ORDER BY DEPTNO
Ahora, supongamos que desea volver a las filas que empiezan con DEPTNO =
'M95' y captar de forma secuencial desde dicho punto. Codifique lo siguiente:
SELECT * FROM DEPARTMENT
WHERE LOCATION = 'CALIFORNIA'
AND DEPTNO >= 'M95'
ORDER BY DEPTNO
Esta sentencia coloca el cursor donde desea.
v Recuperar datos en orden inverso
El valor por omisión consiste en ordenar las filas en orden ascendente. Si sólo
hay una fila para cada valor de DEPTNO, la siguiente sentencia especifica un
orden ascendente exclusivo de filas:
SELECT * FROM DEPARTMENT
WHERE LOCATION = 'CALIFORNIA'
ORDER BY DEPTNO
Para recuperar las mismas filas en orden inverso, especifique que el orden debe
ser descendente, como en la siguiente sentencia:
SELECT * FROM DEPARTMENT
WHERE LOCATION = 'CALIFORNIA'
ORDER BY DEPTNO DESC
178 Desarrollo de aplicaciones de SQL incorporado
![Page 187: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/187.jpg)
Un cursor de la segunda sentencia recupera filas exactamente en el orden
inverso al de un cursor de la primera sentencia. El orden de recuperación sólo se
garantiza si la primera sentencia especifica una secuencia de orden exclusiva.
Para recuperar filas en orden inverso, puede resultar útil tener dos índices en la
columna DEPTNO, uno en orden ascendente y el otro en orden descendente.
Conceptos relacionados:
v “Diferencias en el orden de las filas en tablas de resultados” en la página 179
v “Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado” en la página 181
Tareas relacionadas:
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
v “Colocación de un cursor en una fila con un determinado valor de columna” en
la página 183
Diferencias en el orden de las filas en tablas de resultados
Las filas de varias tablas correspondientes a la misma sentencia SELECT pueden
no visualizarse en el mismo orden. El gestor de bases de datos no tiene en cuenta
el orden de las filas como algo significativo a no ser que la sentencia SELECT
utilice ORDER BY. Por lo tanto, si hay varias filas con el mismo valor DEPTNO,
puede que la segunda sentencia SELECT las recupere en un orden distinto al de la
primera. La única garantía es que todas estarán en orden por número de
departamento, tal como solicita la cláusula ORDER BY DEPTNO.
La diferencia en el orden se puede producir aunque ejecute la misma sentencia de
SQL, con las mismas variables del lenguaje principal, por segunda vez. Por
ejemplo, las estadísticas del catálogo se podrían haber actualizado entre
ejecuciones, o se podrían hacer creado o eliminado índices. Entonces podría
ejecutar de nuevo la sentencia SELECT.
Es más probable que el orden cambie si la segunda sentencia SELECT tiene un
predicado que la primera no tenía; el gestor de bases de datos podría elegir utilizar
un índice en el nuevo predicado. Por ejemplo, podría elegir un índice en LOCATION
para la primera sentencia del ejemplo y un índice en DEPTNO para la segunda.
Puesto que las filas se captan en orden por la clave de índice, el segundo orden no
es necesariamente igual al primero.
De nuevo, al ejecutar dos sentencias SELECT parecidas se puede producir un
orden diferente de filas, aunque no se haya producido ningún cambio en las
estadísticas ni se haya creado ni eliminado ningún índice. En el ejemplo, si hay
varios valores diferentes de LOCATION, el gestor de bases de datos podría elegir un
índice en LOCATION para ambas sentencias. Si se cambia el valor de DEPTNO en la
segunda sentencia por lo siguiente, el gestor de bases de datos podría elegir un
índice en DEPTNO:
SELECT * FROM DEPARTMENT
WHERE LOCATION = 'CALIFORNIA'
AND DEPTNO >= 'Z98'
ORDER BY DEPTNO
Debido a la sutil relación entre el formato de una sentencia de SQL y los valores de
dicha sentencia, nunca dé por supuesto que dos sentencias de SQL diferentes
Capítulo 3. Programación de aplicaciones de SQL incorporado 179
![Page 188: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/188.jpg)
vayan a devolver filas en el mismo orden, a no ser que el orden se determine de
forma exclusiva mediante una cláusula ORDER BY.
Conceptos relacionados:
v “Lectura de los conjuntos de resultados y desplazamiento por los mismos en
aplicaciones de SQL incorporado” en la página 176
Tareas relacionadas:
v “Recuperación de datos captados por segunda vez en aplicaciones de SQL
incorporado” en la página 178
Actualización de datos anteriormente recuperados en
aplicaciones de SQL incorporado
Para desplazarse hacia atrás y actualizar datos recuperados previamente, puede
utilizar una combinación de las técnicas que se utilizan para desplazarse a través
de datos recuperados previamente y para actualizar datos recuperados.
Procedimiento:
Para actualizar datos recuperados previamente, puede hacer una de estas dos
cosas:
v Si tiene un segundo cursor en los datos que se tienen que actualizar y la
sentencia SELECT no utiliza ninguno de los elementos restringidos, puede
utilizar la sentencia UPDATE controlada por el cursor. Nombre el segundo
cursor en la cláusula WHERE CURRENT OF.
v En otros casos, utilice UPDATE con una cláusula WHERE que nombre todos los
valores de la fila o especifique la clave primaria de la tabla. Puede ejecutar una
sentencia varias veces con distintos valores de las variables.
Conceptos relacionados:
v “Ejemplo de un cursor en una aplicación de SQL ejecutada estáticamente” en la
página 186
v “Ejemplo de un cursor en una aplicación de SQL ejecutada dinámicamente” en
la página 187
Tareas relacionadas:
v “Desplazamiento por datos anteriormente recuperados en aplicaciones de SQL
incorporado” en la página 177
v “Actualización y supresión de datos recuperados en una aplicación de SQL
ejecutada estáticamente” en la página 188
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
v “Declaración y utilización de cursores en una aplicación de SQL ejecutada
dinámicamente” en la página 185
Selección de varias filas mediante un cursor
Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado: Para permitir que una aplicación recupere un conjunto de filas, SQL
utiliza un mecanismo denominado un cursor.
Para ayudarle a comprender el concepto de un cursor, supongamos que el gestor
de bases de datos crea una tabla de resultados que contenga todas las filas
180 Desarrollo de aplicaciones de SQL incorporado
![Page 189: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/189.jpg)
recuperadas al ejecutar una sentencia SELECT. Un cursor permite que las filas
procedentes de la tabla de resultados estén disponibles para una aplicación,
identificando o haciendo referencia a una fila actual de esta tabla. Cuando se utiliza
un cursor, una aplicación puede recuperar cada fila secuencialmente de la tabla de
resultados hasta que se encuentra una condición de fin de datos, es decir, se
alcanza la condición NOT FOUND, SQLCODE +100 (SQLSTATE 02000). El
conjunto de filas obtenido como resultado de ejecutar la sentencia SELECT puede
constar de cero, una o más filas, en función del número de filas que cumplan con
la condición de búsqueda.
Procedimiento:
Los pasos a seguir para procesar un cursor son los siguientes:
1. Especifique el cursor utilizando una sentencia DECLARE CURSOR.
2. Realice la consulta y cree la tabla de resultados utilizando la sentencia OPEN.
3. Recupere filas de una en una utilizando la sentencia FETCH.
4. Procese las filas con las sentencias DELETE o UPDATE (si hace falta).
5. Termine el cursor utilizando la sentencia CLOSE.
Una aplicación puede utilizar varios cursores simultáneamente. Cada cursor
necesita su propio conjunto de sentencias DECLARE CURSOR, OPEN, CLOSE y
FETCH.
Conceptos relacionados:
v “Ejemplo de un cursor en una aplicación de SQL ejecutada estáticamente” en la
página 186
Tareas relacionadas:
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
v “Declaración y utilización de cursores en una aplicación de SQL ejecutada
dinámicamente” en la página 185
Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado: Los cursores se dividen en tres categorías:
Sólo lectura
Las filas del cursor sólo se pueden leer, no actualizar. Los cursores de sólo
lectura se utilizan cuando una aplicación sólo va a leer datos, no a
modificarlos. Un cursor se considera de sólo lectura si se basa en una
sentencia select de sólo lectura. Consulte la descripción sobre cómo
actualizar y recuperar datos correspondientes a normas para sentencias
select que definen tablas de resultados no actualizables.
Puede haber ventajas en cuanto a rendimiento para cursores de sólo
lectura. Si se determina que un cursor es de sólo lectura y utiliza un nivel
de aislamiento de lectura repetitiva, se siguen obteniendo y manteniendo
bloqueos de lectura repetitiva en las tablas del sistema que necesita la
unidad de trabajo. Por lo tanto, es importante que las aplicaciones emitan
periódicamente sentencias COMMIT, incluso para cursores de sólo lectura.
Actualizables
Las filas del cursor se pueden actualizar. Los cursores actualizables se
utilizan cuando una aplicación modifica datos a medida que se captan las
filas en el cursor. La consulta especificada sólo puede hacer referencia a
una tabla o vista. La consulta también debe incluir la cláusula FOR
Capítulo 3. Programación de aplicaciones de SQL incorporado 181
![Page 190: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/190.jpg)
UPDATE, nombrando cada columna que se va a actualizar (a no ser que se
utilice la opción de precompilación LANGLEVEL MIA).
Ambiguos
No se puede determinar si el cursor es actualizable o de sólo lectura a
partir de su definición o contexto. Esta situación puede producirse cuando
se encuentra una sentencia de SQL dinámico que se podría utilizar para
cambiar un cursor que de otro modo se consideraría de sólo lectura.
Un cursor ambiguo se trata como de sólo lectura si se especifica la opción
BLOCKING ALL al precompilar o vincular. De lo contrario, el cursor se
considera actualizable.
Nota: Los cursores que se procesan de forma dinámica siempre son
ambiguos.
En función de cómo se declaren los cursores, las acciones de una operación
COMMIT o ROLLBACK varían para los cursores basados en las siguientes
declaraciones:
Opción WITH HOLD
Si una aplicación completa una unidad de trabajo emitiendo una sentencia
COMMIT, el gestor de bases de datos cierra todos los cursores abiertos,
excepto aquellos declarados utilizando la opción WITH HOLD.
Un cursor declarado con la opción WITH HOLD mantiene los recursos a
los que accede en varias unidades de trabajo. El efecto exacto de declarar
un cursor WITH HOLD depende del modo en que finaliza la unidad de
trabajo:
v Si la unidad de trabajo finaliza con una sentencia COMMIT, los cursores
definidos con WITH HOLD permanecen abiertos (OPEN). El cursor se
coloca antes de la siguiente fila lógica de la tabla de resultados. Además,
las sentencias preparadas que hacen referencia a cursores OPEN
definidos con WITH HOLD se retienen. Sólo las peticiones FETCH y
CLOSE asociadas con un determinado cursor son válidas
inmediatamente después de la sentencia COMMIT. Las sentencias
UPDATE WHERE CURRENT OF y DELETE WHERE CURRENT OF
sólo son válidas para filas captadas dentro de la misma unidad de
trabajo.
Nota: Si un paquete se vuelve a vincular durante una unidad de trabajo,
todos los cursores retenidos se cierran.
v Si la unidad de trabajo finaliza con una sentencia ROLLBACK, todos los
cursores abiertos se cierran, todos los bloqueos adquiridos durante la
unidad de trabajo se liberan y todas las sentencias preparadas que
dependen del trabajo realizado en dicha unidad se eliminan.
Por ejemplo, supongamos que la tabla TEMPL contiene 1.000 entradas.
Desea actualizar la columna salary correspondiente a todos los empleados,
y espera emitir una sentencia COMMIT cada vez que actualiza 100 filas.
1. Declare el cursor utilizando la opción WITH HOLD:
EXEC SQL DECLARE EMPLUPDT CURSOR WITH HOLD FOR
SELECT EMPNO, LASTNAME, PHONENO, JOBCODE, SALARY
FROM TEMPL FOR UPDATE OF SALARY
2. Abra el cursor y recupere datos de la tabla de resultados, fila a fila:
182 Desarrollo de aplicaciones de SQL incorporado
![Page 191: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/191.jpg)
EXEC SQL OPEN EMPLUPDT
.
.
.
EXEC SQL FETCH EMPLUPDT
INTO :upd_emp, :upd_lname, :upd_tele, :upd_jobcd, :upd_wage,
3. Cuando desee actualizar o suprimir una fila, utilice una sentencia
UPDATE o DELETE utilizando la opción WHERE CURRENT OF. Por
ejemplo, para actualizar la fila actual, el programa puede emitir:
EXEC SQL UPDATE TEMPL SET SALARY = :newsalary
WHERE CURRENT OF EMPLUPDT
4. Después de emitir una sentencia COMMIT, debe emitir una sentencia
FETCH antes de poder actualizar otra fila.
Debe incluir código en la aplicación para detectar y manejar un SQLCODE
-501 (SQLSTATE 24501), que se puede devolver en una sentencia FETCH o
CLOSE si la aplicación:
v Utiliza cursores declarados WITH HOLD.
v Ejecuta más de una unidad de trabajo y deja un cursor WITH HOLD
abierto en los límites de la unidad de trabajo (COMMIT WORK).
Si una aplicación invalida su paquete eliminando una tabla de la que
depende, el paquete se vuelve a vincular de forma dinámica. En este caso,
se devuelve un SQLCODE -501 (SQLSTATE 24501) para una sentencia
FETCH o CLOSE porque el gestor de bases de datos cierra el cursor. El
modo de manejar un SQLCODE -501 (SQLSTATE 24501) en esta situación
depende de si desea captar filas desde el cursor:
v Si desea captar filas desde el cursor, abra el cursor y luego ejecute la
sentencia FETCH. Sin embargo, tenga en cuenta que la sentencia OPEN
vuelve a colocar el cursor al principio. La posición anterior retenida en
la sentencia COMMIT WORK se pierde.
v Si no desea captar filas desde el cursor, no emita más peticiones SQL
contra el cursor.
Opción WITH RELEASE
Cuando una aplicación cierra un cursor utilizando la opción WITH
RELEASE, DB2 intenta liberar todos los bloqueos de lectura (READ) que el
cursor sigue reteniendo. El cursor sólo continuará reteniendo bloqueos de
grabación (WRITE). Si la aplicación cierra el cursor sin utilizar la opción
RELEASE, los bloqueos READ y WRITE se liberarán cuando finalice la
unidad de trabajo.
Tareas relacionadas:
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Colocación de un cursor en una fila con un determinado valor de columna: Si
tiene que colocar el cursor al final de una tabla, puede utilizar una sentencia de
SQL para colocarlo.
Procedimiento:
Capítulo 3. Programación de aplicaciones de SQL incorporado 183
![Page 192: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/192.jpg)
Utilice cualquiera de los ejemplos siguientes como método para colocar un cursor
mediante clasificación:
v El gestor de bases de datos no garantiza un orden en los datos almacenados en
una tabla; por lo tanto, el final de una tabla no está definido. Sin embargo, el
orden se define en el resultado de una sentencia de SQL:
SELECT * FROM DEPARTMENT
ORDER BY DEPTNO DESC
v La sentencia siguiente coloca el cursor en la fila que tiene el valor de DEPTNO más
alto:
SELECT * FROM DEPARTMENT
WHERE DEPTNO =
(SELECT MAX(DEPTNO) FROM DEPARTMENT)
Sin embargo, observe que, si hay varias filas con el mismo valor, el cursor se
coloca en la primera de ellas.
Tareas relacionadas:
v “Proceso del cursor en un programa SQL ejecutado dinámicamente” en la página
159
v “Recuperación de datos captados por segunda vez en aplicaciones de SQL
incorporado” en la página 178
Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente: Se debe utilizar la sentencia DECLARE CURSOR para declarar un
cursor, especificar un nombre para el cursor y especificar la consulta que define el
conjunto de resultados asociado al cursor. Se hace referencia al nombre
especificado en sentencias OPEN, FETCH y CLOSE posteriores. La consulta es
cualquier sentencia select válida.
Restricciones:
La declaración de un cursor puede realizarse en cualquier lugar dentro de una
aplicación de SQL incorporado; sin embargo, debe aparecer antes de que se haga
referencia al mismo en otras sentencias de SQL.
Procedimiento:
Utilice la sentencia DECLARE para definir el cursor. La tabla siguiente contiene
ejemplos correspondientes a los lenguajes principales soportados:
Tabla 18. Declaraciones de cursor por lenguaje principal
Lenguaje Código fuente de ejemplo
C y C++ EXEC SQL DECLARE C1 CURSOR FOR
SELECT PNAME, DEPT FROM STAFF
WHERE JOB=:host_var;
COBOL EXEC SQL DECLARE C1 CURSOR FOR
SELECT NAME, DEPT FROM STAFF
WHERE JOB=:host-var END-EXEC.
FORTRAN EXEC SQL DECLARE C1 CURSOR FOR
+ SELECT NAME, DEPT FROM STAFF
+ WHERE JOB=:host_var
Conceptos relacionados:
v “Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado” en la página 181
184 Desarrollo de aplicaciones de SQL incorporado
![Page 193: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/193.jpg)
Tareas relacionadas:
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Información relacionada:
v “Sentencia DECLARE CURSOR” en Consulta de SQL, Volumen 2
v “Sentencia FETCH” en Consulta de SQL, Volumen 2
v “Sentencia OPEN” en Consulta de SQL, Volumen 2
Declaración y utilización de cursores en una aplicación de SQL ejecutada
dinámicamente: Procesar un cursor de forma dinámica es casi idéntico a
procesarlo mediante SQL estático. Cuando se declara un cursor, se asocia con una
consulta. Utilizando la sentencia FETCH, el cursor se coloca en la siguiente fila de
la tabla de resultados y asigna los valores de dicha fila a variables del lenguaje
principal.
En SQL estático, la consulta es una sentencia SELECT en formato de texto,
mientras que en SQL dinámico la consulta se asocia con un nombre de sentencia
asignado en una sentencia PREPARE. Cualquier variable del lenguaje principal a la
que se haga referencia se representa mediante marcadores de parámetros.
La principal diferencia entre un cursor estático y uno dinámico es que un cursor
estático se prepara en el momento de la precompilación y un cursor dinámico se
prepara en el tiempo de ejecución. Además, las variables del lenguaje principal a
las que se hace referencia en la consulta están representadas mediante marcadores
de parámetros, los cuales se sustituyen por variables del lenguaje principal de
tiempo de ejecución cuando se abre el cursor.
Procedimiento:
Utilice los ejemplos que se muestran en la tabla siguiente cuando codifique
cursores para un programa de SQL dinámico:
Tabla 19. Sentencia declare asociada con una sentencia SELECT dinámica
Lenguaje Código fuente de ejemplo
C/C++
strcpy( prep_string, "SELECT tabname FROM syscat.tables"
"WHERE tabschema = ?" );
EXEC SQL PREPARE s1 FROM :prep_string;
EXEC SQL DECLARE c1 CURSOR FOR s1;
EXEC SQL OPEN c1 USING :host_var;
COBOL
MOVE "SELECT TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA = ?"
TO PREP-STRING.
EXEC SQL PREPARE S1 FROM :PREP-STRING END-EXEC.
EXEC SQL DECLARE C1 CURSOR FOR S1 END-EXEC.
EXEC SQL OPEN C1 USING :host-var END-EXEC.
FORTRAN
prep_string = ’SELECT tabname FROM syscat.tables WHERE tabschema = ?’
EXEC SQL PREPARE s1 FROM :prep_string
EXEC SQL DECLARE c1 CURSOR FOR s1
EXEC SQL OPEN c1 USING :host_var
REXX
prep_string = "SELECT TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA = ?"
CALL SQLEXEC ’PREPARE S1 FROM :prep_string’;
CALL SQLEXEC ’DECLARE C1 CURSOR FOR S1’;
CALL SQLEXEC ’OPEN C1 USING :schema_name’;
Conceptos relacionados:
Capítulo 3. Programación de aplicaciones de SQL incorporado 185
![Page 194: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/194.jpg)
v “Ejemplo de un cursor en una aplicación de SQL ejecutada dinámicamente” en
la página 187
Tareas relacionadas:
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Información relacionada:
v “Sentencia DECLARE CURSOR” en Consulta de SQL, Volumen 2
v “Sentencia FETCH” en Consulta de SQL, Volumen 2
v “Sentencia OPEN” en Consulta de SQL, Volumen 2
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
Ejemplo de un cursor en una aplicación de SQL ejecutada estáticamente: Los
ejemplos tut_read.sqc en C, tut_read.sqC/sqx en C++ y cursor.sqb en COBOL
muestran cómo declarar un cursor, abrir el cursor, captar filas de la tabla y cerrar
el cursor.
Puesto que REXX no da soporte a SQL estático, no se proporciona ningún ejemplo.
v C y C++
El ejemplo tut_read muestra una sentencia select básica de una tabla que utiliza
un cursor. Por ejemplo:
/* declarar cursor */
EXEC SQL DECLARE c1 CURSOR FOR
SELECT deptnumb, deptname FROM org WHERE deptnumb < 40;
/* abrir cursor */
EXEC SQL OPEN c1 ;
/* captar cursor */
EXEC SQL FETCH c1 INTO :deptnumb, :deptname;
while (sqlca.sqlcode != 100)
{
printf(" %8d %-14s\n", deptnumb, deptname);
EXEC SQL FETCH c1 INTO :deptnumb, :deptname;
}
/* cerrar cursor */
EXEC SQL CLOSE c1;
v COBOL
El ejemplo cursor muestra un ejemplo de cómo recuperar datos de una tabla
utilizando un cursor con una sentencia de SQL estático. Por ejemplo:
* Declarar un cursor
EXEC SQL DECLARE c1 CURSOR FOR
SELECT name, dept FROM staff
WHERE job=’Mgr’ END-EXEC.
* Abrir el cursor
EXEC SQL OPEN c1 END-EXEC.
* Captar filas de la tabla ’staff’
perform Fetch-Loop thru End-Fetch-Loop
until SQLCODE not equal 0.
* Cerrar el cursor
EXEC SQL CLOSE c1 END-EXEC.
move "CLOSE CURSOR" to errloc.
Conceptos relacionados:
186 Desarrollo de aplicaciones de SQL incorporado
![Page 195: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/195.jpg)
v “Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado” en la página 181
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
Tareas relacionadas:
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Ejemplos relacionados:
v “cursor.sqb -- How to update table data with cursor statically (IBM COBOL)”
Ejemplo de un cursor en una aplicación de SQL ejecutada dinámicamente: Una
sentencia de SQL dinámico se puede preparar para su ejecución con la sentencia
PREPARE y se puede ejecutar con la sentencia EXECUTE o con la sentencia
DECLARE CURSOR.
PREPARE con EXECUTE
El siguiente ejemplo muestra cómo se puede preparar una sentencia de SQL
dinámico para su ejecución con la sentencia PREPARE y ejecutar con la sentencia
EXECUTE:
v C y C++ (dbuse.sqc/dbuse.sqC):
El siguiente ejemplo procede del ejemplo dbuse:
EXEC SQL BEGIN DECLARE SECTION;
char hostVarStmt[50];
EXEC SQL END DECLARE SECTION;
strcpy(hostVarStmt, "DELETE FROM org WHERE deptnumb = 15");
EXEC SQL PREPARE Stmt FROM :hostVarStmt;
EXEC SQL EXECUTE Stmt;
PREPARE con DECLARE CURSOR
Los ejemplos siguientes muestran cómo se puede preparar una sentencia de SQL
dinámico para su ejecución con la sentencia PREPARE y ejecutar con la sentencia
DECLARE CURSOR:
v C
EXEC SQL BEGIN DECLARE SECTION;
char st[80];
char parm_var[19};
EXEC SQL END DECLARE SECTION;
strcpy( st, "SELECT tabname FROM syscat.tables" );
strcat( st, " WHERE tabname <> ? ORDER BY 1" );
EXEC SQL PREPARE s1 FROM :st;
EXEC SQL DECLARE c1 CURSOR FOR s1;
strcpy( parm_var, "STAFF" );
EXEC SQL OPEN c1 USING :parm_var;
v COBOL (dynamic.sqb)
El siguiente ejemplo procede del ejemplo dynamic.sqb:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 st pic x(80).
01 parm-var pic x(18).
Capítulo 3. Programación de aplicaciones de SQL incorporado 187
![Page 196: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/196.jpg)
EXEC SQL END DECLARE SECTION END-EXEC.
move "SELECT TABNAME FROM SYSCAT.TABLES ORDER BY 1 WHERE TABNAME <> ?" to st.
EXEC SQL PREPARE s1 FROM :st END-EXEC.
EXEC SQL DECLARE c1 CURSOR FOR s1 END-EXEC.
move "STAFF" to parm-var.
EXEC SQL OPEN c1 USING :parm-var END-EXEC.
EXECUTE IMMEDIATE
También puede preparar y ejecutar una sentencia de SQL dinámico con la
sentencia EXECUTE IMMEDIATE (excepto para las sentencias SELECT que
devuelven más de una fila).
v C y C++ (dbuse.sqc/dbuse.sqC)
El siguiente ejemplo procede de la función DynamicStmtEXECUTE_IMMEDIATE() del
ejemplo dbuse:
EXEC SQL BEGIN DECLARE SECTION;
char stmt1[50];
EXEC SQL END DECLARE SECTION;
strcpy(stmt1, "CREATE TABLE table1(col1 INTEGER)");
EXEC SQL EXECUTE IMMEDIATE :stmt1;
Conceptos relacionados:
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
Ejemplos relacionados:
v “dbuse.sqc -- How to use a database (C)”
v “dbuse.out -- HOW TO USE A DATABASE (C)”
v “dbuse.out -- HOW TO USE A DATABASE (C++)”
v “dbuse.sqC -- How to use a database (C++)”
Actualización y supresión de datos recuperados en una
aplicación de SQL ejecutada estáticamente
Se puede actualizar y suprimir la fila a la que hace referencia un cursor. Para que
una fila se pueda actualizar, la consulta correspondiente al cursor no debe ser de
sólo lectura.
Procedimiento:
Para actualizar con un cursor, utilice la cláusula WHERE CURRENT OF en una
sentencia UPDATE. Utilice la cláusula FOR UPDATE para indicar al sistema que
desea actualizar algunas columnas de la tabla de resultados. Puede especificar una
columna en la cláusula FOR UPDATE sin que esté en fullselect; por lo tanto, puede
actualizar columnas que no recupera explícitamente el cursor. Si la cláusula FOR
UPDATE se especifica sin nombres de columna, se considera que todas las
columnas de la tabla o vista identificada en la primera cláusula FROM de fullselect
externo se pueden actualizar. No nombre más columnas de las que necesita en la
cláusula FOR UPDATE. En algunos casos, si se nombran columnas adicionales en
la cláusula FOR UPDATE, es posible que DB2 sea menos eficiente al acceder a los
datos.
188 Desarrollo de aplicaciones de SQL incorporado
![Page 197: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/197.jpg)
La supresión con un cursor se realiza utilizando la cláusula WHERE CURRENT OF
en una sentencia DELETE. En general, la cláusula FOR UPDATE no se necesita
para la supresión de la fila actual de un cursor. La única excepción se produce
cuando se utiliza SQL dinámico para la sentencia SELECT o la sentencia DELETE
en una aplicación que se ha precompilado con el valor SAA1 para LANGLEVEL y
se ha vinculado con BLOCKING ALL. En este caso, se necesita una cláusula FOR
UPDATE en la sentencia SELECT.
La sentencia DELETE hace que la fila a la que hace referencia el cursor se suprima.
Esta supresión deja el cursor colocado antes de la siguiente fila y se debe emitir una
sentencia FETCH antes de que se puedan realizar operaciones WHERE CURRENT
OF adicionales contra el cursor.
Tareas relacionadas:
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
Información relacionada:
v “Mandato PRECOMPILE” en Consulta de mandatos
v “Consultas de SQL” en Consulta de SQL, Volumen 1
v “Sentencia UPDATE” en Consulta de SQL, Volumen 2
v “Sentencia DELETE” en Consulta de SQL, Volumen 2
Ejemplo de captación en un programa de SQL ejecutado
estáticamente
En el siguiente ejemplo se efectúa una selección en una tabla utilizando un cursor,
se abre el cursor y se captan filas de la tabla. Para cada fila captada, el programa
decide, según criterios sencillos, si la fila se debe suprimir o actualizar.
El lenguaje REXX no da soporte a SQL estático, así que no se proporciona ningún
ejemplo.
v C y C++ (tut_mod.sqc/tut_mod.sqC)
El siguiente ejemplo procede del ejemplo tut_mod. En este ejemplo se efectúa
una selección en una tabla utilizando un cursor, se abre el cursor, se captan, se
actualizan o se suprimen filas de la tabla y luego se cierra el cursor.
EXEC SQL DECLARE c1 CURSOR FOR SELECT * FROM staff WHERE id >= 310;
EXEC SQL OPEN c1;
EXEC SQL FETCH c1 INTO :id, :name, :dept, :job:jobInd, :years:yearsInd, :salary,
:comm:commInd;
El ejemplo tbmod es una versión más larga del ejemplo tut_mod y muestra casi
todos los casos posibles de modificación de datos de la tabla.
v COBOL (openftch.sqb)
El siguiente ejemplo procede del ejemplo openftch. En este ejemplo se efectúa
una selección en una tabla utilizando un cursor, se abre el cursor y se captan
filas de la tabla.
EXEC SQL DECLARE c1 CURSOR FOR
SELECT name, dept FROM staff
WHERE job=’Mgr’
FOR UPDATE OF job END-EXEC.
EXEC SQL OPEN c1 END-EXEC
Capítulo 3. Programación de aplicaciones de SQL incorporado 189
![Page 198: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/198.jpg)
* llamar a FETCH y al bucle UPDATE/DELETE.
perform Fetch-Loop thru End-Fetch-Loop
until SQLCODE not equal 0.
EXEC SQL CLOSE c1 END-EXEC.
Conceptos relacionados:
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
v “Ejemplo de un cursor en una aplicación de SQL ejecutada estáticamente” en la
página 186
Tareas relacionadas:
v “Selección de varias filas utilizando un cursor en aplicaciones de SQL
incorporado” en la página 180
v “Declaración y utilización de cursores en aplicaciones de SQL ejecutadas
estáticamente” en la página 184
Ejemplos relacionados:
v “openftch.sqb -- How to modify table data using cursor statically (IBM COBOL)”
v “tbmod.sqc -- How to modify table data (C)”
v “tbmod.sqC -- How to modify table data (C++)”
Recuperación de mensajes de error en aplicaciones de SQL
incorporado
Información de error en los campos SQLCODE, SQLSTATE y
SQLWARN
La información de error se devuelve en los campos SQLCODE y SQLSTATE de la
estructura SQLCA, que se actualiza tras cada sentencia de SQL ejecutable y tras la
mayoría de las llamadas a API del gestor de bases de datos.
Un archivo fuente que contiene sentencias de SQL ejecutables puede proporcionar
al menos una estructura SQLCA con el nombre sqlca. La estructura SQLCA se
define en el archivo include SQLCA. Los archivos fuente sin sentencias de SQL
incorporado, pero que llaman a las API del gestor de bases de datos, también
pueden proporcionar una o más estructuras SQLCA, pero sus nombres son
arbitrarios.
Si la aplicación cumple con el estándar FIPS 127-2, puede declarar SQLSTATE y
SQLCODE como variables del lenguaje principal para aplicaciones C, C++, COBOL
y FORTRAN, en lugar de utilizar la estructura SQLCA.
Un valor SQLCODE igual a 0 significa una ejecución satisfactoria (con posibles
condiciones de aviso SQLWARN). Un valor positivo significa que la sentencia se ha
ejecutado satisfactoriamente pero con un aviso, como el truncamiento de una
variable del lenguaje principal. Un valor negativo significa que se ha producido
una condición de error.
Un campo adicional, SQLSTATE, contiene un código de error estandarizado
coherente con otros productos de bases de datos de IBM y con otros gestores de
bases de datos que cumplen con SQL92. En la práctica, es conveniente utilizar
190 Desarrollo de aplicaciones de SQL incorporado
![Page 199: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/199.jpg)
valores SQLSTATE cuando le preocupe la portabilidad, pues los valores SQLSTATE
son utilizados por muchos gestores de bases de datos.
El campo SQLWARN contiene una matriz de indicadores de aviso, incluso si
SQLCODE es cero. El primer elemento de la matriz SQLWARN, SQLWARN0,
contiene un blanco si todos los demás elementos están en blanco. SQLWARN0
contiene una W si al menos uno de los otros elementos contiene un carácter de
aviso.
Nota: Si desea desarrollar aplicaciones que acceden a varios servidores RDBMS de
IBM, debe:
v Si es posible, hacer que las aplicaciones comprueben SQLSTATE en lugar
de SQLCODE.
v Si la aplicación va a utilizar DB2 Connect, considerar la posibilidad de
utilizar el recurso de correlación que proporciona DB2 Connect para
correlacionar conversiones de SQLCODE entre bases de datos distintas.
Conceptos relacionados:
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
v “Programas de utilidad de comprobación de errores” en la página 223
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado
FORTRAN” en la página 135
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado COBOL”
en la página 122
v “Archivos de inclusión y definiciones necesarios para aplicaciones de SQL
incorporado” en la página 47
v “Variables SQLSTATE y SQLCODE en una aplicación de SQL incorporado C y
C++” en la página 92
Información relacionada:
v “Estructura de datos SQLCA” en Consulta de las API administrativas
Recuperación de mensajes de error en aplicaciones de SQL
incorporado
En función del lenguaje en el que esté escrita la aplicación, debe utilizar un
método u otro para recuperar información de error:
v Las aplicaciones C, C++ y COBOL pueden utilizar la API GET ERROR
MESSAGE para obtener la información correspondiente relacionada con el
SQLCA que se ha pasado.
Ejemplo de C: el procedimiento SqlInfoPrint de UTILAPI.C
/******************************************************************************
** 1.1 - SqlInfoPrint - imprime información de diagnóstico en la pantalla.
**
******************************************************************************/
int SqlInfoPrint( char * appMsg,
struct sqlca * pSqlca,
int line,
char * file )
{ int rc = 0;
char sqlInfo[1024];
char sqlInfoToken[1024];
char sqlstateMsg[1024];
char errorMsg[1024];
Capítulo 3. Programación de aplicaciones de SQL incorporado 191
![Page 200: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/200.jpg)
if (pSqlca->sqlcode != 0 && pSqlca->sqlcode != 100)
{ strcpy(sqlInfo, "");
if( pSqlca->sqlcode < 0)
{ sprintf( sqlInfoToken, "\n---- error report ----\n");
strcat( sqlInfo, sqlInfoToken);
}
else
{ sprintf( sqlInfoToken, "\n---- warning report ----\n");
strcat( sqlInfo, sqlInfoToken);
} /* endif */
sprintf( sqlInfoToken, " app. message = %s\n", appMsg);
strcat( sqlInfo, sqlInfoToken);
sprintf( sqlInfoToken, " line = %d\n", line);
strcat( sqlInfo, sqlInfoToken);
sprintf( sqlInfoToken, " file = %s\n", file);
strcat( sqlInfo, sqlInfoToken);
sprintf( sqlInfoToken, " SQLCODE = %ld\n", pSqlca->sqlcode);
strcat( sqlInfo, sqlInfoToken);
/* obtener mensaje de error */
rc = sqlaintp( errorMsg, 1024, 80, pSqlca);
/* código de retorno es la longitud de la serie errorMsg */
if( rc > 0)
{ sprintf( sqlInfoToken, "%s\n", errorMsg);
strcat( sqlInfo, sqlInfoToken);
}
/* obtener mensaje SQLSTATE */
rc = sqlogstt( sqlstateMsg, 1024, 80, pSqlca->sqlstate);
if (rc == 0)
{ sprintf( sqlInfoToken, "%s\n", sqlstateMsg);
strcat( sqlInfo, sqlInfoToken);
}
if( pSqlca->sqlcode < 0)
{ sprintf( sqlInfoToken, "--- end error report ---\n");
strcat( sqlInfo, sqlInfoToken);
printf("%s", sqlInfo);
return 1;
}
else
{ sprintf( sqlInfoToken, "--- fin informe avisos ---\n");
strcat( sqlInfo, sqlInfoToken);
printf("%s", sqlInfo);
return 0;
} /* endif */
} /* endif */
return 0;
}
Ejemplo en COBOL: de CHECKERR.CBL
********************************
* Llamada a API GET ERROR MESSAGE *
********************************
call "sqlgintp" using
by value buffer-size
by value line-width
by reference sqlca
by reference error-buffer
returning error-rc.
************************
* GET SQLSTATE MESSAGE *
************************
call "sqlggstt" using
by value buffer-size
192 Desarrollo de aplicaciones de SQL incorporado
![Page 201: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/201.jpg)
by value line-width
by reference sqlstate
by reference state-buffer
returning state-rc.
if error-rc is greater than 0
display error-buffer.
if state-rc is greater than 0
display state-buffer.
if state-rc is less than 0
display "código de retorno de GET SQLSTATE =" state-rc.
if SQLCODE is less than 0
display "--- fin informe errores ---"
go to End-Prog.
display "--- fin informe errores ---"
display "CONTINUANDO PROGRAMA CON AVISOS".
v Las aplicaciones REXX utilizan el procedimiento CHECKERR.
/****** CHECKERR - Comprobar SQLCODE *****/
CHECKERR:
arg errloc
if ( SQLCA.SQLCODE = 0 ) then
return 0
else do
say ’--- informe de errores ---’
say ’Se ha producido un ERROR:’ errloc
say ’SQLCODE :’ SQLCA.SQLCODE
/*********************\
* GET ERROR MESSAGE *
\*********************/
call SQLDBS ’GET MESSAGE INTO :errmsg LINEWIDTH 80’
say errmsg
say ’--- fin informe errores ---’
if (SQLCA.SQLCODE < 0 ) then
exit
else do
say ’AVISO - CONTINUANDO PROGRAMA CON ERRORES’
return 0
end
end
return 0
Conceptos relacionados:
v “Variables SQLSTATE y SQLCODE en una aplicación de SQL incorporado C y
C++” en la página 92
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado COBOL”
en la página 122
v “Variables SQLSTATE y SQLCODE en aplicaciones de SQL incorporado
FORTRAN” en la página 135
Información relacionada:
v “API sqlaintp - Obtener mensaje de error” en Consulta de las API administrativas
Capítulo 3. Programación de aplicaciones de SQL incorporado 193
![Page 202: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/202.jpg)
Consideraciones sobre las rutinas de lista de salida
No utilice SQL ni llamadas a API de DB2 en rutinas de lista de salida. Tenga en
cuenta que no puede desconectarse de una base de datos en una rutina de salida.
Conceptos relacionados:
v “Desconexión de aplicaciones de SQL incorporado” en la página 195
Información relacionada:
v “API de DB2” en Consulta de las API administrativas
Consideraciones sobre el manejador de excepciones, señales
e interrupciones
Un manejador de excepciones, señales o interrupciones es una rutina que adquiere
el control cuando se produce una excepción, señal o interrupción. El tipo de
manejador aplicable lo determina el entorno operativo, tal como se muestra a
continuación:
Sistemas operativos Windows
Al pulsar Control-C o Control-Inter se genera una interrupción.
Sistemas operativos UNIX
Generalmente, al pulsar Control-C se genera una señal de interrupción
SIGINT. Observe que los teclados se pueden redefinir fácilmente de modo
que se pueda generar una señal SIGINT pulsando otra secuencia de teclas
en la máquina.
No coloque sentencias de SQL (que no sean COMMIT o ROLLBACK) en
manejadores de excepciones, señales e interrupciones. Con estos tipos de
condiciones de error, generalmente deseará llevar a cabo una operación
ROLLBACK para evitar el riesgo de tener datos incoherentes.
Tenga en cuenta que debe tener cuidado cuando codifique COMMIT y ROLLBACK
en manejadores de excepciones/señales/interrupciones. Si llama a cualquiera de
estas sentencias por ellas mismas, la operación COMMIT o ROLLBACK no se
ejecuta hasta que se completa la sentencia de SQL actual, si se está ejecutando
alguna. Este no es el comportamiento deseado de un manejador Control-C.
La solución consiste en llamar a la API INTERRUPT (sqleintr/sqlgintr) antes de
emitir una operación ROLLBACK. Esta API interrumpe la consulta de SQL actual
(si la aplicación está ejecutando alguna) y deja que ROLLBACK comience de
inmediato. Si va a realizar una operación COMMIT en lugar de ROLLBACK, no
desea interrumpir el mandato actual.
Cuando se utiliza APPC para acceder a un servidor de bases de datos remoto (DB2
para AIX o el sistema de bases de datos de sistema principal que utiliza DB2
Connect), es posible que la aplicación reciba una señal SIGUSR1. SNA
Services/6000 genera esta señal cuando se produce un error no recuperable y la
conexión SNA se detiene. Es posible que desee instalar un manejador de señales en
la aplicación para que maneje SIGUSR1.
Consulte la documentación de su plataforma para ver detalles específicos sobre
consideraciones sobre distintos manejadores.
194 Desarrollo de aplicaciones de SQL incorporado
![Page 203: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/203.jpg)
Conceptos relacionados:
v “Manejo de errores utilizando la sentencia WHENEVER” en la página 57
v “Recuperación de mensajes de error en aplicaciones de SQL incorporado” en la
página 191
v “Programas de utilidad de comprobación de errores” en la página 223
Tareas relacionadas:
v “Declaración de la SQLCA para el manejo de errores” en la página 56
Información relacionada:
v “Sentencia COMMIT” en Consulta de SQL, Volumen 2
v “Sentencia ROLLBACK” en Consulta de SQL, Volumen 2
Desconexión de aplicaciones de SQL incorporado
La sentencia disconnect es el último paso cuando se trabaja con una base de datos.
Este tema contiene ejemplos de la sentencia disconnect en los lenguajes principales
soportados.
Desconexión de bases de datos DB2 en aplicaciones de SQL incorporado C y
C++:
Cuando se trabaja con aplicaciones C y C++, una conexión de base de datos se
cierra emitiendo la siguiente sentencia:
EXEC SQL CONNECT RESET;
Desconexión de bases de datos DB2 en aplicaciones de SQL incorporado
COBOL:
Cuando se trabaja con aplicaciones COBOL, una conexión de base de datos se
cierra emitiendo la siguiente sentencia:
EXEC SQL CONNECT RESET END-EXEC.
Desconexión de bases de datos DB2 en aplicaciones de SQL incorporado REXX:
Cuando se trabaja con aplicaciones REXX, una conexión de base de datos se cierra
emitiendo la siguiente sentencia:
CALL SQLEXEC ’CONNECT RESET’
Cuando se trabaja con aplicaciones FORTRAN, una conexión de base de datos se
cierra emitiendo la siguiente sentencia:
EXEC SQL CONNECT RESET
Conceptos relacionados:
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
v “Ejecución de sentencias de SQL en aplicaciones de SQL incorporado” en la
página 150
Información relacionada:
v “Sentencia DISCONNECT” en Consulta de SQL, Volumen 2
Capítulo 3. Programación de aplicaciones de SQL incorporado 195
![Page 204: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/204.jpg)
196 Desarrollo de aplicaciones de SQL incorporado
![Page 205: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/205.jpg)
Capítulo 4. Creación de aplicaciones de SQL incorporado
Creación de aplicaciones de SQL incorporado . . 198
Precompilación de aplicaciones de SQL
incorporado con el mandato PRECOMPILE (o
PREP) . . . . . . . . . . . . . . . . 201
Precompilación de aplicaciones de SQL
incorporado con el mandato PRECOMPILE . . 201
Precompilación de aplicaciones de SQL
incorporado que acceden a más de un servidor
de bases de datos . . . . . . . . . . . 203
Paquetes de aplicaciones y planes de acceso de
SQL incorporado . . . . . . . . . . . 204
Calificación de esquema de paquete utilizando
el registro especial CURRENT PACKAGE PATH . 204
Indicaciones horarias generadas por el
precompilador . . . . . . . . . . . . 208
Errores y avisos procedentes de la
precompilación aplicaciones de SQL
incorporado . . . . . . . . . . . . . 209
Compilación y enlace de archivos fuente que
contienen SQL incorporado . . . . . . . . . 209
Vinculación de paquetes de SQL incorporado con
una base de datos mediante el mandato BIND . . 210
Vinculación de paquetes de SQL incorporado
con una base de datos . . . . . . . . . 210
Efecto de la opción de vinculación
DYNAMICRULES en SQL dinámico . . . . . 211
Utilización de registros especiales para controlar
el entorno de compilación de sentencias . . . 214
Cómo volver a crear paquetes utilizando el
mandato BIND y un archivo de vinculación
existente . . . . . . . . . . . . . . 214
Revinculación de paquetes existentes con el
mandato REBIND . . . . . . . . . . . 215
Consideraciones sobre la vinculación . . . . 216
Ventajas de la vinculación diferida . . . . . 217
Mejoras en el rendimiento cuando se utiliza la
opción REOPT del mandato BIND . . . . . 218
Almacenamiento y mantenimiento de paquetes . . 219
Almacenamiento y mantenimiento de paquetes 219
Creación de versiones de paquetes . . . . . 219
Resolución de nombres de tabla no calificados 220
Creación de aplicaciones de SQL incorporado
mediante el script de creación de ejemplo . . . . 221
Creación de aplicaciones de SQL incorporado
mediante el script de creación de ejemplo . . . 221
Programas de utilidad de comprobación de
errores . . . . . . . . . . . . . . . 223
Creación de aplicaciones y rutinas escritas en C
y C++ . . . . . . . . . . . . . . . 225
Creación de aplicaciones y rutinas escritas en
C y C++ . . . . . . . . . . . . . 225
Creación de aplicaciones en C o C++
mediante el script de creación de ejemplo
(UNIX) . . . . . . . . . . . . . 225
Creación de aplicaciones C/C++ en Windows 227
Creación de aplicaciones de SQL incorporado
escritas en VisualAge C++ con archivos de
configuración . . . . . . . . . . . 229
Creación de aplicaciones de SQL incorporado
y de API de DB2 en C o C++ con archivos de
configuración (AIX) . . . . . . . . . 230
Creación de aplicaciones C/C++ de conexión
múltiple en Windows . . . . . . . . . 232
Opciones de compilación y enlace de
aplicaciones de API de DB2 y de SQL
incorporado de C de AIX . . . . . . . 234
Opciones de compilación y enlace de
aplicaciones de la API de administración de
DB2 y de SQL incorporado en C++ de AIX . 235
Opciones de compilación y enlace para
aplicaciones C de HP-UX . . . . . . . 236
Opciones de compilación y enlace para
aplicaciones C++ de HP-UX . . . . . . 238
Opciones de compilación y enlace para
aplicaciones C de Linux . . . . . . . . 239
Opciones de compilación y enlace para
aplicaciones C++ de Linux . . . . . . . 241
Opciones de compilación y enlace para
aplicaciones C de Solaris . . . . . . . 242
Opciones de compilación y enlace para
aplicaciones C++ de Solaris . . . . . . . 244
Opciones de compilación y enlace para
aplicaciones C y C++ de Windows . . . . 245
Creación de aplicaciones y rutinas escritas en
COBOL . . . . . . . . . . . . . . 246
Creación de aplicaciones y rutinas escritas en
COBOL . . . . . . . . . . . . . 246
Creación de aplicaciones IBM COBOL en AIX 246
Creación de aplicaciones Micro Focus
COBOL de UNIX . . . . . . . . . . 248
Creación de aplicaciones IBM COBOL en
Windows . . . . . . . . . . . . . 249
Creación de aplicaciones Micro Focus
COBOL en Windows . . . . . . . . . 251
Configuración del compilador IBM COBOL
en Windows . . . . . . . . . . . . 253
Configuración del compilador Micro Focus
COBOL en Windows . . . . . . . . . 254
Configuración del compilador Micro Focus
COBOL en Linux . . . . . . . . . . 255
Configuración del compilador IBM COBOL
en AIX . . . . . . . . . . . . . 256
Configuración del compilador Micro Focus
COBOL en AIX . . . . . . . . . . . 257
Configuración del compilador Micro Focus
COBOL en HP-UX . . . . . . . . . . 258
Configuración del compilador Micro Focus
COBOL en Solaris . . . . . . . . . . 258
Opciones de compilación y enlace para
aplicaciones IBM COBOL de AIX . . . . . 259
© Copyright IBM Corp. 1993, 2006 197
![Page 206: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/206.jpg)
Opciones de compilación y enlace para
aplicaciones Micro Focus COBOL de AIX . . 260
Opciones de compilación y enlace para
aplicaciones Micro Focus COBOL de HP-UX . 261
Opciones de compilación y enlace para
aplicaciones Micro Focus COBOL de Solaris . 261
Opciones de compilación y enlace para
aplicaciones Micro Focus COBOL de Linux . 262
Opciones de compilación y enlace para
aplicaciones IBM COBOL de Windows . . . 263
Opciones de compilación y enlace para
aplicaciones Micro Focus COBOL de
Windows . . . . . . . . . . . . . 264
Creación y ejecución de aplicaciones de SQL
incorporado escritas en REXX . . . . . . . 265
Creación y ejecución de aplicaciones de SQL
incorporado escritas en REXX . . . . . . 265
Archivos de vinculación de REXX . . . . 266
Creación de aplicaciones Object REXX en
Windows . . . . . . . . . . . . . 267
Creación de aplicaciones de SQL incorporado
desde la línea de mandatos . . . . . . . . . 268
Creación de aplicaciones de SQL incorporado
desde la línea de mandatos . . . . . . . . 268
Creación de aplicaciones de SQL incorporado
escritas en C o C++ (Windows) . . . . . . 268
Migración de las aplicaciones de SQL incorporado 269
Restricciones de enlazar a libdb2.so . . . . . . 271
Creación de aplicaciones de SQL incorporado
Cuando haya creado el código fuente para la aplicación de SQL incorporado, debe
seguir otros pasos para construirla. Deberá considerar construir ejecutables de 64
bits al desarrollar nuevas aplicaciones de bases de datos de SQL incorporado.
Además de compilar y enlazar el programa, debe precompilarlo y vincularlo.
El proceso de precompilación convierte sentencias de SQL incorporado en llamadas
a API de tiempo de ejecución de DB2 que un compilador del lenguaje principal
pueda procesar. Por omisión, se crea un paquete en el momento de la
precompilación. Opcionalmente, se puede crear un archivo de vinculación en el
momento de la precompilación. El archivo de vinculación contiene información
sobre las sentencias de SQL del programa de aplicación. El archivo de vinculación
se puede utilizar más adelante con el mandato BIND para crear un paquete para la
aplicación.
La vinculación es el proceso de crear un paquete a partir de un archivo de
vinculación y de almacenarlo en una base de datos. El archivo de vinculación se
debe vincular a cada base de datos a la que tenga que acceder la aplicación. Si la
aplicación accede a más de una base de datos, debe crear un paquete para cada
base de datos.
Para ejecutar aplicaciones escritas en lenguajes principales compilados, debe crear
los paquetes que necesita el gestor de bases de datos en el momento de la
ejecución. La figura siguiente muestra el orden de estos pasos, junto con los
distintos módulos de una típica aplicación de DB2 compilada:
1. Cree archivos fuente que contengan programas con sentencias de SQL
incorporado.
2. Conecte con una base de datos y luego precompile cada archivo fuente para
convertir las sentencias fuente de SQL incorporado en un formato que el gestor
de bases de datos pueda utilizar
Puesto que las sentencias de SQL colocadas en una aplicación no son
específicas del lenguaje principal, el gestor de bases de datos proporciona una
forma de convertir la sintaxis de SQL para que la procese el lenguaje principal.
Para los lenguajes C, C++, COBOL o FORTRAN, esta conversión se maneja
mediante el precompilador de DB2 que se invoca mediante el mandato
PRECOMPILE (o PREP). El precompilador convierte las sentencias de SQL
incorporado directamente en llamadas a API de servicios de tiempo de
ejecución de DB2. Cuando el precompilador procesa un archivo fuente, busca
específicamente sentencias de SQL y evita el lenguaje principal que no es SQL.
198 Desarrollo de aplicaciones de SQL incorporado
![Page 207: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/207.jpg)
3. Compile los archivos fuente modificados (y otros archivos sin sentencias de
SQL) mediante el compilador del lenguaje principal.
4. Enlace los archivos de objeto con las bibliotecas de DB2 y del lenguaje principal
para generar un programa ejecutable.
Compilación y enlace (pasos 3 y 4), para crear los módulos de objeto necesarios
5. Vincule el archivo de vinculación para crear el paquete si esto no se ha hecho
en el momento de la precompilación o si se va a acceder a una base de datos
distinta. La vinculación crea el paquete que utilizará el gestor de bases de datos
cuando se ejecute el programa.
6. Ejecute la aplicación. La aplicación accede a la base de datos utilizando los
planes de acceso.
Capítulo 4. Creación de aplicaciones de SQL incorporado 199
![Page 208: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/208.jpg)
Conceptos relacionados:
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Paquetes de aplicaciones y planes de acceso de SQL incorporado” en la página
204
Tareas relacionadas:
Figura 4. Preparación de programas escritos en lenguajes principal compilados
200 Desarrollo de aplicaciones de SQL incorporado
![Page 209: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/209.jpg)
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
v “Compilación y enlace de archivos fuente que contienen SQL incorporado” en la
página 209
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Mandato PRECOMPILE” en Consulta de mandatos
Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE (o PREP)
Precompilación de aplicaciones de SQL incorporado con el
mandato PRECOMPILE
Cuando haya creado los archivos fuente de la aplicación de SQL incorporado, debe
precompilar cada archivo del lenguaje principal que contenga sentencias de SQL
con el mandato PREP, utilizando las opciones específicas del lenguaje principal. El
precompilador convierte las sentencias de SQL contenidas en el archivo fuente en
comentarios y genera las llamadas a API en tiempo de ejecución de DB2 para
dichas sentencias.
Siempre debe precompilar un archivo fuente contra una base de datos específica,
incluso si finalmente no utiliza la base de datos con la aplicación. En la práctica,
puede utilizar una base de datos de prueba para desarrollo y, después de probar
por completo la aplicación, puede vincular su archivo de vinculación a una o más
bases de datos de producción. Esta práctica recibe el nombre de vinculación diferida.
Si la aplicación utiliza una página de códigos distinta de la página de códigos de la
base de datos, debe tener en cuenta qué página de códigos debe utilizar al
precompilar.
Si la aplicación utiliza funciones definidas por el usuario (UDF) o tipos
diferenciados definidos por el usuario (UDT), es posible que tenga que utilizar la
opción FUNCPATH al precompilar la aplicación. Esta opción especifica la vía de
acceso de función que se utiliza para resolver las UDF y UDT para aplicaciones
que contienen SQL estático. Si no se especifica FUNCPATH, la vía de acceso de
función por omisión es SYSIBM, SYSFUN, USER, donde USER hace referencia al
ID de usuario actual.
Antes de precompilar una aplicación, debe conectarse con el servidor, de forma
implícita o explícita. Aunque precompile programas de aplicación en la estación de
trabajo cliente y el precompilador genere fuente modificada y mensajes en el
cliente, el precompilador utiliza la conexión con el servidor para llevar a cabo parte
de la validación.
El precompilador también crea la información que necesita el gestor de bases de
datos para procesar las sentencias de SQL contra una base de datos. Esta
información se almacena en un paquete, en un archivo de vinculación o en ambos,
en función de las opciones del precompilador seleccionadas.
A continuación se muestra un ejemplo típico de cómo utilizar el precompilador.
Para precompilar un archivo fuente de SQL incorporado C denominado
Capítulo 4. Creación de aplicaciones de SQL incorporado 201
![Page 210: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/210.jpg)
filename.sqc, puede emitir el siguiente mandato para crear un archivo fuente C con
el nombre por omisión filename.c y un archivo de vinculación con el nombre por
omisión filename.bnd:
DB2 PREP filename.sqc BINDFILE
El precompilador genera un máximo de cuatro tipos de salida:
Fuente modificada
Este archivo es la nueva versión del archivo fuente original
después de que el precompilador convierta las sentencias de SQL
en llamadas a API en tiempo de ejecución de DB2. Se le asigna la
extensión adecuada para el lenguaje principal.
Paquete Si utiliza la opción PACKAGE (el valor por omisión) o si no
especifica ninguna de las opciones BINDFILE, SYNTAX o
SQLFLAG, el paquete se almacena en la base de datos conectada.
El paquete contiene toda la información necesaria para ejecutar las
sentencias de SQL estático de un archivo fuente particular contra
esta base de datos únicamente. A no ser que especifique otro
nombre con la opción PACKAGE USING, el precompilador forma
el nombre del paquete a partir de los 8 primeros caracteres del
nombre del archivo fuente.
Si utiliza la opción PACKAGE sin SQLERROR CONTINUE, la base
de datos que se utiliza durante el proceso de precompilación debe
contener todos los objetos de base de datos a los que hacen
referencia las sentencias de SQL estático en el archivo fuente. Por
ejemplo, no puede precompilar una sentencia SELECT a no ser que
la tabla a la que hace referencia exista en la base de datos.
Con la opción VERSION, el archivo de vinculación (si se utiliza la
opción BINDFILE) y el paquete (tanto si se vincula en el momento
de PREP como si se vincula por separado) se designarán con un
identificador de versión particular. Pueden existir simultáneamente
muchas versiones de paquetes con el mismo nombre y creador.
Archivo de vinculación
Si utiliza la opción BINDFILE, el precompilador crea un archivo de
vinculación (con la extensión .bnd) que contiene los datos
necesarios para crear un paquete. Este archivo se puede utilizar
más adelante con el mandato BIND para vincular la aplicación a
una o más bases de datos. Si especifica BINDFILE y no especifica
la opción PACKAGE, la vinculación se difiere hasta que invoca el
mandato BIND. Observe que para el procesador de línea de
mandatos (CLP), el valor por omisión para PREP no especifica la
opción BINDFILE. Por lo tanto, si utiliza el CLP y desea que la
vinculación se difiera, tiene que especificar la opción BINDFILE.
Si se especifica SQLERROR CONTINUE se crea un paquete,
aunque se produzcan errores al vincular sentencias de SQL. Estas
sentencias que no se pueden vincular por motivos de autorización
o de existencia se pueden vincular de forma incremental en el
momento de la ejecución si también se especifica VALIDATE RUN.
Si se intenta ejecutarlas en el momento de la ejecución se genera
un error.
Archivo de mensajes
Si utiliza la opción MESSAGES, el precompilador redirige los
mensajes al archivo indicado. Estos mensajes incluyen avisos y
202 Desarrollo de aplicaciones de SQL incorporado
![Page 211: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/211.jpg)
mensajes de error que describen problemas encontrados durante la
precompilación. Si el archivo fuente no se precompila
satisfactoriamente, utilice los mensajes de aviso y de error para
determinar el problema, corrija el archivo fuente y luego vuelva a
intentar precompilar el archivo fuente. Si no utiliza la opción
MESSAGES, los mensajes de precompilación se graban en la salida
estándar.
Conceptos relacionados:
v “Ventajas de la vinculación diferida” en la página 217
v “Conversión de caracteres entre distintas páginas de códigos” en Desarrollo de
SQL y rutinas externas
v “Substituciones de caracteres durante conversiones de páginas de códigos” en
Desarrollo de SQL y rutinas externas
v “Factor de expansión de conversión de páginas de códigos” en Desarrollo de SQL
y rutinas externas
v “Conversiones de páginas de códigos soportadas” en Desarrollo de SQL y rutinas
externas
v “Cuándo se produce la conversión de página de códigos” en Desarrollo de SQL y
rutinas externas
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Comentarios en aplicaciones de SQL incorporado” en la página 150
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
Tareas relacionadas:
v “Declaración de variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 76
v “Cómo hacer referencia a variables del lenguaje principal en aplicaciones de SQL
incorporado” en la página 84
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Mandato PRECOMPILE” en Consulta de mandatos
Precompilación de aplicaciones de SQL incorporado que
acceden a más de un servidor de bases de datos
Para precompilar un programa de aplicación que accede a más de un servidor,
puede hacer una de las siguientes cosas:
v Dividir las sentencias de SQL correspondientes a cada base de datos en archivos
fuente separados. No combine sentencias de SQL correspondientes a distintas
bases de datos en el mismo archivo. Cada archivo fuente se puede precompilar
contra la base de datos apropiada. Este es el método recomendado.
v Codificar la aplicación utilizando únicamente sentencias de SQL dinámico y
vincular contra cada base de datos a la que va a acceder el programa.
v Si todas las bases de datos se parecen, es decir, tienen la misma definición,
puede agrupar las sentencias de SQL en un archivo fuente.
Capítulo 4. Creación de aplicaciones de SQL incorporado 203
![Page 212: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/212.jpg)
Los mismos procedimientos se aplican si la aplicación va a acceder a un servidor
de aplicaciones a través de DB2 Connect. Precompílela contra el servidor al que se
va a conectar, utilizando las opciones de PREP disponibles para dicho servidor.
Conceptos relacionados:
v “Ejecución de sentencias de SQL estático y dinámico en aplicaciones de SQL
incorporado” en la página 20
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
Paquetes de aplicaciones y planes de acceso de SQL
incorporado
El precompilador genera un paquete en la base de datos y, opcionalmente, un
archivo de vinculación, si especifica que desea que se cree uno.
El paquete contiene planes de acceso seleccionados por el optimizador de DB2
para las sentencias de SQL estático de la aplicación. Los planes de acceso contienen
la información que necesita el gestor de bases de datos para ejecutar las sentencias
de SQL estático de la forma más eficiente, según determine el optimizador. Para
sentencias de SQL dinámico, el optimizador crea planes de acceso cuando el
usuario ejecuta la aplicación.
Los paquetes almacenados en la base de datos incluyen la información necesaria
para ejecutar sentencias de SQL específicas en un solo archivo fuente. Una
aplicación de base de datos utiliza un paquete para cada archivo fuente
precompilado utilizado para crear la aplicación. Cada paquete constituye una
entidad separada y no tiene ninguna relación con ningún otro paquete utilizado
por la misma o por otras aplicaciones. Los paquetes se crean ejecutando el
precompilador contra un archivo fuente con la vinculación habilitada o ejecutando
el vinculador posteriormente con uno o más archivos de vinculación.
El archivo de vinculación contiene las sentencias de SQL y otros datos necesarios
para crear un paquete. Puede utilizar el archivo de vinculación para revincular la
aplicación más adelante sin tener que precompilarla primero. La revinculación crea
paquetes optimizados para las condiciones actuales de la base de datos. Tiene que
revincular la aplicación si va a acceder a una base de datos distinta de aquella
contra la cual se precompiló.
Conceptos relacionados:
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Revinculación de paquetes existentes con el mandato REBIND” en la página
215
Calificación de esquema de paquete utilizando el registro
especial CURRENT PACKAGE PATH
Los esquemas de paquete proporcionan un método para la agrupación lógica de
paquetes. Existen diferentes métodos para agrupar paquetes y formar esquemas.
Algunas implementaciones utilizan un esquema por cada entorno (por ejemplo, un
esquema de producción y un esquema de prueba). Otras implementaciones utilizan
204 Desarrollo de aplicaciones de SQL incorporado
![Page 213: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/213.jpg)
un esquema por área de negocio (por ejemplo, los esquemas stocktrd y onlinebnk)
o un esquema por aplicación (por ejemplo, stocktrdAddUser y onlinebnkAddUser).
También puede agrupar paquetes con finalidades de administración general o para
proporcionar variaciones en los paquetes (por ejemplo, mantener variaciones de
copia de seguridad de aplicaciones o probar variaciones nuevas de aplicaciones).
Cuando se utilizan varios esquemas para los paquetes, el gestor de la base de
datos debe determinar el esquema en el que ha de buscarse un paquete. Para
realizar esta tarea, el gestor de bases de datos utiliza el valor del registro especial
CURRENT PACKAGESET. Puede definir este registro especial para un solo nombre
de esquema para indicar que cualquier paquete a invocar pertenece a ese esquema.
Si una aplicación utiliza paquetes en esquemas diferentes, es posible que tenga que
emitirse una sentencia SET CURRENT PACKAGESET antes de que se invoque
cualquier paquete en el caso de que el esquema para el paquete sea diferente
respecto del paquete anterior.
Nota: Únicamente DB2 Versión 9.1 para z/OS (DB2 para z/OS) tiene un registro
especial de CURRENT PACKAGESET, que le permitirá definir
explícitamente el valor (un único nombre de esquema) con la sentencia SET
CURRENT PACKAGESET correspondiente. Aunque DB2 Database para
Linux, UNIX y Windows tiene una sentencia SET CURRENT PACKAGESET,
no tiene un registro especial CURRENT PACKAGESET. Esto significa que no
se puede hacer referencia a CURRENT PACKAGESET en otros contextos
(por ejemplo en una sentencia (por ejemplo en una sentencia SELECT) con
DB2 Database para Linux, UNIX y Windows. DB2 UDB para iSeries no
proporciona soporte para CURRENT PACKAGESET.
El servidor de bases de datos de DB2 tiene más flexibilidad cuando puede tomar
en consideración una lista de esquemas durante la resolución de paquetes. La lista
de esquemas es similar a la vía de acceso a SQL que se proporciona por medio del
registro especial CURRENT PATH. La lista de esquemas se utiliza para las
funciones definidas por el usuario, procedimientos, métodos y tipos diferenciados.
Nota: La vía de acceso a SQL es una lista de nombres de esquema que DB2
debería tener en cuenta al intentar determinar el esquema para un nombre
de tipo diferenciado, método, procedimiento o función no calificada.
Si necesita asociar múltiples variaciones de un paquete (es decir, múltiples
conjuntos de opciones BIND de un paquete) con un único programa compilado,
considere la posibilidad de aislar la vía de acceso de los esquemas que se utilizan
para objetos de SQL respecto de la vía de acceso de los esquemas que se utilizan
para paquetes.
El registro especial CURRENT PACKAGE PATH le permite especificar una lista de
esquemas de paquete. Otros productos de la familia DB2 proporcionan una
capacidad similar con registros especiales tales como CURRENT PATH y
CURRENT PACKAGESET, que se utilizan para procedimientos anidados y
funciones definidas por el usuario, sin corromper el entorno de ejecución de la
aplicación invocante. El registro especial CURRENT PACKAGE PATH proporciona
esta capacidad para la resolución de esquemas del paquete.
Muchas instalaciones utilizan más de un esquema para los paquetes. Si no
especifica una lista de esquemas de paquete, deberá emitir la sentencia SET
CURRENT PACKAGESET (que puede contener como máximo un nombre de
esquema) cada vez que necesite un paquete de un esquema diferente. Sin embargo,
si emite una sentencia SET CURRENT PACKAGE PATH al principio de la
Capítulo 4. Creación de aplicaciones de SQL incorporado 205
![Page 214: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/214.jpg)
aplicación para especificar una lista de nombres de esquema, no necesita emitir
una sentencia SET CURRENT PACKAGESET cada vez que se necesite un paquete
en un esquema diferente.
Por ejemplo, suponga que existen los paquetes siguientes y, utilizando la lista
siguiente, que desea invocar el primero que existe en el servidor: SCHEMA1.PKG1,
SCHEMA2.PKG2, SCHEMA3.PKG3, SCHEMA4.PKG y SCHEMA5.PKG5.
Suponiendo que el soporte actual para una sentencia SET CURRENT
PACKAGESET de DB2 Database para Linux, UNIX y Windows (es decir, aceptando
un único nombre de esquema), tendría que emitirse una sentencia SET CURRENT
PACKAGESET antes de intentar invocar cada paquete para especificar el esquema
específico. Para este ejemplo, se tendría que emitir cinco sentencias SET CURRENT
PACKAGESET. Sin embargo, es suficiente la utilización del registro especial
CURRENT PACKAGE PATH, una única sentencia SET. Por ejemplo:
SET CURRENT PACKAGE PATH = SCHEMA1, SCHEMA2, SCHEMA3, SCHEMA, SCHEMA5;
Nota: En DB2 Database para Linux, UNIX y Windows, podrá definir el registro
especial CURRENT PACKAGE PATH en el archivo db2cli.ini, utilizando la
API de SQLSetConnectAttr, en la estructura de SQLE-CLIENT-INFO e
incluyendo la sentencia SET CURRENT PACKAGE PATH en programas SQL
intercalados. Solo DB2 Universal Database para OS/390 y z/OS, Versión 8 o
posterior, da soporte a la sentencia SET CURRENT PACKAGE PATH. Si
emite esta sentencia frente a un servidor de DB2 Database para Linux, UNIX
y Windows o frente a DB2 Universal Database para AS/00, se devuelve
-30005.
Puede utilizar múltiples esquemas para mantener diversas variaciones de un
paquete. Estas variaciones pueden ser muy útiles para ayudar a controlar los
cambios efectuados en entornos de producción. También puede utilizar diferentes
variaciones de un paquete para conservar una versión de copia de seguridad de un
paquete, o una versión de prueba de un paquete (por ejemplo, para evaluar el
impacto de un índice nuevo). También se puede utilizar una versión anterior de un
paquete como una aplicación de copia de seguridad (módulo de carga o
ejecutable), concretamente, para proporcionar la posibilidad de volver a una
versión anterior.
Por ejemplo, suponga que el esquema PROD incluye los paquetes actuales
utilizados por las aplicaciones de producción, y que el esquema BACKUP guarda
una copia de seguridad de esos paquetes. Una versión nueva de la aplicación (y
por tanto de los paquetes) se promociona a la versión de producción mediante la
vinculación por medio del esquema PROD. Las copias de seguridad de los
paquetes se crean vinculando la versión actual de las aplicaciones mediante el
esquema de copia de seguridad (BACKUP). Después, durante la ejecución, puede
utilizar la sentencia SET CURRENT PACKAGE PATH para especificar el orden en
el que se deben examinar los esquemas para los paquetes. Suponga que se ha
vinculado una copia de seguridad de la aplicación MYAPPL utilizando el esquema
BACKUP y que la versión de la aplicación que está actualmente en producción se
ha vinculado al esquema PROD creando un paquete PROD.MYAPPL. Para
especificar que debe utilizarse la variación del paquete contenida en el esquema
PROD si está disponible (de lo contrario se utilizará la variación contenida en el
esquema BACKUP), emita la sentencia SET siguiente para el registro especial:
SET CURRENT PACKAGE PATH = PROD, BACKUP;
Si necesita volver a la versión anterior del paquete, la versión de producción de la
aplicación puede descartarse con la sentencia DROP PACKAGE, que hace que se
invoque la versión anterior de la aplicación (módulo de carga o ejecutable) que se
206 Desarrollo de aplicaciones de SQL incorporado
![Page 215: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/215.jpg)
vinculó utilizando el esquema BACKUP (aquí se pueden utilizar técnicas de vía de
acceso de aplicación, específicas de cada plataforma de sistema operativo).
Nota: Este ejemplo asume que la única diferencia entre las versiones del paquete
están en las opciones BIND que se utilizaron para crear los paquetes (es
decir, no hay diferencias en el código ejecutable).
La aplicación no utiliza la sentencia SET CURRENT PACKAGESET para
seleccionar el esquema que desea. En su lugar, permite a DB2 seleccionar el
paquete buscándolo en los esquemas listados en el registro especial CURRENT
PACKAGE PATH.
Nota: El proceso de precompilación de DB2 Universal Database para OS/390 y
z/OS almacena una señal de coherencia en el DBRM (que puede definirse
utilizando la opción LEVEL) y durante la resolución de paquetes, se efectúa
una comprobación para asegurarse de que la señal de coherencia del
programa corresponde al paquete. De modo análogo, el proceso de
vinculación de DB2 Database para Linux, UNIX y Windows almacena una
indicación horaria en el proceso de vinculación. DB2 Database para Linux,
UNIX y Windows también da soporte a una opción LEVEL.
Otro motivo para crear varias versiones de un paquete en esquemas diferentes
podría ser el de hacer que entren en vigor diferentes opciones de BIND. Por
ejemplo, pueden utilizarse calificadores diferentes para referencias de nombre sin
calificar en el paquete.
Las aplicaciones se escriben a menudo con nombres de tabla sin calificar. Esta
acción da soporte a múltiples tablas que tienen estructuras y nombres de tabla
idénticos, pero calificadores diferentes para distinguir instancias diferentes. Por
ejemplo, se pueden haber creado los mismos objetos en un sistema de prueba y en
un sistema de producción, pero esos objetos pueden tener calificadores diferentes
(por ejemplo, PROD y TEST). Otro ejemplo es una aplicación que distribuya datos
en tablas de diferentes sistemas DB2, en los que cada tabla tenga un calificador
diferente (por ejemplo, EAST, WEST, NORTH, SOUTH; COMPANYA,
COMPANYB; Y1999, Y2000, Y2001). En DB2 Universal Database para OS/390 y
z/OS, especifique el calificador de tabla utilizando la opción QUALIFIER del
mandato BIND. Cuando se utilice la opción QUALIFIER, los usuarios no tendrán
que mantener múltiples programas, cada uno de ellos especificará los nombres
totalmente calificados que se necesiten para acceder a las tablas sin calificar. En vez
de eso, puede accederse al paquete correcto en tiempo de ejecución emitiendo la
sentencia SET CURRENT PACKAGESET desde la aplicación y especificando un
único nombre de esquema. Sin embargo, si utiliza SET CURRENT PACKAGESET,
seguirá siendo necesario conservar y modificar múltiples aplicaciones: cada una de
ellas con su propia sentencia SET CURRENT PACKAGESET para acceder al
paquete necesario. Si en vez de eso se emite una sentencia SET CURRENT
PACKAGE PATH, se podría listar la totalidad de los esquemas. En el momento de
la ejecución, DB2 podría seleccionar el paquete correcto.
Nota: DB2 Database para Linux, UNIX y Windows también da soporte a una
opción de vinculación QUALIFIER. Sin embargo, la opción de vinculación
QUALIFIER sólo afecta al SQL estático o a los paquetes que utilizan la
opción DYNAMICRULES del mandato BIND.
Información relacionada:
v “Sentencia SET CURRENT PACKAGESET” en Consulta de SQL, Volumen 2
Capítulo 4. Creación de aplicaciones de SQL incorporado 207
![Page 216: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/216.jpg)
v “Registro especial CURRENT PATH” en Consulta de SQL, Volumen 1
Indicaciones horarias generadas por el precompilador
Cuando una aplicación se precompila con la vinculación habilitada, el paquete y el
archivo fuente modificado se generan con indicaciones horarias que coinciden.
Estas indicaciones horarias se conocen de forma individual como una señal de
coherencia. Si existen varias versiones de un paquete (utilizando la opción
PRECOMPILE VERSION), cada versión tendrá una indicación horaria asociada.
Cuando se ejecuta una aplicación, el nombre del paquete, el creador y la indicación
horaria se envían al gestor de bases de datos, el cual comprueba si hay algún
paquete cuyo nombre, creador e indicación horaria coinciden con los enviados por
la aplicación. Si no existe dicha coincidencia, se devuelve uno de los siguientes
códigos de error de SQL a la aplicación:
v SQL0818N (conflicto de indicaciones horarias). Este error se devuelve si se
encuentra un solo paquete que coincide con el nombre y creador (pero no con la
señal de coherencia) y el paquete tiene la versión ″″ (una serie vacía)
v SQL0805N (paquete no encontrado). Este error se devuelve en las demás
situaciones.
Recuerde que cuando vincula una aplicación a una base de datos, los ocho
primeros caracteres del nombre de la aplicación se utilizan como el nombre del
paquete a no ser que altere temporalmente el valor por omisión utilizando la opción
PACKAGE USING en el mandato PREP. Asimismo, el ID de versión será ″″ (una
serie vacía), a no ser que se especifique mediante la opción VERSION del mandato
PREP. Esto significa que si precompila y vincula dos programas utilizando el
mismo nombre sin cambiar el ID de versión, el segundo paquete sustituirá al
paquete del primero. Cuando ejecute el primer programa, obtendrá un error de
indicación horaria o de paquete no encontrado porque la indicación horaria
correspondiente al archivo fuente modificado ya no coincide con la del paquete en
la base de datos. El error de paquete no encontrado puede proceder del uso de la
opción de precompilación o de vinculación ACTION REPLACE REPLVER, como
en el siguiente ejemplo:
1. Precompile y vincule el paquete SCHEMA1.PKG especificando VERSION
VER1. Luego genere la aplicación asociada A1.
2. Precompile y vincule el paquete SCHEMA1.PKG, especificando VERSION
VER2 ACTION REPLACE REPLVER VER1. Luego genere la aplicación asociada
A2.
La segunda precompilación y vinculación genera un paquete SCHEMA1.PKG
que tiene para VERSION el valor VER2 y la especificación de ACTION
REPLACE REPLVER VER1 elimina el paquete SCHEMA1.PKG que tenía para
VERSION el valor VER1.
Si se intenta ejecutar la primera aplicación, se producirá una falta de
coincidencia de paquetes y el intento fallará.
Un síntoma parecido sucedería en el siguiente ejemplo:
1. Precompile y vincule el paquete SCHEMA1.PKG, especificando VERSION
VER1. Luego genere la aplicación asociada A1.
2. Precompile y vincule el paquete SCHEMA1.PKG, especificando VERSION
VER2. Luego genere la aplicación asociada A2.
En este momento es posible ejecutar ambas aplicaciones, A1 y A2, que se
ejecutarían desde los paquetes SCHEMA1.PKG con versiones VER1 y VER2
respectivamente. Si, por ejemplo, se elimina el primer paquete (utilizando la
208 Desarrollo de aplicaciones de SQL incorporado
![Page 217: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/217.jpg)
sentencia DROP PACKAGE SCHEMA1.PKG VERSION VER1 SQL), el intento
de ejecutar la aplicación A1 fallaría con un error de paquete no encontrado.
Cuando un archivo fuente se precompila pero no se crea un paquete, se genera un
archivo de vinculación y un archivo fuente modificado con indicaciones horarias
coincidentes. Para ejecutar la aplicación, el archivo de vinculación se vincula en un
paso BIND independiente para crear un paquete y el archivo fuente modificado se
compila y se enlaza. Para una aplicación que necesita varios módulos fuente, el
proceso de vinculación se debe realizar para cada archivo de vinculación.
En este escenario de vinculación diferida, las indicaciones horarias de la aplicación
y del paquete coinciden porque el archivo de vinculación contiene la misma
indicación horaria que el que se almacenó en el archivo fuente modificado durante
la precompilación.
Conceptos relacionados:
v “Cómo volver a crear paquetes utilizando el mandato BIND y un archivo de
vinculación existente” en la página 214
v “Paquetes de aplicaciones y planes de acceso de SQL incorporado” en la página
204
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Creación de versiones de paquetes” en la página 219
Errores y avisos procedentes de la precompilación
aplicaciones de SQL incorporado
El precompilador de SQL incorporado detecta los errores de SQL incorporado en el
momento de la precompilación. El precompilador de SQL incorporado detecta los
errores de sintaxis, por ejemplo la falta de signos de punto y coma y las variables
del lenguaje principal no declaradas en sentencias de SQL. Para cada uno de estos
errores, se genera un mensaje de error adecuado.
Conceptos relacionados:
v “Programación de aplicaciones de SQL incorporado” en la página 42
Compilación y enlace de archivos fuente que contienen SQL
incorporado
Cuando se precompilan archivos fuente de SQL incorporado, el mandato
PRECOMPILE genera archivos fuente modificados con una extensión de archivo que
se puede aplicar al lenguaje de programación.
Compile los archivos fuente modificados (y los archivos fuente adicionales que no
contienen sentencias de SQL) utilizando el compilador de lenguaje principal
adecuado. El compilador de lenguaje convierte cada archivo fuente modificado en
un módulo de objeto.
Consulte la documentación sobre programación correspondiente a su plataforma
operativa para ver las excepciones a las opciones del compilador por omisión.
Consulte la documentación del compilador para ver una descripción completa de
las opciones disponibles del compilador.
Capítulo 4. Creación de aplicaciones de SQL incorporado 209
![Page 218: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/218.jpg)
El enlazador del lenguaje principal crea una aplicación ejecutable. Por ejemplo:
v En sistemas operativos Windows, la aplicación puede ser un archivo ejecutable o
una biblioteca de enlace dinámico (DLL).
v En sistemas operativos basados en UNIX y Linux, la aplicación puede ser un
módulo de carga ejecutable o una biblioteca compartida.
Nota: Aunque las aplicaciones pueden ser bibliotecas de enlace dinámico (DLL) en
los sistemas operativos Windows, las DLL son cargadas directamente por la
aplicación y no por el gestor de bases de datos de DB2. En sistemas
operativos Windows, el gestor de bases de datos carga los procedimientos
almacenados de SQL incorporado y las funciones definidas por el usuario
como DLL.
Para crear el archivo ejecutable, enlace lo siguiente:
v Módulos de objetos de usuario, generados por el compilador del lenguaje a
partir de los archivos fuente modificados y otros archivos que no contienen
sentencias de SQL.
v API de biblioteca de lenguaje principal, que se suministran con el compilador
del lenguaje.
v La biblioteca del gestor de bases de datos que contiene las API del gestor de
bases de datos correspondientes a su entorno operativo. Consulte la
documentación sobre programación adecuada para su plataforma operativa para
ver el nombre específico de la biblioteca del gestor de bases de datos que
necesita para las API del gestor de bases de datos.
Tareas relacionadas:
v “Creación y ejecución de aplicaciones de SQL incorporado escritas en REXX” en
la página 265
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
v “Creación de aplicaciones IBM COBOL en AIX” en la página 246
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
Vinculación de paquetes de SQL incorporado con una base de datos
mediante el mandato BIND
Vinculación de paquetes de SQL incorporado con una base de
datos
La vinculación es el proceso de crear un paquete a partir de un archivo de
vinculación y de almacenarlo en una base de datos.
Relaciones entre aplicación, archivo de vinculación y paquete:
Las aplicaciones de bases de datos utilizan paquetes por algunas de las mismas
razones por las que se compilan las aplicaciones: mejora de rendimiento y de
compactación. Al precompilar una sentencia de SQL, la sentencia se compila en el
paquete cuando se crea la aplicación en lugar de hacerlo en el tiempo de ejecución.
Cada sentencia se analiza y se almacena en el paquete una serie de operandos
interpretados de forma más eficiente. Durante la ejecución, el código que ha
generado el precompilador llama a las API del gestor de bases de datos de
210 Desarrollo de aplicaciones de SQL incorporado
![Page 219: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/219.jpg)
servicios de tiempo de ejecución con la información sobre variables necesaria para
la entrada o salida de datos y la información almacenada en el paquete se ejecuta.
Las ventajas de la precompilación sólo se aplican a sentencias de SQL estático. Las
sentencias de SQL que se ejecutan de forma dinámica (utilizando PREPARE y
EXECUTE o EXECUTE IMMEDIATE) no se precompilan; por lo tanto, deben pasar
por todo el conjunto de pasos de proceso en el tiempo de ejecución.
Con el programa de utilidad de descripción de archivos de vinculación de DB2
(db2bfd), puede visualizar fácilmente el contenido de un archivo de vinculación
para examinar y verificar las sentencias de SQL que contiene, así como visualizar
las opciones de precompilación utilizadas para crear el archivo de vinculación. Esto
puede resultar útil en la determinación de problemas relacionados con el archivo
de vinculación de la aplicación.
Conceptos relacionados:
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Mejoras en el rendimiento cuando se utiliza la opción REOPT del mandato
BIND” en la página 218
Información relacionada:
v “db2bfd - Mandato Herramienta de descripción de archivo de vinculación” en
Consulta de mandatos
v “Sentencia EXECUTE” en Consulta de SQL, Volumen 2
v “Sentencia PREPARE” en Consulta de SQL, Volumen 2
Efecto de la opción de vinculación DYNAMICRULES en SQL
dinámico
La opción DYNAMICRULES de los mandatos PRECOMPILE y BIND determina
los valores que se aplicarán en el momento de la ejecución para los siguientes
atributos de SQL:
v El ID de autorización que se utiliza durante la comprobación de autorización.
v El calificador que se utiliza para la calificación de objetos no calificados.
v Si el paquete se puede utilizar para preparar de forma dinámica las siguientes
sentencias: GRANT, REVOKE, ALTER, CREATE, DROP, COMMENT ON,
RENAME, SET INTEGRITY y SET EVENT MONITOR STATE.
Además del valor de DYNAMICRULES, el entorno de tiempo de ejecución de un
paquete controla el modo en que se comportan las sentencias de SQL en el
momento de la ejecución. Los dos posibles entornos de tiempo de ejecución son:
v El paquete se ejecuta formando parte de un programa autónomo
v El paquete se ejecuta dentro del contexto de una rutina
La combinación del valor de DYNAMICRULES y del entorno de tiempo de
ejecución determina los valores correspondientes a los atributos de SQL dinámico.
Este conjunto de valores de atributos se denomina comportamiento de las
sentencias de SQL dinámico. Los cuatro comportamientos son:
Comportamiento de ejecución
DB2 utiliza el ID de autorización del usuario (el ID que se conectó
inicialmente a DB2) que ejecuta el paquete como valor que se va a
utilizar para la comprobación de autorización de sentencias de SQL
Capítulo 4. Creación de aplicaciones de SQL incorporado 211
![Page 220: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/220.jpg)
dinámico y como valor inicial utilizado para la calificación
implícita de referencias a objetos no calificados dentro de
sentencias de SQL dinámico.
Comportamiento de vinculación
En el momento de la ejecución, DB2 utiliza todas las normas que
se aplican al SQL estático para la autorización y calificación. Es
decir, se toma el ID de autorización del propietario del paquete
como valor que se va a utilizar para la comprobación de
autorización de sentencias de SQL dinámico y el calificador por
omisión del paquete para la calificación implícita de referencias a
objetos no calificados dentro de sentencias de SQL dinámico.
Comportamiento de definición
El comportamiento de definición sólo se aplica si la sentencia de
SQL dinámico está en un paquete que se ejecuta dentro del
contexto de una rutina y el paquete se vinculó con
DYNAMICRULES DEFINEBIND o DYNAMICRULES
DEFINERUN. DB2 utiliza el ID de autorización del definidor de la
rutina (no el vinculador de paquetes de la rutina) como valor que
se va a utilizar para la comprobación de autorización de sentencias
de SQL dinámico y para la calificación implícita de referencias a
objetos no calificados dentro de sentencias de SQL dinámico
contenidas en dicha rutina.
Comportamiento de invocación
El comportamiento de invocación sólo se aplica si la sentencia de
SQL dinámico está en un paquete que se ejecuta dentro del
contexto de una rutina y el paquete se vinculó con
DYNAMICRULES INVOKEBIND o DYNAMICRULES
INVOKERUN. DB2 utiliza el ID de autorización de sentencias
actualmente en vigor cuando se invoca la rutina como valor que se
va a utilizar para la comprobación de autorización de SQL
dinámico y para la calificación implícita de referencias a objetos no
calificados dentro de sentencias de SQL dinámico contenidas en
dicha rutina. Esto se resume en la tabla siguiente:
Entorno de invocación ID utilizado
Cualquier SQL estático Valor implícito o explícito del propietario
(OWNER) del paquete del que procede el
SQL que invoca la rutina.
Utilizado en definición de vista o activador Definidor de la vista o del activador.
SQL dinámico procedente de un paquete de
comportamiento de ejecución
ID utilizado para efectuar la conexión inicial
con DB2.
SQL dinámico procedente del paquete de
comportamiento de definición
Definidor de la rutina que utiliza el paquete
del que procede el SQL que invoca la rutina.
SQL dinámico procedente de un paquete de
comportamiento de invocación
ID de autorización actual que invoca la
rutina.
La tabla siguiente muestra la combinación del valor de DYNAMICRULES y el
entorno de tiempo de ejecución que da lugar a cada comportamiento del SQL
dinámico.
212 Desarrollo de aplicaciones de SQL incorporado
![Page 221: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/221.jpg)
Tabla 20. Cómo DYNAMICRULES y el entorno de tiempo de ejecución determinan el comportamiento de las
sentencias de SQL dinámico
Valor de DYNAMICRULES Comportamiento de sentencias de
SQL dinámico en un entorno de
programa autónomo
Comportamiento de sentencias de SQL
dinámico en un entorno de rutina
BIND Comportamiento de vinculación Comportamiento de vinculación
RUN Comportamiento de ejecución Comportamiento de ejecución
DEFINEBIND Comportamiento de vinculación Comportamiento de definición
DEFINERUN Comportamiento de ejecución Comportamiento de definición
INVOKEBIND Comportamiento de vinculación Comportamiento de invocación
INVOKERUN Comportamiento de ejecución Comportamiento de invocación
La tabla siguiente muestra los valores de atributos de SQL dinámico
correspondientes a cada tipo de comportamiento de SQL dinámico.
Tabla 21. Definiciones de comportamientos de sentencias de SQL dinámico
Atributo de SQL
dinámico
Valor
correspondiente a
atributos de SQL
dinámico:
comportamiento de
vinculación
Valor
correspondiente a
atributos de SQL
dinámico:
comportamiento de
ejecución
Valor correspondiente
a atributos de SQL
dinámico:
comportamiento de
definición
Valor correspondiente a
atributos de SQL
dinámico:
comportamiento de
invocación
ID de
autorización
Valor implícito o
explícito de la opción
OWNER BIND
ID de usuario que
ejecuta el paquete
Definidor de la rutina
(no el propietario del
paquete de la rutina)
ID de autorización de
sentencias actual cuando
se invoca la rutina.
Calificador por
omisión para
objetos no
calificados
Valor implícito o
explícito de la opción
QUALIFIER BIND
Registro especial
CURRENT
SCHEMA
Definidor de la rutina
(no el propietario del
paquete de la rutina)
ID de autorización de
sentencias actual cuando
se invoca la rutina.
Puede ejecutar
GRANT,
REVOKE, ALTER,
CREATE, DROP,
COMMENT ON,
RENAME, SET
INTEGRITY y
SET EVENT
MONITOR STATE
No Sí No No
Conceptos relacionados:
v “Consideraciones de autorización para SQL dinámico” en Desarrollo de SQL y
rutinas externas
v “Autorizaciones y vinculación de rutinas que contienen SQL” en Desarrollo de
SQL y rutinas externas
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
Tareas relacionadas:
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
Capítulo 4. Creación de aplicaciones de SQL incorporado 213
![Page 222: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/222.jpg)
Utilización de registros especiales para controlar el entorno
de compilación de sentencias
Para sentencias preparadas de forma dinámica, los valores de varios registros
especiales determinan el entorno de compilación de sentencias:
v El registro especial CURRENT QUERY OPTIMIZATION determina qué clase de
optimización se utiliza.
v El registro especial CURRENT PATH determina la vía de acceso de función
utilizada para la resolución de UDF y UDT.
v El registro CURRENT EXPLAIN SNAPSHOT determina qué información de
instantánea de Explain se captura.
v El registro CURRENT EXPLAIN MODE determina si la información de tabla de
Explain se captura, para cualquier sentencia de SQL dinámico que se pueda
elegir. Los valores por omisión correspondientes a estos registros especiales son
los mismos que se utilizan para las opciones de vinculación relacionadas.
Tareas relacionadas:
v “Preparación de una sentencia de SQL ejecutada dinámicamente utilizando la
estructura SQLDA mínima” en la página 154
Información relacionada:
v “Registro especial CURRENT EXPLAIN MODE” en Consulta de SQL, Volumen 1
v “Registro especial CURRENT EXPLAIN SNAPSHOT” en Consulta de SQL,
Volumen 1
v “Registro especial CURRENT PATH” en Consulta de SQL, Volumen 1
v “Registro especial CURRENT QUERY OPTIMIZATION” en Consulta de SQL,
Volumen 1
Cómo volver a crear paquetes utilizando el mandato BIND y
un archivo de vinculación existente
La vinculación es el proceso que crea el paquete que necesita el gestor de bases de
datos para poder acceder a la base de datos cuando se ejecuta la aplicación. Por
omisión, el mandato PRECOMPILE crea un paquete. La vinculación se realiza de
forma implícita en el momento de la precompilación, a no ser que se especifique la
opción BINDFILE. La opción PACKAGE le permite especificar un nombre de
paquete para el paquete que se crea en el momento de la precompilación.
A continuación se muestra un ejemplo típico de cómo utilizar el mandato BIND.
Para vincular un archivo de vinculación denominado filename.bnd a la base de
datos, puede emitir el siguiente mandato:
BIND filename.bnd
Se crea un paquete para cada módulo de código fuente precompilado por
separado. Si una aplicación tiene cinco archivos fuente, de los cuales tres necesitan
precompilación, se crean tres paquetes o archivos de vinculación. Por omisión, a
cada paquete se le asigna un nombre que coincide con el nombre del módulo
fuente a partir del cual se ha originado el archivo .bnd, pero truncado a 8
caracteres. Para especificar de forma explícita otro nombre de paquete, debe
utilizar la opción PACKAGE USING en el mandato PREP. La versión de un paquete
la proporciona la opción de precompilación VERSION y su valor por omisión es
una serie vacía. Si el nombre y esquema de este paquete recién creado coinciden
214 Desarrollo de aplicaciones de SQL incorporado
![Page 223: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/223.jpg)
con el nombre de un paquete que existe actualmente en la base de datos de
destino, pero el identificador de versión difiere, se crea un paquete nuevo y se
conserva el paquete anterior. Sin embargo, si existe un paquete cuyo nombre,
esquema y versión coinciden con los del paquete que se está vinculando, el
paquete se elimina y se sustituye por el paquete nuevo que se está vinculando (si
se especifica ACTION ADD en la vinculación se evita que se devuelva un error
(SQL0719)).
Conceptos relacionados:
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
v “Indicaciones horarias generadas por el precompilador” en la página 208
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Mandato PRECOMPILE” en Consulta de mandatos
Revinculación de paquetes existentes con el mandato REBIND
Revincular es el proceso de volver a crear un paquete correspondiente a un
programa de aplicación que se había vinculado previamente. Debe revincular
paquetes si se han marcado como no válidos o no operativos o si las estadísticas
de base de datos han cambiado desde la última vinculación. Sin embargo, en
algunas situaciones es posible que desee revincular paquetes que son válidos. Por
ejemplo, es posible que desee aprovechar un índice recién creado o utilizar
estadísticas actualizadas después de ejecutar el mandato RUNSTATS.
Los paquetes pueden depender de varios tipos de objetos de bases de datos como
tablas, vistas, alias, índices, activadores, restricciones referenciales y restricciones de
comprobación de tabla. Si un paquete depende de un objeto de base de datos
(como una tabla, vista, activador, etc) y dicho objeto se elimina, el paquete se
coloca en estado no válido. Si el objeto que se elimina es una UDF, el paquete se
coloca en estado no operativo.
El gestor de bases de datos revincula de forma implícita (o automática) los
paquetes no válidos cuando se ejecutan. Los paquetes no operativos se deben
revincular de forma explícita ejecutando el mandato BIND o el mandato REBIND.
Tenga que cuenta que la revinculación implícita puede ocasionar errores
inesperados si la revinculación implícita falla. Es decir, se devuelve el error de
revinculación implícita en la sentencia que se ejecuta, que puede no ser la sentencia
que realmente contiene el error. Si se intenta ejecutar un paquete no operativo, se
produce un error. Puede decidir revincular de forma explícita paquetes no válidos
en lugar de dejar que el sistema los revincule automáticamente. Esto le permite
controlar cuándo se produce la revinculación.
La opción de qué mandato utilizar para revincular de forma explícita un paquete
depende de las circunstancias. Debe utilizar el mandato BIND para revincular un
paquete correspondiente a un programa que se ha modificado para incluir más o
menos sentencias de SQL o sentencias de SQL modificadas. También debe utilizar
el mandato BIND si tiene que cambiar opciones de vinculación con respecto a los
valores con los que se vinculó originalmente el paquete. En todos los demás casos,
utilice el mandato BIND o REBIND. Debe utilizar REBIND cuando la situación no
necesite de forma específica el uso de BIND, puesto que el rendimiento de REBIND es
significativamente mejor que el de BIND.
Capítulo 4. Creación de aplicaciones de SQL incorporado 215
![Page 224: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/224.jpg)
Si coexisten varias versiones del mismo nombre de paquete en el catálogo, no se
puede revincular más una versión simultáneamente.
Conceptos relacionados:
v “Statement dependencies when changing objects” en Administration Guide:
Implementation
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Mandato REBIND” en Consulta de mandatos
v “Mandato RUNSTATS” en Consulta de mandatos
Consideraciones sobre la vinculación
Si la página de códigos de la aplicación utiliza una página de códigos distinta de la
de la base de datos, es posible que deba tener en cuenta qué página de códigos
utilizar al vincular.
Si la aplicación emite llamadas a alguna de las API de programas de utilidad del
gestor de bases de datos, como por ejemplo IMPORT o EXPORT, debe vincular los
archivos de vinculación suministrados por el programa de utilidad a la base de
datos.
Puede utilizar opciones de vinculación para controlar determinadas operaciones
que se producen durante la vinculación, como en los siguientes ejemplos:
v La opción de vinculación QUERYOPT aprovecha una clase de optimización
específica al vincular.
v La opción de vinculación EXPLSNAP almacena información de instantánea de
Explain para las sentencias de SQL que se pueden elegir en las tablas de
Explain.
v La función de vinculación FUNCPATH resuelve correctamente tipos
diferenciados definidos por el usuario y funciones definidas por el usuario en
SQL estático.
Si el proceso de vinculación comienza pero nunca vuelve, es posible que otras
aplicaciones conectadas a la base de datos mantengan bloqueos que necesita. En
este caso, asegúrese de que no haya aplicaciones conectadas a la base de datos. Si
las hay, desconecte todas las aplicaciones en el servidor y el proceso de vinculación
continuará.
Si la aplicación va a acceder a un servidor utilizando DB2 Connect, puede utilizar
las opciones de BIND disponibles para dicho servidor.
Los archivos de vinculación no son compatibles con versiones anteriores de DB2
UDB para Linux, UNIX y Windows. En entornos de nivel mixto, DB2 sólo puede
utilizar las funciones disponibles al nivel inferior del entorno de base de datos. Por
ejemplo, si un cliente de la versión 8 se conecta a un servidor de la versión 7.2, el
cliente sólo podrá utilizar funciones de la versión 7.2. Como los archivos de
vinculación expresan las funciones de la base de datos, están sujetos a la restricción
de nivel mixto.
216 Desarrollo de aplicaciones de SQL incorporado
![Page 225: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/225.jpg)
Si tiene que volver a vincular archivos de vinculación de nivel superior en sistemas
de nivel inferior, puede:
v Utilizar un Cliente DB2 de nivel inferior con el servidor de nivel superior y crear
archivos de vinculación que se puedan suministrar y vincular al entorno de DB2
UDB para Linux, UNIX y Windows de nivel inferior.
v Utilizar un cliente DB2 de nivel superior en el entorno de producción de nivel
inferior para vincular los archivos de vinculación de nivel superior creados en el
entorno de prueba. El cliente de nivel superior sólo pasa las opciones que se
aplican al servidor de nivel inferior.
Conceptos relacionados:
v “Conversión de caracteres entre distintas páginas de códigos” en Desarrollo de
SQL y rutinas externas
v “Substituciones de caracteres durante conversiones de páginas de códigos” en
Desarrollo de SQL y rutinas externas
v “Factor de expansión de conversión de páginas de códigos” en Desarrollo de SQL
y rutinas externas
v “Página de códigos activa para la precompilación y vinculación” en Desarrollo de
SQL y rutinas externas
Tareas relacionadas:
v “Binding utilities to the database” en Administration Guide: Implementation
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Sentencia SET CURRENT QUERY OPTIMIZATION” en Consulta de SQL,
Volumen 2
Ventajas de la vinculación diferida
La precompilación con la vinculación habilitada permite que una aplicación acceda
únicamente a la base de datos utilizada durante el proceso de precompilación. Sin
embargo, la precompilación con vinculación diferida permite que una aplicación
acceda a muchas bases de datos, puesto que puede vincular el archivo BIND
contra cada una. Este método de desarrollo de aplicaciones es más flexible por el
hecho de que las aplicaciones sólo se precompilan una vez, pero la aplicación se
puede vincular a una base de datos en cualquier momento.
Utilizar la API BIND durante la ejecución permite que una aplicación se vincule a
sí misma, quizás como parte de un procedimiento de instalación o antes de que se
ejecute un módulo asociado. Por ejemplo, una aplicación puede realizar varias
tareas, de las cuales sólo una necesita el uso de sentencias de SQL. Puede diseñar
la aplicación de modo que se vincule a sí misma a una base de datos sólo cuando
la aplicación llame a la tarea que necesita sentencias de SQL y sólo si aún no existe
un paquete asociado.
Otra ventaja del método de vinculación diferida es que le permite crear paquetes
sin suministrar el código fuente a los usuarios finales. Puede suministrar los
archivos de vinculación asociados con la aplicación.
Conceptos relacionados:
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
Capítulo 4. Creación de aplicaciones de SQL incorporado 217
![Page 226: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/226.jpg)
Información relacionada:
v “API sqlabndx - Vincular programa de aplicaciones para crear un paquete” en
Consulta de las API administrativas
Mejoras en el rendimiento cuando se utiliza la opción REOPT
del mandato BIND
la opción de vinculación REOPT puede mejorar significativamente el rendimiento
de las aplicaciones de SQL incorporado. A continuación encontrará descripciones
correspondientes a SQL estático e incorporado.
Efectos de REOPT en SQL estático:
La opción de vinculación REOPT puede hacer que sentencias de SQL estático que
contengan variables de lenguaje principal o registros especiales se comporten como
sentencias de vinculación incremental. Esto significa que estas sentencias se
compilan cuando se ejecuta EXECUTE u OPEN, en lugar de hacerlo durante la
vinculación. Durante esta compilación, se selecciona el plan de acceso, de acuerdo
con los valores reales de estas variables.
Cuando se utiliza REOPT ONCE, el plan de acceso se coloca en antememoria
después de la primera petición OPEN o EXECUTE, y se utiliza para la ejecución
subsiguiente de esta sentencia. Cuando se utiliza REOPT ALWAYS, el plan de
acceso se regenera para cada petición OPEN y EXECUTE, y para crear el plan se
utiliza el conjunto actual de valores de variables de lenguaje principal, marcadores
de parámetros y registros especiales.
Efectos de REOPT en SQL dinámico:
Cuando especifica la opción REOPT ALWAYS, DB2 aplaza la preparación de
cualquier sentencia que contenga variables de lenguaje principal, marcadores de
parámetros y registros especiales hasta que DB2 encuentre una sentencia OPEN o
EXECUTE; es decir, cuando los valores de esas variables pasan a ser conocidos. En
ese momento, se genera el plan de acceso utilizando esos valores. Las peticiones
OPEN o EXECUTE subsiguientes para la misma sentencia recompilarán la
sentencia, reoptimizarán el plan de consulta utilizando el conjunto actual de
valores de las variables y ejecutarán el plan de consulta recién creado.
La opción REOPT ONCE tiene un efecto similar, salvo que el plan se optimiza una
sola vez utilizando los valores de las variables de lenguaje principal, marcadores
de parámetros y de registros especiales. Este plan se coloca en antememoria y es
utilizado por peticiones subsiguientes.
Conceptos relacionados:
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Determinación del momento en que deben ejecutarse sentencias de SQL estática
o dinámicamente en aplicaciones de SQL incorporado” en la página 22
v “Utilización de registros especiales para controlar el entorno de compilación de
sentencias” en la página 214
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
v “Paquetes de aplicaciones y planes de acceso de SQL incorporado” en la página
204
218 Desarrollo de aplicaciones de SQL incorporado
![Page 227: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/227.jpg)
Almacenamiento y mantenimiento de paquetes
Almacenamiento y mantenimiento de paquetes
Los paquetes se crean al precompilar/enlazar un programa de aplicación. El
paquete contiene un plan de acceso optimizado que supervisa la ejecución de todas
las sentencias de SQL que se encuentran dentro de la aplicación. Los tres tipos de
privilegios relacionados con los paquetes son CONTROL, EXECUTE y BIND y sirven para
filtrar el nivel de acceso aceptable. Se pueden crear varias versiones del mismo
paquete especificando la opción VERSION en el momento de la compilación. Esta
opción ayuda a evitar errores de falta de coincidencia de indicación de hora y
permite ejecutar simultáneamente varias versiones de la aplicación.
Conceptos relacionados:
v “Creación de versiones de paquetes” en la página 219
v “Resolución de nombres de tabla no calificados” en la página 220
Creación de versiones de paquetes
Si tiene que crear varias versiones de una aplicación, puede utilizar la opción
VERSION del mandato PRECOMPILE. Esta opción permite la coexistencia de
varias versiones del mismo nombre de paquete (es decir, el nombre del paquete y
el nombre del creador). Por ejemplo, supongamos que tiene una aplicación
denominada foo que se compila desde foo.sqc. Precompilaría y vincularía el
paquete foo a la base de datos y distribuiría la aplicación a los usuarios. Luego los
usuarios podrían ejecutar la aplicación. Para realizar cambios en la aplicación,
actualizaría foo.sqc y luego repetiría el proceso de recompilación, vinculación y
envío de la aplicación a los usuarios. Si no se especifica la opción VERSION para
la primera o segunda precompilación de foo.sqc, el primer paquete se sustituye
por el segundo. Cualquier usuario que intente ejecutar la versión antigua de la
aplicación recibirá un error SQLCODE -818, que indica un error de falta de
coincidencia de indicación horaria.
Para evitar el error de falta de coincidencia de indicación horaria y para permitir
que ambas versiones de la aplicación se ejecutan al mismo tiempo, utilice la
creación de versiones de paquetes. Como ejemplo, cuando cree la primera versión
de foo, precompílela utilizando la opción VERSION, del siguiente modo:
DB2 PREP FOO.SQC VERSION V1.1
Ahora se puede ejecutar esta primera versión del programa. Cuando cree la nueva
versión de foo, precompílela con el mandato:
DB2 PREP FOO.SQC VERSION V1.2
En este momento esta nueva versión de la aplicación también se ejecutará, aunque
aún se estén ejecutando instancias de la primera aplicación. Puesto que la versión
de paquete correspondiente al primer paquete es V1.1 y la versión de paquete
correspondiente al segundo es V1.2, no hay conflicto de nombres: ambos paquetes
existirán en la base de datos y ambas versiones de la aplicación se pueden utilizar.
Puede utilizar la opción ACTION de los mandatos PRECOMPILE o BIND junto
con la opción VERSION del mandato PRECOMPILE. La opción ACTION sirve
para controlar el modo en que las distintas versiones de paquetes se pueden añadir
o sustituir.
Capítulo 4. Creación de aplicaciones de SQL incorporado 219
![Page 228: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/228.jpg)
Los privilegios de paquetes no tienen granularidad a nivel de versión. Es decir,
una acción GRANT o REVOKE de un privilegio de paquete se aplica a todas las
versiones de un paquete que comparten el nombre y el creador. Así, si se otorgaran
los privilegios del paquete foo a un usuario o un grupo después de que se creara
la versión V1.1, cuando se distribuyera la versión V1.2 el usuario o grupo tendría
los mismos privilegios sobre la versión V1.2. Este comportamiento suele ser
necesario porque normalmente los mismos usuarios y grupos tienen los mismos
privilegios sobre todas las versiones de un paquete. Si no desea que se apliquen los
mismos privilegios de paquete a todas las versiones de una aplicación, no utilice la
opción PRECOMPILE VERSION al realizar versiones del paquete. En su lugar,
utilice distintos nombres de paquetes (cambiando el nombre del archivo fuente
actualizado o utilizando la opción PACKAGE USING para cambiar el nombre del
paquete de forma explícita).
Conceptos relacionados:
v “Indicaciones horarias generadas por el precompilador” en la página 208
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
Tareas relacionadas:
v “Inclusión de las variables del lenguaje principal SQLSTATE y SQLCODE en
aplicaciones de SQL incorporado” en la página 83
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Mandato PRECOMPILE” en Consulta de mandatos
Resolución de nombres de tabla no calificados
Puede manejar nombres de tabla no calificados en la aplicación utilizando uno de
los siguientes métodos:
v Cada usuario puede vincular su paquete con distintos parámetros de
COLLECTION que utilizan distintos identificadores de autorización mediante
los siguientes mandatos:
CONNECT TO db_name USER user_name
BIND file_name COLLECTION schema_name
En el ejemplo anterior, db_name es el nombre de la base de datos, user_name es el
nombre del usuario y file_name es el nombre de la aplicación que se va a
vincular. Tenga en cuenta que user_name y schema_name suelen tener el mismo
valor. Luego utilice la sentencia SET CURRENT PACKAGESET para especificar
qué paquete utilizar y, por lo tanto, qué calificadores se utilizarán. Si no se
especifica COLLECTION, el calificador por omisión es el identificador de
autorización que se utiliza al vincular el paquete. Si se especifica COLLECTION,
el schema_name especificado es el calificador que se utilizará para objetos no
calificados.
v Cree vistas para cada usuario con el mismo nombre que la tabla de modo que
los nombres de tabla no calificados se resuelvan correctamente.
v Cree un alias para que cada usuario apunte a la tabla deseada.
Información relacionada:
v “Mandato BIND” en Consulta de mandatos
v “Sentencia SET CURRENT PACKAGESET” en Consulta de SQL, Volumen 2
v “Sentencia CREATE ALIAS” en Consulta de SQL, Volumen 2
220 Desarrollo de aplicaciones de SQL incorporado
![Page 229: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/229.jpg)
v “Sentencia CREATE VIEW” en Consulta de SQL, Volumen 2
Creación de aplicaciones de SQL incorporado mediante el script de
creación de ejemplo
Creación de aplicaciones de SQL incorporado mediante el
script de creación de ejemplo
Los archivos utilizados para mostrar la creación de programas de ejemplo se
conocen como archivos script en UNIX y Linux y como archivos de proceso por
lotes en Windows. Nosotros los llamaremos genéricamente archivos de creación.
Estos archivos contienen los mandatos de compilación y enlace recomendados para
los compiladores de las plataformas soportadas.
DB2 proporciona archivos de creación para los lenguajes principales pertenecientes
a las plataformas soportadas. Los archivos de creación están disponibles en el
mismo directorio en el que se encuentran los ejemplos correspondientes a cada
lenguaje. La tabla siguiente muestra los diferentes tipos de archivos de creación
para crear diversos tipos de programas. A menos que se indique otra cosa, estos
archivos de creación están pensados para los lenguajes soportados en todas las
plataformas soportadas. Los archivos de creación tienen la extensión .bat (batch)
en Windows, la cual no se muestra en la tabla. No existe extensión de archivo para
las plataformas UNIX.
Tabla 22. Archivos de creación de DB2
Archivo de
creación Tipos de programas creados
bldapp Programas de aplicación
bldrtn Rutinas (procedimientos almacenados y funciones definidas por el
usuario)
bldmc Aplicaciones C/C++ de conexión múltiple
bldmt Aplicaciones C/C++ de varias hebras
bldcli Aplicaciones cliente de CLI para procedimientos SQL contenidos en
el subdirectorio sqlproc de samples.
Nota: Por omisión, los scripts de ejemplo de bldapp para crear archivos ejecutables
a partir de código fuente crearán archivos ejecutables de 64 bits.
La tabla siguiente lista los archivos de creación correspondientes a cada plataforma
y lenguaje de programación, y los directorios donde están situados. En la
documentación en línea, los nombres de los archivos de creación están enlazados
dinámicamente con los archivos fuente de HTML. El usuario puede también
acceder a los archivos de texto contenidos en los directorios samples
correspondientes.
Capítulo 4. Creación de aplicaciones de SQL incorporado 221
![Page 230: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/230.jpg)
Tabla 23. Archivos de creación por lenguaje y plataforma
Plataforma —>
Lenguaje AIX HP-UX Linux Solaris Windows
C
samples/c
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp.bat
bldrtn.bat
bldmt.bat
bldmc.bat
C++
samples/cpp
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp
bldrtn
bldmt
bldmc
bldapp.bat
bldrtn.bat
bldmt.bat
bldmc.bat
IBM COBOL
samples/cobol
bldapp
bldrtn
n/d n/d n/d bldapp.bat
bldrtn.bat
Micro Focus COBOL
samples/cobol_mf
bldapp
bldrtn
bldapp
bldrtn
bldapp
bldrtn
bldapp
bldrtn
bldapp.bat
bldrtn.bat
Los archivos de creación se utilizan en la documentación sobre la creación de
aplicaciones y rutinas porque muestran muy claramente las opciones de
compilación y enlace que DB2 recomienda para los compiladores soportados
Generalmente existen otras muchas opciones de compilación y enlace, que el
usuario puede probar. Consulte la documentación del compilador para conocer
todas las opciones de compilación y enlace proporcionadas. Además de crear los
programas de ejemplo, el programador puede también crear sus propios
programas mediante los archivos de creación. Los programas de ejemplo se
pueden utilizar como plantillas que el usuario puede modificar como ayuda en el
desarrollo de aplicaciones.
Una característica práctica de los archivos de creación es que están diseñados para
crear un archivo fuente cuyo nombre puede ser cualquier nombre de archivo
permitido por el compilador. En cambio, en los makefiles, los nombres de
programa están codificados en el archivo. Los makefiles acceden a los archivos de
creación para compilar y enlazar los programas que crean. Los archivos de creación
utilizan la variable $1 en UNIX y Linux y la variable %1 en los sistemas operativos
Windows para que internamente se utilice la variable en lugar del nombre de
programa. Mediante un mayor número de estos nombres de variable se sustituyen
otros argumentos que puedan ser necesarios.
Los archivos de creación permiten experimentar de forma rápida y sencilla, pues
cada archivo está pensado para una clase específica de creación de programas,
tales como la creación de programas autónomos, rutinas (procedimientos
almacenados y funciones definidas por el usuario) o tipos de programa más
especializados, tales como los programas de conexión múltiple o los programas de
varias hebras. Se proporciona cada tipo de archivo de creación siempre que el
compilador da soporte a la clase determinada de programa para el que está
diseñado el archivo de creación.
El archivo objeto y el archivo ejecutable creados por un archivo de creación se
sobrescriben cada vez que se crea un programa, aunque el archivo fuente no se
modifique.No ocurre así cuando se utiliza un makefile. Por tanto, el programador
puede volver a crear un programa existente sin tener que suprimir un archivo
objeto o archivo ejecutable anterior, ni modificar el archivo fuente.
Los archivos de creación contienen un valor por omisión para la base de datos
″sample″ (base de datos de ejemplo). Si el usuario desea acceder a otra base de
222 Desarrollo de aplicaciones de SQL incorporado
![Page 231: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/231.jpg)
datos, puede simplemente proporcionar otro parámetro para alterar temporalmente
el valor por omisión. Si utilizan regularmente la otra base de datos, pueden
codificar el nombre de esa base de datos, en lugar de sample, dentro del propio
archivo de creación.
Para programas de SQL incorporado, salvo cuando se utilice el precompilador
COBOL de IBM en Windows, los archivos de creación llamar a otro archivo,
embprep, que contiene los pasos de precompilación y enlace para los programas de
SQL incorporado. Para estos pasos pueden ser necesarios los parámetros
opcionales correspondientes al ID de usuario y la contraseña, según el lugar donde
se cree el programa de SQL incorporado.
Por último, el programador puede modificar los archivos de creación de acuerdo
con sus necesidades. Además de cambiar el nombre de la base de datos dentro del
archivo de creación (tal como se describió anteriormente), el programador puede
codificar fácilmente otros parámetros dentro del archivo, cambiar opciones de
compilación y enlace, o modificar la vía de instancia predefinida de DB2. El
carácter simple, directo y específico del archivo de creación hace que el usuario
pueda adaptarlo fácilmente a sus necesidades.
Conceptos relacionados:
v “Archivos de ejemplo” en Temas de ejemplos
v “El entorno de desarrollo de aplicaciones de bases de datos de DB2” en Iniciación
al desarrollo de aplicaciones de bases de datos
v “Creación de aplicaciones de SQL incorporado” en la página 198
v “Programas de utilidad de comprobación de errores” en la página 223
v “Variables del lenguaje principal en aplicaciones de SQL incorporado” en la
página 74
Tareas relacionadas:
v “Compilación y enlace de archivos fuente que contienen SQL incorporado” en la
página 209
Programas de utilidad de comprobación de errores
El Cliente DB2 proporciona varios archivos de programas de utilidad. Estos
archivos contienen funciones para la comprobación de errores y la impresión de
información de errores. Los archivos de programa de utilidad correspondientes a
cada lenguaje se encuentran en el directorio ″samples″. Cuando se utilizan junto
con un programa de aplicación, los archivos de los programas de utilidad de
comprobación de errores proporcionan información útil sobre errores y facilitan la
depuración de los programas DB2. La mayoría de los programas de comprobación
de errores utilizan las API de DB2 GET SQLSTATE MESSAGE (sqlogstt) y GETERROR
MESSAGE (sqlaintp) para obtener la información pertinente de SQLSTATE y SQLCA
referente a problemas encontrados al ejecutar el programa. El archivo de programa
de utilidad de la CLI de DB2, utilcli.c, no hace uso de estas API de DB2; en su
lugar utiliza sentencias equivalentes de la CLI de DB2. Todos los programas de
utilidad de comprobación de errores imprimen mensajes de error descriptivos para
ayudar al programador a comprender rápidamente el problema. Algunos
programas DB2, tales como las rutinas (procedimientos almacenados y funciones
definidas por el usuario), no necesitan hacer uso de los programas de utilidad.
Capítulo 4. Creación de aplicaciones de SQL incorporado 223
![Page 232: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/232.jpg)
A continuación se indican los archivos de los programas de utilidad de
comprobación de errores utilizados por los compiladores soportados por DB2 para
los diversos lenguajes de programación:
Tabla 24. Archivos del programa de utilidad de comprobación de errores por idioma
Idioma
Archivo fuente
de SQL no
incorporado
Archivo de
cabecera de SQL
no incorporado
Archivo fuente
de SQL
incorporado
Archivo de
cabecera de SQL
incorporado
C
samples/c
utilapi.c utilapi.h utilemb.sqc utilemb.h
C++
samples/cpp
utilapi.C utilapi.h utilemb.sqC utilemb.h
IBM COBOL
samples/cobol
checkerr.cbl n/a n/a n/a
Micro Focus COBOL
samples/cobol_mf
checkerr.cbl n/a n/a n/a
Para poder utilizar las funciones del programa de utilidad, se debe primero
compilar el archivo del programa de utilidad y luego enlazar su archivo objeto
durante la creación del archivo ejecutable del programa destino. Tanto el makefile
como los archivos de creación contenidos en los directorios samples realizan esas
acciones para los programas que necesitan hacer uso de los programas de utilidad
de comprobación de errores.
El ejemplo siguiente muestra cómo se utilizan los programas de utilidad de
comprobación de errores en los programas DB2. El archivo de cabecera utilemb.h
define la macro EMB_SQL_CHECK, para las funciones SqlInfoPrint() y
TransRollback():
/* macro para la comprobación del SQL incorporado */
#define EMB_SQL_CHECK( MSG_STR ) \
SqlInfoPrint(MSG_STR, &sqlca, __LINE__, __FILE__); \
if (sqlca.sqlcode < 0) \
{ \
TransRollback(); \
return 1; \
}
SqlInfoPrint() comprueba el SQLCODE y muestra la información disponible
relacionada con el error específico encontrado. También indica el lugar donde se
produjo el error en el código fuente. TransRollback() permite que el archivo de
programa de utilidad retrotraiga sin peligro una transacción donde se ha
producido un error. Utiliza la sentencia de SQL incorporado EXEC SQL ROLLBACK. El
ejemplo siguiente nuestra cómo el programa de C dbuse invoca las funciones del
programa de utilidad utilizando la macro, y proporciona el valor "Delete with
host variables -- Execute" para el parámetro MSG_STR de la función
SqlInfoPrint():
EXEC SQL DELETE FROM org
WHERE deptnumb = :hostVar1 AND
division = :hostVar2;
EMB_SQL_CHECK("Delete with host variables -- Execute");
La macro EMB_SQL_CHECK hace que si la sentencia DELETE falla, la transacción se
retrotraiga sin peligro, y se imprima el mensaje de error apropiado.
El programador puede utilizar estos programas de utilidad de comprobación de
errores y utilizarlos como modelo al crear sus propios programas DB2.
224 Desarrollo de aplicaciones de SQL incorporado
![Page 233: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/233.jpg)
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
v “Archivos de ejemplo” en Temas de ejemplos
v “Información de error en los campos SQLCODE, SQLSTATE y SQLWARN” en la
página 190
Tareas relacionadas:
v “Inclusión de las variables del lenguaje principal SQLSTATE y SQLCODE en
aplicaciones de SQL incorporado” en la página 83
v “Declaración de la SQLCA para el manejo de errores” en la página 56
Creación de aplicaciones y rutinas escritas en C y C++
Creación de aplicaciones y rutinas escritas en C y C++
Se proporcionan scripts de creación para distintas plataformas de sistemas
operativos con el producto para facilitar la creación de aplicaciones de SQL
incorporado en C y C++. Además de los scripts de creación utilizados para crear
aplicaciones, se proporciona un script específico, bldrtn, que sirve para crear
rutinas (procedimientos almacenados y funciones definidas por el usuario). Para
aplicaciones y rutinas escritas en VisualAge, se utilizan archivos de configuración
para crear las aplicaciones. Los ejemplos de aplicaciones C suministrados varían
desde ejemplos de nivel de guía de aprendizaje o de cliente hasta ejemplo de nivel
de instancia y se encuentran en el directorio sqllib/samples/c para UNIX y en el
directorio sqllib\samples\c para Windows.
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
v “Creación del código de rutinas C y C++” en la página 362
v “Creación de aplicaciones de SQL incorporado escritas en VisualAge C++ con
archivos de configuración” en la página 229
Creación de aplicaciones en C o C++ mediante el script de
creación de ejemplo (UNIX)
DB2 proporciona scripts de creación para compilar y enlazar programas de SQL
incorporado y de la API de administración de DB2 en C o C++. Se encuentran en
el directorio sqllib/samples/c para aplicaciones en C y en el directorio
sqllib/samples/cpp para aplicaciones en C++, junto con programas de ejemplo
que se pueden crear con estos archivos.
El archivo de creación, bldapp contiene los mandatos para crear un programa de
aplicación DB2.
El primer parámetro, $1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas de la API de administración de DB2 que
no contienen SQL incorporado. Para crear programas de SQL incorporado es
necesaria una conexión con la base de datos, por lo que también se proporcionan
otros tres parámetros opcionales: el segundo parámetro, $2, especifica el nombre de
la base de datos con la que se desea conectar; el tercer parámetro, $3, especifica el
ID de usuario correspondiente a la base de datos, y $4 especifica la contraseña.
Capítulo 4. Creación de aplicaciones de SQL incorporado 225
![Page 234: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/234.jpg)
Para un programa de SQL incorporado, bldapp pasa los parámetros al script de
precompilación y vinculación, embprep. Si no se proporciona un nombre de base de
datos, se utiliza la base de datos por omisión sample. Los parámetros de ID de
usuario y contraseña sólo son necesarios si la instancia donde se crea el programa
es diferente de la instancia donde reside la base de datos.
Procedimiento:
Los ejemplos siguientes muestran cómo crear y ejecutar programas de la API de
administración de DB2 y aplicaciones de SQL incorporado.
Creación y ejecución de aplicaciones de la API de administración de DB2
Para crear el programa de ejemplo de la API de administración de DB2, cli_info,
a partir del archivo fuente cli_info.c para C y cli_info.C para ++, especifique:
bldapp cli_info
El resultado es un archivo ejecutable, cli_info.
Para ejecutar el archivo ejecutable, escriba el nombre del ejecutable:
cli_info
Creación y ejecución de aplicaciones de SQL incorporado
Hay tres formas de crear la aplicación de SQL incorporado, tbmod , a partir del
archivo fuente tbmod.sqc para C y tbmod.sqC para C++,:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp tbmod
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp tbmod basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp tbmod basedatos IDusuario contraseña
El resultado es un archivo ejecutable, tbmod.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si desea acceder a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable:
tbmod
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
tbmod basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
tbmod basedatos IDusuario contraseña
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
226 Desarrollo de aplicaciones de SQL incorporado
![Page 235: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/235.jpg)
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Información relacionada:
v “Opciones de compilación y enlace de aplicaciones de API de DB2 y de SQL
incorporado de C de AIX” en la página 234
v “Opciones de compilación y enlace para aplicaciones C de HP-UX” en la página
236
v “Opciones de compilación y enlace para aplicaciones C de Linux” en la página
239
v “Opciones de compilación y enlace para aplicaciones C de Solaris” en la página
242
Ejemplos relacionados:
v “bldapp -- Builds AIX C application programs (C)”
v “bldapp -- Builds HP-UX C applications (C)”
v “bldapp -- Builds Linux C applications (C)”
v “bldapp -- Builds Solaris C applications (C)”
v “cli_info.c -- Set and get information at the client level (C)”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
v “tbmod.sqc -- How to modify table data (C)”
Creación de aplicaciones C/C++ en Windows
DB2 proporciona scripts de creación para compilar y enlazar programas de la API
de DB2 y de SQL incorporado en C/C++. Estos archivos residen en los directorios
sqllib/samples/c y sqllib\samples\cpp, junto con programas de ejemplo que se
pueden crear a partir de esos archivos.
El archivo de proceso por lotes bldapp.bat contiene los mandatos para crear
programas de la API de DB2 y de SQL incorporado. Utiliza un máximo de cuatro
parámetros como entrada, que están representados dentro del archivo de proceso
por lotes por las variables %1, %2, %3 y %4.
El primer parámetro, %1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas que no contienen SQL incorporado. Para
crear programas de SQL incorporado es necesaria una conexión con la base de
datos, por lo que también se proporcionan otros tres parámetros: el segundo
parámetro, %2, especifica el nombre de la base de datos con la que se desea
conectar; el tercer parámetro, %3, especifica el ID de usuario correspondiente a la
base de datos, y %4 especifica la contraseña.
Para un programa de SQL incorporado, bldapp pasa los parámetros al archivo de
precompilación y vinculación, embprep.bat. Si no se proporciona un nombre de
base de datos, se utiliza la base de datos por omisión sample. Los parámetros de
ID de usuario y contraseña sólo son necesarios si la instancia donde se crea el
programa es diferente de la instancia donde reside la base de datos.
Procedimiento:
Capítulo 4. Creación de aplicaciones de SQL incorporado 227
![Page 236: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/236.jpg)
Los ejemplos siguientes muestran cómo crear y ejecutar programas de la API de
DB2 y aplicaciones de SQL incorporado.
Para crear el programa de ejemplo de la API de DB2 de SQL no incorporado,
cli_info, a partir del archivo fuente cli_info.c, situado en sqllib\samples\c, o a
partir del archivo fuente cli_info.cxx, situado en sqllib\samples\cpp, especifique:
bldapp cli_info
El resultado es un archivo ejecutable, cli_info.exe. Puede ejecutar el archivo
ejecutable escribiendo el nombre del ejecutable (sin la extensión) en la línea de
mandatos:
cli_info
Creación y ejecución de aplicaciones de SQL incorporado
Existen tres maneras para crear la aplicación de SQL incorporado tbmod, a partir
del archivo fuente C tbmod.sqc de sqllib\samples\c, o partir del archivo C++
tbmod.sqx de sqllib\samples\cpp:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp tbmod
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp tbmod basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp tbmod basedatos IDusuario contraseña
El resultado es un archivo ejecutable, tbmod.exe.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si desea acceder a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable:
tbmod
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
tbmod basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
tbmod basedatos IDusuario contraseña
Creación y ejecución de aplicaciones de varias hebras
Las aplicaciones C/C++ de varias hebras en Windows se tienen que compilar con
las opciones -MT o -MD. La opción -MT se enlazará utilizando la biblioteca estática
LIBCMT.LIB, y -MD se enlazará utilizando la biblioteca dinámica MSVCRT.LIB. El
binario enlazado con -MD será más pequeño pero dependiente de MSVCRT.DLL,
mientras que el binario enlazado con -MT será más grande pero independiente
respecto al momento de ejecución.
228 Desarrollo de aplicaciones de SQL incorporado
![Page 237: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/237.jpg)
El archivo de proceso por lotes bldmt.bat utiliza la opción -MT para crear un
programa de varias hebras. Todas las otras opciones de compilación y enlace son
iguales a las utilizadas por el archivo de proceso por lotes bldapp.bat para crear
aplicaciones autónomas normales.
Para crear el programa de varias hebras de ejemplo, dbthrds, a partir de los
archivos fuente samples\c\dbthrds.sqc o samples\cpp\dbthrds.sqx, especifique:
bldmt dbthrds
El resultado es un archivo ejecutable, dbthrds.exe.
Existen tres maneras de ejecutar esta aplicación de varias hebras:
1. Si accede a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable (sin la extensión):
dbthrds
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
dbthrds basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
dbthrds basedatos IDusuario contraseña
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones C y C++ de Windows” en
la página 245
Ejemplos relacionados:
v “cli_info.C -- Set and get information at the client level (C++)”
v “dbthrds.sqC -- How to use multiple context APIs on Windows (C++)”
v “tbmod.sqC -- How to modify table data (C++)”
v “bldapp.bat -- Builds C++ applications on Windows”
v “bldmt.bat -- Builds C++ multi-threaded applications on Windows”
v “dbthrds.sqc -- How to use multiple context APIs on Windows (C)”
v “embprep.bat -- Prep and binds a C/C++ or Micro Focus COBOL embedded
SQL program on Windows”
v “tbmod.sqc -- How to modify table data (C)”
v “bldapp.bat -- Builds C applications on Windows”
v “bldmt.bat -- Builds C multi-threaded applications on Windows”
v “cli_info.c -- Set and get information at the client level (C)”
Creación de aplicaciones de SQL incorporado escritas en
VisualAge C++ con archivos de configuración
VisualAge C++ tiene un compilador incremental y un compilador de proceso por
lotes. Mientras que el compilador de proceso por lotes utiliza makefiles y archivos
de creación, el compilador incremental utiliza archivos de configuración en su
lugar. Consulte la documentación de VisualAge C++ Versión 5.0 para conocer más
sobre este tema.
DB2 proporciona archivos de configuración para los diferentes tipos de programas
DB2 que el usuario puede crear con el compilador VisualAge C++.
Capítulo 4. Creación de aplicaciones de SQL incorporado 229
![Page 238: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/238.jpg)
Procedimiento:
Para utilizar un archivo de configuración de DB2, primero debe asignar una
variable de entorno al nombre del programa que desea compilar. A continuación,
compile el programa con un mandato proporcionado por VisualAge C++. Estos son
los temas que describen cómo utilizar los archivos de configuración
proporcionados por DB2 para compilar los diversos tipos de programas:
v Creación de aplicaciones de SQL incorporado y de la API de DB2 en C o C++
con archivos de configuración (AIX)
v Creación de procedimientos almacenados de SQL incorporado en C o C++ con
archivos de configuración
v Creación de funciones definidas por el usuario en C o C++ con archivos de
configuración (AIX)
Tareas relacionadas:
v “Creación de aplicaciones de SQL incorporado y de API de DB2 en C o C++ con
archivos de configuración (AIX)” en la página 230
v “Creación de procedimientos almacenados de SQL incorporado en C o C++ con
archivos de configuración” en la página 384
v “Creación de funciones definidas por el usuario en C o C++ con archivos de
configuración (AIX)” en la página 386
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Creación de aplicaciones de SQL incorporado y de API de DB2
en C o C++ con archivos de configuración (AIX)
Los archivos de configuración son básicamente scripts de creación utilizados para
crear aplicaciones escritas en VisualAge. El script hace varias cosas, que incluyen
comprobación de errores, conexión a una base de datos, precompilación del código,
establecimiento de la vía de acceso en la que se puede acceder a DB2 y finalmente
generación del archivo ejecutable.
Procedimiento:
Los ejemplos siguientes muestran cómo crear y ejecutar programas de la API de
administración de DB2 y aplicaciones de SQL incorporado con archivos de
configuración.
Creación de aplicaciones de SQL incorporado C y C++ con archivos de
configuración
El archivo de configuración emb.icc, contenido en sqllib/samples/c y
sqllib/samples/cpp, le permite crear aplicaciones de SQL incorporado para DB2
utilizando C o C++ en AIX.
Para utilizar el archivo de configuración a fin de crear la aplicación de SQL
incorporado tbmod, a partir del archivo fuente tbmod.sqc, siga estos pasos:
1. Asigne a la variable de entorno EMB el nombre del programa, de este modo:
v En el shell bash o Korn:
export EMB=tbmod
230 Desarrollo de aplicaciones de SQL incorporado
![Page 239: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/239.jpg)
v En el shell C:
setenv EMB tbmod
2. Si su directorio de trabajo contiene un archivo emb.ics, resultante de la creación
de un programa diferente con el archivo emb.icc, suprima el archivo emb.ics
mediante este mandato:
rm emb.ics
Si para el mismo programa que ahora creará de nuevo ya existe un archivo
emb.ics, no es necesario suprimir el archivo.
3. Compile el programa de ejemplo, especificando:
vacbld emb.icc
Nota: El mandato vacbld está incluido en VisualAge C++.
El resultado es un archivo ejecutable, tbmod. Puede ejecutar el programa entrando
el nombre del ejecutable:
tbmod
Creación de aplicaciones de API de DB2 C y C++ con archivos de configuración
El archivo de configuración, api.icc en sqllib/samples/c y en
sqllib/samples/cpp, le permite crear programas de la API de administración de
DB2 en C o C++ en AIX.
Para utilizar el archivo de configuración para crear el programa de ejemplo de la
API de administración de DB2, cli_info, a partir del archivo fuente cli_info.c,
haga lo siguiente:
1. Asigne a la variable de entorno API el nombre del programa, de este modo:
v En el shell bash o Korn:
export API=cli_info
v En el shell C:
setenv API cli_info
2. Si su directorio de trabajo contiene un archivo api.ics, resultante de la creación
de un programa diferente con el archivo api.icc, suprima el archivo api.ics
mediante este mandato:
rm api.ics
Si para el mismo programa que ahora creará de nuevo ya existe un archivo
api.ics, no es necesario suprimir el archivo.
3. Compile el programa de ejemplo, especificando:
vacbld api.icc
Nota: El mandato vacbld está incluido en VisualAge C++.
El resultado es un archivo ejecutable, cli_info. Puede ejecutar el programa
entrando el nombre del ejecutable:
cli_info
Tareas relacionadas:
v “Creación de procedimientos almacenados de SQL incorporado en C o C++ con
archivos de configuración” en la página 384
Capítulo 4. Creación de aplicaciones de SQL incorporado 231
![Page 240: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/240.jpg)
v “Creación de funciones definidas por el usuario en C o C++ con archivos de
configuración (AIX)” en la página 386
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
Creación de aplicaciones C/C++ de conexión múltiple en
Windows
DB2 proporciona scripts de creación para compilar y enlazar programas C y C++
de SQL incorporado y de los programas de API de DB2. Estos archivos residen en
los directorios sqllib/samples/c y sqllib\samples\cpp, junto con programas de
ejemplo que se pueden crear a partir de esos archivos.
El archivo de proceso por lotes, bldmc.bat, contiene los mandatos para crear un
programa de conexión múltiple de DB2, que requiere dos bases de datos. Las
opciones de compilación y enlace son las mismas que las utilizadas en el archivo
bldapp.bat.
El primer parámetro, %1, especifica el nombre del archivo fuente. El segundo
parámetro, %2, especifica el nombre de la primera base de datos a la que desea
conectarse. El tercer parámetro, %3, especifica la segunda base de datos a la que
desea conectarse. Todos estos parámetros son obligatorios.
Nota: El script de creación codifica los valores por omisión ″sample″ y ″sample2″
como nombres de la base de datos (%2 y %3, respectivamente) por lo que, si
está utilizando el script de creación y acepta estos valores, sólo tendrá que
especificar el nombre del programa (parámetro %1). Si utiliza el script
bldmc.bat debe especificar los tres parámetros.
No se requieren parámetros opcionales para una conexión local, pero sí para
conectar con un servidor desde un cliente remoto. Estos parámetros son: %4 y %5
para especificar, respectivamente, el ID de usuario y la contraseña para la primera
base de datos; y %6 y %7 para especificar, respectivamente, el ID de usuario y la
contraseña para la segunda base de datos.
Procedimiento:
Para el programa de ejemplo de conexión múltiple, dbmcon.exe, se requieren dos
bases de datos. Si aún no se ha creado la base de datos sample, la puede crear
entrando db2sampl en la línea de mandatos de una ventana de mandatos de DB2.
La segunda base de datos, aquí llamada sample2, se puede crear mediante uno de
los mandatos siguientes:
Si crea la base de datos localmente:
db2 create db sample2
Si crea la base de datos remotamente:
db2 attach to <nombre_nodo>
db2 create db sample2
db2 detach
db2 catalog db sample2 as sample2 at node <nombre_nodo>
donde <nombre_nodo es el nodo en que reside la base de datos.
Una conexión múltiple también requiere que se esté ejecutando el receptor TCP/IP.
Para asegurarse que es así, haga lo siguiente:
1. Establezca la variable de entorno DB2COMM en TCP/IP de la forma siguiente:
232 Desarrollo de aplicaciones de SQL incorporado
![Page 241: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/241.jpg)
db2set DB2COMM=TCPIP
2. Actualice el archivo de configuración 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 del servicio de TCP/IP>
Cada instancia tiene un nombre de servicio TCP/IP listado en el archivo de
servicios. Si no puede localizarlo o no tiene el permiso de archivo para cambiar
el archivo de servicios, pida ayuda al administrador.
3. Detenga y reinicie el gestor de bases de datos para que estos cambios entren en
vigor:
db2stop
db2start
El programa dbmcon.exe se crea a partir de cinco archivos de los directorios
samples\c o samples\cpp:
dbmcon.sqc o dbmcon.sqx
Archivo fuente principal para conectar con ambas bases de datos.
dbmcon1.sqc o dbmcon1.sqx
Archivo fuente para crear un paquete vinculado a la primera base de
datos.
dbmcon1.h
Archivo de cabecera para dbmcon1.sqc o dbmcon1.sqx, incluido en el
archivo fuente principal, dbmcon.sqc o dbmcon.sqx, para acceder a las
sentencias de SQL para crear y eliminar una tabla que se debe vincular a la
primera base de datos.
dbmcon2.sqc o dbmcon2.sqx
Archivo fuente para crear un paquete vinculado a la segunda base de
datos.
dbmcon2.h
Archivo de cabecera para dbmcon2.sqc o dbmcon2.sqx, incluido en el
archivo fuente principal, dbmcon.sqc o dbmcon.sqx, para acceder a las
sentencias de SQL para crear y eliminar una tabla que se debe vincular a la
segunda base de datos.
Para crear el programa de ejemplo de conexión múltiple, dbmcon.exe, se entre lo
siguiente:
bldmc dbmcon sample sample2
El resultado es un archivo ejecutable, dbmcon.exe.
Para ejecutar el archivo ejecutable, entre el nombre del ejecutable sin la extensión:
dbmcon
El programa muestra una confirmación en una fase para dos bases de datos.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Información relacionada:
Capítulo 4. Creación de aplicaciones de SQL incorporado 233
![Page 242: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/242.jpg)
v “Opciones de compilación y enlace para aplicaciones C y C++ de Windows” en
la página 245
v “svcename - TCP/IP service name configuration parameter” en Performance
Guide
Ejemplos relacionados:
v “bldmc.bat -- Builds C multi-connection application on Windows”
v “dbmcon.sqc -- How to use multiple databases (C)”
v “dbmcon1.h -- Function declarations for the source file, dbmcon1.sqc (C)”
v “dbmcon1.sqc -- Functions used in the multiple databases program dbmcon.sqc
(C)”
v “dbmcon2.h -- Function declarations for the source file, dbmcon2.sqc (C)”
v “dbmcon2.sqc -- Functions used in the multiple databases program dbmcon.sqc
(C)”
v “bldmc.bat -- Builds C++ multi-connection application on Windows”
v “dbmcon.sqC -- How to use multiple databases (C++)”
v “dbmcon1.h -- Class declaration for the source file, dbmcon1.sqC (C++)”
v “dbmcon1.sqC -- Functions used in the multiple databases program dbmcon.sqC
(C++)”
v “dbmcon2.h -- Class declaration for the source file, dbmcon2.sqC (C++)”
v “dbmcon2.sqC -- Functions used in the multiple databases program dbmcon.sqC
(C++)”
Opciones de compilación y enlace de aplicaciones de API de
DB2 y de SQL incorporado de C de AIX
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones C de SQL incorporado y de la API de DB2 con
el compilador C de IBM para AIX, tal como muestra el script de creación bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
xlc El compilador IBM XL C/C++.
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
234 Desarrollo de aplicaciones de SQL incorporado
![Page 243: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/243.jpg)
Opciones de enlace:
xlc Hace que el compilador se utilice como interfaz del editor de enlaces.
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si crea un programa que no es de SQL incorporado, incluir el archivo objeto del
programa de utilidad de la API de DB2 para la comprobación de errores.
-ldb2 Enlazar con la biblioteca de DB2.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/$LIB. Si el usuario no especifica la opción -L, el
compilador utiliza esta vía de acceso: /usr/lib:/lib.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
Información relacionada:
v “Opciones de compilación y enlace para rutinas C de AIX” en la página 373
Ejemplos relacionados:
v “bldapp -- Builds AIX C application programs (C)”
Opciones de compilación y enlace de aplicaciones de la API de
administración de DB2 y de SQL incorporado en C++ de AIX
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear aplicaciones de SQL incorporado y de la API de
administración de DB2 en C++ con el compilador IBM XL C/C++ de AIX, tal como
se muestra en el script de creación bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
xlC El compilador IBM XL C/C++.
EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Capítulo 4. Creación de aplicaciones de SQL incorporado 235
![Page 244: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/244.jpg)
Opciones de enlace:
xlC Hace que el compilador se utilice como interfaz del editor de enlaces.
EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
utilapi.o
Hace que se incluya el archivo objeto del programa de utilidad de la API para
programas que no contienen SQL incorporado.
utilemb.o
Incluye el archivo objeto del programa de utilidad de SQL incorporado para los
programas de SQL incorporado.
-ldb2 Enlazar con la biblioteca de DB2.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/$LIB. Si el usuario no especifica la opción -L, el
compilador utiliza esta vía de acceso: /usr/lib:/lib.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones de SQL incorporado y de API de DB2 en C o C++ con
archivos de configuración (AIX)” en la página 230
Información relacionada:
v “Opciones de compilación y enlace para rutinas C++ de AIX” en la página 374
Ejemplos relacionados:
v “bldapp -- Builds AIX C++ applications (C++)”
Opciones de compilación y enlace para aplicaciones C de HP-UX
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones C de SQL incorporado y de la API de DB2 con
el compilador C de HP-UX, tal como muestra el script de creación bldapp.
236 Desarrollo de aplicaciones de SQL incorporado
![Page 245: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/245.jpg)
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cc Indica el compilador C.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.-Ae Habilita la modalidad ampliada ANSI de HP.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Opciones de enlace:
cc Hace que el compilador se utilice como interfaz del editor de enlaces.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.-o $1 Especifica el ejecutable.
$1.o Especifica el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si es un programa de SQL no incorporado, incluir el archivo objeto del programa
de utilidad de la API de DB2 para la comprobación de errores.
$EXTRA_LFLAG
Especificar la vía de acceso de tiempo de ejecución. Si se establece, para 32 bits
contiene el valor -Wl,+b$HOME/sqllib/lib32, y para 64 bits contiene
-Wl,+b$HOME/sqllib/lib64. Si no se establece, no contiene ningún valor.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Para 32 bits: $HOME/sqllib/lib32; para 64 bits: $HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
Capítulo 4. Creación de aplicaciones de SQL incorporado 237
![Page 246: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/246.jpg)
Ejemplos relacionados:
v “bldapp -- Builds HP-UX C applications (C)”
Opciones de compilación y enlace para aplicaciones C++ de
HP-UX
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones en C++ de SQL incorporado y de la API de
DB2 con el compilador C++ de HP-UX, tal como muestra el script de creación
bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
aCC Indica el compilador aC++ de HP.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.-ext Permite el uso de diversas extensiones de C++, que incluyen el soporte para ″long
long″.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
238 Desarrollo de aplicaciones de SQL incorporado
![Page 247: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/247.jpg)
Opciones de enlace:
aCC Hace que el compilador aC++ de HP se utilice como interfaz del editor de enlaces.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.-o $1 Especifica el ejecutable.
$1.o Especifica el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si es un programa de SQL no incorporado, incluir el archivo objeto del programa
de utilidad de la API de DB2 para la comprobación de errores.
$EXTRA_LFLAG
Especificar la vía de acceso de tiempo de ejecución. Si se establece, para 32 bits
contiene el valor ″-Wl,+b$HOME/sqllib/lib32″, y para 64 bits: ″-Wl,+b$HOME/sqllib/lib64″. Si no se establece, no contiene ningún valor.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Para 32 bits: $HOME/sqllib/lib32; para 64 bits: $HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Conceptos relacionados:
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
Ejemplos relacionados:
v “bldapp -- Builds HP-UX C++ applications (C++)”
Opciones de compilación y enlace para aplicaciones C de Linux
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones C de SQL incorporado y de la API de DB2 con
el compilador C de Linux, tal como muestra el script de creación bldapp.
Capítulo 4. Creación de aplicaciones de SQL incorporado 239
![Page 248: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/248.jpg)
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
$CC El compilador gcc o xlc_r.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este
archivo de script tiene pasos separados para la compilación y la edición de
enlaces.
Opciones de enlace:
$CC El compilador gcc o xlc_r; hace que el compilador se utilice como interfaz del
editor de enlaces.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-o $1 Especifica el ejecutable.
$1.o Especifica el archivo objeto.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si es un programa de SQL no incorporado, incluir el archivo objeto del programa
de utilidad de la API de DB2 para la comprobación de errores.
$EXTRA_LFLAG
Para 32 bits contiene el valor ″-Wl,-rpath,$DB2PATH/lib32″, y para 64 bits
contiene el valor ″-Wl,-rpath,$DB2PATH/lib64″.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
Ejemplos relacionados:
240 Desarrollo de aplicaciones de SQL incorporado
![Page 249: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/249.jpg)
v “bldapp -- Builds Linux C applications (C)”
Opciones de compilación y enlace para aplicaciones C++ de
Linux
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones en C++ de SQL incorporado y de la API de
DB2 con el compilador C++ de Linux, tal como muestra el script de creación
bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
g++ Indica el compilador C++ de GNU/Linux.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este
archivo de script tiene pasos separados para la compilación y la edición de
enlaces.
Capítulo 4. Creación de aplicaciones de SQL incorporado 241
![Page 250: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/250.jpg)
Opciones de enlace:
g++ Hace que el compilador se utilice como interfaz del editor de enlaces.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si es un programa de SQL no incorporado, incluir el archivo objeto del programa
de utilidad de la API de DB2 para la comprobación de errores.
$EXTRA_LFLAG
Para 32 bits contiene el valor ″-Wl,-rpath,$DB2PATH/lib32″, y para 64 bits
contiene el valor ″-Wl,-rpath,$DB2PATH/lib64″.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Conceptos relacionados:
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
Ejemplos relacionados:
v “bldapp -- Builds Linux C++ applications (C++)”
Opciones de compilación y enlace para aplicaciones C de
Solaris
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones C de SQL incorporado y de la API de DB2 con
el compilador C de Forte, tal como muestra el script de creación bldapp.
242 Desarrollo de aplicaciones de SQL incorporado
![Page 251: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/251.jpg)
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cc Indica el compilador C.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este script
tiene pasos separados para la compilación y la edición de enlaces.
Opciones de enlace:
cc Hace que el compilador se utilice como interfaz del editor de enlaces.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Crea enlaces cuando se utiliza el soporte de varias hebras. Esta opción es
necesaria para enlazar con libdb2.
Nota: Si se utilizan hebras de POSIX, las aplicaciones DB2 se deben también
enlazar con -lpthread, tengan o no varias hebras.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si crea un programa que no es de SQL incorporado, incluir el archivo objeto del
programa de utilidad de la API de DB2 para la comprobación de errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-R$DB2PATH/lib32″, y para 64 bits contiene el
valor ″-R$DB2PATH/lib64″.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
Ejemplos relacionados:
v “bldapp -- Builds Solaris C applications (C)”
Capítulo 4. Creación de aplicaciones de SQL incorporado 243
![Page 252: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/252.jpg)
Opciones de compilación y enlace para aplicaciones C++ de
Solaris
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear aplicaciones en C++ de SQL incorporado y de la API de
DB2 con el compilador C++ de Forte, tal como muestra el script de creación
bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
CC Indica el compilador C++.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este script
tiene pasos separados para la compilación y la edición de enlaces.
Opciones de enlace:
CC Hace que el compilador se utilice como interfaz del editor de enlaces.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Crea enlaces cuando se utiliza el soporte de varias hebras. Esta opción es
necesaria para enlazar con libdb2.
Nota: Si se utilizan hebras de POSIX, las aplicaciones DB2 se deben también
enlazar con -lpthread, tengan o no varias hebras.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
utilemb.o
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.o
Si es un programa de SQL no incorporado, incluir el archivo objeto del programa
de utilidad de la API de DB2 para la comprobación de errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-R$DB2PATH/lib32″, y para 64 bits contiene el
valor ″-R$DB2PATH/lib64″.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
244 Desarrollo de aplicaciones de SQL incorporado
![Page 253: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/253.jpg)
Tareas relacionadas:
v “Compilación y enlace de archivos fuente que contienen SQL incorporado” en la
página 209
Ejemplos relacionados:
v “bldapp -- Builds Solaris C++ applications (C++)”
Opciones de compilación y enlace para aplicaciones C y C++ de
Windows
A continuación se muestran las opciones de compilación y enlace recomendadas
para DB2 para crear aplicaciones de SQL incorporado y de la API de DB2 en C y
C++ en Windows con el compilador Microsoft Visual C++, tal como se muestra en
el archivo de proceso por lotes bldapp.bat.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
%BLDCOMP%
Variable del compilador. El valor por omisión es cl, que indica el compilador
Microsoft Visual C++. Puede tener también el valor icl, el compilador Intel C++
para para aplicaciones de 32 ó 64 bits, o ecl, el compilador Intel C++ para
aplicaciones Itanium de 64 bits.
-Zi Habilitar la información de depuración.
-Od Inhabilitar las optimizaciones. Es más fácil utilizar un depurador si la
optimización está inhabilitada.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. El archivo
de proceso por lotes tiene pasos separados para la compilación y la edición de
enlaces.
-W2 Emitir mensajes de aviso, de error, de error grave y de error no recuperable.
-DWIN32
Opción de compilador necesaria para los sistemas operativos Windows.
Opciones de enlace:
link Indica la utilización del enlazador para la edición de enlaces.
-debug Hace que se incluya información de depuración.
-out:%1.exe
Especifique un nombre de archivo.
%1.obj Incluir el archivo objeto.
utilemb.obj
Si es un programa de SQL incorporado, incluir el archivo objeto del programa de
utilidad de SQL incorporado para la comprobación de errores.
utilapi.obj
Si crea un programa que no es de SQL incorporado, incluir el archivo objeto del
programa de utilidad de la API de DB2 para la comprobación de errores.
db2api.lib
Enlazar con la biblioteca DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones C/C++ en Windows” en la página 227
Capítulo 4. Creación de aplicaciones de SQL incorporado 245
![Page 254: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/254.jpg)
Ejemplos relacionados:
v “bldapp.bat -- Builds C++ applications on Windows”
v “bldapp.bat -- Builds C applications on Windows”
Creación de aplicaciones y rutinas escritas en COBOL
Creación de aplicaciones y rutinas escritas en COBOL
Se proporcionan scripts de creación para distintas plataformas de sistemas
operativos con el producto para facilitar la creación de aplicaciones de SQL
incorporado en COBOL. Además de los scripts de creación utilizados para crear
aplicaciones, se proporciona un script específico, bldrtn, que sirve para crear
rutinas (procedimientos almacenados y funciones definidas por el usuario).
Cuando trabaje con aplicaciones escrita en el lenguaje Micro Focus COBOL en
Linux, asegúrese de configurar el compilador de modo que pueda acceder a ciertas
bibliotecas compartidas de COBOL. Se suministran ejemplos IBM COBOL que se
encuentran en el directorio sqllib/samples/cobol para UNIX y en el directorio
sqllib\samples\cobol para Windows; para los directorios de ejemplos de Micro
Focus COBOL, sustituya ’cobol’ al final de la vía de acceso por ’cobol_mf’.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Creación de aplicaciones IBM COBOL en AIX” en la página 246
v “Creación de aplicaciones Micro Focus COBOL en Windows” en la página 251
Información relacionada:
v “Ejemplos de COBOL” en la página 408
Creación de aplicaciones IBM COBOL en AIX
DB2 proporciona scripts de creación para compilar y enlazar programas IBM
COBOL de SQL incorporado y programas de la API de administración de DB2.
Estos scripts residen en el directorio sqllib/samples/cobol, junto con programas
de ejemplo que se pueden crear a partir de esos archivos.
El archivo de creación, bldapp, contiene los mandatos para crear un programa de
aplicación DB2.
El primer parámetro, $1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas que no contienen SQL incorporado. Para
crear programas de SQL incorporado es necesaria una conexión con la base de
datos, por lo que también se proporcionan otros tres parámetros opcionales: el
segundo parámetro, $2, especifica el nombre de la base de datos con la que se
desea conectar; el tercer parámetro, $3, especifica el ID de usuario correspondiente
a la base de datos, y $4 especifica la contraseña.
Para un programa de SQL incorporado, bldapp pasa los parámetros al script de
precompilación y vinculación, embprep. Si no se proporciona un nombre de base de
datos, se utiliza la base de datos por omisión sample. Los parámetros de ID de
usuario y contraseña sólo son necesarios si la instancia donde se crea el programa
es diferente de la instancia donde reside la base de datos.
Procedimiento:
246 Desarrollo de aplicaciones de SQL incorporado
![Page 255: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/255.jpg)
Para crear el programa de ejemplo de SQL no incorporado, client, a partir del
archivo fuente client.cbl, especifique:
bldapp client
El resultado es un archivo ejecutable, client. Para ejecutar el archivo ejecutable
sobre la base de datos sample, especifique:
client
Creación y ejecución de aplicaciones de SQL incorporado
A partir del archivo fuente updat.sqb, puede crear la aplicación de SQL
incorporado, updat, de tres maneras:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp updat
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp updat basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
El resultado es un archivo ejecutable, updat.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si desea acceder a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable:
updat
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
updat basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Tareas relacionadas:
v “Creación de rutinas IBM COBOL en AIX” en la página 396
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones IBM COBOL de AIX” en la
página 259
v “Ejemplos de COBOL” en la página 408
Ejemplos relacionados:
v “client.cbl -- How to set and query a client (IBM COBOL)”
v “updat.sqb -- How to update, delete and insert table data (IBM COBOL)”
v “bldapp -- Builds AIX COBOL applications”
Capítulo 4. Creación de aplicaciones de SQL incorporado 247
![Page 256: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/256.jpg)
v “embprep -- To prep and bind a COBOL embedded SQL sample on AIX”
Creación de aplicaciones Micro Focus COBOL de UNIX
DB2 proporciona scripts de creación para compilar y enlazar programas Micro
Focus COBOL de SQL incorporado y de la API de DB2. Estos scripts residen en el
directorio sqllib/samples/cobol_mf, junto con programas de ejemplo que se
pueden crear a partir de esos archivos.
El archivo de creación, bldapp, contiene los mandatos para crear un programa de
aplicación DB2.
El primer parámetro, $1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas que no contienen SQL incorporado. Para
crear programas de SQL incorporado es necesaria una conexión con la base de
datos, por lo que también se proporcionan otros tres parámetros opcionales: el
segundo parámetro, $2, especifica el nombre de la base de datos con la que se
desea conectar; el tercer parámetro, $3, especifica el ID de usuario correspondiente
a la base de datos, y $4 especifica la contraseña.
Para un programa de SQL incorporado, bldapp pasa los parámetros al script de
precompilación y vinculación, embprep. Si no se proporciona un nombre de base de
datos, se utiliza la base de datos por omisión sample. Los parámetros de ID de
usuario y contraseña sólo son necesarios si la instancia donde se crea el programa
es diferente de la instancia donde reside la base de datos.
Procedimiento:
Para crear el programa de ejemplo de SQL no incorporado, client, a partir del
archivo fuente client.cbl, especifique:
bldapp client
El resultado es un archivo ejecutable, client. Para ejecutar el archivo ejecutable
sobre la base de datos sample, especifique:
client
Creación y ejecución de aplicaciones de SQL incorporado
A partir del archivo fuente updat.sqb, puede crear la aplicación de SQL
incorporado, updat, de tres maneras:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp updat
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp updat basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
El resultado es un archivo ejecutable, updat.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si desea acceder a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable:
248 Desarrollo de aplicaciones de SQL incorporado
![Page 257: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/257.jpg)
updat
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
updat basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
AIX” en la página 260
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
HP-UX” en la página 261
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Linux” en la página 262
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Solaris” en la página 261
Ejemplos relacionados:
v “bldapp -- Builds Linux Micro Focus COBOL applications”
v “bldapp -- Builds Solaris Micro Focus COBOL applications”
v “client.cbl -- How to set and query a client (MF COBOL)”
v “updat.sqb -- How to update, delete and insert table data (MF COBOL)”
v “bldapp -- Builds AIX Micro Focus COBOL applications”
v “bldapp -- Builds HP-UX Micro Focus COBOL applications”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
Creación de aplicaciones IBM COBOL en Windows
DB2 proporciona scripts de creación para compilar y enlazar programas de la API
de DB2 y de SQL incorporado. Estos archivos residen en el directorio
sqllib\samples\cobol, junto con programas de ejemplo que se pueden crear a
partir de esos archivos.
DB2 da soporte a dos precompiladores para crear aplicaciones IBM COBOL en
Windows, el precompilador de DB2 y el precompilador de IBM COBOL. El valor
por omisión es el precompilador de DB2. El precompilador de IBM COBOL se
puede seleccionar descomentando la línea apropiada del archivo de proceso por
lotes que se esté utilizando. La precompilación con IBM COBOL la realiza el
propio compilador, utilizando opciones de precompilación específicas.
El archivo de proceso por lotes bldapp.bat contiene los mandatos para crear
programas de aplicación DB2. Utiliza un máximo de cuatro parámetros como
entrada, que están representados dentro del archivo de proceso por lotes por las
variables %1, %2, %3 y %4.
Capítulo 4. Creación de aplicaciones de SQL incorporado 249
![Page 258: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/258.jpg)
El primer parámetro, %1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas que no contienen SQL incorporado. Para
crear programas de SQL incorporado es necesaria una conexión con la base de
datos, por lo que también se proporcionan otros tres parámetros: el segundo
parámetro, %2, especifica el nombre de la base de datos con la que se desea
conectar; el tercer parámetro, %3, especifica el ID de usuario correspondiente a la
base de datos, y %4 especifica la contraseña.
Para un programa de SQL incorporado que utiliza el precompilador de DB2 por
omisión, bldapp.bat pasa los parámetros al archivo de precompilación y
vinculación, embprep.bat.
Para un programa de SQL incorporado que utiliza el precompilador de IBM
COBOL, bldrtn.bat copia el archivo fuente .sqb en un archivo fuente .cbl. El
compilador realiza la precompilación sobre el archivo fuente .cbl con opciones de
precompilación específicas.
Para cualquiera de los precompiladores, si no se proporciona un nombre de base
de datos, se utiliza la base de datos por omisión sample. Los parámetros de ID de
usuario y contraseña sólo son necesarios si la instancia donde se crea el programa
es diferente de la instancia donde reside la base de datos.
Procedimiento:
Los ejemplos siguientes muestran cómo crear y ejecutar programas de la API de
DB2 y aplicaciones de SQL incorporado.
Para crear el programa de ejemplo de SQL no incorporado, client, a partir del
archivo fuente client.cbl, especifique:
bldapp client
El resultado es un archivo ejecutable, client.exe. Para ejecutar el archivo
ejecutable sobre la base de datos sample, especifique el nombre del ejecutable (sin
la extensión):
client
Creación y ejecución de aplicaciones de SQL incorporado
A partir del archivo fuente updat.sqb, puede crear la aplicación de SQL
incorporado, updat, de tres maneras:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp updat
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp updat basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
El resultado es un archivo ejecutable, updat.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si desea acceder a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable:
250 Desarrollo de aplicaciones de SQL incorporado
![Page 259: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/259.jpg)
updat
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
updat basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Información relacionada:
v “Ejemplos de COBOL” en la página 408
v “Opciones de compilación y enlace para aplicaciones IBM COBOL de Windows”
en la página 263
Ejemplos relacionados:
v “bldapp.bat -- Builds Windows VisualAge COBOL applications”
v “client.cbl -- How to set and query a client (IBM COBOL)”
v “embprep.bat -- To prep and bind a COBOL embedded SQL program on
Windows”
v “updat.sqb -- How to update, delete and insert table data (IBM COBOL)”
Creación de aplicaciones Micro Focus COBOL en Windows
DB2 proporciona scripts de creación para compilar y enlazar programas de la API
de DB2 y de SQL incorporado. Estos archivos residen en el directorio
sqllib\samples\cobol_mf, junto con programas de ejemplo que se pueden crear a
partir de esos archivos.
El archivo de proceso por lotes bldapp.bat contiene los mandatos para crear
programas de aplicación DB2. Utiliza un máximo de cuatro parámetros como
entrada, que están representados dentro del archivo de proceso por lotes por las
variables %1, %2, %3 y %4.
El primer parámetro, %1, especifica el nombre del archivo fuente. Éste es el único
parámetro necesario para los programas que no contienen SQL incorporado. Para
crear programas de SQL incorporado es necesaria una conexión con la base de
datos, por lo que también se proporcionan otros tres parámetros: el segundo
parámetro, %2, especifica el nombre de la base de datos con la que se desea
conectar; el tercer parámetro, %3, especifica el ID de usuario correspondiente a la
base de datos, y %4 especifica la contraseña.
Para un programa de SQL incorporado, bldapp pasa los parámetros al archivo de
precompilación y vinculación, embprep.bat. Si no se proporciona un nombre de
base de datos, se utiliza la base de datos por omisión sample. Los parámetros de
ID de usuario y contraseña sólo son necesarios si la instancia donde se crea el
programa es diferente de la instancia donde reside la base de datos.
Procedimiento:
Capítulo 4. Creación de aplicaciones de SQL incorporado 251
![Page 260: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/260.jpg)
Los ejemplos siguientes muestran cómo crear y ejecutar programas de la API de
DB2 y aplicaciones de SQL incorporado.
Para crear el programa de ejemplo de SQL no incorporado, client, a partir del
archivo fuente client.cbl, especifique:
bldapp client
El resultado es un archivo ejecutable, client.exe. Para ejecutar el archivo
ejecutable sobre la base de datos sample, especifique el nombre del ejecutable (sin
la extensión):
client
Creación y ejecución de aplicaciones de SQL incorporado
A partir del archivo fuente updat.sqb, puede crear la aplicación de SQL
incorporado, updat, de tres maneras:
1. Si conecta con la base de datos ″sample″ en la misma instancia, especifique:
bldapp updat
2. Si conecta con otra base de datos en la misma instancia, especifique también el
nombre de la base de datos:
bldapp updat basedatos
3. Si conecta con una base de datos de otra instancia, especifique también el ID de
usuario y la contraseña de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
El resultado es un archivo ejecutable, updat.exe.
Existen tres maneras de ejecutar esta aplicación de SQL incorporado:
1. Si accede a la base de datos sample en la misma instancia, especifique
simplemente el nombre del ejecutable (sin la extensión):
updat
2. Si desea acceder a otra base de datos en la misma instancia, especifique el
nombre del ejecutable y el nombre de la base de datos:
updat basedatos
3. Si desea acceder a una base de datos de otra instancia, especifique el nombre
del ejecutable, el nombre de la base de datos, y el ID de usuario y la contraseña
de la instancia de base de datos:
bldapp updat basedatos IDusuario contraseña
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Información relacionada:
v “Ejemplos de COBOL” en la página 408
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Windows” en la página 264
Ejemplos relacionados:
v “bldapp.bat -- Builds Windows Micro Focus Cobol applications”
v “client.cbl -- How to set and query a client (MF COBOL)”
v “updat.sqb -- How to update, delete and insert table data (MF COBOL)”
252 Desarrollo de aplicaciones de SQL incorporado
![Page 261: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/261.jpg)
v “embprep.bat -- Prep and binds a C/C++ or Micro Focus COBOL embedded
SQL program on Windows”
Configuración del compilador IBM COBOL en Windows
Si desarrolla aplicaciones que contienen SQL incorporado y llamadas a la API de
DB2 y está utilizando el compilador IBM VisualAge COBOL, hay varias
consideraciones a tener en cuenta.
Procedimiento:
v Cuando precompile la aplicación utilizando el precompilador de DB2 y use el
mandato de procesador de línea de mandatos db2 prep, utilice la opción target
ibmcob.
v No utilice caracteres de tabulación en los archivos fuente.
v Utilice las palabras clave PROCESS y CBL en los archivos fuente para definir
opciones de compilación. Coloque las palabras clave en las columnas 8 a la 72
solamente.
v Si la aplicación sólo contiene SQL incorporado y ninguna llamada a la API de
DB2, no es necesario que utilice la opción de compilación pgmname(mixed). Si
especifica llamadas a la API de DB2, debe utilizar la opción de compilación
pgmname(mixed).
v Si utiliza la opción ″System/390 host data type support″ del compilador IBM
VisualAge COBOL, los archivos de inclusión de DB2 correspondientes a las
aplicaciones se encuentran en el siguiente directorio:
%DB2PATH%\include\cobol_i
Si crea programas DB2 de ejemplo utilizando los archivos de proceso por lotes
proporcionados, la vía de acceso de los archivos de inclusión especificada en los
archivos de proceso por lotes se debe cambiar para que apunte al directorio
cobol_i y no al directorio cobol_a.
Si NO utiliza la opción ″System/390 host data type support″ del compilador
IBM VisualAge COBOL, o si utiliza una versión anterior de este compilador, los
archivos de inclusión de DB2 correspondientes a las aplicaciones se encuentran
en el siguiente directorio:
%DB2PATH%\include\cobol_a
El directorio cobol_a es el directorio por omisión.
v Especifique nombres de archivo de COPY de modo que incluyan la extensión
.cbl, de la manera siguiente:
COPY "sql.cbl".
Tareas relacionadas:
v “Creación de aplicaciones IBM COBOL en Windows” en la página 249
v “Creación de rutinas IBM COBOL en Windows” en la página 399
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones IBM COBOL de Windows”
en la página 263
v “Opciones de compilación y enlace para rutinas IBM COBOL de Windows” en la
página 395
Capítulo 4. Creación de aplicaciones de SQL incorporado 253
![Page 262: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/262.jpg)
Configuración del compilador Micro Focus COBOL en Windows
Si desarrolla aplicaciones que contienen SQL incorporado y llamadas a la API de
DB2, y está utilizando el compilador Micro Focus, existen varias consideraciones
para tener en cuenta.
Procedimiento:
v Cuando precompile la aplicación utilizando el mandato db2 prep del procesador
de línea de mandatos, utilice la opción target mfcob.
v Asegúrese de que la variable de entorno LIB apunta a %DB2PATH%\lib utilizando
el siguiente mandato:
set LIB="%DB2PATH%\lib;%LIB%"
v Los archivos de COPY para DB2 correspondientes a Micro Focus COBOL residen
en %DB2PATH%\include\cobol_mf. Defina la variable de entorno COBCPY para que
incluya ese directorio del siguiente modo:
set COBCPY="%DB2PATH%\include\cobol_mf;%COBCPY%"
Debe asegurarse de que las variables de entorno antes mencionadas estén
establecidas permanentemente en los valores del Sistema. Esto se puede
comprobar siguiendo estos pasos:
1. Abra el Panel de control
2. Seleccione Sistema
3. Seleccione la pestaña Avanzado
4. Pulse en Variables de entorno
5. Compruebe en la lista Variables del sistema si aparecen las variables de
entorno necesarias. Si no están, añádalas a la lista Variables del sistema
Establecerlas en los valores de Usuario, en un indicador de mandatos o en un
script no es suficiente.
Las llamadas a las API de DB2 se deben realizar utilizando el convenio de llamada
74. El precompilador DB2 COBOL inserta automáticamente una cláusula
CALL-CONVENTION en un párrafo SPECIAL-NAMES. Si el párrafo
SPECIAL-NAMES no existe, el precompilador DB2 COBOL lo crea, de esta manera:
Identification Division
Program-ID. "static".
special-names.
call-convention 74 is DB2API.
Además, el precompilador inserta automáticamente el símbolo DB2API, que sirve
para identificar el convenio de llamada, a continuación de la palabra clave ″call″
cada vez que se llama a una API de DB2. Esto ocurre, por ejemplo, cada vez que el
precompilador emite una llamada a una API de DB2 a partir de una sentencia de
SQL incorporado.
Si las llamadas a las API de DB2 se realizan en una aplicación que no está
precompilada, es necesario crear manualmente un párrafo SPECIAL-NAMES en la
aplicación, similar al proporcionado más arriba. Si llama a una API de DB2
directamente, necesitará añadir manualmente el símbolo DB2API a continuación de
la palabra clave ″call″.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL en Windows” en la página 251
v “Creación de rutinas Micro Focus COBOL en Windows” en la página 401
254 Desarrollo de aplicaciones de SQL incorporado
![Page 263: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/263.jpg)
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Windows” en la página 264
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows” en la página 396
Configuración del compilador Micro Focus COBOL en Linux
Procedimiento:
Para ejecutar rutinas de Micro Focus COBOL, el editor de enlaces de Linux debe
poder acceder a determinadas bibliotecas compartidas de Java, y DB2 debe poder
cargar estas bibliotecas. Debido a que el programa que realiza esta carga se ejecuta
con privilegios setuid, sólo buscará las bibliotecas dependientes en /usr/lib.
Cree enlaces simbólicos con /usr/lib para las bibliotecas compartidas de COBOL.
Esto se debe hacer como usuario root. La manera más sencilla de hacerlo es
enlazando todos los archivos de bibliotecas de COBOL de $COBDIR/lib con
/usr/lib:
ln -s $COBDIR/lib/libcob* /usr/lib
donde $COBDIR es el lugar en que está instalado Micro Focus COBOL, normalmente
/opt/lib/mfcobol.
Éstos son los mandatos para enlazar cada uno de los archivos individuales
(suponiendo que Micro Focus COBOL está instalado en /opt/lib/mfcobol):
ln -s /opt/lib/mfcobol/lib/libcobrts.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobrts_t.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobrts.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobrts_t.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobcrtn.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobcrtn.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobmisc.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobmisc_t.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobmisc.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobmisc_t.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobscreen.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobscreen.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobtrace.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobtrace_t.so /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobtrace.so.2 /usr/lib
ln -s /opt/lib/mfcobol/lib/libcobtrace_t.so.2 /usr/lib
Es necesario hacer lo siguiente en cada instancia de DB2.
v Cuando precompile la aplicación utilizando el mandato db2 prep del procesador
de línea de mandatos, utilice la opción target mfcob.
v Debe incluir el directorio del archivo COPY de DB2 para COBOL en la variable
de entorno COBCOPY de Micro Focus COBOL. La variable de entorno COBCPY
especifica la ubicación de los archivos COPY. Los archivos COPY de DB2
correspondientes a Micro Focus COBOL residen en sqllib/include/cobol_mf,
dentro del directorio de la instancia de la base de datos.
Para incluir el directorio en la variable de entorno, especifique:
– En el shell bash o Korn:
export COBCPY=$HOME/sqllib/include/cobol_mf:$COBDIR/cpylib
– En el shell C:
setenv COBCPY $HOME/sqllib/include/cobol_mf:$COBDIR/cpylib
Capítulo 4. Creación de aplicaciones de SQL incorporado 255
![Page 264: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/264.jpg)
v Actualizar la variable de entorno:
– En el shell bash o Korn:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/sqllib/lib:$COBDIR/lib
– En el shell C:
setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:$HOME/sqllib/lib:$COBDIR/lib
v Establecer la Lista de entornos de DB2:
db2set DB2ENVLIST="COBDIR LD_LIBRARY_PATH"
Nota: Es posible que desee establecer COBCPY, COBDIR y LD_LIBRARY_PATH en
.bashrc, .kshrc (según el shell que se utilice), .bash_profile, .profile
(según el shell que se utilice) o en .login. .
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Linux” en la página 262
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de Linux”
en la página 394
Configuración del compilador IBM COBOL en AIX
Debe seguir los pasos siguientes si desarrolla aplicaciones que contienen SQL
incorporado y llamadas a la API de DB2, y está utilizando el compilador IBM
COBOL Set para AIX.
Procedimiento:
v Cuando precompile la aplicación utilizando el mandato de procesador de línea
de mandatos db2 prep, utilice la opción target ibmcob.
v No utilice caracteres de tabulación en los archivos fuente.
v Puede utilizar las palabras clave PROCESS y CBL en la primera línea de los
archivos fuente para definir opciones de compilación.
v Si la aplicación sólo contiene SQL incorporado y ninguna llamada a la API de
DB2, no es necesario que utilice la opción de compilación pgmname(mixed). Si
especifica llamadas a la API de DB2, debe utilizar la opción de compilación
pgmname(mixed).
v Si utiliza la opción ″System/390 host data type support″ del compilador IBM
COBOL Set para AIX, los archivos de inclusión de DB2 correspondientes a las
aplicaciones están contenidos en este directorio:
$HOME/sqllib/include/cobol_i
Si crea programas DB2 de ejemplo utilizando los archivos de script
proporcionados, la vía de acceso de los archivos de inclusión especificada en los
archivos de script se debe cambiar para que apunte al directorio cobol_i y no al
directorio cobol_a.
Si NO utiliza la opción ″System/390 host data type support″ del compilador
IBM COBOL Set para AIX, o está utilizando una versión anterior de este
compilador, los archivos de inclusión de DB2 correspondientes a las aplicaciones
están contenidos en este directorio:
$HOME/sqllib/include/cobol_a
256 Desarrollo de aplicaciones de SQL incorporado
![Page 265: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/265.jpg)
Especifique nombres de archivo de COPY de modo que incluyan la extensión
.cbl, de la manera siguiente:
COPY "sql.cbl".
Conceptos relacionados:
v “Consideraciones sobre la instalación de COBOL en AIX” en Desarrollo de SQL y
rutinas externas
Tareas relacionadas:
v “Creación de aplicaciones IBM COBOL en AIX” en la página 246
v “Creación de rutinas IBM COBOL en AIX” en la página 396
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones IBM COBOL de AIX” en la
página 259
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
Configuración del compilador Micro Focus COBOL en AIX
Siga los pasos siguientes si desarrolla aplicaciones que contienen SQL incorporado
y llamadas a la API de DB2 y utiliza el compilador Micro Focus COBOL.
Procedimiento:
v Cuando precompile la aplicación utilizando el mandato db2 prep del procesador
de línea de mandatos, utilice la opción target mfcob.
v Debe incluir el directorio del archivo COPY de DB2 para COBOL en la variable
de entorno COBCOPY de Micro Focus COBOL. La variable de entorno COBCPY
especifica la ubicación de los archivos COPY. Los archivos COPY de DB2
correspondientes a Micro Focus COBOL residen en sqllib/include/cobol_mf,
dentro del directorio de la instancia de la base de datos.
Para incluir el directorio en la variable de entorno, especifique:
– En el shell bash o Korn:
export COBCPY=$COBCPY:$HOME/sqllib/include/cobol_mf
– En el shell C:
setenv COBCPY $COBCPY:$HOME/sqllib/include/cobol_mf
Nota: Puede definir COBCPY dentro del archivo .profile o .login.
Conceptos relacionados:
v “Consideraciones sobre la instalación de COBOL en AIX” en Desarrollo de SQL y
rutinas externas
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
AIX” en la página 260
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
Capítulo 4. Creación de aplicaciones de SQL incorporado 257
![Page 266: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/266.jpg)
Configuración del compilador Micro Focus COBOL en HP-UX
Si desarrolla aplicaciones que contienen SQL incorporado y llamadas a la API de
DB2, y está utilizando el compilador Micro Focus COBOL, existen varias
consideraciones para tener en cuenta.
Procedimiento:
v Cuando precompile la aplicación utilizando el mandato db2 prep del procesador
de línea de mandatos, utilice la opción target mfcob.
v Debe incluir el directorio del archivo COPY de DB2 para COBOL en la variable
de entorno COBCOPY de Micro Focus COBOL. La variable de entorno COBCPY
especifica la ubicación de los archivos COPY. Los archivos COPY de DB2
correspondientes a Micro Focus COBOL residen en sqllib/include/cobol_mf,
dentro del directorio de la instancia de la base de datos.
Para incluir el directorio en la variable de entorno,
– en el shell bash o Korn, especifique:
export COBCPY=$COBCPY:$HOME/sqllib/include/cobol_mf
– en el shell C, especifique:
setenv COBCPY ${COBCPY}:${HOME}/sqllib/include/cobol_mf
Nota: Puede definir COBCPY dentro del archivo .profile o .login.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
HP-UX” en la página 261
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de HP-UX”
en la página 393
Configuración del compilador Micro Focus COBOL en Solaris
Si desarrolla aplicaciones que contienen SQL incorporado y llamadas a la API de
DB2, y está utilizando el compilador Micro Focus COBOL, debe tener en cuenta
varias consideraciones.
Procedimiento:
v Cuando precompile la aplicación utilizando el mandato db2 prep del procesador
de línea de mandatos, utilice la opción target mfcob.
v Debe incluir el directorio del archivo COPY de DB2 para COBOL en la variable
de entorno COBCOPY de Micro Focus COBOL. La variable de entorno COBCPY
especifica la ubicación de los archivos COPY. Los archivos COPY de DB2
correspondientes a Micro Focus COBOL residen en sqllib/include/cobol_mf,
dentro del directorio de la instancia de la base de datos.
Para incluir el directorio en la variable de entorno, especifique:
– En el shell bash o Korn:
export COBCPY=$COBCPY:$HOME/sqllib/include/cobol_mf
– En el shell C:
setenv COBCPY $COBCPY:$HOME/sqllib/include/cobol_mf
258 Desarrollo de aplicaciones de SQL incorporado
![Page 267: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/267.jpg)
Nota: Puede definir COBCPY dentro del archivo .profile.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
Solaris” en la página 261
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de Solaris”
en la página 393
Opciones de compilación y enlace para aplicaciones IBM COBOL
de AIX
A continuación se muestran las opciones de compilación y enlace recomendadas
para DB2 para crear aplicaciones de SQL incorporado y de la API de DB2 en
COBOL con el compilador IBM COBOL para AIX, tal como se muestra en el script
de creación bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob2 El compilador IBM COBOL para AIX.
-qpgmname\(mixed\)
Indica al compilador que permita llamadas a los puntos de entrada de biblioteca
utilizando nombres con mayúsculas y minúsculas mezcladas.
-qlib Indica al compilador que procese las sentencias COPY.
-I$DB2PATH/include/cobol_a
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include/cobol_a.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Opciones de enlace:
cob2 Hace que el compilador se utilice como interfaz del editor de enlaces.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
checkerr.o
Hace que se incluya el archivo objeto de programa de utilidad para la
comprobación de errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/lib32.
-ldb2 Enlazar con la biblioteca del gestor de bases de datos.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones IBM COBOL en AIX” en la página 246
v “Configuración del compilador IBM COBOL en AIX” en la página 256
Capítulo 4. Creación de aplicaciones de SQL incorporado 259
![Page 268: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/268.jpg)
Información relacionada:
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
Ejemplos relacionados:
v “bldapp -- Builds AIX COBOL applications”
Opciones de compilación y enlace para aplicaciones Micro
Focus COBOL de AIX
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear aplicaciones de SQL incorporado y de la API de
DB2 en COBOL con el compilador Micro Focus COBOL en AIX, tal como se
muestra en el script de creación bldapp. Tenga en cuenta que los archivos de
inclusión de DB2 MicroFocus COBOL se localizan configurando la variable de
entorno COBCPY, de modo que no se necesita el distintivo -I en el paso de
compilación. Consulte el script bldapp para ver un ejemplo.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob El compilador MicroFocus COBOL.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces.
$EXTRA_COBOL_FLAG="-C MFSYNC"
Habilita el soporte de 64 bits.
-x Cuando se utiliza con -c, crea un archivo objeto.
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-x Crea un programa ejecutable.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/lib32.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Configuración del compilador Micro Focus COBOL en AIX” en la página 257
Información relacionada:
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
Ejemplos relacionados:
260 Desarrollo de aplicaciones de SQL incorporado
![Page 269: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/269.jpg)
v “bldapp -- Builds AIX Micro Focus COBOL applications”
Opciones de compilación y enlace para aplicaciones Micro
Focus COBOL de HP-UX
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear aplicaciones de SQL incorporado y de la API de
DB2 en COBOL con el compilador Micro Focus COBOL en HP-UX, tal como se
muestra en el script de creación bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob Indica el compilador Micro Focus COBOL.
-cx Compila para crear el módulo objeto.
$EXTRA_COBOL_FLAG
Contiene ″-C MFSYNC″ si la plataforma HP-UX es IA64 y el soporte de 64 bits
está habilitado.
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-x Especifica un programa ejecutable.
$1.o Incluir el archivo objeto del programa.
checkerr.o
Incluir el archivo objeto del programa de utilidad para la comprobación de
errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Configuración del compilador Micro Focus COBOL en HP-UX” en la página
258
Ejemplos relacionados:
v “bldapp -- Builds HP-UX Micro Focus COBOL applications”
Opciones de compilación y enlace para aplicaciones Micro
Focus COBOL de Solaris
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear aplicaciones de SQL incorporado y de la API de
DB2 en COBOL con el compilador Micro Focus COBOL en Solaris, tal como se
muestra en el script de creación bldapp.
Capítulo 4. Creación de aplicaciones de SQL incorporado 261
![Page 270: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/270.jpg)
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob Indica el compilador Micro Focus COBOL.
$EXTRA_COBOL_FLAG
Para soporte de 64 bits, contiene el valor ″-C MFSYNC″; de lo contrario, no
contiene ningún valor.
-cx Compila para crear el módulo objeto.
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-x Especifica un programa ejecutable.
$1.o Incluir el archivo objeto del programa.
checkerr.o
Hace que se incluya el archivo objeto de programa de utilidad para la
comprobación de errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo: $HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
v “Configuración del compilador Micro Focus COBOL en Solaris” en la página 258
Ejemplos relacionados:
v “bldapp -- Builds Solaris Micro Focus COBOL applications”
Opciones de compilación y enlace para aplicaciones Micro
Focus COBOL de Linux
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear aplicaciones de SQL incorporado y de la API de
DB2 en COBOL con el compilador Micro Focus COBOL en Linux, tal como se
muestra en el script de creación bldapp.
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob Indica el compilador Micro Focus COBOL.
-cx Compila y crea el módulo objeto.
$EXTRA_COBOL_FLAG
Para el soporte de 64 bits, contiene el valor ″-C MFSYNC″; de lo contrario, no
contiene ningún valor.
262 Desarrollo de aplicaciones de SQL incorporado
![Page 271: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/271.jpg)
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-x Especifica un programa ejecutable.
-o $1 Incluir el ejecutable.
$1.o Incluir el archivo objeto del programa.
checkerr.o
Incluir el archivo objeto del programa de utilidad para la comprobación de
errores.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Configuración del compilador Micro Focus COBOL en Linux” en la página 255
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
Ejemplos relacionados:
v “bldapp -- Builds Linux Micro Focus COBOL applications”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
Opciones de compilación y enlace para aplicaciones IBM COBOL
de Windows
A continuación se muestran las opciones de compilación y enlace recomendadas
para DB2 para crear aplicaciones de SQL incorporado y de la API de DB2 en
COBOL en Windows con el compilador IBM VisualAge COBOL, tal como se
muestra en el archivo de proceso por lotes bldapp.bat.
Capítulo 4. Creación de aplicaciones de SQL incorporado 263
![Page 272: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/272.jpg)
Opciones de compilación y enlace para bldapp:
Opciones de compilación:
cob2 El compilador IBM VisualAge COBOL.
-qpgmname(mixed)
Indica al compilador que permita llamadas a los puntos de entrada de biblioteca
utilizando nombres con mayúsculas y minúsculas mezcladas.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
-qlib Indica al compilador que procese las sentencias COPY.
-Ivía Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
-I"%DB2PATH%\include\cobol_a".
%EXTRA_COMPFLAG%
Si ″set IBMCOB_PRECOMP=true" no tiene comentarios, el precompilador IBM COBOL
se utilizará para precompilar el SQL incorporado. Se invocará con una de las
siguientes formulaciones, en función de los parámetros de entrada:
-q"SQL(’database sample CALL_RESOLUTION DEFERRED’)"
precompilar utilizando la base de datos de ejemplo por omisión, y diferir
la resolución de la llamada.
-q"SQL(’database %2 CALL_RESOLUTION DEFERRED’)"
precompilar utilizando una base de datos especificada por el usuario, y
diferir la resolución de la llamada.
-q"SQL(’database %2 user %3 using %4 CALL_RESOLUTION DEFERRED’)"
precompilar utilizando una base de datos, un ID de usuario y una
contraseña especificados por el usuario, y diferir la resolución de la
llamada. Éste es el formato para el acceso de clientes remotos.
Opciones de enlace:
cob2 Utilizar el compilador como interfaz del editor de enlaces.
%1.obj Incluir el archivo objeto del programa.
checkerr.obj
Incluir el archivo objeto del programa de utilidad de comprobación de errores.
db2api.lib
Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones IBM COBOL en Windows” en la página 249
v “Configuración del compilador IBM COBOL en Windows” en la página 253
Ejemplos relacionados:
v “bldapp.bat -- Builds Windows VisualAge COBOL applications”
Opciones de compilación y enlace para aplicaciones Micro
Focus COBOL de Windows
A continuación se muestran las opciones de compilación y enlace recomendadas
para DB2 para crear aplicaciones de SQL incorporado y de la API de DB2 en
COBOL en Windows con el compilador Micro Focus COBOL, tal como se muestra
en el archivo de proceso por lotes bldapp.bat.
264 Desarrollo de aplicaciones de SQL incorporado
![Page 273: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/273.jpg)
Opciones de compilación y enlace para bldapp:
Opción de compilación:
cobol Indica el compilador Micro Focus COBOL.
Opciones de enlace:
cbllink
Utilizar el enlazador para la edición de enlaces.
-l Enlazar con la biblioteca lcobol.
checkerr.obj
Enlazar con el archivo objeto del programa de utilidad de comprobación de
errores.
db2api.lib
Enlazar con la biblioteca DB2 de la API
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL en Windows” en la página 251
v “Configuración del compilador Micro Focus COBOL en Windows” en la página
254
Ejemplos relacionados:
v “bldapp.bat -- Builds Windows Micro Focus Cobol applications”
Creación y ejecución de aplicaciones de SQL incorporado
escritas en REXX
Creación y ejecución de aplicaciones de SQL incorporado
escritas en REXX
Las aplicaciones REXX no se precompilan, compilan ni enlazan. Las instrucciones
siguientes describen cómo crear y ejecutar aplicaciones REXX en sistemas
operativos Windows y en el sistema operativo AIX.
Restricciones:
En plataformas basadas en Windows, el archivo de aplicación debe tener una
extensión .CMD. Después de su creación, puede ejecutar la aplicación directamente
desde el indicador de mandatos del sistema operativo. En AIX, el archivo de la
aplicación puede tener cualquier extensión.
Procedimiento:
Cree y ejecute las aplicaciones REXX del siguiente modo:
v En sistemas operativos Windows, el archivo de aplicación puede tener cualquier
nombre. Después de su creación, puede ejecutar la aplicación desde el indicador
de mandatos del sistema operativo invocando al intérprete de REXX del modo
siguiente:
REXX file_name
v En AIX, puede ejecutar la aplicación mediante cualquiera de los dos métodos
siguientes:
Capítulo 4. Creación de aplicaciones de SQL incorporado 265
![Page 274: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/274.jpg)
– En el indicador de mandatos de shell, escriba rexx name donde name es el
nombre del programa REXX.
– Si la primera línea del programa REXX contiene un ″número mágico″ (#!) e
identifica el directorio en que reside el intérprete de REXX/6000, puede
ejecutar el programa REXX escribiendo su nombre en el indicador de
mandatos del shell. Por ejemplo, si el archivo del intérprete de REXX/6000
está en el directorio /usr/bin, incluya la información siguiente como primera
línea del programa REXX:
#! /usr/bin/rexx
A continuación, haga que el programa sea ejecutable escribiendo el mandato
siguiente en el indicador de mandatos del shell:
chmod +x name
Ejecute el programa REXX escribiendo su nombre de archivo en el indicador
de mandatos del shell.
Nota: En AIX, debe establecer la variable de entorno LIBPATH para incluir el
directorio en que está ubicada la biblioteca de SQL para REXX, db2rexx.
Por ejemplo:
export LIBPATH=/lib:/usr/lib:/$DB2PATH/lib
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones REXX” en la página 9
Información relacionada:
v “Archivos de vinculación de REXX” en la página 266
v “Ejemplos de REXX” en la página 412
Archivos de vinculación de REXX
Se proporcionan cinco archivos de vinculación para el soporte de aplicaciones
REXX. Los nombres de estos archivos están incluidos en el archivo
DB2UBIND.LST. Cada archivo de vinculación se ha precompilado utilizando un
nivel de aislamiento distinto; por consiguiente, en la base de datos hay cinco
paquetes diferentes almacenados.
Los cinco archivos de vinculación son:
DB2ARXCS.BND
Soporta el nivel de aislamiento de estabilidad del cursor.
DB2ARXRR.BND
Soporta el nivel de aislamiento de lectura repetitiva.
DB2ARXUR.BND
Soporta el nivel de aislamiento de estabilidad de lectura no confirmada.
DB2ARXRS.BND
Soporta el nivel de aislamiento de estabilidad de lectura.
DB2ARXNC.BND
Soporta el nivel de aislamiento de sin confirmación. Se utiliza este nivel de
aislamiento cuando se trabaja con algunos servidores de bases de datos de
sistema principal, AS/400 o iSeries. En otras bases de datos, se comporta
como el nivel de aislamiento de lectura no confirmada.
Nota: En algunos casos, puede que sea necesario vincular de forma explícita estos
archivos a la base de datos.
266 Desarrollo de aplicaciones de SQL incorporado
![Page 275: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/275.jpg)
Cuando se utiliza la rutina SQLEXEC se usa, por omisión, el paquete creado con
estabilidad del cursor. Si necesita uno de los otros niveles de aislamiento, lo puede
cambiar mediante la API SQLDBS CHANGE SQL ISOLATION LEVEL antes de
conectar con la base de datos. Esto ocasionará que las posteriores llamadas a la
rutina SQLEXEC se asocien al nivel de aislamiento especificado.
Las aplicaciones REXX basadas en Windows no pueden asumir que esté en vigor el
nivel de aislamiento por omisión a menos que sepan que ningún otro programa
REXX de la sesión ha cambiado el valor. Antes de conectar con una base de datos,
una aplicación REXX debe establecer explícitamente el nivel de aislamiento.
Conceptos relacionados:
v “Tipos de cursores y consideraciones sobre unidad de trabajo en aplicaciones de
SQL incorporado” en la página 181
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
Creación de aplicaciones Object REXX en Windows
Object REXX es un versión del lenguaje REXX orientada a objetos. Se han añadido
extensiones orientadas a objetos al REXX estándar, pero no se han modificado sus
funciones e instrucciones existentes. El programa intérprete de Object REXX es una
versión mejorada de su predecesor, e incluye soporte adicional para:
v Clases, objetos y métodos
v Gestión de mensajes y polimorfismo
v Herencia simple y múltiple
Object REXX es totalmente compatible con el REXX estándar. En esta sección,
siempre que se utiliza el término REXX se hace referencia a todas las versiones de
REXX, incluido Object REXX.
No es necesario precompilar ni enlazar los programas REXX.
En Windows, no es necesario que los programas REXX comiencen con un
comentario. Sin embargo, por razones de portabilidad, es recomendable que en
cada programa REXX coloque un comentario que comience en la primera columna
de la primera línea. Esto permitirá diferenciar el programa respecto de un mandato
de proceso por lotes cuando se ejecute en otras plataformas:
/* Coloque aquí un comentario cualquiera. */
Los programas REXX de ejemplo están contenidos en el directorio
sqllib\samples\rexx.
Procedimiento:
Para ejecutar el programa REXX de ejemplo updat, especifique:
rexx updat.cmd
Conceptos relacionados:
v “Restricciones en el uso de REXX para programar aplicaciones de SQL
incorporado” en la página 30
Información relacionada:
v “Ejemplos de REXX” en la página 412
Capítulo 4. Creación de aplicaciones de SQL incorporado 267
![Page 276: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/276.jpg)
Creación de aplicaciones de SQL incorporado desde la línea de
mandatos
Creación de aplicaciones de SQL incorporado desde la línea
de mandatos
Para crear de aplicaciones de SQL incorporado desde la línea de mandatos incluye,
siga estos pasos:
1. Precompile la aplicación emitiendo el mandato PRECOMPILE
2. Si ha creado un archivo de vinculación, vincule dicho archivo a una base de
datos para crear un paquete de aplicación emitiendo el mandato BIND.
3. Compile la fuente de la aplicación modificada y los archivos fuente que no
contienen SQL incorporado para crear un archivo de objeto de aplicación (un
archivo .obj).
4. Enlace los archivos de objeto de aplicación con DB2 y con bibliotecas del
lenguaje principal para crear un programa ejecutable mediante el mandato link.
Conceptos relacionados:
v “Incorporación de sentencias de SQL en un lenguaje principal” en la página 4
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
Creación de aplicaciones de SQL incorporado escritas en C o
C++ (Windows)
Después de escribir el archivo fuente, tiene que crear la aplicación de SQL
incorporado. Algunos pasos del proceso de creación dependen del compilador que
utilice. Los ejemplos que se proporcionan con casa paso del procedimiento
muestran cómo crear una aplicación denominada myapp con un compilador
Microsoft Visual Studio 6.0, que es un compilador de C. Puede ejecutar cada uno
de los pasos del procedimiento de forma individual o puede ejecutar los pasos
juntos dentro de un archivo de proceso por lotes desde un indicador de la ventana
de mandatos de DB2. Para ver un ejemplo de un archivo de proceso por lotes que
se puede utilizar para crear aplicaciones de ejemplo de SQL incorporado en el
directorio %DB2PATH%\SQLLIB\samples\c\, consulte el archivo
%DB2PATH%\SQLLIB\samples\c\bldapp.bat. Este archivo de proceso por lotes
llama a otro archivo de proceso por lotes, %DB2PATH%\SQLLIB\samples\c\embprep.bat, para precompilar la aplicación y vincular la aplicación a una base de
datos.
Requisitos previos:
v Una conexión de base de datos activa
v Un archivo de código fuente de aplicación con la extensión .sqc en C o .sqx en
C++ y que contenga SQL incorporado
v Un compilador de C o C++ soportado
v Las autorizaciones o privilegios necesarios para ejecutar el mandato
PRECOMPILE y el mandato BIND
Procedimiento:
1. Precompile la aplicación emitiendo el mandato PRECOMPILE. Por ejemplo:
268 Desarrollo de aplicaciones de SQL incorporado
![Page 277: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/277.jpg)
Aplicación C: db2 PRECOMPILE myapp.sqc BINDFILE
Aplicación C++: db2 PRECOMPILE myapp.sqx BINDFILE
El mandato PRECOMPILE genera un archivo .c o .C, que contiene un formato
modificado del código fuente en un archivo .sqc o .sqC, un paquete de
aplicación. Si utiliza la opción BINDFILE, el mandato PRECOMPILE genera un
archivo de vinculación. En el ejemplo anterior, el archivo de vinculación se
llamaría myapp.bnd.
2. Si ha creado un archivo de vinculación, vincule dicho archivo a una base de
datos para crear un paquete de aplicación emitiendo el mandato BIND. Por
ejemplo:
db2 bind myapp.bnd
El mandato BIND asocia el paquete de aplicación a la base de datos y almacena
el paquete dentro de la misma.
3. Compile la fuente de la aplicación modificada y los archivos fuente que no
contienen SQL incorporado para crear un archivo de objeto de aplicación (un
archivo .obj). Por ejemplo:
Aplicación C: cl -Zi -Od -c -W2 -DWIN32 myapp.c
Aplicación C++: cl -Zi -Od -c -W2 -DWIN32 myapp.cxx
4. Enlace los archivos de objeto de aplicación con DB2 y con bibliotecas del
lenguaje principal para crear un programa ejecutable mediante el mandato link.
Por ejemplo:
link -debug -out:myapp.exe myapp.obj
Siguiente tarea:
A continuación puede realizar cualquiera de las siguientes tareas:
v Depuración de errores en tiempo de compilación de la aplicación de SQL
incorporado
v Ajuste del rendimiento de aplicaciones de SQL incorporado
v Despliegue de la aplicación ejecutable, myapp.exe
v Ejecución de aplicaciones de SQL incorporado
Conceptos relacionados:
v “Conexión con bases de datos DB2 en aplicaciones de SQL incorporado” en la
página 58
v “Rendimiento de aplicaciones de SQL incorporado” en la página 25
v “Indicaciones horarias generadas por el precompilador” en la página 208
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones C y C++ de Windows” en
la página 245
Migración de las aplicaciones de SQL incorporado
Para asegurarse de que las aplicaciones de SQL incorporado construidas para DB2
UDB Versión 8 funcionarán con DB2 Versión 9, tendrá que migrar dichas
aplicaciones.
Prerrequisitos:
Antes de migrar las aplicaciones de SQL incorporado, tenga en cuenta estos
puntos:
Capítulo 4. Creación de aplicaciones de SQL incorporado 269
![Page 278: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/278.jpg)
v El cliente o el servidor DB2 desde el que se ejecuta la aplicación se tiene que
migrar a DB2 Versión 9.
v Asegúrese de que el software de desarrollo que utiliza para las aplicaciones de
SQL incorporado está soportado en DB2 Versión 9.
Procedimiento:
Para migrar la aplicación de SQL incorporado de manera que funcione con DB2
Versión 9, siga estos pasos:
1. Someta a prueba las aplicaciones de SQL incorporado en un entorno de prueba
DB2 Versión 9. Si la prueba es satisfactoria, no hace falta que realice pasos
adicionales.
2. Determine si en las aplicaciones de SQL incorporado hay sentencias SQL que
hagan referencia a vistas de catálogo, rutinas SQL administrativas o vistas SQL
administrativas. Si tiene sentencias SQL que hagan referencia a estos objetos,
sométalos a prueba desde el procesador de línea de mandatos (CLP) de DB2
para asegurarse de que la vista o la rutina sigue teniendo la misma signatura.
Si es necesario, vea la documentación de consulta sobre las vistas de catálogo o
las rutinas y vistas SQL administrativas para obtener signaturas actualizadas.
3. Reconstruya las aplicaciones de SQL incorporado que hayan cambiado,
utilizando el archivo de construcción pertinente de DB2 y especificando la vía
de acceso de biblioteca compartida adecuada de DB2. En el caso de las
aplicaciones de 32 bits, especifique que la vía de acceso de biblioteca
compartida es $INSTHOME/sqllib/lib32, y en el caso de las aplicaciones de 64
bits, especifique que la vía de acceso de biblioteca compartida es
$INSTHOME/sqllib/lib64, siendo INSTHOME el directorio inicial de la instancia.
4. En el caso de las aplicaciones de SQL incorporado en UNIX y Linux, ejecute el
mandato db2chglibpath para asegurarse de que se pueden localizar todas las
bibliotecas que tengan vías de acceso cambiadas entre las versiones de DB2.
5. Opcional: valide explícitamente los paquetes asociados a las aplicaciones de
SQL incorporado: Volver a enlazar los paquetes en las bases de datos migradas.
Durante la migración de la base de datos, los paquetes existentes de las
aplicaciones de SQL incorporado quedan invalidados. Después del proceso de
migración, cada paquete se reconstruye automáticamente cuando el gestor de
bases de datos DB2 lo utiliza por primera vez.
6. Someta a prueba las aplicaciones de bases de datos para asegurarse de que
funcionan como cabe esperar bajo DB2 Versión 9.
Conceptos relacionados:
v “Rutinas y vistas administrativas de SQL” en Vistas y rutinas de administración de
SQL
Tareas relacionadas:
v “Revinculación de paquetes en bases de datos migradas” en Guía de migración
v “Migración de aplicaciones de bases de datos de 32 bits para ejecutarlas en
instancias de 64 bits” en Guía de migración
v “Migración de aplicaciones de bases de datos” en Guía de migración
Información relacionada:
v “Software de desarrollo soportado para aplicaciones de SQL incorporado” en la
página 12
v “Vistas de catálogo del sistema” en Consulta de SQL, Volumen 1
270 Desarrollo de aplicaciones de SQL incorporado
![Page 279: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/279.jpg)
Restricciones de enlazar a libdb2.so
En algunas distribuciones de Linux, el rpm de desarrollo de libc viene con la
biblioteca
/usr/lib/libdb2.so
o
/usr/lib64/libdb2.so
. Esta biblioteca se utiliza para la implementación Berkeley DB de Sleepycat
Software y no está asociada con sistemas de base de datos IBM DB2.
Si no tiene pensado utilizar Berkeley DB, puede redenominar o suprimir estos
archivos de biblioteca permanentemente en los sistemas.
Si desea utilizar Berkeley DB, puede redenominar la carpeta que contiene estos
archivos de biblioteca y modificar la variable de entorno para que señale a la
nueva carpeta.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado” en la página 198
Capítulo 4. Creación de aplicaciones de SQL incorporado 271
![Page 280: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/280.jpg)
272 Desarrollo de aplicaciones de SQL incorporado
![Page 281: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/281.jpg)
Parte 2. Desarrollo de rutinas incorporadas
© Copyright IBM Corp. 1993, 2006 273
![Page 282: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/282.jpg)
274 Desarrollo de aplicaciones de SQL incorporado
![Page 283: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/283.jpg)
Capítulo 5. Desarrollo de rutinas externas
Rutinas externas
Las rutinas externas son rutinas cuya lógica está implementada en una aplicación
de lenguaje de programación que reside fuera de la base de datos, en el sistema de
archivos del servidor de bases de datos. La asociación de la rutina con la aplicación
de código externo está indicada mediante la especificación de la cláusula
EXTERNAL en la sentencia CREATE de la rutina.
Puede crear procedimientos externos, funciones externas y métodos externos.
Aunque todos ellos se implementan en lenguajes de programación externos, cada
tipo funcional de rutina tiene características distintas. Antes de decidir la
implementación de una rutina externa, es importante que primero comprenda qué
son las rutinas externas, cómo se implementan y se utilizan leyendo el tema
″Visión general de las rutinas externas″. Una vez comprenda esto, podrá obtener
más información acerca de las rutinas externas en los temas de los enlaces
relacionados para tomar decisiones informadas sobre cuándo y cómo utilizarlas en
el entorno de bases de datos.
Conceptos relacionados:
v “Funciones de tabla de OLE DB definidas por el usuario” en Desarrollo de SQL y
rutinas externas
v “Visión general de las rutinas externas” en la página 276
v “Visión general de las rutinas” en Desarrollo de SQL y rutinas externas
v “Soporte para el desarrollo de rutinas externas en lenguajes CLR de .NET” en
Desarrollo de SQL y rutinas externas
v “Soporte para el desarrollo de rutinas externas en C” en la página 315
v “Soporte para el desarrollo de rutinas externas en C++” en la página 315
v “Software soportado de desarrollo de rutinas Java” en Desarrollo de SQL y rutinas
externas
v “Rutinas CLR (common language runtime) de .NET” en Desarrollo de SQL y
rutinas externas
v “Procedimientos COBOL” en la página 388
v “Rutinas DB2GENERAL” en Desarrollo de SQL y rutinas externas
v “Funciones de rutinas externas” en la página 276
v “Rutinas Java” en Desarrollo de SQL y rutinas externas
v “Diseño de rutinas de automatización de OLE” en Desarrollo de SQL y rutinas
externas
Tareas relacionadas:
v “Creación de rutinas C y C++” en la página 360
v “Creación de rutinas externas” en la página 312
v “Desarrollo de rutinas” en Desarrollo de SQL y rutinas externas
Información relacionada:
v “Soporte para el desarrollo de procedimientos externos en COBOL” en la página
390
© Copyright IBM Corp. 1993, 2006 275
![Page 284: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/284.jpg)
v “Sentencia CREATE FUNCTION (Tabla externa)” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE (Externo)” en Consulta de SQL, Volumen 2
Visión general de las rutinas externas
Visión general de las rutinas externas
Las rutinas externas se caracterizan principalmente por el hecho de que su lógica
de rutina se implementa en código de lenguaje de programación y no en SQL.
Antes de decidir la implementación de una rutina externa, es importante que
comprenda qué son las rutinas externas, cómo se implementan y cómo pueden
utilizarse. Los temas sobre los conceptos siguientes lo ayudarán a comprender las
rutinas externas para poder tomar decisiones informadas sobre cuándo y cómo
utilizarlas en el entorno de bases de datos:
v “Funciones de rutinas externas”
v Creación de rutinas externas
v Gestión de bibliotecas o clases de rutinas externas
v Lenguajes de programación soportados para el desarrollo de rutinas externas
v Soporte de 32 y 64 bits para rutinas externas
v Estilos de parámetros para rutinas externas
v Restricciones en las rutinas externas
Cuando haya comprendido los conceptos sobre rutinas externas, puede comenzar
a:
v “Creación de rutinas externas” en la página 312
Conceptos relacionados:
v “Soporte de 32 bits y 64 bits para rutinas externas” en la página 306
v “Características de las funciones y métodos externos” en la página 277
v “Creación de rutinas externas” en la página 297
v “Funciones de rutinas externas” en la página 276
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Estilos de parámetros de rutinas externas” en la página 298
v “Rutinas externas” en la página 275
v “Rendimiento de las rutinas con bibliotecas de 32 bits en servidores de bases de
datos de 64 bits” en la página 307
v “Restricciones de las rutinas externas” en la página 309
v “Interfaces API y lenguajes de programación soportados para el desarrollo de
rutinas externas” en la página 290
v “Soporte para el tipo de datos XML en las rutinas externas” en la página 308
Tareas relacionadas:
v “Creación de rutinas externas” en la página 312
Funciones de rutinas externas
Las rutinas externas proporcionan soporte para las funciones más comunes de
rutinas, así como soporte para funciones adicionales no soportadas por rutinas
SQL. Las siguientes funciones son exclusivas de las rutinas externas:
276 Desarrollo de aplicaciones de SQL incorporado
![Page 285: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/285.jpg)
Acceso a archivos, datos y aplicaciones que residen fuera de la base de datos
Las rutinas externas pueden acceder y manipular datos o archivos que
residan fuera de la propia base de datos. También pueden invocar
aplicaciones que residan fuera de la base de datos. Los datos, archivos o
aplicaciones podrían residir, por ejemplo, en el sistema de archivos del
servidor de base de datos o en la red disponible.
Variedad de opciones de estilos de parámetros de rutinas externas
La implementación de rutinas externas en un lenguaje de programación se
puede realizar utilizando varias opciones de estilos de parámetros. Aunque
puede haber un estilo de parámetro preferido para un determinado
lenguaje de programación, a veces es posible escoger. Algunos estilos de
parámetros proporcionan soporte para pasar información adicional sobre
propiedades de rutinas y de bases de datos a la rutina y de recibirla de
esta en una estructura denominada estructura dbinfo que puede resultar útil
dentro de la lógica de la rutina.
Conservación de estado entre invocaciones de funciones externas con un área
reutilizable
Las funciones externas definidas por el usuario proporcionan soporte para
la conservación de estado entre invocaciones de función para un conjunto
de valores. Esto se realiza con una estructura denominada scratchpad. Esto
puede resultar útil tanto para las funciones que devuelven valores
agregados como para las funciones que necesitan lógica de configuración
inicial, como inicialización de almacenamientos intermedios.
Los tipos de llamada identifican invocaciones de funciones externas
individuales
Las funciones externas definidas por el usuario se invocan varias veces
para un conjunto de valores. Cada invocación se identifica con un valor de
tipo de llamada al que se puede hacer referencia dentro de la lógica de la
función. Por ejemplo, hay tipos de llamada especiales para la primera
invocación de una función, para las llamadas de captación de datos y para
la invocación final. Los tipos de llamada resultan útiles porque se puede
asociar lógica específica a un tipo de llamada determinado.
Conceptos relacionados:
v “Soporte de 32 bits y 64 bits para rutinas externas” en la página 306
v “Características de las funciones y métodos externos” en la página 277
v “Rutinas externas” en la página 275
v “Características de procedimientos de SQL” en Desarrollo de SQL y rutinas
externas
v “Visión general de las rutinas externas” en la página 276
v “Restricciones de las rutinas externas” en la página 309
v “SQL en rutinas externas” en Desarrollo de SQL y rutinas externas
v “Soporte para el tipo de datos XML en las rutinas externas” en la página 308
Características de las funciones y métodos externos
Características de las funciones y métodos externos
Las funciones externas y los métodos externos proporcionan soporte para
funciones que, en el caso de un determinado conjunto de datos de entrada, se
podrían invocar múltiples veces y producir un conjunto de valores de salida.
Capítulo 5. Desarrollo de rutinas externas 277
![Page 286: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/286.jpg)
Para obtener más información sobre las características de las funciones y métodos
externos, consulte estos temas:
v “Funciones escalares externas”
v “Modelo de proceso de los métodos y las funciones escalares externas” en la
página 280
v “Funciones de tablas externas” en la página 281
v “Modelo de proceso para las funciones de tablas externas” en la página 282
v “Modelo de ejecución de funciones de tabla para Java” en la página 284
v “Áreas reutilizables para funciones externas y métodos” en la página 285
v “Áreas reutilizables en sistemas operativos de 32 bits y 64 bits” en la página 289
Estas características son exclusivas para las funciones y métodos externos y no
atañen a las funciones SQL ni a los métodos SQL.
Conceptos relacionados:
v “Restricciones de las rutinas externas” en la página 309
v “Visión general de las rutinas externas” en la página 276
v “Funciones escalares externas” en la página 278
v “Funciones de rutinas externas” en la página 276
v “Rutinas externas” en la página 275
v “Modelo de proceso de los métodos y las funciones escalares externas” en la
página 280
Funciones escalares externas
Las funciones escalares externas tienen implementada su lógica en un lenguaje de
programación externo.
Estas funciones pueden desarrollarse y utilizarse para ampliar el conjunto de
funciones de SQL existentes y pueden invocarse del mismo modo que las
funciones incorporadas de DB2, como por ejemplo, LENGTH y COUNT. Es decir,
se puede hacer referencia a ellas en sentencias de SQL siempre que la expresión sea
válida.
La ejecución de funciones escalares externas se lleva a cabo en el servidor de bases
de datos, aunque, a diferencia de las funciones escalares de SQL incorporadas o
definidas por el usuario, la lógica de las funciones externas puede acceder al
sistema de archivos del servidor de bases de datos, realizar llamadas al sistema o
acceder a una red.
Las funciones escalares externas pueden leer datos de SQL, pero no pueden
modificarlos.
Las funciones escalares externas se pueden invocar repetidamente para una sola
referencia de la función y pueden mantener el estado entre estas invocaciones
mediante un área reutilizable, que es un almacenamiento intermedio de memoria.
Esto puede resultar potente si una función requiere una lógica de configuración
inicial, pero costosa. La lógica de configuración se puede realizar en una primera
invocación, utilizando el área reutilizable para almacenar algunos valores, cuyo
acceso o actualización es posible en invocaciones siguientes de la función escalar.
Características de las funciones escalares externas
v Se puede hacer referencia a ellas como parte de una sentencia de SQL en
cualquier parte en que esté soportada una expresión.
278 Desarrollo de aplicaciones de SQL incorporado
![Page 287: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/287.jpg)
v La sentencia de SQL que realiza la invocación puede utilizar
directamente la salida de una función escalar.
v Para las funciones escalares externas definidas por el usuario, se puede
mantener el estado entre las invocaciones iterativas de la función
empleando un área reutilizable.
v Pueden proporcionar una ventaja para el rendimiento cuando se utilizan
en predicados, puesto que se ejecutan en el servidor. Si una función se
puede aplicar a una fila candidata en el servidor, puede, a menudo,
dejar de tomar en consideración la fila antes de transmitirla a la
máquina cliente, con lo que se reduce la cantidad de datos que se deben
pasar desde el servidor al cliente.
Limitaciones
v No se puede realizar la gestión dentro de una función escalar. Es decir,
no se puede emitir COMMIT ni ROLLBACK dentro de una function
escalar.
v No pueden devolver conjuntos de resultados.
v Las funciones escalares están pensadas para devolver un solo valor
escalar por cada conjunto de valores de entrada.
v Las funciones escalares externas no están pensadas para que se utilicen
en una sola invocación. Están diseñadas de forma que, para cada
referencia a la función y cada conjunto determinado de valores de
entrada, la función se invoque una vez por cada valor de entrada y
devuelva un solo valor escalar. En la primera invocación, las funciones
escalares pueden estar diseñadas para realizar algún trabajo de
configuración o para almacenar información, cuyo acceso sea posible en
invocaciones posteriores. Las funciones escalares de SQL se ajustan
mejor a la funcionalidad que requiere una sola invocación.
v En una base de datos de una sola partición, las funciones escalares
externas pueden incluir sentencias de SQL. Estas sentencias pueden leer
datos de tablas, pero no pueden modificarlos. Si la base de datos tiene
más de una partición, no debe haber sentencias de SQL en una función
escalar externa. Las funciones escalares de SQL pueden contener
sentencias de SQL que lean o modifiquen datos .
Usos frecuentes
v Ampliar el conjunto de funciones incorporadas de DB2.
v Realizar operaciones lógicas dentro de una sentencia de SQL que SQL no
puede realizar de forma nativa.
v Encapsular una consulta escalar que se reutilice habitualmente como
subconsulta en las sentencias de SQL. Por ejemplo, dado un código
postal, buscar en una tabla la ciudad en la que se encuentra el código
postal.
Lenguajes soportados
v C
v C++
v Java
v OLE
v Lenguajes de ejecución en el lenguaje común .NET
Notas:
1. Existe una capacidad limitada para crear funciones de agregación. Conocidas
también como funciones de columna, estas funciones reciben un conjunto de
Capítulo 5. Desarrollo de rutinas externas 279
![Page 288: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/288.jpg)
valores semejantes (una columna de datos) y devuelven una sola respuesta.
Una función de agregación definida por el usuario sólo se puede crear si su
fuente es una función de agregación incorporada. Por ejemplo, si existe un tipo
diferenciado SHOESIZE que está definido con el tipo base INTEGER, es posible
definir una función, AVG(SHOESIZE), como función de agregación basada en la
función de agregación incorporada existente AVG(INTEGER).
2. También puede crear funciones que devuelvan una fila. Éstas se conocen como
funciones de fila y sólo se pueden utilizar como funciones de transformación
para los tipos estructurados. La salida de una función de salida es una única
fila.
Conceptos relacionados:
v “Ventajas de utilizar rutinas” en Desarrollo de SQL y rutinas externas
v “Características de las funciones y métodos externos” en la página 277
v “Modelo de proceso de los métodos y las funciones escalares externas” en la
página 280
v “Funciones de tabla de OLE DB definidas por el usuario” en Desarrollo de SQL y
rutinas externas
v “Áreas reutilizables para funciones externas y métodos” en la página 285
v “Funciones de tablas externas” en la página 281
Tareas relacionadas:
v “Invocación de funciones o métodos escalares” en Desarrollo de SQL y rutinas
externas
v “Invocación de funciones de tabla definidas por el usuario” en Desarrollo de SQL
y rutinas externas
Información relacionada:
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
Modelo de proceso de los métodos y las funciones escalares
externas
El modelo de proceso para los métodos y las UDF escalares que se definen con la
especificación FINAL CALL es el siguiente:
Llamada FIRST
Éste es un caso especial de la llamada NORMAL, identificado como FIRST
para permitir que la función realice cualquier proceso inicial. Se evalúan
los argumentos y se pasan a la función. Normalmente, la función
devolverá un valor en esta llamada, pero puede devolver un error, en cuyo
caso no se realiza ninguna llamada NORMAL ni FINAL. Si se devuelve un
error en una llamada FIRST, lo debe borrar el método o la UDF antes de
volver, puesto que no se realizará ninguna llamada FINAL.
Llamada NORMAL
Son las llamadas a la función que van de la segunda a la última, según
indiquen los datos y la lógica de la sentencia. Se espera que la función
devuelva un valor con cada llamada NORMAL después de que se evalúen
y pasen los argumentos. Si una llamada NORMAL devuelve un error, no
se realiza ninguna otra llamada NORMAL pero se realiza la llamada
FINAL.
Llamada FINAL
Ésta es una llamada especial, que se realiza en el proceso de fin de
280 Desarrollo de aplicaciones de SQL incorporado
![Page 289: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/289.jpg)
sentencia (o en el cierre (CLOSE) de un cursor), siempre y cuando la
llamada FIRST sea satisfactoria. En una llamada FINAL no se pasa ningún
valor de argumento. Esta llamada se lleva a cabo para que la función
pueda borrar los recursos. La función no devuelve un valor en esta
llamada, pero puede devolver un error.
Si se trata de métodos o UDF escalares que no se han definido con FINAL CALL,
sólo se realizan llamadas NORMAL a la función, la cual habitualmente devuelve
un valor para cada llamada. Si una llamada NORMAL devuelve un error, o si la
sentencia encuentra otro error, no se realiza ninguna otra llamada a la función.
Nota: Este modelo describe el proceso de errores corriente para los métodos y las
UDF escalares. En el caso de una anomalía del sistema o un problema de
comunicación, no se puede efectuar una llamada indicada por el modelo de
proceso de errores. Por ejemplo, para una UDF FENCED, si el proceso
protegido db2udf termina de algún modo de forma prematura, DB2 no
puede efectuar las llamadas indicadas.
Conceptos relacionados:
v “Características de las funciones y métodos externos” en la página 277
v “Funciones escalares externas” en la página 278
Funciones de tablas externas
Una función de tabla definida por el usuario entrega una tabla al SQL en el que se
le hace referencia. Una referencia a una UDF de tabla sólo es válida en una
cláusula FROM de una sentencia SELECT. Cuando utilice funciones de tabla, tenga
en cuenta lo siguiente:
v Aunque una función de tabla entrega una tabla, la interfaz física entre DB2 y la
UDF es de una fila cada vez. Hay cinco tipos de llamadas que se pueden
realizar a una función de tabla: OPEN, FETCH, CLOSE, FIRST y FINAL. La
existencia de las llamadas FIRST y FINAL depende de cómo se defina la UDF.
Para distinguir estas llamadas, se utiliza el mismo mecanismo de tipo-llamada
que se usa para las funciones escalares.
v No se tienen que devolver todas las columnas de resultado definidas en la
cláusula RETURNS de la sentencia CREATE FUNCTION para la función de
tabla. La palabra clave DBINFO de CREATE FUNCTION y el argumento dbinfo
correspondiente permiten una optimización consistente en que sólo haya que
devolver las columnas necesarias para una referencia a una función de tabla
determinada.
v Los valores de columna individuales devueltos se ajustan al formato de los
valores devueltos por las funciones escalares.
v La sentencia CREATE FUNCTION para una función de tabla tiene la
especificación CARDINALITY. Esta especificación permite que el creador
informe al optimizador de DB2 del tamaño aproximado del resultado, de forma
que el optimizador pueda tomar decisiones mejores cuando se haga referencia a
la función.
Independientemente de lo que se haya especificado como CARDINALITY de
una función de tabla, tenga cuidado respecto a la escritura de una función con
una cardinalidad infinita, es decir, una función que siempre devuelva una fila en
una llamada FETCH. Existen muchas situaciones en las que DB2 espera la
condición de fin de tabla como catalizador dentro del proceso de la consulta. La
utilización de GROUP BY u ORDER BY son ejemplos de este caso. DB2 no
puede formar los grupos de agregación hasta que se llega al fin de tabla, ni
Capítulo 5. Desarrollo de rutinas externas 281
![Page 290: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/290.jpg)
puede realizar ninguna clasificación sin tener todos los datos. Por lo tanto, una
función de tabla que nunca devuelva la condición de fin de tabla (valor ’02000’
de estado de SQL) puede ocasionar un bucle infinito del proceso si se utiliza con
una cláusula GROUP BY u ORDER BY.
Conceptos relacionados:
v “Características de las funciones y métodos externos” en la página 277
v “Modelo de proceso para las funciones de tablas externas” en la página 282
Información relacionada:
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Paso de argumentos a rutinas C, C++, OLE o COBOL” en la página 342
Modelo de proceso para las funciones de tablas externas
El modelo de proceso para las UDF de tabla que se definen con la especificación
FINAL CALL es el siguiente:
Llamada FIRST
Esta llamada se realiza antes de la primera llamada OPEN y su objetivo
consiste en permitir que la función realice cualquier proceso inicial. Antes
de esta llamada, el área reutilizable se borra. Se evalúan los argumentos y
se pasan a la función. La función no devuelve una fila. Si la función
devuelve un error, no se realiza ninguna otra llamada a la misma.
Llamada OPEN
Esta llamada se realiza para permitir que la función realice un proceso
especial de apertura (OPEN) específico de la exploración. El área
reutilizable (si existe) no se borra antes de la llamada. Se evalúan los
argumentos y se pasan. La función no devuelve una fila en una llamada
OPEN. Si la función devuelve un error de la llamada OPEN, no se
realizará ninguna llamada FETCH ni CLOSE, pero sí se realizará la
llamada FINAL al final de la sentencia.
Llamada FETCH
Se siguen produciendo llamadas FETCH hasta que la función devuelve un
valor de SQLSTATE que significa fin-de-tabla. Es en estas llamadas donde
la UDF desarrolla y devuelve una fila de datos. Se pueden pasar valores de
argumentos a la función, pero éstos apuntan a los mismos valores que se
han pasado al ejecutar OPEN. Por lo tanto, es posible que los valores de
argumentos no sean actuales y no se debe confiar en ellos. Si tiene
necesidad de mantener valores actuales entre las invocaciones de una
función de tabla, utilice un área reutilizable. La función puede devolver un
error de una llamada FETCH, y la llamada CLOSE se seguirá produciendo.
Llamada CLOSE
Se realiza esta llamada cuando finaliza la exploración o sentencia, siempre
que la llamada OPEN haya resultado satisfactoria. Los posibles valores de
argumentos no serán actuales. La función puede devolver un error.
Llamada FINAL
Se realiza la llamada FINAL al final de la sentencia, siempre que la
llamada FIRST haya resultado satisfactoria. Esta llamada se lleva a cabo
para que la función pueda borrar los recursos. La función no devuelve un
valor en esta llamada, pero puede devolver un error.
282 Desarrollo de aplicaciones de SQL incorporado
![Page 291: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/291.jpg)
Para las UDF de tabla no definidas con FINAL CALL, sólo se realizan las llamadas
OPEN, FETCH y CLOSE a la función. Antes de cada llamada OPEN, se borra el
área reutilizable (si existe).
La diferencia entre las UDF de tabla definidas con FINAL CALL y las definidas
con NO FINAL CALL se puede observar examinando un escenario que implique
una unión o una subconsulta, en que el acceso de la función de tabla es el acceso
″interior″. Por ejemplo, en una sentencia como la siguiente:
SELECT x,y,z,... FROM table_1 as A,
TABLE(table_func_1(A.col1,...)) as B
WHERE...
En este caso, el optimizador abrirá una exploración de table_func_1 para cada fila
de table_1. Esto es debido a que el valor de la col1 de table_1, que se pasa a
table_func_1, se utiliza para definir la exploración de la función de tabla.
Para las UDF de tabla con NO FINAL CALL, la secuencia de llamadas OPEN,
FETCH, FETCH, ..., CLOSE se repite para cada fila de table_1. Observe que cada
llamada OPEN obtendrá un área reutilizable limpia. Puesto que la función de tabla
no sabe, al final de cada exploración, si se producirán más exploraciones, la tiene
que limpiar completamente durante el proceso de cierre (CLOSE). Esto puede
resultar ineficaz si existe un proceso significativo de apertura de una sola vez que
se debe repetir.
Las UDF de tabla con FINAL CALL proporcionan una llamada FIRST de una sola
vez y una llamada FINAL de una sola vez. Estas llamadas se utilizan para
amortizar los costes de inicialización y terminación a lo largo de todas las
exploraciones de la función de tabla. Al igual que anteriormente, las llamadas
OPEN, FETCH, FETCH, ..., CLOSE se realizan para cada fila de la tabla exterior
pero, dado que la función de tabla sabe que obtendrá una llamada FINAL, no es
necesario que efectúe una limpieza completa en la llamada CLOSE (ni que la
reasigne en la OPEN posterior). Observe también que el área reutilizable no se
borra entre las exploraciones, en gran parte porque los recursos de la función de
tabla se repartirán a lo largo de las exploraciones.
A expensas de gestionar dos tipos de llamadas adicionales, la UDF de tabla puede
alcanzar una eficacia mayor en estos escenarios de unión y subconsulta. La
decisión de si se debe definir la función de tabla como FINAL CALL depende del
modo en que se pretenda utilizar.
Conceptos relacionados:
v “Características de las funciones y métodos externos” en la página 277
v “Modelo de ejecución de funciones de tabla para Java” en la página 284
v “Funciones de tabla definidas por el usuario” en Desarrollo de SQL y rutinas
externas
Información relacionada:
v “Sentencia CREATE FUNCTION (Tabla externa)” en Consulta de SQL, Volumen 2
v “Sentencia CREATE FUNCTION (Tabla externa OLE DB)” en Consulta de SQL,
Volumen 2
v “Sentencia CREATE FUNCTION (Escalar de SQL, tabla o fila)” en Consulta de
SQL, Volumen 2
Capítulo 5. Desarrollo de rutinas externas 283
![Page 292: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/292.jpg)
Modelo de ejecución de funciones de tabla para Java
Para las funciones de tabla escritas en Java que utilizan PARAMETER STYLE
DB2GENERAL, es importante comprender lo que sucede en cada punto del
proceso de DB2 de una sentencia determinada. La tabla siguiente detalla esta
información para una función de tabla habitual. Se abarcan los casos de NO
FINAL CALL y de FINAL CALL, suponiendo en ambos casos SCRATCHPAD.
Punto en el tiempo de exploración NO FINAL CALL
LANGUAGE JAVA
SCRATCHPAD
FINAL CALL
LANGUAGE JAVA
SCRATCHPAD
Antes de la primera OPEN para la
función de tabla
No hay llamadas. v Se llama al constructor de clases
(por medio de la nueva área
reutilizable). Se llama al método de
UDF con la primera (FIRST)
llamada.
v El constructor inicializa las
variables de clase y área
reutilizable. El método conecta con
el servidor de Web.
En cada OPEN de la función de tabla v Se llama al constructor de clases
(por medio de la nueva área
reutilizable). Se llama al método de
UDF con la llamada OPEN.
v El constructor inicializa las
variables de clase y área
reutilizable. El método conecta con
el servidor de Web y abre la
exploración de los datos de la Web.
v Se abre el método de UDF con la
llamada OPEN.
v El método abre la exploración de
los datos de la Web que desee.
(Puede ser capaz de evitar que se
tenga que volver a abrir después
de una reposición de CLOSE,
según lo que se guarde en el área
reutilizable.)
En cada FETCH para una nueva fila
de datos de la función de tabla
v Se llama al método de UDF con la
llamada FETCH.
v El método capta y devuelve la
siguiente fila de datos, o bien EOT.
v Se llama al método de UDF con la
llamada FETCH.
v El método capta y devuelve la
nueva fila de datos, o bien EOT.
En cada CLOSE de la función de
tabla
v Se llama al método de UDF con la
llamada CLOSE. Método close(),
si existe para la clase.
v El método cierra su exploración de
la Web y se desconecta del
servidor de Web. No es necesario
que close() haga nada.
v Se llama al método de UDF con la
llamada CLOSE.
v El método puede reposicionarse al
principio de la exploración o
cerrarla. Puede guardar cualquier
estado en el área reutilizable, el
cual persistirá.
Después de la última CLOSE de la
función de tabla
No hay llamadas. v Se llama al método de UDF con la
llamada FINAL. Se llama al
método close(), si existe para la
clase.
v El método se desconecta del
servidor de Web. No es necesario
que el método close() haga nada.
Notas:
1. El término ″método de UDF″ hace referencia al método de clase de Java que
implementa la UDF. Se trata del método identificado en la cláusula EXTERNAL
NAME de la sentencia CREATE FUNCTION.
2. Para las funciones de tabla que tengan especificado NO SCRATCHPAD, las
llamadas al método de UDF son las indicadas en esta tabla, pero, puesto que el
284 Desarrollo de aplicaciones de SQL incorporado
![Page 293: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/293.jpg)
usuario no solicita ninguna continuidad por medio de un área reutilizable, DB2
hará que se cree una instancia de un nuevo objeto antes de cada llamada,
llamando al constructor de clases. No está claro que las funciones de tabla con
NO SCRATCHPAD (y, por lo tanto, sin continuidad) puedan realizar acciones
útiles, pero se soportan.
Conceptos relacionados:
v “Rutinas DB2GENERAL” en Desarrollo de SQL y rutinas externas
v “Características de las funciones y métodos externos” en la página 277
v “Modelo de proceso para las funciones de tablas externas” en la página 282
v “Rutinas Java” en Desarrollo de SQL y rutinas externas
Tareas relacionadas:
v “Diseño de rutinas Java” en Desarrollo de SQL y rutinas externas
Información relacionada:
v “Sentencia CREATE FUNCTION (Tabla externa)” en Consulta de SQL, Volumen 2
Áreas reutilizables para funciones externas y métodos
Un área reutilizable permite que una función definida por el usuario o un método
guarden su estado entre una invocación y la siguiente. Por ejemplo, a continuación
se identifican dos situaciones en las que guardar el estado entre las invocaciones es
beneficioso:
1. Las funciones o los métodos que, para ser correctos, dependen de que se
guarde el estado.
Un ejemplo de función o método de este tipo es una simple función de
contador que devuelve un '1' la primera vez que recibe llamada, e incrementa
el resultado en uno en cada llamada sucesiva. En algunas circunstancias, este
tipo de función se podría utilizar para numerar las filas del resultado de una
sentencia SELECT:
SELECT counter(), a, b+c, ...
FROM tablex
WHERE ...
La función necesita un lugar en el que almacenar el valor actual del contador
entre las invocaciones, donde se garantice que el valor será el mismo para la
siguiente invocación. Luego, en cada invocación se puede incrementar el valor
y devolverlo como resultado de la función.
Este tipo de rutina es NOT DETERMINISTIC. Su salida no depende
únicamente de los valores de sus argumentos de SQL.
2. Las funciones o los métodos en que se puede mejorar el rendimiento mediante
la posibilidad de realizar algunas acciones de inicialización.
Un ejemplo de función o método de este tipo, que puede formar parte de una
aplicación de documento, es una función match (de coincidencia), que devuelve
'Y' si un documento determinado contiene una serie indicada, y 'N' en caso
contrario:
SELECT docid, doctitle, docauthor
FROM docs
WHERE match(’myocardial infarction’, docid) = ’Y’
Esta sentencia devuelve todos los documentos que contienen el valor de serie
de texto concreto representado por el primer argumento. Lo que match desearía
hacer es:
v Sólo la primera vez.
Capítulo 5. Desarrollo de rutinas externas 285
![Page 294: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/294.jpg)
Recuperar una lista de todos los ID de documento que contengan la serie
’myocardial infarction’ desde la aplicación de documento, que se mantiene
fuera de DB2. Esta recuperación es un proceso costoso, por lo que la función
desearía hacerlo una sola vez, y guardar la lista en algún lugar para tenerla a
mano en las llamadas posteriores.
v En cada llamada.
Utilizar la lista de los ID de documento guardada durante la primera
llamada, para ver si el ID de documento que se pasa como segundo
argumento está incluido en la lista.Este tipo de rutina es DETERMINISTIC. Su respuesta sólo depende de los
valores de los argumentos de entrada. Lo que se muestra aquí es una función
cuyo rendimiento, y no su corrección, depende de la posibilidad de guardar
información entre una llamada y la siguiente.
Ambas necesidades se satisfacen con la posibilidad de especificar un área
reutilizable (SCRATCHPAD) en la sentencia CREATE:
CREATE FUNCTION counter()
RETURNS int ... SCRATCHPAD;
CREATE FUNCTION match(varchar(200), char(15))
RETURNS char(1) ... SCRATCHPAD 10000;
La palabra clave SCRATCHPAD indica a DB2 que asigne y mantenga un área
reutilizable para una rutina. El tamaño por omisión de un área reutilizable es de
100 bytes, pero el usuario puede determinar el tamaño (en bytes) correspondiente a
un área reutilizable. El ejemplo de match presenta 10000 bytes de longitud. DB2
inicializa el área reutilizable con ceros binarios antes de la primera invocación. Si el
área reutilizable se define para una función de tabla, y si la función de tabla
también se define con NO FINAL CALL (valor por omisión), DB2 renueva el área
reutilizable antes de cada llamada a OPEN. Si se especifica la opción de función de
tabla FINAL CALL, DB2 no examinará ni cambiará el contenido del área
reutilizable después de su inicialización. Para las funciones escalares definidas con
áreas reutilizables, DB2 tampoco examina ni cambia el contenido del área después
de su inicialización. En cada invocación se pasa a la rutina un puntero al área
reutilizable, y DB2 conserva la información del estado de la rutina en el área
reutilizable.
Así, para el ejemplo de counter, el último valor devuelto se puede conservar en el
área reutilizable. Y, en el ejemplo de match, se puede conservar en el área
reutilizable la lista de documentos, en caso de que el área reutilizable sea
suficientemente grande; de lo contrario, se puede asignar memoria para la lista y
conservar la dirección de la memoria adquirida en el área reutilizable. Las áreas
reutilizables pueden tener una longitud variable: la longitud se define en la
sentencia CREATE para la rutina.
El área reutilizable únicamente se aplica a la referencia individual a la rutina en la
sentencia. Si en una sentencia existen varias referencias a una rutina, cada
referencia tiene su propia área reutilizable, por lo que estas áreas no se pueden
emplear para realizar comunicaciones entre referencias. El área reutilizable sólo se
aplica a un único agente de DB2 (un agente es una entidad de DB2 que realiza el
proceso de todos los aspectos de una sentencia). No existe un ″área reutilizable
global″ para coordinar el compartimiento de la información de las áreas
reutilizables entre los agentes. Esto es importante, en concreto, para aquellas
situaciones en que DB2 establece varios agentes para procesar una sentencia (ya
sea en una base de datos de una sola partición o de varias). En estos casos, aunque
una sentencia puede contener una sola referencia a una rutina, pueden existir
286 Desarrollo de aplicaciones de SQL incorporado
![Page 295: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/295.jpg)
varios agentes que realicen el trabajo y cada uno de ellos tendrá su propia área
reutilizable. En una base de datos de varias particiones, donde una sentencia que
hace referencia a una UDF ha de procesar datos en varias particiones e invocar la
UDF en cada partición, el área reutilizable sólo se aplica a una partición. Como
consecuencia, existe un área reutilizable en cada partición en que se ejecuta la UDF.
Si la ejecución correcta de una función depende de que haya una sola área
reutilizable por cada referencia a la función, registre la función como DISALLOW
PARALLEL. Esto causará que la función se ejecute en una única partición y, de esta
manera, se garantizará que exista una única área reutilizable por cada referencia a
la función.
Puesto que es reconocido que una UDF o un método pueden requerir recursos del
sistema, la UDF o el método se pueden definir con la palabra clave FINAL CALL.
Esta palabra clave indica a DB2 que llame a la UDF o al método durante el
proceso de fin de sentencia, para que la UDF o el método puedan liberar sus
recursos del sistema. Es vital que una rutina libere cualquier recurso que adquiera;
incluso una pequeña fuga se puede convertir en una gran fuga en un entorno en
que la sentencia se invoque repetidamente, y una gran fuga puede provocar una
detención de DB2 por anomalía grave.
Puesto que el área reutilizable tiene un tamaño fijo, es posible que la UDF o el
método incluyan una asignación de memoria y por ello puedan utilizar la llamada
final para liberar la memoria. Por ejemplo, la función match anterior no puede
predecir cuántos documentos coincidirán con la serie de texto indicada. Por lo
tanto, la siguiente resultará una definición mejor para match:
CREATE FUNCTION match(varchar(200), char(15))
RETURNS char(1) ... SCRATCHPAD 10000 FINAL CALL;
Para las UDF o los métodos que emplean un área reutilizable y están referidos en
una subconsulta, DB2 puede efectuar una llamada final, si la UDF o el método se
especifican así, y renovar el área reutilizable entre invocaciones de la subconsulta.
El usuario se puede proteger frente a esta posibilidad, si las UDF o los métodos se
utilizan alguna vez en subconsultas, definiendo la UDF o el método con FINAL
CALL y utilizando el argumento de tipo de llamada o bien comprobando siempre
el estado de cero binario del área reutilizable.
Si especifica FINAL CALL, observe que la UDF o el método recibirán una llamada
del tipo FIRST. Se puede utilizar esta posibilidad para adquirir e inicializar algún
recurso persistente.
A continuación se muestra un ejemplo sencillo de Java de una UDF que utiliza un
área reutilizable para calcular la suma de los cuadrados de las entradas de una
columna. Este ejemplo toma una columna y devuelve una columna que contiene la
suma acumulada de cuadrados desde el principio de la columna hasta la entrada
de la fila actual:
CREATE FUNCTION SumOfSquares(INTEGER)
RETURNS INTEGER
EXTERNAL NAME ’UDFsrv!SumOfSquares’
DETERMINISTIC
NO EXTERNAL ACTION
FENCED
NOT NULL CALL
LANGUAGE JAVA
PARAMETER STYLE DB2GENERAL
NO SQL
SCRATCHPAD 10
FINAL CALL
Capítulo 5. Desarrollo de rutinas externas 287
![Page 296: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/296.jpg)
DISALLOW PARALLEL
NO DBINFO@
// Suma de cuadrados utilizando la UDF Scratchpad
public void SumOfSquares(int inColumn,
int outSum)
throws Exception
{
int sum = 0;
byte[] scratchpad = getScratchpad();
// variables a leer de área SCRATCHPAD
ByteArrayInputStream byteArrayIn = new ByteArrayInputStream(scratchpad);
DataInputStream dataIn = new DataInputStream(byteArrayIn);
// variables a grabar en área SCRATCHPAD
byte[] byteArrayCounter;
int i;
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(10);
DataOutputStream dataOut = new DataOutputStream(byteArrayOut);
switch(getCallType())
{
case SQLUDF_FIRST_CALL:
// inicializar datos
sum = (inColumn * inColumn);
// guardar datos en área SCRATCHPAD
dataOut.writeInt(sum);
byteArrayCounter = byteArrayOut.toByteArray();
for(i = 0; i < byteArrayCounter.length; i++)
{
scratchpad[i] = byteArrayCounter[i];
}
setScratchpad(scratchpad);
break;
case SQLUDF_NORMAL_CALL:
// leer datos de área SCRATCHPAD
sum = dataIn.readInt();
// trabajar con datos
sum = sum + (inColumn * inColumn);
// guardar datos en área SCRATCHPAD
dataOut.writeInt(sum);
byteArrayCounter = byteArrayOut.toByteArray();
for(i = 0; i < byteArrayCounter.length; i++)
{
scratchpad[i] = byteArrayCounter[i];
}
setScratchpad(scratchpad);
break;
}
// establecer valor de salida
set(2, sum);
} // UDF SumOfSquares
Tenga en cuenta que se trata de una función incorporada de DB2 que realiza la
misma función que la UDF SumOfSquares. Se ha elegido este ejemplo para
demostrar el uso de un área reutilizable.
Conceptos relacionados:
v “Área reutilizable como parámetro de función C o C++” en la página 329
v “Áreas reutilizables en sistemas operativos de 32 bits y 64 bits” en la página 289
v “Características de las funciones y métodos externos” en la página 277
288 Desarrollo de aplicaciones de SQL incorporado
![Page 297: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/297.jpg)
v “Modelo de proceso de los métodos y las funciones escalares externas” en la
página 280
Información relacionada:
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE METHOD” en Consulta de SQL, Volumen 2
v “Sentencia CREATE TYPE (Estructurado)” en Consulta de SQL, Volumen 2
Ejemplos relacionados:
v “udfsrv.c -- Library of user-defined functions (UDFs) called by the client”
v “UDFCreate.db2 -- How to catalog the Java UDFs contained in UDFsrv.java ”
v “UDFsrv.java -- Provide UDFs to be called by UDFcli.java (JDBC)”
Áreas reutilizables en sistemas operativos de 32 bits y 64 bits
Para hacer que el código de la UDF o del método se pueda transportar entre
sistemas operativos de 32 bits y 64 bits, debe ir con precaución en la manera de
crear y utilizar las áreas reutilizables que contengan valores de 64 bits. Es
recomendable no declarar una variable de longitud explícita para una estructura de
área reutilizable que contenga uno o más valores de 64 bits, tales como los
punteros de 64 bits o las variables BIGINT sqlint64.
A continuación se muestra una declaración de estructura de ejemplo
correspondiente a un área reutilizable:
struct sql_scratchpad
{
sqlint32 length;
char data[100];
};
Cuando se define su propia estructura para el área reutilizable, una rutina tiene
dos opciones:
1. Redefinir el área reutilizable sql_scratchpad entera, en cuyo caso es necesario
incluir un campo de longitud explícito. Por ejemplo:
struct sql_spad
{
sqlint32 length;
sqlint32 int_var;
sqlint64 bigint_var;
};
void SQL_API_FN routine( ..., struct sql_spad* scratchpad, ... )
{
/* Utilizar área reutilizable */
}
2. Redefinir solamente la porción de datos del área reutilizable sql_scratchpad, en
cuyo caso no se necesita ningún campo de longitud.
struct spaddata
{
sqlint32 int_var;
sqlint64 bigint_var;
};
void SQL_API_FN routine( ..., struct sql_scratchpad* spad, ... )
{
struct spaddata* scratchpad = (struct spaddata*)spad→data;
/* Utilizar área reutilizable */
}
Capítulo 5. Desarrollo de rutinas externas 289
![Page 298: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/298.jpg)
Puesto que la aplicación no puede cambiar el valor del campo de longitud del área
reutilizable, el hecho de codificar la rutina tal como se muestra en el primer
ejemplo no brinda ningún beneficio significativo. El segundo ejemplo también se
puede transportar entre sistemas de distintos tamaños de palabra, por lo que
representa la manera preferible de escribir la rutina.
Conceptos relacionados:
v “Características de las funciones y métodos externos” en la página 277
v “Áreas reutilizables para funciones externas y métodos” en la página 285
v “Funciones escalares externas” en la página 278
v “Funciones de tabla definidas por el usuario” en Desarrollo de SQL y rutinas
externas
Tareas relacionadas:
v “Invocación de rutinas de 32 bits en un servidor de bases de datos de 64 bits” en
Desarrollo de SQL y rutinas externas
API y lenguajes de programación soportados
Interfaces API y lenguajes de programación soportados para el
desarrollo de rutinas externas
Puede desarrollar rutinas externas de DB2 (procedimientos y funciones) utilizando
las siguientes API y los lenguajes de programación asociados:
v ADO.NET
– Lenguajes de programación .NET Common Language Runtimev CLI
v SQL incorporado
– C
– C++
– COBOL (solo para procedimientos)v JDBC
– Javav OLE
– Visual Basic
– Visual C++
– Cualquier otro lenguaje de programación que soporte esta API.v OLE DB (solo para funciones de tabla)
– Cualquier lenguaje de programación que soporte esta API.v SQLJ
– Java
Conceptos relacionados:
v “Visión general de las rutinas externas” en la página 276
v “Soporte para el desarrollo de rutinas externas en lenguajes CLR de .NET” en
Desarrollo de SQL y rutinas externas
v “Soporte para el desarrollo de rutinas externas en C” en la página 315
v “Soporte para el desarrollo de rutinas externas en C++” en la página 315
290 Desarrollo de aplicaciones de SQL incorporado
![Page 299: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/299.jpg)
v “Software soportado de desarrollo de rutinas Java” en Desarrollo de SQL y rutinas
externas
v “Elección de una interfaz de programación de aplicaciones” en Iniciación al
desarrollo de aplicaciones de bases de datos
v “Interfaces soportadas de programación de aplicaciones de bases de datos” en
Iniciación al desarrollo de aplicaciones de bases de datos
Información relacionada:
v “Soporte para el desarrollo de procedimientos externos en COBOL” en la página
390
v “Lenguajes de programación y compiladores soportados para el desarrollo de
aplicaciones de bases de datos” en Iniciación al desarrollo de aplicaciones de bases de
datos
Comparación de las API y lenguajes de programación
soportados para el desarrollo de rutinas externas
Antes de empezar a implementar rutinas externas, es importante tener en cuenta
las características y las limitaciones de las distintas interfaces de programación de
aplicaciones (API) y lenguajes de programación soportados para las rutinas
externas. Con ello se asegurará de que elige la implementación adecuada desde el
principio y de que están disponibles las características de rutinas que necesite.
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
SQL (incluye SQL
PL)
v SQL es un
lenguaje de alto
nivel fácil de
aprender y de
utilizar y que
agiliza la
implementación.
v Los elementos
SQL Procedural
Language (SQL
PL) permiten
utilizar la
lógica de flujo
de control en
operaciones y
consultas SQL.
v Soporte a tipos
de datos
firmes.
v Muy bueno.
v El rendimiento
de las rutinas
SQL es mejor
que el de las
rutinas Java.
v El rendimiento
de las rutinas
SQL es tan
bueno como el
de las rutinas
externas de C y
C++ creadas
con la cláusula
NOT FENCED.
v Muy seguro.
v Los
procedimientos
SQL se ejecutan
en la misma
memoria que el
gestor de bases
de datos.
v Gran
escalabilidad.
v No pueden
acceder al
sistema de
archivos del
servidor de
bases de datos.
v No pueden
invocar
aplicaciones
que residan
fuera de la base
de datos.
Capítulo 5. Desarrollo de rutinas externas 291
![Page 300: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/300.jpg)
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas (continuación)
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
SQL incorporado
(incluye C y C++)
v Lenguaje de
programación
de bajo nivel,
pero potente.
v Muy bueno.
v El rendimiento
de las rutinas
de C y C++ es
mejor que el de
las rutinas Java.
v El rendimiento
de las rutinas
de C y C++
creadas con la
cláusula NOT
FENCED es tan
bueno como el
de las rutinas
SQL.
v Las rutinas de
C y C++ son
susceptibles a
los errores de
programación.
v Los
programadores
deben tener un
buen dominio
del lenguaje C
para evitar
cometer errores
de memoria y
de
manipulación
de punteros
muy comunes
que hacen que
la
implementación
de las rutinas
sea más pesada
y requiera más
tiempo.
v Las rutinas de
C y C++ deben
crearse con la
cláusula
FENCED y la
cláusula NOT
THREADSAFE
para evitar la
interrupción
del gestor de
bases de datos
en caso de que
se produzca
una excepción
en la rutina en
tiempo de
ejecución. Éstas
son las
cláusulas por
omisión. La
utilización de
estas cláusulas
puede tener un
cierto efecto
negativo sobre
el rendimiento
pero garantiza
una ejecución
segura.
Consulte:
Seguridad de
las rutinas .
v La
escalabilidad es
limitada
cuando se
crean rutinas
de C y C++
con las
cláusulas
FENCED y
NOT
THREADSAFE.
Estas rutinas se
ejecutan en un
proceso db2fmp
independiente
del proceso del
gestor de bases
de datos. Se
necesita un
proceso db2fmp
para cada
rutina que se
ejecute de
forma
simultánea.
v Existen
múltiples
estilos para
pasar los
parámetros
soportados y
esto puede
resultar
confuso. Los
usuarios deben
utilizar siempre
que sea posible
el estilo de los
parámetros
SQL.
292 Desarrollo de aplicaciones de SQL incorporado
![Page 301: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/301.jpg)
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas (continuación)
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
SQL incorporado
(COBOL)
v Lenguaje de
programación
de alto nivel
adecuado para
el desarrollo de
aplicaciones
empresariales
que suelen ir
orientadas a
archivos.
v Utilizado de
forma
generalizada en
el pasado para
las aplicaciones
empresariales
de producción,
aunque su
popularidad
está decayendo.
v COBOL no
contiene
soporte a los
punteros y es
un lenguaje de
programación
iterativo y
lineal.
v El rendimiento
de las rutinas
de COBOL no
es tan bueno
como el de las
rutinas creadas
con el resto de
opciones de
implementación
de rutinas
externas.
v No hay
información
disponible en
estos
momentos.
v No hay
información
disponible en
estos
momentos.
v Es posible crear
e invocar
procedimientos
de COBOL de
32 bits en
instancias de
DB2 de 64 bits;
sin embargo, el
rendimiento de
estas rutinas no
será tan bueno
como el de los
procedimientos
de COBOL de
64 bits de una
instancia de
DB2 de 64 bits.
JDBC (Java) y
SQLJ (Java)
v Lenguaje de
programación
de alto nivel
orientado a
objetos
adecuado para
el desarrollo de
aplicaciones
autónomas,
applets y
servlets.
v Los objetos y
los tipos de
datos de Java
facilitan el
establecimiento
de conexiones
con la base de
datos, la
ejecución de las
sentencias SQL
y la
manipulación
de los datos.
v El rendimiento
de las rutinas
de Java es tan
bueno como el
de las rutinas
de C y C++ o
el de las
rutinas SQL.
v Las rutinas de
Java son más
seguras que las
rutinas de C y
C++ porque la
Máquina
virtual Java
(JVM) es quien
gestiona el
control de las
operaciones
peligrosas. Esto
aumenta la
fiabilidad y
hace que
resulte difícil
que el código
de una rutina
de Java
perjudique a
otra rutina que
se ejecute en el
mismo proceso.
v Buena
escalabilidad
v Las rutinas
Java creadas
con la cláusula
FENCED
THREADSAFE
(el valor por
omisión) tienen
una buena
escalabilidad.
Todas las
rutinas Java
protegidas
comparten
algunas JVM.
Es posible que
se utilice más
de una JVM en
el sistema si la
pila de Java de
un proceso
db2fmp
concreto está
próxima a su
agotamiento.
v Para evitar
operaciones
potencialmente
peligrosas, no
se permiten
llamadas JNI
(Java Native
Interface) desde
las rutinas Java.
Capítulo 5. Desarrollo de rutinas externas 293
![Page 302: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/302.jpg)
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas (continuación)
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
Lenguajes
soportados de
ejecución en el
lenguaje común
(CLR) .NET
(incluidos C#,
Visual Basic y
otros)
v Parte del
modelo de
código
gestionado
.NET de
Microsoft.
v El código
fuente se
compila en el
bytecode de
lenguaje
intermedio (IL)
que se puede
interpretar
mediante la
unidad
ejecutable de
lenguaje común
(CLR)
Microsoft .NET
Framework.
v Los
ensamblajes
CLR se pueden
crear a partir
de
subensamblajes
que se hayan
compilado con
diferente
código fuente
de lenguaje de
programación
.NET, lo que
permite a los
usuarios
reutilizar e
integrar
módulos de
código escritos
en varios
lenguajes.
v Las rutinas
CLR solo se
pueden crear
con la cláusula
FENCED NOT
THREADSAFE
para minimizar
la posibilidad
de una
interrupción
del gestor de
bases de datos
durante el
tiempo de
ejecución. Esto
puede tener un
cierto efecto
negativo sobre
el rendimiento.
v Las rutinas
CLR solo se
pueden crear
con la cláusula
FENCED NOT
THREADSAFE.
Por lo tanto,
son seguras
porque se
ejecutarán
fuera del gestor
de bases de
datos en un
proceso
db2fmp aparte.
v No hay
información
disponible.
v Consulte el
tema
″Restricciones
de las rutinas
CLR .NET″.
294 Desarrollo de aplicaciones de SQL incorporado
![Page 303: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/303.jpg)
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas (continuación)
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
v OLE v Las rutinas de
OLE se pueden
implantar en
Visual C++, en
Visual Basic y
en otros
lenguajes
soportados por
OLE.
v La velocidad
de las rutinas
automatizadas
OLE dependerá
del lenguaje
utilizado para
implementarlas.
En general, son
más lentas que
las rutinas
C/C++ que no
son OLE.
v Las rutinas
OLE solo se
pueden ejecutar
en modalidad
FENCED NOT
THREADSAFE
y, por lo tanto,
las rutinas
automatizadas
OLE tienen una
buena
escalabilidad.
v No hay
información
disponible.
v No hay
información
disponible.
v No hay
información
disponible.
Capítulo 5. Desarrollo de rutinas externas 295
![Page 304: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/304.jpg)
Tabla 25. Comparación de las API y lenguajes de programación de rutinas externas (continuación)
API y lenguaje
de programación
Soporte de
características Rendimiento Seguridad Escalabilidad Limitaciones
v OLE DB v OLE DB se
puede utilizar
para crear
funciones de
tabla definidas
por el usuario.
v Las funciones
OLE DB
establecen
conexión con
fuentes de
datos externas
OLE DB.
v El rendimiento
de las
funciones OLE
DB depende
del proveedor
de OLE DB; sin
embargo, en
general las
funciones OLE
DB ofrecen un
mejor
rendimiento
que las
funciones Java
equivalente en
términos
lógicos pero
menor que las
funciones C,
C++ o SQL
equivalentes en
términos
lógicos. No
obstante,
algunos
predicados de
la consulta en
que se invoca
la función se
pueden evaluar
en el proveedor
de OLE DB,
por lo que
quedará
reducido el
número de filas
que DB2 tenga
que procesar, lo
que suele dar
lugar a un
mejor
rendimiento.
v No hay
información
disponible.
v No hay
información
disponible.
v OLE DB sólo se
puede utilizar
para crear
funciones de
tabla definidas
por el usuario.
Conceptos relacionados:
v “Interfaces soportadas de programación de aplicaciones de bases de datos” en
Iniciación al desarrollo de aplicaciones de bases de datos
v “Soporte para el desarrollo de rutinas externas en lenguajes CLR de .NET” en
Desarrollo de SQL y rutinas externas
v “Soporte para el desarrollo de rutinas externas en C” en la página 315
v “Soporte para el desarrollo de rutinas externas en C++” en la página 315
v “Software soportado de desarrollo de rutinas Java” en Desarrollo de SQL y rutinas
externas
v “Interfaces API y lenguajes de programación soportados para el desarrollo de
rutinas externas” en la página 290
296 Desarrollo de aplicaciones de SQL incorporado
![Page 305: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/305.jpg)
Información relacionada:
v “Lenguajes de programación y compiladores soportados para el desarrollo de
aplicaciones de bases de datos” en Iniciación al desarrollo de aplicaciones de bases de
datos
v “Soporte para el desarrollo de procedimientos externos en COBOL” en la página
390
Creación de rutinas externas
Las rutinas externas se crean de manera parecida a cómo se crean rutinas con otras
implementaciones. Sin embargo, se necesitan algunos pasos adicionales porque,
para implementar la rutina, hay que escribir código fuente, compilarlo y
desplegarlo.
Una rutina externa consta de dos partes:
v La sentencia CREATE que define la rutina.
v La biblioteca o clase externa que implementa el cuerpo de la rutina.
Cuando la sentencia CREATE que define una rutina se ejecuta satisfactoriamente,
la rutina se crea en la base de datos. La sentencia debe definir como mínimo el
nombre de la rutina, la signatura de parámetros que se usará en la implementación
de la rutina, y la ubicación de la biblioteca o clase externa construida a partir del
código fuente de la implementación de la rutina.
El código de implementación de las rutinas externas debe estar escrito en uno de
los lenguajes de programación soportados y luego hay que incorporarlo en un
archivo de clase o biblioteca que debe estar instalado en el sistema de archivos del
servidor de base de datos.
Una rutina externa no se puede invocar satisfactoriamente hasta que se ha creado
en la base de datos y hasta que la biblioteca o clase asociada a la rutina se ha
colocado en la ubicación especificada por la cláusula EXTERNAL.
El desarrollo de rutinas externas suele consistir en las siguientes tareas:
v Determinar qué tipo funcional de rutina hay que implementar.
v Elegir uno de los lenguajes de programación soportados para las rutinas
externas de cara a su implementación.
v Diseñar la rutina.
v Conectar con una base de datos y crear la rutina en la base de datos.
– Para ello, se ejecuta una de las sentencias CREATE PROCEDURE, CREATE
FUNCTION o CREATE METHOD o se utiliza una herramienta gráfica que
automatice este paso.
– Esta tarea, también conocida como definición o registro de una rutina, se
puede realizar en cualquier momento antes de invocar la rutina, excepto en
las circunstancias siguientes:
- Para las rutinas Java que hacen referencia a un archivo o archivos JAR
externos, el código y los archivos JAR externos se deben codificar y
compilar antes de que la rutina se cree en la base de datos utilizando la
sentencia CREATE específica del tipo de rutina.
- Las rutinas que ejecutan sentencias SQL y se refieren directamente a sí
mismas se deben crear en la base de datos emitiendo la sentencia CREATE
antes de que se precompile y enlace el código externo asociado con la
Capítulo 5. Desarrollo de rutinas externas 297
![Page 306: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/306.jpg)
rutina. Esto también es aplicable a las situaciones en que exista un ciclo de
referencias; por ejemplo: la Rutina A hace referencia a la Rutina B, la cual
hace referencia a la Rutina A.v Escribir el código de la lógica de la rutina para que se corresponda con la
definición de la rutina.
v Construir la rutina y generar un archivo de clase o biblioteca.
– En el caso de las rutinas de SQL incorporado, incluye: precompilar, compilar
y enlazar el código, así como enlazar el paquete de la rutina con la base de
datos destino.
– En el caso de las rutinas de SQL no incorporado, incluye: compilar y enlazar
el código.v Desplegar el archivo de clase o biblioteca en el servidor de base de datos, en la
ubicación especificada en la definición de la rutina.
v Otorgar el privilegio EXECUTE sobre la rutina al invocador o invocadores de la
rutina (si no son los que han definido la rutina).
v Invocar, probar y depurar la rutina.
Todos los pasos necesarios para crear una rutina externa se pueden realizar
mediante el procesador de línea de mandatos de DB2 o mediante una ventana de
mandatos de DB2. Hay herramientas que pueden ayudar a automatizar algunos de
estos pasos o todos ellos.
Conceptos relacionados:
v “Funciones de rutinas externas” en la página 276
v “Rutinas externas” en la página 275
v “Visión general de las rutinas externas” en la página 276
Tareas relacionadas:
v “Creación de rutinas externas” en la página 312
Estilos de parámetros de rutinas externas
Las implementaciones de rutinas externas se tienen que ajustar a un convenio
determinado para el intercambio de valores de parámetros de la rutina. Estos
convenios se conocen como estilos de parámetros. Se especifica un estilo de
parámetros de rutina externa cuando se crea la rutina, especificando la cláusula
PARAMETER STYLE. Los estilos de parámetros caracterizan la especificación y el
orden en el que se pasarán los valores de los parámetros a la implementación de la
rutina externa. también especifican qué pasará si se pasan valores adicionales a la
implementación de la rutina externa. Por ejemplo, algunos estilos de parámetros
especifican que para cada valor de parámetro de rutina se debe pasar un valor de
indicador de nulo adicional por separado a la implementación de la rutina para
proporcionar información sobre la capacidad de nulos de los parámetros, lo que de
lo contrario no se puede determinar fácilmente con un tipo de datos del lenguaje
de programación nativo.
La tabla siguiente proporciona una lista de los estilos de parámetros disponibles,
las implementaciones de rutina que dan soporte a cada estilo de parámetros, los
tipos de rutinas funcionales que dan soporte a cada estilo de parámetros y una
descripción del estilo de parámetros:
298 Desarrollo de aplicaciones de SQL incorporado
![Page 307: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/307.jpg)
Tabla 26. Estilos de parámetros
Estilo de
parámetros
Lenguaje
soportado
Tipo de rutina
soportado Descripción
SQL
1
v C/C++
v OLE
v Lenguajes de
ejecución en el
lenguaje
común .NET
v COBOL
2
v UDF
v procedim.
almacenados
v métodos
Además de los parámetros que se pasan durante la invocación, se pasan a
la rutina los argumentos siguientes por este orden:
v Un indicador nulo para cada parámetro o resultado declarado en la
sentencia CREATE.
v El SQLSTATE que se debe devolver a DB2.
v El nombre calificado de la rutina.
v El nombre específico de la rutina.
v La serie de diagnóstico de SQL que se debe devolver a DB2.
Según las opciones especificadas en la sentencia CREATE y el tipo de
rutina, se pueden pasar a la rutina los argumentos siguientes por este
orden:
v Un almacenamiento intermedio para el área reutilizable.
v El tipo de llamada de la rutina.
v La estructura dbinfo (contiene información acerca de la base de datos).
DB2SQL
1
v C/C++
v OLE
v Lenguajes de
ejecución en el
lenguaje
común .NET
v COBOL
v procedim.
almacenados
Además de los parámetros que se pasan durante la invocación, se pasan al
procedimiento almacenado los argumentos siguientes por este orden:
v Un vector que contiene un indicador nulo para cada parámetro de la
sentencia CALL.
v El SQLSTATE que se debe devolver a DB2.
v El nombre calificado del procedimiento almacenado.
v El nombre específico del procedimiento almacenado.
v La serie de diagnóstico de SQL que se debe devolver a DB2.
Si se especifica la cláusula DBINFO en la sentencia CREATE PROCEDURE,
se pasa al procedimiento almacenado una estructura dbinfo (contiene
información acerca de la base de datos).
JAVA
v Java v UDF
v procedim.
almacenados
Las rutinas con PARAMETER STYLE JAVA utilizan un convenio de pase de
parámetros que cumple con la especificación del lenguaje Java y las rutinas
de SQLJ.
Para los procedimientos almacenados, los parámetros INOUT y OUT se
pasarán como matrices de entrada única para facilitar la devolución de
valores. Además de los parámetros IN, OUT e INOUT, las signaturas de
método Java de los procedimientos almacenados incluyen un parámetro del
tipo ResultSet[] para cada conjunto de resultados especificado en la cláusula
DYNAMIC RESULT SETS de la sentencia CREATE PROCEDURE.
Para las UDF y los métodos con PARAMETER STYLE JAVA, no se pasan
más argumentos que los especificados en la invocación de la rutina.
Las rutinas PARAMETER STYLE JAVA no proporcionan soporte a las
cláusulas DBINFO o PROGRAM TYPE. Para las UDF, PARAMETER STYLE
JAVA sólo puede especificarse si no se han especificado como parámetros
tipos de datos estructurados y no se ha especificado como tipo de retorno
ningún tipo de datos estructurado, CLOB, DBCLOB ni BLOB (SQLSTATE
429B8). Además las UDF de PARAMETER STYLE JAVA no proporcionan
soporte a las funciones de tabla, los tipos de llamada ni áreas reutilizables.
DB2GENERAL
v Java v UDF
v procedim.
almacenados
v métodos
Este tipo de rutina utilizará un convenio de pase de parámetros definido
para su uso con los métodos Java. A no ser que se desarrollen UDF de tabla
o UDF con áreas reutilizables o que se tenga que acceder a la estructura
dbinfo, es recomendable utilizar PARAMETER STYLE JAVA.
Para las rutinas con PARAMETER STYLE DB2GENERAL, no se pasa
ningún argumento adicional aparte de los especificados en la invocación de
la rutina.
Capítulo 5. Desarrollo de rutinas externas 299
![Page 308: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/308.jpg)
Tabla 26. Estilos de parámetros (continuación)
Estilo de
parámetros
Lenguaje
soportado
Tipo de rutina
soportado Descripción
GENERAL
v C/C++
v Lenguajes de
ejecución en el
lenguaje
común .NET
v COBOL
v procedim.
almacenados
Un procedimiento almacenado con PARAMETER STYLE GENERAL recibe
parámetros de la sentencia CALL en la aplicación o rutina que realiza la
invocación. Si se especifica la cláusula DBINFO en la sentencia CREATE
PROCEDURE, se pasa al procedimiento almacenado una estructura dbinfo
(contiene información acerca de la base de datos).
GENERAL es el equivalente de los procedimientos almacenados SIMPLE en
DB2 Universal Database para z/OS y OS/390.
GENERAL
WITH NULLS
v C/C++
v Lenguajes de
ejecución en el
lenguaje
común .NET
v COBOL
v procedim.
almacenados
Un procedimiento almacenado con PARAMETER STYLE GENERAL WITH
NULLS recibe parámetros de la sentencia CALL en la aplicación o rutina
que realiza la invocación. También se incluye un vector que contiene un
indicador nulo para cada parámetro de la sentencia CALL. Si se especifica
la cláusula DBINFO en la sentencia CREATE PROCEDURE, se pasa al
procedimiento almacenado una estructura dbinfo (contiene información
acerca de la base de datos).
GENERAL WITH NULLS es el equivalente de los procedimientos
almacenados SIMPLE WITH NULLS en DB2 Universal Database para z/OS
y OS/390.
Nota:
1. Para las UDF y los métodos, PARAMETER STYLE SQL es equivalente a
PARAMETER STYLE DB2SQL.
2. COBOL sólo se puede utilizar para desarrollar procedimientos
almacenados.
3. Los métodos de ejecución en el lenguaje común .NET no están
soportados.
Conceptos relacionados:
v “Rutinas DB2GENERAL” en Desarrollo de SQL y rutinas externas
v “Rutinas Java” en Desarrollo de SQL y rutinas externas
v “Visión general de las rutinas externas” en la página 276
v “Parámetros de las rutinas de CLR .NET” en Desarrollo de SQL y rutinas externas
v “Parámetros de rutinas C y C++” en la página 319
v “Parámetros en rutinas Java” en Desarrollo de SQL y rutinas externas
v “Parámetros de los procedimientos de SQL” en Desarrollo de SQL y rutinas
externas
Tareas relacionadas:
v “Tipos diferenciados como UDF o parámetros de método” en Desarrollo de SQL y
rutinas externas
v “Pase de parámetros de tipo estructurado a rutinas externas” en Desarrollo de
SQL y rutinas externas
Información relacionada:
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE METHOD” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE” en Consulta de SQL, Volumen 2
v “Sentencia CREATE TYPE (Estructurado)” en Consulta de SQL, Volumen 2
v “Paso de argumentos a rutinas C, C++, OLE o COBOL” en la página 342
300 Desarrollo de aplicaciones de SQL incorporado
![Page 309: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/309.jpg)
Gestión de bibliotecas o clases de rutinas
Gestión de bibliotecas y clases de rutinas externas
Para desarrollar e invocar rutinas externas satisfactoriamente, los archivos de
bibliotecas y de clases de rutinas externas deben desplegarse y gestionarse
debidamente.
La gestión de archivos de bibliotecas y de clases de rutinas externas puede ser
mínima si se tiene cuidado cuando se crean las rutinas externas por primera vez y
se despliegan archivos de bibliotecas y clases de rutinas externas.
Las principales consideraciones a tener en cuenta sobre la gestión de rutinas
externas son las siguientes:
v Despliegue de archivos de bibliotecas y de clases de rutinas externas
v Seguridad de archivos de bibliotecas y de clases de rutinas externas
v Resolución de bibliotecas y clases de rutinas externas
v Modificaciones de archivos de bibliotecas y de clases de rutinas externas
v Copia de seguridad y restauración de archivos de bibliotecas y de clases de
rutinas externas
Los administradores del sistema, los administradores de bases de datos y los
desarrolladores de aplicaciones de bases de datos deben responsabilizarse de
garantizar que los archivos de bibliotecas y de clases de las rutinas externas están
protegidos y correctamente conservados durante las tareas de desarrollo de rutinas
y de administración de bases de datos.
Conceptos relacionados:
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Despliegue de bibliotecas y clases de rutinas externas” en la página 301
v “Visión general de las rutinas externas” en la página 276
v “Resolución de bibliotecas y clases de rutinas externas” en la página 303
v “Restricciones de las rutinas externas” en la página 309
v “Seguridad de archivos de bibliotecas o clases de rutinas externas” en la página
303
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
Información relacionada:
v “Sentencia ALTER FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia ALTER METHOD” en Consulta de SQL, Volumen 2
v “Sentencia ALTER PROCEDURE” en Consulta de SQL, Volumen 2
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE METHOD” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE” en Consulta de SQL, Volumen 2
Despliegue de bibliotecas y clases de rutinas externas
El despliegue de bibliotecas y clases de rutinas externas consiste en copiar las
bibliotecas y clases de las rutinas externas en el servidor de bases de datos cuando
se han creado a partir del código fuente.
Capítulo 5. Desarrollo de rutinas externas 301
![Page 310: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/310.jpg)
Los archivos de biblioteca, clase o ensamblaje de la rutina externa se tienen que
copiar en el directorio function de DB2 o en un subdirectorio de este directorio en el
servidor de bases de datos. Esta es la ubicación recomendada para el despliegue de
rutinas externas. Para obtener más información sobre el directorio de función,
consulte la descripción de la cláusula EXTERNAL correspondiente a cualquiera de
las siguientes sentencias SQL: CREATE PROCEDURE o CREATE FUNCTION.
Puede copiar la clase, biblioteca o ensamblaje de la rutina externa en otras
ubicaciones de directorios del servidor, en función de la API y el lenguaje de
programación utilizados para implementar la rutina, aunque no se recomienda
hacerlo en general. Si se hace, para invocar satisfactoriamente la rutina debe anotar
el nombre de la vía de acceso calificada al completo y asegurarse de que se utilice
este valor con la cláusula EXTERNAL NAME.
Los archivos de biblioteca y de clase se pueden copiar en el sistema de archivos
del servidor de bases de datos mediante las herramientas de transferencia de
archivos disponibles de manera más general. Las rutinas Java fr un sistema
informático en el que esté instalado un cliente DB2 se pueden copiar en un
servidor de bases de datos DB2 mediante procedimientos especiales definidos por
el sistema diseñados específicamente para ello. Encontrará más detalles en los
temas sobre rutinas Java.
Cuando ejecute la sentencia CREATE del lenguaje SQL adecuado correspondiente
al tipo de rutina, CREATE PROCEDURE o CREATE FUNCTION, asegúrese de
especificar las cláusulas adecuadas, prestando especial atención en la cláusula
EXTERNAL NAME.
v Especifique la cláusula LANGUAGE con el valor adecuado correspondiente a la API
o lenguaje de programación elegido. Ejemplos: CLR, C, JAVA.
v Especifique la cláusula PARAMETER STYLE con el nombre del estilo de parámetros
soportado que se ha implementado en el código de la rutina.
v Especifique la cláusula EXTERNAL con el nombre del archivo de biblioteca, clase o
ensamblaje que se ha de asociar a la rutina utilizando uno de los valores
siguientes:
– el nombre de vía de acceso calificado al completo del archivo de biblioteca,
clase o ensamblaje de la rutina.
– el nombre de vía de acceso relativa del archivo de biblioteca, clase o
ensamblaje de la rutina con relación al directorio de función.
Por omisión, DB2 buscará el archivo de biblioteca, clase o ensamblaje por el
nombre en el directorio de función, a menos que se especifique un nombre de vía
de acceso completamente calificado o relativo para el archivo en la cláusula
EXTERNAL.
Conceptos relacionados:
v “Gestión y rendimiento de bibliotecas de rutinas externas” en la página 305
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
v “Resolución de bibliotecas y clases de rutinas externas” en la página 303
v “Seguridad de archivos de bibliotecas o clases de rutinas externas” en la página
303
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
302 Desarrollo de aplicaciones de SQL incorporado
![Page 311: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/311.jpg)
Seguridad de archivos de bibliotecas o clases de rutinas
externas
Las bibliotecas de las rutinas externas se almacenan en el sistema de archivos en el
servidor de bases de datos, y el gestor de bases de datos de DB2 no hace copia de
ellas ni las protege de ningún modo. Para que se pueda seguir invocando
satisfactoriamente las rutinas, es imprescindible que la biblioteca asociada a la
rutina continúe existiendo en la ubicación especificada en la cláusula EXTERNAL
de la sentencia CREATE utilizada para crear la rutina. No mueva ni suprima
bibliotecas de rutinas después de crear las rutinas; de lo contrario, las invocaciones
de las rutinas fallarían.
Para evitar que las bibliotecas de rutinas se supriman o sustituyan de forma
accidental o intencionada, debe restringir el acceso a los directorios del servidor de
bases de datos que contienen bibliotecas de rutinas y restringir el acceso a los
archivos de bibliotecas de rutinas. Esto se puede realizar utilizando mandatos del
sistema operativo para establecer permisos sobre directorios y archivos.
Conceptos relacionados:
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Gestión y rendimiento de bibliotecas de rutinas externas” en la página 305
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
Resolución de bibliotecas y clases de rutinas externas
La resolución de bibliotecas de rutinas externas de DB2 se realiza a nivel de
instancia de DB2. Esto significa que, en instancias de DB2 que contienen varias
bases de datos de DB2, se pueden crear rutinas externas en una base de datos que
utilicen bibliotecas de rutinas externas que ya se utilicen para una rutina en otra
base de datos.
La resolución de rutinas externas a nivel de instancia da soporte a la reutilización
de código, permitiendo asociar varias definiciones de rutina a una sola biblioteca.
Cuando las bibliotecas de rutinas externas no se reutilizan de esta forma, sino que
existen copias de la biblioteca de la rutina externa en el sistema de archivos del
servidor de bases de datos, pueden producirse conflictos de nombres de
bibliotecas. Esto puede suceder concretamente cuando hay varias bases de datos en
una sola instancia y las rutinas de cada base de datos se asocian a sus propias
copias de bibliotecas y clases de cuerpos de rutinas. Se produce un conflicto
cuando el nombre de una biblioteca o de una clase utilizado por una rutina de una
base de datos es idéntico al nombre de la biblioteca o clase utilizado por una
rutina de otra base de datos (de la misma instancia).
Para minimizar la probabilidad de que esto suceda, se recomienda almacenar una
sola copia de una biblioteca de rutina en el directorio de función de nivel de
instancia (directorio sqllib/function) y que la cláusula EXTERNAL de todas las
definiciones de rutinas de cada una de las bases de datos haga referencia a la
biblioteca exclusiva.
Si se tienen que crear dos bibliotecas de rutinas funcionalmente diferentes con el
mismo nombre, es importante realizar pasos adicionales para minimizar la
probabilidad de que se produzcan conflictos de nombres de bibliotecas.
Capítulo 5. Desarrollo de rutinas externas 303
![Page 312: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/312.jpg)
Para rutinas C, C++, COBOL y ADO.NET:
Los conflictos de nombres de bibliotecas se pueden minimizar o resolver:
1. Almacenando las bibliotecas con los cuerpos de las rutinas en distintos
directorios para cada base de datos.
2. Creando las rutinas con un valor de cláusula EXTERNAL NAME que
especifique la vía de acceso completa de una determinada biblioteca (en
lugar de una vía de acceso relativa).
Para rutinas Java:
Los conflictos de nombres de clase no se pueden resolver moviendo los
archivos de clase en cuestión a directorios diferentes, porque la variable de
entorno CLASSPATH tiene efecto en toda la instancia. La primera clase que
se encuentra en CLASSPATH es la que se utiliza. Por lo tanto, si tiene dos
rutinas Java diferentes que hacen referencia a una clase con el mismo
nombre, una de las rutinas utilizará una clase incorrecta. Existen dos
soluciones posibles: renombre las clases afectadas o cree una instancia
distinta para cada base de datos.
Conceptos relacionados:
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Gestión y rendimiento de bibliotecas de rutinas externas” en la página 305
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
v “Seguridad de archivos de bibliotecas o clases de rutinas externas” en la página
303
Modificaciones de archivos de bibliotecas y clases de rutinas
externas
Puede ser necesario modificar la lógica de una rutina externa existente después de
que una rutina externa se despliegue y se utilice en un entorno del sistema de
bases de datos de producción. Se pueden realizar modificaciones en las rutinas
existentes, pero hay que realizarlas cuidadosamente para definir un momento de
toma de control claro para las actualizaciones y para minimizar el riesgo de que se
produzcan interrupciones en cualquier invocación concurrente de la rutina.
Si una biblioteca de rutina externa necesita una actualización, no vuelva a compilar
y a enlazar la rutina con el mismo archivo de destino (por ejemplo,
sqllib/function/foo.a) que utiliza la rutina actual mientras se está ejecutando el
gestor de bases de datos. Si una invocación de rutina actual accede a una versión
en antememoria del proceso de la rutina y se sustituye la biblioteca subyacente, la
invocación de la rutina puede fallar. Si hay que modificar el cuerpo de una rutina
sin detener y volver a iniciar DB2, siga los pasos siguientes:
1. Cree la nueva biblioteca de rutina externa con otro nombre de archivo de
biblioteca o de clase.
2. Si se trata de una rutina de SQL incorporado, enlace el paquete de la rutina a la
base de datos con el mandato BIND.
3. Utilice la sentencia ALTER ROUTINE para cambiar la definición de la rutina
para que la cláusula EXTERNAL NAME haga referencia a la biblioteca o clase
de la rutina actualizada. Si el cuerpo de rutina que se debe actualizar lo utilizan
rutinas catalogadas en varias bases de datos, las acciones recomendadas en esta
sección se deberán llevar a cabo para cada base de datos afectada.
304 Desarrollo de aplicaciones de SQL incorporado
![Page 313: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/313.jpg)
4. Para actualizar rutinas Java incorporadas en archivos JAR, tiene que emitir una
sentencia CALL SQLJ.REFRESH_CLASSES() a fin de forzar que DB2 cargue las
nuevas clases. Si no emite la sentencia CALL SQLJ.REFRESH_CLASSES()
después de actualizar las clases de rutinas Java, DB2 continúa utilizando las
versiones anteriores de las clases. DB2 renueva las clases cuando se produce
una operación COMMIT o ROLLBACK.
Una vez actualizada la definición de la rutina, las siguientes invocaciones de la
rutina cargarán y ejecutarán la nueva biblioteca o clase de rutina externa.
Conceptos relacionados:
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Gestión y rendimiento de bibliotecas de rutinas externas” en la página 305
v “Seguridad de archivos de bibliotecas o clases de rutinas externas” en la página
303
Copia de seguridad y restauración de archivos de bibliotecas y
clases de rutinas externas
No se hace copia de seguridad de las bibliotecas de rutinas externas con otros
objetos de base de datos cuando se realiza una copia de seguridad de la base de
datos. Tampoco se restauran cuando se restaura una base de datos.
Si el objetivo de una operación de copia de seguridad y restauración de una base
de datos es redesplegar una base de datos, los archivos de bibliotecas de rutinas
externas del sistema de archivos del servidor de bases de datos original se tienen
que copiar en el sistema de archivos del servidor de bases de datos de destino, de
forma que se conserven los nombres de vías de acceso relativas de las bibliotecas
de rutinas externas.
Conceptos relacionados:
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Gestión y rendimiento de bibliotecas de rutinas externas” en la página 305
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
v “Seguridad de archivos de bibliotecas o clases de rutinas externas” en la página
303
Gestión y rendimiento de bibliotecas de rutinas externas
La gestión de bibliotecas de rutinas externas puede afectar al rendimiento de las
rutinas, puesto que el gestor de bases de datos de DB2 coloca en antememoria de
forma dinámica las bibliotecas de rutinas externas a fin de mejorar el rendimiento
de acuerdo con el uso de las rutinas. para conseguir un rendimiento óptimo de las
rutinas externas, tenga en cuenta lo siguiente:
v Haga que el número de rutinas de cada biblioteca sea lo más reducido posible.
Es mejor tener muchas bibliotecas de rutinas externas pequeñas que unas pocas
de gran tamaño.
v Agrupe dentro del código fuente las funciones de las rutinas que se suelen
invocar juntas. Cuando el código se compila en una biblioteca de rutinas
externas, los puntos de entrada de las rutinas que se invocan con frecuencia
estarán juntos, lo que permite al gestor de bases de datos ofrecer un mejor
Capítulo 5. Desarrollo de rutinas externas 305
![Page 314: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/314.jpg)
soporte de colocación en antememoria. El soporte mejorado de colocación en
antememoria se debe a la eficacia que se puede obtener al cargar una sola
biblioteca de rutinas externas una vez y luego invocar varias funciones de
rutinas externas dentro de dicha biblioteca.
Para las rutinas externas implementadas en el lenguaje de programación C o
C++, el coste de cargar una biblioteca se paga una vez para las bibliotecas que se
encuentran en uso de forma coherente por parte de las rutinas C. Después de la
primera invocación de la rutina, no es necesario que todas las invocaciones
posteriores, de la misma hebra del proceso, vuelvan a cargar la biblioteca de la
rutina.
Conceptos relacionados:
v “Copia de seguridad y restauración de archivos de bibliotecas y clases de rutinas
externas” en la página 305
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Modificaciones de archivos de bibliotecas y clases de rutinas externas” en la
página 304
Tareas relacionadas:
v “Sustitución de una biblioteca compartida de AIX” en Desarrollo de SQL y rutinas
externas
Soporte de 32 bits y 64 bits para rutinas externas
El soporte para rutinas externas de 32 bits y 64 bits está determinado por la
especificación de una de las dos cláusulas siguientes en la sentencia CREATE para
las rutinas: cláusula FENCED o cláusula NOT FENCED.
El cuerpo de la rutina de una rutina externa se escribe en un lenguaje de
programación y se compila en una biblioteca o archivo de clase que luego se carga
y se ejecuta cuando se invoca la rutina. La especificación de la cláusula FENCED o
NOT FENCED determina si la rutina externa se ejecuta en un entorno con barrera
diferenciado del gestor de bases de datos o en el mismo espacio de direcciones que
el gestor de bases de datos, lo que puede ofrecer un mejor rendimiento mediante el
uso de memoria compartida en vez de TCPIP para las comunicaciones. Por
omisión, las rutinas siempre se crean con barrera independientemente de las otras
cláusulas seleccionadas.
La tabla siguiente ilustra el soporte de DB2 para ejecutar rutinas de 32 bits y 64
bits con y sin barrera en servidores de base de datos de 32 bits y 64 bits que
ejecutan el mismo sistema operativo.
Tabla 27. Soporte para rutinas externas de 32 y de 64 bits
Ancho de bits de la rutina Servidor de 32 bits Servidor de 64 bits
Procedimiento con barrera de 32 bits
o UDF
Soportado Soportado
Procedimiento con barrera de 64 bits
o UDF
No soportado (4) Soportado
Procedimiento sin barrera de 32 bits
o UDF
Soportado Soportado (2)
Procedimiento sin barrera de 64 bits
o UDF
No soportado (4) Soportado
306 Desarrollo de aplicaciones de SQL incorporado
![Page 315: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/315.jpg)
Las notas a pie de página de la tabla anterior corresponden a:
v (1) Ejecutar una rutina de 32 bits en un servidor de 64 bits no es tan rápido
como ejecutar una rutina de 64 bits en un servidor de 64 bits.
v (2) Las rutinas de 32 bits deben crearse como FENCED y NOT THREADSAFE
para funcionar en un servidor de 64 bits.
v (3) No es posible invocar rutinas de 32 bits en servidores de base de datos de 64
bits Linux IA.
v (4) Las aplicaciones y las rutinas de 64 bits y no pueden ejecutarse en espacios
de direcciones de 32 bits.
Lo importante a tener en cuenta en la tabla es que los procedimientos sin barrera
de 32 bits no pueden ejecutarse en un servidor DB2 de 64 bits. Si debe desplegar
rutinas sin barrera de 32 bits en plataformas de 64 bits, elimine la cláusula NOT
FENCED de las sentencias CREATE para estas rutinas antes de catalogarlas.
Conceptos relacionados:
v “Gestión de bibliotecas y clases de rutinas externas” en la página 301
v “Rutinas externas” en la página 275
v “Visión general de las rutinas externas” en la página 276
v “Creación de rutinas externas” en la página 297
v “Funciones de rutinas externas” en la página 276
v “Implementación de las rutinas externas” en Desarrollo de SQL y rutinas externas
Tareas relacionadas:
v “Creación de rutinas externas” en la página 312
Rendimiento de las rutinas con bibliotecas de 32 bits en
servidores de bases de datos de 64 bits
Es posible invocar rutinas con bibliotecas de rutinas de 32 bits en servidores de
bases de datos de DB2 de 64 bits. Sin embargo, su rendimiento no es tan bueno
como el de invocar una rutina de 64 bits en un servidor de 64 bits. La razón de la
disminución del rendimiento es que, antes de cada intento de ejecutar una rutina
de 32 bits en un servidor de 64 bits, primero se intenta invocarla como una
biblioteca de 64 bits. Si esto falla, entonces la biblioteca se invocará como una
biblioteca de 32 bits. Un intento fallido de invocar una biblioteca de 32 bits como si
fuera una biblioteca de 64 bits genera un mensaje de error (SQLCODE -444) en el
archivo db2diag.log.
Las clases de Java son independientes del número de bits. Solamente las máquinas
virtuales de Java (JVM) se clasifican como de 32 bits o de 64 bits. DB2 solo da
soporte al uso de JVM que tengan el mismo número de bits que la instancia en que
se están utilizando. Es decir, en una instancia de DB2 de 32 bits solamente puede
utilizarse una JVM de 32 bits y en una instancia de DB2 de 64 bits solamente
puede utilizarse una JVM de 64 bits. Esto garantiza el correcto funcionamiento de
las rutinas de Java y el mejor rendimiento posible.
Conceptos relacionados:
v “Visión general de las rutinas externas” en la página 276
Capítulo 5. Desarrollo de rutinas externas 307
![Page 316: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/316.jpg)
Soporte para el tipo de datos XML en las rutinas externas
Los procedimientos y las funciones externas escritas en los siguientes lenguajes de
programación soportan parámetros y variables de tipo de datos XML:
v C
v C++
v COBOL
v Java
v Lenguajes .NET CLR
Las rutinas OLE y OLEDB externas no soportan parámetros de tipo de datos XML.
Los valores de tipo de datos XML se representan en el código de las rutinas
externas de la misma manera que los tipos de datos CLOB.
Cuando se declaran parámetros de tipo de datos XML para las rutinas externas, las
sentencias CREATE PROCEDURE y CREATE FUNCTION que se utilizarán para
crear las rutinas en la base de datos deben especificar que el tipo de datos XML se
debe almacenar en forma de tipo de datos CLOB. El tamaño del valor de CLOB
debe acercarse al tamaño del documento XML representado por el parámetro XML.
En la siguiente línea de código aparece una sentencia CREATE PROCEDURE de
un procedimiento externo implementado en el lenguaje de programación C con un
parámetro XML llamado parm1:
CREATE PROCEDURE myproc(IN parm1 XML AS CLOB(2M), IN parm2 VARCHAR(32000))
LANGUAGE C
FENCED
PARAMETER STYLE SQL
EXTERNAL NAME ’mylib!myproc’;
Hay que tener en cuenta consideraciones parecidas al crear funciones definidas por
usuario (UDF) externas, como se ve en el siguiente ejemplo:
CREATE FUNCTION myfunc (IN parm1 XML AS CLOB(2M))
RETURNS SMALLINT
LANGUAGE C
PARAMETER STYLE SQL
DETERMINISTIC
NOT FENCED
NULL CALL
NO SQL
NO EXTERNAL ACTION
EXTERNAL NAME ’mylib1!myfunc’
Los valores XML se serializan antes de pasarlos a rutinas externas.
En el código de las rutinas externas, los valores de los parámetros y variables XML
se acceden, establecen y modifican de la misma manera que en las aplicaciones de
bases de datos.
Conceptos relacionados:
v “Visión general de las rutinas externas” en la página 276
v “Encoding considerations for passing XML data in routine parameters” en XML
Guide
308 Desarrollo de aplicaciones de SQL incorporado
![Page 317: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/317.jpg)
v “Parámetros y variables del tipo de datos XML en funciones de SQL” en
Desarrollo de SQL y rutinas externas
v “Soporte de XML y XQuery en procedimientos SQL” en Desarrollo de SQL y
rutinas externas
Tareas relacionadas:
v “Especificación de un tipo de columna de datos” en Desarrollo de SQL y rutinas
externas
Información relacionada:
v “Tipos de datos SQL soportados para DB2 .NET Data Provider” en Desarrollo de
SQL y rutinas externas
v “Tipos de datos de SQL soportados en rutinas DB2GENERAL” en Desarrollo de
SQL y rutinas externas
v “Tipos de datos SQL soportados en rutinas Java” en Desarrollo de SQL y rutinas
externas
Restricciones de las rutinas externas
Se aplican las siguientes restricciones a las rutinas externas y deben tenerse en
cuenta a la hora de desarrollar o depurar rutinas externas:
Restricciones que se aplican a todas las rutinas externas::
v En las rutinas externas no se pueden crear hebras nuevas.
v Las API de nivel de conexión no se pueden llamar desde dentro de funciones o
métodos externos.
v Desde rutinas externas no es posible recibir entradas desde el teclado ni
visualizar salidas en la salida estándar. No utilice corrientes de entrada-salida
estándar. Por ejemplo:
– En código de rutinas Java externas, no emita los métodos
System.out.println().
– En código de rutinas C o C++ externas, no emita printf().
– En código de rutinas COBOL externas, no emita display
Aunque las rutinas externas no pueden visualizar datos en una salida estándar,
sí pueden incluir código que grabe datos en un archivo del sistema de archivos
del servidor de bases de datos.
Para las rutinas delimitadas (fenced) que se ejecutan en entornos UNIX, el
directorio de destino en que se debe crear el archivo, o el propio archivo, debe
tener los permisos adecuados, de forma que el propietario del archivo
sqllib/adm/.fenced pueda crearlo o grabar en él. Si se trata de rutinas no
delimitadas (not fenced), el propietario de la instancia debe tener permisos de
creación, lectura y grabación para el directorio en que se abra el archivo.
Nota: DB2 no intenta sincronizar la entrada externa ni la salida que realice una
rutina con transacciones propias de DB2. Así, por ejemplo, si una UDF
graba en un archivo durante una transacción y más tarde se retira dicha
transacción por cualquier motivo, no se realiza ningún intento de
descubrir ni deshacer las grabaciones efectuadas en el archivo.
v En rutinas externas no pueden ejecutarse sentencias o mandatos relacionados
con la conexión. Esta restricción es aplicable a las siguientes sentencias:
– BACKUP
Capítulo 5. Desarrollo de rutinas externas 309
![Page 318: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/318.jpg)
– CONNECT
– CONNECT TO
– CONNECT RESET
– CREATE DATABASE
– DROP DATABASE
– FORWARD RECOVERY
– RESTOREv No es recomendable utilizar funciones del sistema operativo dentro de las
rutinas. El uso de estas funciones no está restringido, excepto en los casos
siguientes:
– No deben instalarse manejadores de señales definidos por el usuario para
rutinas externas. Si no se cumple con esta restricción, se pueden producir
anomalías inesperadas durante la ejecución de las rutinas externas,
terminaciones anormales de base de datos u otros problemas. La instalación
de manejadores de señales también puede interferir en el funcionamiento
de la JVM para las rutinas de Java.
– Las llamadas al sistema que terminan un proceso pueden terminar de forma
anómala uno de los procesos de DB2 y causar como consecuencia una
anomalía del sistema o de la aplicación de base de datos.
Otras llamadas al sistema también pueden ocasionar problemas si interfieren
en el funcionamiento normal del gestor de bases de datos DB2. Por ejemplo,
una función que intente descargar una biblioteca que contenga una función
definida por el usuario desde la memoria podría causar problemas graves.
Preste atención al programar y al probar las rutinas externas que contengan
llamadas al sistema.v Las rutinas externas no deben contener mandatos que terminen el proceso
actual. Una rutina externa siempre tiene que devolver el control al gestor de
bases de datos DB2 sin terminar el proceso actual.
v Las bibliotecas, clases o ensamblajes de rutinas externas no deben actualizarse
mientras la base de datos está activa, excepto en casos especiales. Si es necesario
realizar una actualización mientras el gestor de bases de datos de DB2 está
activo, y no es posible detener y volver a iniciar la instancia, cree la biblioteca,
clase o ensamblaje nuevo para la rutinas con uno diferente. A continuación,
utilice la sentencia ALTER para cambiar el valor de la cláusula EXTERNAL
NAME de la rutina externa de modo que haga referencia al nombre del archivo
de biblioteca, clase o ensamblaje nuevo.
v La variable de entorno DB2CKPTR no está disponible en las rutinas externas. Las
demás variables de entorno cuyos nombres empiezan por 'DB2' se capturan en el
momento en que se inicia el gestor de bases de datos y pueden utilizarse en las
rutinas externas.
v Algunas variables de entorno cuyos nombres no comienzan por 'DB2' no están
disponibles para las rutinas externas delimitadas (fenced). Por ejemplo, la
variable de entorno LIBPATH no puede utilizarse. Sin embargo, estas variables sí
están disponibles para las rutinas externas que no están delimitadas (not fenced).
v Los valores de variables de entorno establecidos una vez iniciado el gestor de
bases de datos de DB2 no están disponibles para las rutinas externas.
v Dentro de las rutinas externas, debe limitarse el uso de recursos protegidos,
recursos a los que únicamente puede acceder un proceso a la vez. Si han de
utilizarse, procure reducir la probabilidad de puntos muertos cuando dos rutinas
externas intenten acceder al recurso protegido. Si se producen puntos muertos
en dos o más rutinas, mientras se intenta acceder al recurso protegido, el gestor
310 Desarrollo de aplicaciones de SQL incorporado
![Page 319: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/319.jpg)
de bases de datos de DB2 no será capaz de detectar o resolver la situación. Esto
ocasionará que los procesos de rutinas externas se queden colgados.
v La memoria para los parámetros de rutinas externas no debe asignarse
explícitamente en el servidor de bases de datos DB2. El gestor de bases de datos
de DB2 asigna automáticamente almacenamiento basándose en la declaración de
parámetros de la sentencia CREATE para la rutina. No modifique ningún
puntero del almacenamiento para los parámetros de las rutinas externas. Un
intento de cambiar un puntero por un puntero del almacenamiento creado
localmente puede tener como consecuencia fugas de memoria, corrupción de los
datos o terminaciones anormales.
v No utilice datos estáticos ni globales en las rutinas externas. DB2 no puede
garantizar que la memoria utilizada por las variables estáticas o globales no se
toque entre las invocaciones de rutinas externas. Para las UDF y los métodos,
puede emplear áreas reutilizables a fin de almacenar los valores que se utilizarán
entre las invocaciones.
v Los valores de todos los parámetros de SQL se colocan en el almacenamiento
intermedio. Esto significa que se realiza una copia del valor y se le pasa a la
rutina externa. Si se efectúan cambios en los parámetros de entrada de una
rutina externa, estos cambios no repercutirán en los valores de SQL ni en el
proceso. Sin embargo, si una rutina externa graba, en un parámetro de entrada o
de salida, más datos de los especificados en la sentencia CREATE, se habrá
corrompido la memoria y es posible que la rutina termine anormalmente.
Restricciones que se aplican solamente a los procedimientos externos:
v Cuando se devuelvan conjuntos de resultados desde procedimientos
almacenados anidados, podrá abrir un cursor con el mismo nombre en varios
niveles de anidamiento. No obstante, las aplicaciones anteriores a la versión 8
sólo podrán acceder al primer conjunto de resultados que se haya abierto. Esta
restricción no se aplica a los cursores abiertos con un nivel de paquete diferente.
Restricciones que se aplican solamente a las funciones externas:
v Las funciones externas no pueden devolver conjuntos de resultados. Todos los
cursores abiertos dentro de una función externa deben estar cerrados en el
momento en que se complete la invocación a la llamada final de la función.
v Las asignaciones dinámicas de memoria en una rutinas externa deben liberarse
antes de que la rutina externa devuelva el control. De lo contrario, se producirán
fugas de memoria y constante aumento del consumo de memoria de un proceso
de DB2 puede tener como consecuencia que el sistema de bases de datos se
quede sin memoria.
Para las funciones definidas por el usuario externas y los métodos externos,
pueden utilizarse áreas reutilizables para asignar la memoria dinámica necesaria
para la invocación de múltiples funciones. Si se utilizan áreas reutilizables de
este modo, especifique el atributo FINAL CALL en las sentencias CREATE
FUNCTION o CREATE METHOD. Así se garantiza que la memoria asignada se
liberará antes de que la rutina devuelva el control.
Conceptos relacionados:
v “Visión general de las rutinas externas” en la página 276
v “Manejo de tipos de datos de SQL en rutinas C y C++” en la página 334
Información relacionada:
v “Tipos de datos de SQL soportados en la automatización de OLE” en Desarrollo
de SQL y rutinas externas
Capítulo 5. Desarrollo de rutinas externas 311
![Page 320: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/320.jpg)
v “Tipos de datos SQL soportados en OLE DB” en Desarrollo de SQL y rutinas
externas
v “Correlaciones de tipos de datos entre DB2 y OLE DB” en Desarrollo de
aplicaciones ADO.NET y OLE DB
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
v “Sentencia ALTER FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia ALTER METHOD” en Consulta de SQL, Volumen 2
v “Sentencia ALTER PROCEDURE” en Consulta de SQL, Volumen 2
v “Sentencia CALL” en Consulta de SQL, Volumen 2
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE METHOD” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE” en Consulta de SQL, Volumen 2
Creación de rutinas externas
Las rutinas externas, incluidos procedimientos y funciones, se crean de forma
parecida a las rutinas con otras implementaciones, aunque algunos pasos
adicionales necesarios porque la implementación de la rutina requiere la
codificación, compilación y despliegue del código fuente.
Elegirá implementar una rutina externa si:
v Desea encapsular lógica compleja en una rutina que acceda a la base de datos o
que realice una acción fuera de la base de datos.
v Necesita que la lógica encapsulada se invoque desde cualquiera de estos
elementos: diversas aplicaciones, el CLP, otra rutina (procedimiento, función
(UDF) o método) o un activador.
v Se siente más cómodo al codificar esta lógica en un lenguaje de programación en
lugar de utilizar sentencias de SQL y SQL PL.
v Necesita la lógica de rutina para realizar operaciones externas a la base de datos,
tales como escribir o leer un archivo del servidor de base de datos, la ejecución
de otra aplicación, o lógica que no puede representarse con sentencias de SQL y
SQL PL.
Requisitos previos:
v Conocimiento de la implementación de rutinas externas. Para obtener
información sobre las rutinas externas en general, consulte el tema:
– “Rutinas externas” en la página 275
– “Creación de rutinas externas” en la página 297v Debe instalarse el Cliente DB2.
v El servidor de bases de datos debe ejecutar un sistema operativo que dé soporte
a los compiladores del lenguaje de programación de la implementación elegida y
al software de desarrollo.
v Los compiladores necesarios y el soporte de ejecución para el lenguaje de
programación elegido deben estar instalados en el servidor de base de datos
v Autorización para ejecutar la sentencia CREATE PROCEDURE, CREATE
FUNCTION o CREATE METHOD.
Restricciones:
Para obtener una lista de las restricciones asociadas con rutinas externas, consulte:
312 Desarrollo de aplicaciones de SQL incorporado
![Page 321: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/321.jpg)
v “Restricciones de las rutinas externas” en la página 309
Procedimiento:
1. Codifique la lógica de la rutina en el lenguaje de programación elegido.
v Para obtener información general sobre rutinas externas, características de las
rutinas y la implementación de características de las rutinas, consulte los
temas a los que se hace referencia en la sección Requisitos previos.
v Utilice o importe los archivos de cabecera necesarios para dar soporte a la
ejecución de sentencias de SQL.
v Declare las variables y los parámetros correctamente utilizando tipos de
datos del lenguaje de programación que se correlacionen con tipos de datos
de SQL de DB2.2. Los parámetros deben declararse de acuerdo con el formato requerido por el
estilo de parámetro para el lenguaje de programación elegido. Si desea más
información sobre los parámetros y las declaraciones de prototipo, consulte:
v “Estilos de parámetros de rutinas externas” en la página 2983. Construya el código en una biblioteca o archivo de clase.
4. Copie la biblioteca o archivo de clase en el directorio de función DB2 en el
servidor de base de datos. Es recomendable almacenar ensamblajes o
bibliotecas asociadas con rutinas de DB2 en el directorio de función. Para
conocer más acerca del directorio de función, consulte la cláusula EXTERNAL
de una de las sentencias siguientes: CREATE PROCEDURE o CREATE
FUNCTION.
Puede copiar el ensamblaje en otro directorio del servidor si lo desea, pero,
para invocar satisfactoriamente la rutina, debe anotar el nombre de vía de
acceso completamente calificado del ensamblaje porque lo necesitará en el paso
siguiente.
5. Ejecute de forma dinámica o estática la sentencia CREATE de lenguaje SQL
correspondiente para el tipo de rutina: CREATE PROCEDURE o CREATE
FUNCTION.
v Especifique la cláusula LANGUAGE con el valor adecuado correspondiente a la
API o lenguaje de programación elegido. Ejemplos: CLR, C, JAVA.
v Especifique la cláusula PARAMETER STYLE con el nombre del estilo de
parámetros soportado que se ha implementado en el código de la rutina.
v Especifique la cláusula EXTERNAL con el nombre del archivo de biblioteca,
clase o ensamblaje que se ha de asociar a la rutina utilizando uno de los
valores siguientes:
– el nombre de vía de acceso calificado al completo del archivo de
biblioteca, clase o ensamblaje de la rutina.
– el nombre de vía de acceso relativa del archivo de biblioteca, clase o
ensamblaje de la rutina con relación al directorio de función.Por omisión, DB2 buscará el archivo de biblioteca, clase o ensamblaje por el
nombre en el directorio de función, a menos que se especifique un nombre
de vía de acceso completamente calificado o relativo para el archivo en la
cláusula EXTERNAL.
v Especifique DYNAMIC RESULT SETS con un valor numérico si la rutina es
un procedimiento y ha de devolver uno o varios conjunto de resultados al
llamador.
v Especifique las demás cláusulas necesarias para caracterizar la rutina.
Para invocar la rutina externa, consulte Invocación de la rutina
Capítulo 5. Desarrollo de rutinas externas 313
![Page 322: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/322.jpg)
Conceptos relacionados:
v “Rutinas externas” en la página 275
v “Creación de rutinas externas” en la página 297
v “Restricciones de las rutinas externas” en la página 309
v “Estilos de parámetros de rutinas externas” en la página 298
v “Invocación de rutinas” en Desarrollo de SQL y rutinas externas
v “Visión general de las rutinas externas” en la página 276
Rutinas C y C++
Rutinas C y C++
Las rutinas C y C++ son rutinas externas que se crean ejecutando una sentencia
CREATE PROCEDURE, CREATE FUNCTION o CREATE METHOD, que haga
referencia a una biblioteca creada a partir del código fuente C o C++ como su
cuerpo de código externo.
Las rutinas C y C++ pueden ejecutar opcionalmente sentencias de SQL incluyendo
sentencias de SQL incorporado.
Los siguientes términos son importantes en el contexto de las rutinas C y C++:
Sentencia CREATE
La sentencia CREATE del lenguaje SQL utilizada para crear la rutina en la
base de datos.
Código fuente del cuerpo de la rutina
El archivo de código fuente que contiene la implementación de la rutina C
o C++ que corresponde a la especificación de la cláusula EXTERNAL de la
sentencia CREATE.
Precompilador
El programa de utilidad de DB2 que preanaliza la implementación del
código fuente de la rutina para validar las sentencias de SQL contenidas en
el código y genera un paquete.
Compilador
El software específico del lenguaje de programación necesario para
compilar y enlazar la implementación del código fuente.
Paquete
El archivo que contiene la información de vía de acceso de tiempo de
ejecución que utilizará DB2 en el momento de la ejecución de la rutina
para ejecutar las sentencias de SQL contenidas en la implementación del
código de la rutina.
Biblioteca de la rutina
Un archivo que contiene el formato compilado del código fuente de la
rutina. En Windows a veces se denomina una DLL, porque estos archivos
tienen la extensión de archivo .dll.
Antes de desarrollar una rutina C o C++, es importante comprender los conceptos
básicos de las rutinas y las características exclusivas y específicas de las rutinas C y
C++. También es importante comprender la API de SQL incorporado y los
conceptos básicos sobre el desarrollo de aplicaciones de SQL incorporado. Para
obtener más información sobre estos temas, consulte los siguientes apartados:
314 Desarrollo de aplicaciones de SQL incorporado
![Page 323: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/323.jpg)
v Rutinas externas
v SQL incorporado
v Archivos de inclusión para rutinas C y C++
v parámetros en rutinas C y C++
v Restricciones de rutinas C y C++
El desarrollo de rutinas C o C++ incluye seguir una serie de instrucciones paso a
paso y consultar ejemplos de rutinas C o C++. Consulte:
v Creación de rutinas C y C++
v Ejemplos de procedimientos C
v Ejemplos de funciones definidas por el usuario C
Conceptos relacionados:
v “Herramientas para el desarrollo de rutinas C y C++” en la página 316
v “Rutinas externas” en la página 275
v “Soporte para el desarrollo de rutinas externas en C” en la página 315
v “Soporte para el desarrollo de rutinas externas en C++” en la página 315
Tareas relacionadas:
v “Creación del código de rutinas C y C++” en la página 362
v “Creación de rutinas C y C++” en la página 360
v “Diseño de rutinas C y C++” en la página 316
Soporte para el desarrollo de rutinas externas en C
Para desarrollar rutinas externas en C debe utilizar compiladores y software de
desarrollo soportados.
Todos los compiladores y el software de desarrollo soportados para el desarrollo
de aplicaciones de bases de datos DB2 en C se puede utilizar para el desarrollo de
rutinas externas en C.
Conceptos relacionados:
v “Rutinas C y C++” en la página 314
v “Interfaces API y lenguajes de programación soportados para el desarrollo de
rutinas externas” en la página 290
Información relacionada:
v “Soporte para el desarrollo de aplicaciones de bases de datos en C” en Iniciación
al desarrollo de aplicaciones de bases de datos
v “Lenguajes de programación y compiladores soportados para el desarrollo de
aplicaciones de bases de datos” en Iniciación al desarrollo de aplicaciones de bases de
datos
Soporte para el desarrollo de rutinas externas en C++
Para desarrollar rutinas externas en C++ debe utilizar compiladores y software de
desarrollo soportados.
Capítulo 5. Desarrollo de rutinas externas 315
![Page 324: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/324.jpg)
Todos los compiladores y el software de desarrollo soportados para el desarrollo
de aplicaciones de bases de datos DB2 en C se pueden utilizar para el desarrollo
de rutinas externas en C++.
Conceptos relacionados:
v “Interfaces API y lenguajes de programación soportados para el desarrollo de
rutinas externas” en la página 290
v “Rutinas C y C++” en la página 314
Información relacionada:
v “Soporte para el desarrollo de aplicaciones de bases de datos en C++” en
Iniciación al desarrollo de aplicaciones de bases de datos
v “Lenguajes de programación y compiladores soportados para el desarrollo de
aplicaciones de bases de datos” en Iniciación al desarrollo de aplicaciones de bases de
datos
Herramientas para el desarrollo de rutinas C y C++
Las herramientas soportadas para las rutinas C y C++ son las mismas que las
soportadas para aplicaciones C y C++ de SQL incorporado.
No hay entornos de desarrollo de DB2 ni herramientas gráficas de interfaz de
usuario para desarrollar, depurar o desplegar aplicaciones o rutinas de SQL
incorporado.
Las siguientes interfaces de línea de mandatos se suelen utilizar para desarrollar,
depurar y desplegar aplicaciones y rutinas de SQL incorporado:
v Procesador de línea de mandatos de DB2
v Ventana de mandatos de DB2
Estas interfaces dan soporte a la ejecución de las sentencias de SQL necesarias para
crear rutinas en una base de datos. El mandato PREPARE y el mandato BIND
necesarios para crear rutinas C y C++ que contienen SQL incorporado también se
puede emitir desde estas interfaces.
Conceptos relacionados:
v “Rutinas C y C++” en la página 314
v “Procesador de línea de mandatos (CLP) de DB2” en Desarrollo de SQL y rutinas
externas
v “Herramientas para desarrollar rutinas” en Desarrollo de SQL y rutinas externas
Tareas relacionadas:
v “Creación del código de rutinas C y C++” en la página 362
Diseño de rutinas C y C++
Diseño de rutinas C y C++
El diseño de rutinas C y C++ es una tarea que debe preceder a la creación de
dichas rutinas. El diseño de rutinas C y C++ suele estar relacionado con el diseño
de rutinas externas implementadas en otros lenguajes de programación y con el
diseño de aplicaciones de SQL incorporado.
Requisitos previos:
316 Desarrollo de aplicaciones de SQL incorporado
![Page 325: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/325.jpg)
v Conocimientos generales sobre rutinas externas
v Experiencia con la programación de C o C++
v Opcional: Conocimientos sobre, y experiencia con, el desarrollo de aplicaciones
CLI y SQL incorporado (si la rutina va a ejecutar sentencias de SQL)
Los temas siguientes proporcionan parte de la información necesaria sobre
requisitos previos.
Para obtener más información sobre las funciones y usos de rutinas externas:
v Consulte el tema, Rutinas externas
Para obtener más información sobre las características de la API de SQL:
v Consulte el tema, SQL incorporado
Procedimiento:
Con el conocimiento de los requisitos previos, el diseño de rutinas de SQL
incorporado consiste principalmente en conocer las funciones y características
exclusivas de las rutinas C y C++:
v “Archivo de inclusión necesario para el desarrollo de rutinas C y C++
(sqludf.h)” en la página 318
v “Parámetros de rutinas C y C++” en la página 319
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Manejo de tipos de datos de SQL en rutinas C y C++” en la página 334
v “Variables gráficas del lenguaje principal en rutinas C y C++” en la página 356
v “Devolución de conjuntos de resultados desde procedimientos C y C++” en la
página 358
v “Decoración de tipos de C++” en la página 356
v “Restricciones de las rutinas externas” en la página 309
Después de conocer las características de C y C++, puede interesarle:
v “Creación de rutinas C y C++” en la página 360
Conceptos relacionados:
v “Implementación de las rutinas externas” en Desarrollo de SQL y rutinas externas
v “Introducción a SQL incorporado” en la página 3
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Manejo de tipos de datos de SQL en rutinas C y C++” en la página 334
v “Variables gráficas del lenguaje principal en rutinas C y C++” en la página 356
v “Devolución de conjuntos de resultados desde procedimientos C y C++” en la
página 358
v “Decoración de tipos de C++” en la página 356
v “Restricciones de las rutinas externas” en la página 309
v “Consideraciones sobre la precompilación y vinculación para rutinas de SQL
incorporado” en la página 360
v “Rutinas C y C++” en la página 314
Capítulo 5. Desarrollo de rutinas externas 317
![Page 326: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/326.jpg)
v “Archivo de inclusión necesario para el desarrollo de rutinas C y C++
(sqludf.h)” en la página 318
v “Parámetros de rutinas C y C++” en la página 319
Tareas relacionadas:
v “Creación de rutinas C y C++” en la página 360
Archivo de inclusión necesario para el desarrollo de rutinas C y
C++ (sqludf.h)
El archivo de inclusión sqludf.h contiene estructuras, definiciones y valores que
son de utilidad al escribir las rutinas. Aunque el nombre de este archivo incluye
’udf’, (por razones históricas) también sirve para los procedimientos almacenados y
los métodos. Cuando se compile una rutina, se tendrá que hacer referencia al
directorio que contiene este archivo. Este directorio es sqllib/include.
El archivo de inclusión sqludf.h se autodescribe. A continuación puede ver un
breve resumen de su contenido:
1. Definiciones de estructuras para argumentos que están representados por
estructuras en C ó C++:
v Argumentos y resultado VARCHAR FOR BIT DATA
v Argumentos y resultado LONG VARCHAR (con o sin FOR BIT DATA)
v Argumentos y resultado LONG VARGRAPHIC
v Argumentos y resultado SQL de todos los tipos de LOB
v El área reutilizable
v La estructura dbinfo2. Las definiciones del tipo de lenguaje C para todos los tipos de datos SQL, para
utilizarlos en la definición de argumentos de rutinas correspondientes a
argumentos y resultado de SQL que tienen los tipos de datos. Se trata de las
definiciones que tienen por nombre SQLUDF_x y SQLUDF_x_FBD, donde x es
un nombre de tipo de datos de SQL y FBD representa FOR BIT DATA.
También se incluye un tipo de lenguaje C para un argumento o resultado
definido con la cláusula AS LOCATOR. Esto sólo es aplicable a las UDF y los
métodos.
3. Definición de tipos de lenguaje C para argumentos del área-reutilizable y del
tipo-llamada, con una definición de tipo enum del argumento tipo-llamada.
4. Macros para definir los argumentos estándar de cola, tanto con como sin la
inclusión de argumentos de área-reutilizable y tipo-llamada. Esto corresponde a la
presencia y ausencia de las palabras clave SCRATCHPAD y FINAL CALL en la
definición de la función. Son los argumentos de invocación de UDF estado-SQL,
nombre-función, nombre-específico, mensaje-diagnóstico, área-reutilizable y
tipo-llamada. También se incluyen las definiciones para hacer referencia a estas
construcciones y los diversos valores de SQLSTATE válidos.
5. Macros para comprobar si los argumentos de SQL son nulos.
Existe un archivo de inclusión correspondiente para COBOL: sqludf.cbl. Este
archivo sólo incluye definiciones para las estructuras de área reutilizable y dbinfo.
Conceptos relacionados:
v “Manejo de tipos de datos de SQL en rutinas C y C++” en la página 334
Tareas relacionadas:
v “Diseño de rutinas C y C++” en la página 316
318 Desarrollo de aplicaciones de SQL incorporado
![Page 327: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/327.jpg)
Información relacionada:
v “Paso de argumentos a rutinas C, C++, OLE o COBOL” en la página 342
v “Tipos de datos de SQL soportados en rutinas C y C++” en la página 331
Parámetros de rutinas C y C++
Parámetros de rutinas C y C++: La declaración de parámetros de las rutinas C y
C++ debe cumplir con los requisitos de uno de los estilos de parámetros y del tipo
de programa que se soportan. Si la rutina ha de emplear un área reutilizable o la
estructura dbinfo o ha de tener la interfaz de parámetros PROGRAM TYPE MAIN,
existen detalles adicionales a considerar, incluidos:
v Estilos de parámetros para rutinas C y C++
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Indicadores nulos de parámetros en rutinas C y C++” en la página 320
v “Paso de parámetros por valor o por referencia en rutinas C y C++” en la página
326
v “No se necesitan parámetros para conjuntos de resultados de procedimientos C
y C++” en la página 326
v Estructura dbinfo como parámetro de rutina C o C++
v “Área reutilizable como parámetro de función C o C++” en la página 329
v Tipo de programa MAIN soportado para procedimientos C y C++
Es muy importante implementar la interfaz de parámetros para rutinas C y C++
correctamente. Esto puede realizarse fácilmente teniendo cuidado para asegurarse
de que se eligen e implementan el estilo de parámetros y los tipos de datos
correctos de acuerdo con la especificación.
Conceptos relacionados:
v “Soporte para el tipo de datos XML en las rutinas externas” en la página 308
Tareas relacionadas:
v “Diseño de rutinas C y C++” en la página 316
Estilos de parámetros soportados para rutinas C y C++: Los siguientes estilos de
parámetros reciben soporte para rutinas C y C++:
v SQL (soportado para procedimientos y funciones; recomendado)
v GENERAL (Soportado para procedimientos)
v GENERAL WITH NULLS (Soportado para procedimientos)
Se recomienda utilizar el estilo de parámetros SQL para todas las rutinas C y C++.
Este estilo de parámetros da soporte a valores NULL, proporciona una interfaz
estándar para errores de informe, así como áreas reutilizables de soporte y tipos de
llamadas.
Para especificar el estilo de parámetros que se van a utilizar para una rutina, debe
especificar la cláusula PARAMETER STYLE de la sentencia CREATE para dicha
rutina en el momento de creación de la rutina.
El estilo de parámetros se debe reflejar adecuadamente en la implementación del
código de la rutina C o C++.
Capítulo 5. Desarrollo de rutinas externas 319
![Page 328: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/328.jpg)
Para obtener más información sobre estos estilos de parámetros, consulte: ″Sintaxis
para pasar parámetros a rutinas C y C++″.
Conceptos relacionados:
v “Estructura dbinfo como parámetros de rutinas C o C++” en la página 327
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Parámetros de rutinas C y C++” en la página 319
v “Paso de parámetros por valor o por referencia en rutinas C y C++” en la página
326
Información relacionada:
v “Paso de argumentos a rutinas C, C++, OLE o COBOL” en la página 342
Indicadores nulos de parámetros en rutinas C y C++: Si el estilo de parámetros
elegido para una rutina C o C++ (procedimiento o función) necesita que se
especifique un parámetro de indicador nulo para cada uno de los parámetros SQL,
como en el caso del estilo de parámetros SQL, los indicadores nulos se tienen que
pasar como parámetros del tipo de datos SQLUDF_NULLIND. Para el estilo de
parámetros GENERAL WITH NULLS, se deben pasar como una matriz de tipo
SQUDF_NULLIND. Este tipo de datos se define en el archivo de inclusión de una
rutina y aplicación de SQL incorporado: sqludf.h.
Los parámetros de indicadores nulos indican si el valor del parámetro
correspondiente es equivalente a NULL en SQL o si tiene un valor literal. Si el
valor del indicador nulo para un parámetro es 0, significa que el valor del
parámetro no es nulo. Si el valor del indicador nulo de un parámetro es -1, se
considera que el parámetro tiene un valor equivalente al valor de SQL NULL.
Cuando se utilizan indicadores nulos, es importante incluir código dentro de la
rutina que:
v Compruebe los valores de los indicadores nulos para ver los parámetros de
entrada antes de utilizarlos.
v Establezca valores de indicadores nulos para parámetros de salida antes de que
la rutina devuelva un valor.
Para obtener más información sobre parámetros de SQL, consulte:
v “Estilos de parámetros de rutinas externas” en la página 298
Conceptos relacionados:
v “Estilos de parámetros soportados para rutinas C y C++” en la página 319
v “No se necesitan parámetros para conjuntos de resultados de procedimientos C
y C++” en la página 326
v “Parámetros de rutinas C y C++” en la página 319
v “Paso de parámetros por valor o por referencia en rutinas C y C++” en la página
326
v “Soporte para el tipo de datos XML en las rutinas externas” en la página 308
Estilo de parámetros SQL en procedimientos C y C++: Los procedimientos C y
C++ se deben crear utilizando la cláusula PARAMETER STYLE SQL en la sentencia
CREATE PROCEDURE. Los convenios de paso de parámetros de este estilo de
parámetros se deben implementar en la implantación del código del procedimiento
correspondiente.
320 Desarrollo de aplicaciones de SQL incorporado
![Page 329: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/329.jpg)
La implementación de la signatura SQL PARAMETER STYLE de C y C++
necesaria para procedimientos sigue este formato:
SQL_API_RC SQL_API_FN nombre-función ( argumentos-SQL,
SQL-argument-inds,
sqlstate,
nombre-rutina,
nombre-específico,
mensaje-diagnóstico )
SQL_API_RC SQL_API_FN
SQL_API_RC y SQL_API_FN son macros que especifican el tipo de retorno y el
convenio de llamada para un procedimiento C o C++, los cuales pueden
ser distintos según los sistemas operativos soportados. El uso de estas
macros es obligatorio para rutinas C y C++. Las macros se declaran en el
archivo de inclusión de rutinas y aplicaciones de SQL incorporado
sqlsystm.h.
nombre-función
Nombre de la función C o C++ dentro del archivo del código. No es
necesario que este valor coincida con el nombre del procedimiento
especificado dentro de la sentencia CREATE PROCEDURE
correspondiente. Sin embargo, se debe especificar este valor, en
combinación con el nombre de la biblioteca, en la cláusula EXTERNAL
NAME para identificar el punto de entrada de función correcto dentro de
la biblioteca que se va a utilizar. En las rutinas C++, el compilador C++
aplica la decoración de tipos al nombre de punto de entrada. Hay que
especificar el nombre decorado con tipos en la cláusula EXTERNAL NAME
o bien se debe definir el punto de entrada como extern "C" en el código
del usuario. Debe exportar el nombre de la función de forma explícita.
argumentos-SQL
Los argumentos de C o C++ correspondientes al conjunto de parámetros
SQL especificados en la sentencia CREATE PROCEDURE. Los parámetros
de modalidad IN, OUT e INOUT se pasan mediante valores de puntero
individuales.
ind-argumentos-SQL
Indicadores de nulo C o C++ que corresponden al conjunto de parámetros
de SQL especificados en la sentencia CREATE PROCEDURE. Para cada
parámetro de modalidad IN, OUT e INOUT, debe existir un parámetro del
indicador de nulo asociado. Los indicadores de nulo se pueden pasar como
argumentos individuales de tipo SQLUDF_NULLIND, o como parte de
una sola matriz de indicadores de nulo definida como
SQLUDF_NULLIND*.
sqlstate Valor del parámetro de entrada y salida utilizado por la rutina para señalar
condiciones de aviso o error. Normalmente, este argumento se utiliza para
asignar un valor de SQLSTATE definido por el usuario correspondiente a
un error o aviso, que puede devolverse al llamador. Los valores SQLSTATE
con formato 38xxx, donde xxx representa cualquier valor numérico, están
disponibles para valores de error SQLSTATE definidos por el usuario. Los
valores con formato 01Hxx, donde xx representa cualquier valor numérico,
están disponibles para valores de avisos SQLSTATE definidos por el
usuario.
nombre-rutina
Valor del parámetro de entrada que contiene el nombre calificado de la
rutina. Este valor lo genera DB2 y lo pasa a la rutina en el formato
<nombre-esquema>.<nombre-rutina> donde <nombre-esquema> y
<nombre-rutina> corresponden respectivamente al valor de la columna
Capítulo 5. Desarrollo de rutinas externas 321
![Page 330: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/330.jpg)
ROUTINESCHEMA y al valor de la columna ROUTINENAME
correspondientes a la rutina dentro de la vista de catálogo
SYSCAT.ROUTINES. Este valor puede resultar útil si múltiples definiciones
de rutina diferentes utilizan una única implementación de rutina. Cuando
el nombre de la definición de la rutina se ha pasado a la rutina, se podrá
ejecutar condicionalmente la lógica, dependiendo de qué definición se haya
utilizado. El nombre de la rutina puede ser útil cuando se formule la
información de diagnósticos, incluidos los mensajes de error, o cuando se
escriba en un archivo de anotaciones cronológicas.
nombre-específico
Valor del parámetro de entrada que contiene el nombre exclusivo
específico de la rutina. Este valor lo genera DB2 y lo pasa a la rutina. Este
valor se corresponde con el valor de la columna SPECIFICNAME
correspondiente a la rutina en la vista SYSCAT.ROUTINES. Puede resultar
tan útil como el nombre-rutina.
mensaje-diagnóstico
Valor del parámetro de salida opcionalmente utilizado por la rutina para
devolver el texto del mensaje a la aplicación o rutina que lo ha invocado.
Este parámetro está diseñado para ser utilizado como un complemento
para el argumento SQLSTATE. Se puede utilizar para asignar un mensaje
de error definido por el usuario que acompañe a un valor SQLSTATE
definido por el usuario, lo cual puede proporcionar información más
detallada sobre errores o avisos de diagnóstico al llamador de la rutina.
Nota: Para simplificar la escritura de signaturas de procedimientos C y C++,
puede utilizarse la definición de macro SQLUDF_TRAIL_ARGS definida en
sqludf.h, en lugar de utilizar argumentos individuales, en la signatura del
procedimiento para implementar los argumentos de tipos de datos que no
son SQL.
A continuación se muestra un ejemplo de una implementación de un
procedimiento C o C++ que acepta un solo parámetro de entrada y devuelve un
solo parámetro de salida y un conjunto de resultados:
/****************************************************************
Rutina: cstp
Objetivo: Devuelve un valor de parámetro de salida basado en un valor
de parámetro de entrada
Muestra cómo:
- definir un procedimiento utilizando PARAMETER STYLE SQL
- definir indicadores NULL para el parámetro
- ejecutar una sentencia de SQL
- definir un indicador NULL cuando el parámetro no es nulo
Parámetros:
IN: inParm
OUT: outParm
Cuando se define PARAMETER STYLE SQL para la rutina
(consulte el script de registro de rutina spcreate.db2),
además de los parámetros pasados durante la invocación,
los argumentos siguientes se pasan a la rutina en el
orden siguiente:
- un indicador de nulo para cada parámetro IN/INOUT/OUT,
ordenados de forma que coincidan con el orden de las
declaraciones de parámetros
322 Desarrollo de aplicaciones de SQL incorporado
![Page 331: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/331.jpg)
- SQLSTATE que se debe devolver a DB2 (salida)
- nombre calificado de la rutina (entrada)
- nombre específico de la rutina (entrada)
- serie de diagnóstico de SQL para devolver un texto de
mensajes de error opcional a DB2 (salida)
Consulte más abajo las declaraciones de parámetros reales
para ver qué tipos de datos y tamaños se recomiendan.
SUGERENCIA DE CÓDIGO:
---------------------
En lugar de codificar los parámetros ’extra’:
sqlstate, nombre calificado de la rutina, nombre
específico de la rutina, mensaje de diagnóstico,
se puede utilizar un macro SQLUDF_TRAIL_ARGS.
Este macro se define en el archivo de inclusión sqludf.h de DB2
SUGERENCIA DE EJEMPLO:
----------------------
El siguiente ejemplo es equivalente al prototipo real
usado, que utiliza definiciones de macro incluidas
en sqludf.h. El formato implementado en realidad es
más simple y elimina las cuestiones sobre tipos de datos.
extern "C" SQL_API_RC SQL_API_FN OutLanguage(
sqlint16 *inParm,
double *outParm,
sqlint16 *inParmNullInd,
sqlint16 *outParmNullInd,
char sqlst[6],
char qualName[28],
char specName[19],
char diagMsg[71])
)
*****************************************************************/
extern "C" SQL_API_RC SQL_API_FN cstp ( sqlint16 *inParm,
double *outParm,
SQLUDF_NULLIND *inParmNullInd,
SQLUDF_NULLIND *outParmNullInd,
SQLUDF_TRAIL_ARGS )
{
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
sqlint16 sql_inParm;
EXEC SQL END DECLARE SECTION;
sql_inParm = *inParm;
EXEC SQL DECLARE cur1 CURSOR FOR
SELECT value
FROM table01
WHERE index = :sql_inParm;
*outParm = (*inParm) + 1;
*outParmNullInd = 0;
EXEC SQL OPEN cur1;
return (0);
}
La sentencia CREATE PROCEDURE que corresponde a este procedimiento es la
siguiente:
Capítulo 5. Desarrollo de rutinas externas 323
![Page 332: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/332.jpg)
CREATE PROCEDURE cproc( IN inParm INT, OUT outParm INT )
LANGUAGE c
PARAMETER STYLE sql
DYNAMIC RESULT SETS 1
FENCED
THREADSAFE
RETURNS NULL ON NULL INPUT
EXTERNAL NAME ’c_rtns!cstp’
La sentencia anterior supone que la implementación del procedimiento C o C++
está en un archivo de biblioteca denominado c_rtns y en una función denominada
cstp.
Estilo de parámetros SQL en funciones C y C++: Las funciones definidas por el
usuario C y C++ se deben crear utilizando la cláusula PARAMETER STYLE SQL
en la sentencia CREATE FUNCTION. Los convenios de paso de parámetros de este
estilo de parámetros se deben implementar en la implantación del código fuente
correspondiente. La implementación de la signatura SQL PARAMETER STYLE de
C y C++ necesaria para funciones definidas por el usuario sigue este formato:
SQL_API_RC SQL_API_FN nombre-función ( argumentos-SQL,
SQL-argument-inds,
SQLUDF_TRAIL_ARGS )
SQL_API_RC SQL_API_FN
SQL_API_RC y SQL_API_FN son macros que especifican el tipo de retorno y el
convenio de llamada para una función definida por el usuario C o C++, los
cuales pueden ser distintos según los sistemas operativos soportados. El
uso de estas macros es obligatorio para rutinas C y C++. Las macros se
declaran en el archivo de inclusión de rutinas y aplicaciones de SQL
incorporado sqlsystm.h.
nombre-función
Nombre de la función C o C++ dentro del archivo del código. No es
necesario que este valor coincida con el nombre de la función especificado
dentro de la sentencia CREATE FUNCTION correspondiente. Sin embargo,
se debe especificar este valor, en combinación con el nombre de la
biblioteca, en la cláusula EXTERNAL NAME para identificar el punto de
entrada de función correcto dentro de la biblioteca que se va a utilizar. En
las rutinas C++, el compilador C++ aplica la decoración de tipos al nombre
de punto de entrada. Se tiene que especificar el nombre decorado del tipo
en la cláusula EXTERNAL NAME o la declaración de la función dentro del
archivo del código fuente se tiene que preceder de extern "C", tal como se
muestra en el siguiente ejemplo: extern ″C″ SQL_API_RC SQL_API_FN
OutLanguage( char *, sqlint16 *, char *, char *, char *, char *);
argumentos-SQL
Los argumentos de C o C++ correspondientes al conjunto de parámetros
SQL especificados en la sentencia CREATE FUNCTION.
ind-argumentos-SQL
Para cada argumento-SQL, se necesita un parámetro de indicador nulo
para especificar si el valor del parámetro se tiene que interpretar dentro de
la implementación de la rutina como un valor NULL en SQL. Los
indicadores nulos se deben especificar con el tipo de datos
SQLUDF_NULLIND. Este tipo de datos se define en el archivo de
inclusión de rutinas de SQL incorporado sqludf.h.
SQLUDF_TRAIL_ARGS
Una macro definida en el archivo de inclusión de rutinas de SQL
324 Desarrollo de aplicaciones de SQL incorporado
![Page 333: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/333.jpg)
incorporado sqludf.h que, una vez ampliada, define los argumentos
finales adicionales necesarios para obtener una signatura completa SQL de
estilo de parámetros. Se pueden utilizar dos macros:
SQLUDF_TRAIL_ARGS y SQLUDF_TRAIL_ARGS_ALL.
SQLUDF_TRAIL_ARGS, una vez ampliada, tal como está definida en
sqludf.h, equivale a la adición de los siguientes argumentos de rutina:
SQLUDF_CHAR *sqlState,
SQLUDF_CHAR qualName,
SQLUDF_CHAR specName,
SQLUDF_CHAR *sqlMessageText,
En general estos argumentos no son necesarios ni se suelen utilizar como
parte de la lógica de función definida por el usuario. Representan el valor
de SQLSTATE de salida que se tiene que pasar al que ha invocado la
función, el nombre de función calificado al completo de entrada, el nombre
específico de la función de entrada y el texto del mensaje de salida que se
tiene que devolver con SQLSTATE. SQLUDF_TRAIL_ARGS, una vez
ampliada, tal como está definida en sqludf.h, equivale a la adición de los
siguientes argumentos de rutina:
SQLUDF_CHAR qualName,
SQLUDF_CHAR specName,
SQLUDF_CHAR sqlMessageText,
SQLUDF_SCRAT *scratchpad
SQLUDF_CALLT *callType
Si la sentencia UDF CREATE incluye la cláusula SCRATCHPAD o la
cláusula FINAL CALL, se debe utilizar la macro SQLUDF_TAIL_ARGS_ALL.
Además de los argumentos proporcionados con SQLUDF_TRAIL_ARGS, esta
macro también contiene punteros a una estructura de área reutilizable y a
un valor de tipo de llamada.
A continuación se muestra un ejemplo de una UDF C o C++ que devuelve en un
parámetro de salida el valor del producto de sus dos valores de parámetros de
entrada:
SQL_API_RC SQL_API_FN product ( SQLUDF_DOUBLE *in1,
SQLUDF_DOUBLE *in2,
SQLUDF_DOUBLE *outProduct,
SQLUDF_NULLIND *in1NullInd,
SQLUDF_NULLIND *in2NullInd,
SQLUDF_NULLIND *productNullInd,
SQLUDF_TRAIL_ARGS )
{
/* comprobar que los valores de los parámetros de entrada no sean nulos
comprobando los valores de indicadores nulos correspondientes
0 : indica que el valor del parámetro no es NULL
-1 : indica que el valor del parámetro es NULL
Si los valores no son NULL, calcular el producto.
Si los valores son NULL, devolver un valor de salida NULL. */
if ((*in1NullInd != -1) &&
*in2NullInd != -1))
{
*outProduct = (*in1) * (*in2);
*productNullInd = 0;
}
else
{
Capítulo 5. Desarrollo de rutinas externas 325
![Page 334: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/334.jpg)
*productNullInd = -1;
}
return (0);
}
La sentencia CREATE FUNCTION correspondiente que se puede utilizar para crear
esta UDF podría ser la siguiente:
CREATE FUNCTION product( in1 DOUBLE, in2 DOUBLE )
RETURNS DOUBLE
LANGUAGE C
PARAMETER STYLE SQL
NO SQL
FENCED THREADSAFE
DETERMINISTIC
RETURNS NULL ON NULL INPUT
NO EXTERNAL ACTION
EXTERNAL NAME ’c_rtns!product’
En la sentencia SQL anterior se da por supuesto que la función C o C++ está en un
archivo de biblioteca en el directorio de función denominado c_rtns.
Paso de parámetros por valor o por referencia en rutinas C y C++: Para rutinas
C y C++, los valores de los parámetros se deben pasar siempre por referencia a las
rutinas utilizando punteros. Ésto es necesario para parámetros sólo de entrada, de
entrada-salida y de salida. por referencia.
Los parámetros del indicador de nulo también se deben pasar por referencia a las
rutinas utilizando punteros.
Nota: DB2 controla la asignación de memoria para todos los parámetros y
mantiene las referencias de C o C++ a todos los parámetros pasados a una
rutina o salidos de ella. No es necesario asignar o liberar la memoria
asociada a parámetros de rutinas e indicadores de nulo.
No se necesitan parámetros para conjuntos de resultados de procedimientos C y
C++: No se necesita ningún parámetro en la signatura de la sentencia CREATE
PROCEDURE para un procedimiento o en la implementación de procedimiento
asociado para devolver un conjunto de resultados al llamador.
Los conjuntos de resultados devueltos de procedimientos C, se devuelven
utilizando cursores.
Si desea más información sobre la devolución de conjuntos de resultados desde
procedimientos LANGUAGE C, consulte:
v “Devolución de conjuntos de resultados desde procedimientos C y C++” en la
página 358
Conceptos relacionados:
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Indicadores nulos de parámetros en rutinas C y C++” en la página 320
v “Estilos de parámetros soportados para rutinas C y C++” en la página 319
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Parámetros de rutinas C y C++” en la página 319
Tareas relacionadas:
326 Desarrollo de aplicaciones de SQL incorporado
![Page 335: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/335.jpg)
v “Devolución de conjuntos de resultados procedentes de procedimientos .NET de
CLR” en Desarrollo de SQL y rutinas externas
Estructura dbinfo como parámetros de rutinas C o C++: La estructura dbinfo es
una estructura que contiene información sobre bases de datos y rutinas, que puede
pasarse a la implementación de la rutina, y recibirse de ésta, como un argumento
extra, sólo si la cláusula DBINFO está incluida en la sentencia CREATE para dicha
rutina.
La estructura dbinfo recibe soporte en rutinas LANGUAGE C a través del uso de
la estructura sqludf_dbinfo. Esta estructura C está definida en el archivo de
inclusión de DB2 sqludf.h situado en el directorio sqllib\include.
La estructura sqludf_dbinfo se define del modo siguiente:
SQL_STRUCTURE sqludf_dbinfo
{
unsigned short dbnamelen; /* Longitud del nombre de base datos */
unsigned char dbname[SQLUDF_MAX_IDENT_LEN]; /* Nombre de la base de datos */
unsigned short authidlen; /* Longitud del ID de autorización */
unsigned char authid[SQLUDF_MAX_IDENT_LEN]; /* ID de autorización */
union db_cdpg codepg; /* Página de códigos de base datos */
unsigned short tbschemalen; /* Long. del nombre esquema de tabla */
unsigned char tbschema[SQLUDF_MAX_IDENT_LEN]; /* Nombre del esquema de tabla */
unsigned short tbnamelen; /* Longitud del nombre de la tabla */
unsigned char tbname[SQLUDF_MAX_IDENT_LEN]; /* Nombre de la tabla */
unsigned short colnamelen; /* Longitud del nombre de columna */
unsigned char colname[SQLUDF_MAX_IDENT_LEN]; /* Nombre de columna */
unsigned char ver_rel[SQLUDF_SH_IDENT_LEN]; /* Versión/release de base de datos */
unsigned char resd0[2]; /* Alineación */
sqluint32 platform; /* Plataforma */
unsigned short numtfcol; /* # de entradas de la matriz de */
/* la lista de columnas TF */
unsigned char resd1[2]; /* Reservado */
sqluint32 procid; /* ID de procedimiento actual */
unsigned char resd2[32]; /* Reservado */
unsigned short *tfcolumn; /* Se debe asignar la Tfcolumn */
/* dinámicamente si se define */
/* una función de tabla; */
/* si no, un puntero a Null */
char *appl_id; /* Identificador de la aplicación */
sqluint32 dbpartitionnum; /* Número de partición de la base de */
/* datos donde se ejecutó la rutina */
unsigned char resd3[16]; /* Reservado */
};
Aunque no todos los campos de la estructura dbinfo puedan ser útiles durante de
una rutina, varios de los valores en los campos de esta estructura serán de utilidad
al formular la información sobre los mensajes de errores de diagnóstico. Por
ejemplo, si ocurre un error dentro de una rutina, puede que resulte útil devolver el
nombre de la base de datos, la longitud del nombre de la base de datos, la página
de códigos de la base de datos, el ID de la autorización actual y la longitud del ID
de la autorización actual.
Para hacer referencia a la estructura sqludf_dbinfo en una implementación de la
rutina LANGUAGE C:
v Añada la cláusula DBINFO a la sentencia CREATE que define la rutina.
v Incluya el archivo de cabecera sqludf.h al principio del archivo que contenga la
implementación de la rutina.
v Añada un parámetro de tipo sqludf_dbinfo a la signatura de la rutina en la
posición especificada por el estilo de parámetros utilizado.
Capítulo 5. Desarrollo de rutinas externas 327
![Page 336: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/336.jpg)
A continuación figura un ejemplo de un procedimiento C con PARAMETER STYLE
GENERAL que muestra el uso de la estructura dbinfo. A continuación se
proporciona la sentencia CREATE PROCEDURE para el procedimiento. Observe
que según se especifica en la cláusula EXTERNAL NAME, la implementación del
procedimiento está situada en un archivo de biblioteca denominado spserver que
contiene una función C denominada DbinfoExample:
CREATE PROCEDURE DBINFO_EXAMPLE (IN job CHAR(8),
OUT salary DOUBLE,
OUT dbname CHAR(128),
OUT dbversion CHAR(8),
OUT errorcode INTEGER)
DYNAMIC RESULT SETS 0
LANGUAGE C
PARAMETER STYLE GENERAL
DBINFO
FENCED NOT THREADSAFE
READS SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME ’spserver!DbinfoExample’@
A continuación figura la implementación del procedimiento C correspondiente a la
definición del procedimiento:
/***************************************************************
Rutina: DbinfoExample
IN: inJob - un tipo de trabajo, utilizado en un predicado
SELECT
OUT: salary - salario medio de los empleados con trabajo
job injob
dbname - nombre de base de datos recuperada de DBINFO
dbversion - versión de base de datos recuperada de DBINFO
outSqlError - sqlcode de error emitido (si los hay)
sqludf_dbinfo - puntero a la estructura DBINFO
Objetivo: La rutina toma un tipo de trabajo y devuelve el
salario medio de todos los empleados con ese trabajo,
así como información sobre la base de datos (nombre,
versión de base de datos). La información de la base
de datos se recupera desde el objeto de dbinfo.
Muestra cómo:
- definir parámetros IN/OUT en PARAMETER STYLE GENERAL
- declarar un puntero de parámetro a la estructura dbinfo
- recuperar valores de la estructura dbinfo
*****************************************************************/
SQL_API_RC SQL_API_FN DbinfoExample(char inJob[9],
double *salary,
char dbname[129],
char dbversion[9],
sqlint32 *outSqlError,
struct sqludf_dbinfo * dbinfo
)
{
/* Declare una SQLCA local */
struct sqlca sqlca;
EXEC SQL WHENEVER SQLERROR GOTO return_error;
/* Sección de declaración de las variables de lenguaje principal de SQL */
/* Cada nombre de variable del lenguaje principal debe ser exclusivo dentro
de un archivo de código, si no el precompilador emitirá el error SQL0307 */
EXEC SQL BEGIN DECLARE SECTION;
char dbinfo_injob[9];
double dbinfo_outsalary;
sqlint16 dbinfo_outsalaryind;
328 Desarrollo de aplicaciones de SQL incorporado
![Page 337: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/337.jpg)
EXEC SQL END DECLARE SECTION;
/* Inicializar parámetros de salida - establecer series en NULL */
memset(dbname, ’\0’, 129);
memset(dbversion, ’\0’, 9);
*outSqlError = 0;
/* Copie parámetro de entrada en la variable del lenguaje local */
strcpy(dbinfo_injob, inJob);
EXEC SQL SELECT AVG(salary) INTO:dbinfo_outsalary
FROM employee
WHERE job =:dbinfo_injob;
*salary = dbinfo_outsalary;
/* Copie los valores de la estructura DBINFO en los parámetros de salida.
Las series deben terminar de forma explícita en nulo.
La información, como por ejemplo, el nombre de la base de datos y la
versión del producto de la base de datos, puede encontrarse en la
estructura DBINFO, así como otros campos de información. */
strncpy(dbname, (char *)(dbinfo->dbname), dbinfo->dbnamelen);
dbname[dbinfo->dbnamelen] = ’\0’;
strncpy(dbversion, (char *)(dbinfo->ver_rel), 8);
dbversion[8] = ’\0’;
return 0;
/* Copie el SQLCODE en el parámetro OUT si se produce un error SQL */
return_error:
{
*outSqlError = SQLCODE;
EXEC SQL WHENEVER SQLERROR CONTINUE;
return 0;
}
} /* DbinfoExample function */
Área reutilizable como parámetro de función C o C++: La estructura del área
reutilizable, utilizada para almacenar valores de UDF entre invocaciones para cada
valor de entrada de UDF, recibe soporte en rutinas C y C++ mediante el uso de la
estructura sqludf_scrat. Esta estructura C está definida en el archivo de inclusión
de DB2 sqludf.h.
Para hacer referencia a la estructura sqludf_scrat, incluya el archivo de cabecera
sqludf.h al principio del archivo que contiene la implementación de la función C o
C++ y utilice la macro SQLUDF_TRAIL_ARGS_ALL dentro de la signatura de la
implementación de la rutina.
En el siguiente ejemplo se hace una demostración de la implementación de una
función escalar C que incluye un parámetro de tipo SQLUDF_TRAIL_ARGS_ALL:
#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN ScratchpadScUDF(SQLUDF_INTEGER *outCounter,
SQLUDF_SMALLINT *counterNullInd,
SQLUDF_TRAIL_ARGS_ALL)
{
struct scalar_scratchpad_data *pScratData;
/* SQLUDF_CALLT y SQLUDF_SCRAT son */
/* partes de SQLUDF_TRAIL_ARGS_ALL */
Capítulo 5. Desarrollo de rutinas externas 329
![Page 338: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/338.jpg)
pScratData = (struct scalar_scratchpad_data *)SQLUDF_SCRAT->data;
switch (SQLUDF_CALLT)
{
case SQLUDF_FIRST_CALL:
pScratData->counter = 1;
break;
case SQLUDF_NORMAL_CALL:
pScratData->counter = pScratData->counter + 1;
break;
case SQLUDF_FINAL_CALL:
break;
}
*outCounter = pScratData->counter;
*counterNullInd = 0;
} /* ScratchpadScUDF */
La macro SQLUDF_TRAIL_ARGS_ALL se expande para definir otros valores de
parámetros, incluido uno que se llama SQLUDF_SCRAT y define un parámetro de
memoria intermedia que se debe usar a modo de área reutilizable. Cuando se
invoca la función escalar para un conjunto de valores, cada vez que se invoca la
función escalar, la memoria intermedia se pasa como parámetro a la función. La
memoria intermedia puede servir para acceder a ella
El valor de la macro SQLUDF_TRAIL_ARGS_ALL también define otro parámetro,
SQLUDF_CALLT. Este parámetro sirve para indicar un valor de tipo de llamada.
Los valores de tipo de llamada pueden servir para identificar si una función se
invoca por primera vez para un conjunto de valores, por última vez o en un
momento intermedio del proceso.
Soporte de MAIN de tipo de programa para procedimientos C y C++: Aunque
generalmente se recomienda el valor por omisión SUB de la cláusula PROGRAM
TYPE para procedimientos C, el valor MAIN de la cláusula PROGRAM TYPE
recibe soporte en sentencias CREATE PROCEDURE, donde el valor de la cláusula
LANGUAGE es C.
El valor MAIN de la cláusula PROGRAM TYPE es necesario para rutinas con más
de noventa parámetros.
Cuando se especifica la cláusula PROGRAM TYPE MAIN, los procedimientos
deben implementarse utilizando una signatura que sea coherente con el estilo por
omisión correspondiente a una rutina principal en una archivo de código de fuente
C. Esto no significa que la rutina tenga que implementarse utilizando una función
denominada main, sino que los parámetros tienen que pasarse en el formato que se
asocia generalmente a una implementación de aplicación de la rutina main con
tipo por omisión que utilice los argumentos de programación argc y argv típicos
de C.
A continuación figura un ejemplo de una signatura de rutinas C o C++ que cumple
la especificación PGRAM TYPE MAIN:
SQL_API_RC SQL_API_FN functionName(int argc, char **argv)
{
...
}
El número total de argumentos de la función se especifica mediante el valor de
argc. Los valores de los argumentos se pasan como elementos de matriz dentro de
330 Desarrollo de aplicaciones de SQL incorporado
![Page 339: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/339.jpg)
la matriz argv. El número y el orden de los argumentos depende del valor de la
cláusula PARAMETER STYLE especificada en la sentencia CREATE PROCEDURE.
Por ejemplo, supongamos que tenemos la siguiente sentencia CREATE
PROCEDURE para un procedimiento C que deba tener un estilo PROGRAM TYPE
MAIN y el PARAMETER STYLE SQL recomendado:
CREATE PROCEDURE MAIN_EXAMPLE (IN job CHAR(8),
OUT salary DOUBLE)
SPECIFIC CPP_MAIN_EXAMPLE
DYNAMIC RESULT SETS 0
NOT DETERMINISTIC
LANGUAGE C
PARAMETER STYLE SQL
NO DBINFO
FENCED NOT THREADSAFE
READS SQL DATA
PROGRAM TYPE MAIN
EXTERNAL NAME ’spserver!MainExample’@
La implementación de signatura de rutina correspondiente a esta sentencia
CREATE PROCEDURE es la siguiente:
//*****************************************************
// Procedimiento almacenado: MainExample
//
// Parámetros SQL:
// IN: argv[1] - job (char[8])
// OUT: argv[2] - salary (double)
//*****************************************************
SQL_API_RC SQL_API_FN MainExample(int argc, char **argv)
{
...
}
Puesto que se utiliza PARAMETER STYLE SQL, además de los valores de los
parámetros SQL que se pasan en el momento de la invocación del procedimiento,
también se pasan a la rutina los parámetros adicionales necesarios para este estilo.
Se puede acceder a los valores de parámetros haciendo referencia al elemento de la
matriz argv que interesa dentro del código fuente. Para el ejemplo anterior, los
elementos de matriz argc y argv contienen los siguientes valores:
argc : Número de elementos de la matriz argv
argv[0]: Nombre de la función
argv[1]: Valor de parámetro job (char[8], input)
argv[2]: Valor de parámetro salary (double, output)
argv[3]: indicador nulo para parámetro job
argv[4]: indicador nulo para parámetro salary
argv[5]: sqlstate (char[6], output)
argv[6]: qualName (char[28], output)
argv[7]: specName (char[19], output)
argv[8]: diagMsg (char[71], output)
Tipos de datos de SQL soportados en rutinas C y C++
La tabla siguiente lista las correlaciones soportadas entre los tipos de datos de SQL
y los tipos de datos de C para las rutinas. Junto a cada tipo de datos de C/C++, se
encuentra el tipo definido correspondiente de sqludf.h.
Capítulo 5. Desarrollo de rutinas externas 331
![Page 340: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/340.jpg)
Tabla 28. Tipos de datos de SQL correlacionados con declaraciones C/C++
Tipo de columna de SQL Tipo de datos de C/C++ Descripción del tipo de columna de SQL
SMALLINT sqlint16
SQLUDF_SMALLINT
Entero con signo de 16 bits
INTEGER sqlint32
SQLUDF_INTEGER
Entero con signo de 32 bits
BIGINT sqlint64
SQLUDF_BIGINT
Entero con signo de 64 bits
REAL
FLOAT(n) donde 1<=n<=24
float
SQLUDF_REAL
Coma flotante de precisión simple
DOUBLE
FLOAT
FLOAT(n) donde 25<=n<=53
double
SQLUDF_DOUBLE
Coma flotante de precisión doble
DECIMAL(p, s) No soportado. Para pasar un valor decimal, defina el parámetro
como tipo de datos convertible desde DECIMAL
(por ejemplo, CHAR o DOUBLE) y convierta
explícitamente el argumento a este tipo.
CHAR(n) char[n+1] donde n es suficientemente
grande como para que contenga los
datos
1<=n<=254
SQLUDF_CHAR
Serie de caracteres de longitud fija terminada en
nulo
CHAR(n) FOR BIT DATA char[n] donde n es suficientemente
grande para contener los datos
1<=n<=254
SQLUDF_CHAR
Serie de caracteres de longitud fija no terminada en
nulo
VARCHAR(n) char[n+1] donde n es suficientemente
grande para contener los datos
1<=n<=32 672
SQLUDF_VARCHAR
Serie de longitud variable terminada en nulo
VARCHAR(n) FOR BIT DATA struct {
sqluint16 length;
char[n]
}
1<=n<=32 672
SQLUDF_VARCHAR_FBD
Serie de caracteres de longitud variable no
terminada en nulo
LONG VARCHAR struct {
sqluint16 length;
char[n]
}
1<=n<=32 700
SQLUDF_LONG
Serie de caracteres de longitud variable no
terminada en nulo
CLOB(n) struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
SQLUDF_CLOB
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud de
serie de 4 bytes
332 Desarrollo de aplicaciones de SQL incorporado
![Page 341: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/341.jpg)
Tabla 28. Tipos de datos de SQL correlacionados con declaraciones C/C++ (continuación)
Tipo de columna de SQL Tipo de datos de C/C++ Descripción del tipo de columna de SQL
BLOB(n) struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
SQLUDF_BLOB
Serie binaria de longitud variable no terminada en
nulo con indicador de longitud de serie de 4 bytes
DATE char[11]
SQLUDF_DATE
Serie de caracteres terminada en nulo con el
formato siguiente:
aaaa-mm-dd
TIME char[9]
SQLUDF_TIME
Serie de caracteres terminada en nulo con el
formato siguiente:
hh.mm.ss
TIMESTAMP char[27]
SQLUDF_STAMP
Serie de caracteres terminada en nulo con el
formato siguiente:
aaaa-mm-dd-hh.mm.ss.nnnnnn
LOB LOCATOR sqluint32
SQLUDF_LOCATOR
Entero con signo de 32 bits
DATALINK struct {
sqluint32 version;
char linktype[4];
sqluint32 url_length;
sqluint32 comment_length;
char reserve2[8];
char url_plus_comment[230];
}
SQLUDF_DATALINK
GRAPHIC(n) sqldbchar[n+1] donde n es
suficientemente grande para contener
los datos
1<=n<=127
SQLUDF_GRAPH
Serie de caracteres de doble byte y longitud fija
terminada en nulo
VARGRAPHIC(n) sqldbchar[n+1] donde n es
suficientemente grande para contener
los datos
1<=n<=16 336
SQLUDF_GRAPH
Serie de caracteres de doble byte y longitud
variable terminada en nulo
LONG VARGRAPHIC struct {
sqluint16 length;
sqldbchar[n]
}
1<=n<=16 350
SQLUDF_LONGVARG
Serie de caracteres de doble byte y longitud
variable no terminada en nulo
DBCLOB(n) struct {
sqluint32 length;
sqldbchar data[n];
}
1<=n<=1 073 741 823
SQLUDF_DBCLOB
Serie de caracteres de longitud variable no
terminada en nulo con indicador de longitud de
serie de 4 bytes
Capítulo 5. Desarrollo de rutinas externas 333
![Page 342: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/342.jpg)
Tabla 28. Tipos de datos de SQL correlacionados con declaraciones C/C++ (continuación)
Tipo de columna de SQL Tipo de datos de C/C++ Descripción del tipo de columna de SQL
XML AS CLOB struct {
sqluint32 length;
char data[n];
}
1<=n<=2 147 483 647
SQLUDF_CLOB
Serie de caracteres serializados de longitud variable
no terminada en nulo con indicador de longitud de
serie de 4 bytes.
Nota: Los tipos de datos XML solo se pueden implementar como tipos de datos
CLOB en rutinas externas implementadas en C o C++.
Nota: Los tipos de datos siguientes sólo están disponibles en los entornos DBCS o
EUC si se compilan previamente con la opción WCHARTYPE
NOCONVERT:
v GRAPHIC(n)
v VARGRAPHIC(n)
v LONG VARGRAPHIC
v DBCLOB(n)
Conceptos relacionados:
v “Archivo de inclusión necesario para el desarrollo de rutinas C y C++
(sqludf.h)” en la página 318
v “Parámetros de rutinas C y C++” en la página 319
v “Manejo de tipos de datos de SQL en rutinas C y C++” en la página 334
Tareas relacionadas:
v “Diseño de rutinas C y C++” en la página 316
Manejo de tipos de datos de SQL en rutinas C y C++
En este apartado se identifican los tipos válidos para parámetros y resultados de
rutinas y se especifica cómo se debe definir el argumento correspondiente en la
rutina, en los lenguajes C o C++. Todos los argumentos de la rutina se deben pasar
como punteros al tipo de datos adecuado. Observe que, si utiliza el archivo de
inclusión sqludf.h y los tipos definidos en éste, puede generar automáticamente
estructuras y variables del lenguaje que sean correctas para los distintos tipos de
datos y compiladores. Por ejemplo, para BIGINT puede utilizar el tipo de datos
SQLUDF_BIGINT a fin de ocultar las diferencias en el tipo requerido para la
representación de BIGINT entre distintos compiladores.
El que gobierna el formato de los valores de argumento es el tipo de datos para
cada parámetro definido en la sentencia CREATE de la rutina. A fin de obtener el
valor en el formato adecuado, puede ser necesario realizar promociones a partir
del tipo de datos del argumento. DB2 lleva a cabo automáticamente estas
promociones sobre los valores de los argumentos. No obstante, si se especifican
tipos de datos incorrectos en el código de la rutina, se producirá un
comportamiento imprevisible, como, por ejemplo, pérdida de datos o
terminaciones anómalas.
Para el resultado de un método o de una función escalar, es el tipo de datos
especificado en la cláusula CAST FROM de la sentencia CREATE FUNCTION el
334 Desarrollo de aplicaciones de SQL incorporado
![Page 343: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/343.jpg)
que define el formato. Si no hay ninguna cláusula CAST FROM presente, define el
formato el tipo de datos especificado en la cláusula RETURNS.
En el ejemplo siguiente, la presencia de la cláusula CAST FROM significa que el
cuerpo de la rutina devuelve un SMALLINT y que DB2 convierte el valor a
INTEGER antes de pasarlo a la sentencia en que se produce la referencia a la
función:
... RETURNS INTEGER CAST FROM SMALLINT ...
En este caso, la rutina se debe escribir de forma que genere un SMALLINT, tal
como se define más adelante en este apartado. Tenga en cuenta que el tipo de
datos CAST FROM se debe poder convertir al tipo de datos de RETURNS, por lo
que no es posible elegir arbitrariamente otro tipo de datos.
A continuación se muestra una lista de los tipos de SQL y sus representaciones en
los lenguajes C/C++. Esta lista incluye información sobre si cada tipo es válido
como parámetro o como resultado. También se incluyen ejemplos de cómo pueden
aparecer los tipos como definición de argumentos en la rutina, en los lenguajes C o
C++:
v SMALLINT
Válidos. Se representan en C como SQLUDF_SMALLINT o sqlint16.
Ejemplo:
sqlint16 *arg1; /* ejemplo de SMALLINT */
Cuando defina parámetros enteros de una rutina, considere la posibilidad de
utilizar INTEGER en lugar de SMALLINT, ya que DB2 no promociona los
argumentos INTEGER a SMALLINT. Por ejemplo, suponga que define una UDF
del modo siguiente:
CREATE FUNCTION SIMPLE(SMALLINT)...
Si invoca la función SIMPLE utilizando datos INTEGER (... SIMPLE(1)...),
recibirá un error SQLCODE -440 (SQLSTATE 42884) indicando que no se ha
encontrado la función, y es posible que los usuarios finales de esta función no
perciban la razón del mensaje. En el ejemplo anterior, 1 es un INTEGER, por lo
que puede convertirlo a SMALLINT o puede definir el parámetro como
INTEGER.
v INTEGER o INT
Válidos. Se representan en C como SQLUDF_INTEGER o sqlint32. Debe ejecutar
#include sqludf.h o #include sqlsystm.h para tomar esta definición.
Ejemplo:
sqlint32 *arg2; /* ejemplo de INTEGER */
v BIGINT
Válidos. Se representan en C como SQLUDF_BIGINT o sqlint64.
Ejemplo:
sqlint64 *arg3; /* ejemplo de INTEGER */
DB2 define el tipo sqlint64 del lenguaje C para superar las diferencias entre
definiciones del entero con signo de 64 bits en compiladores y sistemas
operativos. Debe ejecutar #include sqludf.h o #include sqlsystm.h para tomar
la definición.
v REAL o FLOAT(n) donde 1 <= n <= 24
Válidos. Se representan en C como SQLUDF_REAL o float.
Ejemplo:
Capítulo 5. Desarrollo de rutinas externas 335
![Page 344: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/344.jpg)
float *result; /* ejemplo de REAL */
v DOUBLE o DOUBLE PRECISION o FLOAT o FLOAT(n) donde 25 <= n <= 53
Válidos. Se representan en C como SQLUDF_DOUBLE o double.
Ejemplo:
double *result; /* ejemplo de DOUBLE */
v DECIMAL(p,s) o NUMERIC(p,s)
No válidos, puesto que no existe ninguna representación en lenguaje C. Si desea
pasar un valor decimal, debe definir el parámetro como de tipo de datos
DECIMAL que se puede convertir (por ejemplo, CHAR o DOUBLE) y convertir
explícitamente el argumento a este tipo. En el caso de DOUBLE, no es necesario
que convierta explícitamente un argumento decimal a un parámetro DOUBLE,
ya que DB2 lo promociona automáticamente.
Ejemplo:
Suponga que tiene dos columnas, WAGE como DECIMAL(5,2) y HOURS como
DECIMAL(4,1), y que desea escribir una UDF para calcular el pago semanal en
base al salario, el número de horas trabajadas y algunos otros factores. La UDF
podría ser como la siguiente:
CREATE FUNCTION WEEKLY_PAY (DOUBLE, DOUBLE, ...)
RETURNS DECIMAL(7,2) CAST FROM DOUBLE
...;
Para la UDF anterior, los dos primeros parámetros corresponden al salario y al
número de horas. Invoque a la UDF WEEKLY_PAY en la sentencia de selección
de SQL, del modo siguiente:
SELECT WEEKLY_PAY (WAGE, HOURS, ...) ...;
Observe que no se requiere ninguna conversión explícita porque los argumentos
DECIMAL se pueden convertir a DOUBLE.
Alternativamente, puede definir WEEKLY_PAY con argumentos CHAR, del
modo siguiente:
CREATE FUNCTION WEEKLY_PAY (VARCHAR(6), VARCHAR(5), ...)
RETURNS DECIMAL (7,2) CAST FROM VARCHAR(10)
...;
La puede invocar así:
SELECT WEEKLY_PAY (CHAR(WAGE), CHAR(HOURS), ...) ...;
Observe que se requiere una conversión explícita porque los argumentos
DECIMAL no se pueden promocionar a VARCHAR.
Una ventaja de utilizar parámetros de coma flotante es que resulta fácil realizar
operaciones aritméticas sobre los valores de la rutina; una ventaja de utilizar
parámetros de tipo carácter es que siempre es posible representar exactamente el
valor decimal. Esto no es siempre posible con la coma flotante.
v CHAR(n) o CHARACTER(n) con o sin el modificador FOR BIT DATA.
Válidos. Se representan en C como SQLUDF_CHAR o char...[n+1] (ésta es una
serie C terminada en nulo).
Ejemplo:
char arg1[14]; /* ejemplo de CHAR(13) */
char *arg1; /* también se puede aceptar */
Los parámetros de la rutina de entrada del tipo de datos CHAR siempre
terminan automáticamente en nulo. Para un parámetro de entrada CHAR(n),
donde n es la longitud del tipo de datos CHAR, n bytes de datos se mueven al
almacenamiento intermedio en la implementación de la rutina y el carácter
situado en la posición n + 1 se establece en el carácter de terminador nulo ASCII
(X'00').
336 Desarrollo de aplicaciones de SQL incorporado
![Page 345: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/345.jpg)
La rutina debe terminar en nulo de forma explícita los parámetros de salida de
los procedimientos y los valores de retorno de las funciones del tipo de datos
CHAR. para un valor de retorno de una UDF especificada por la cláusula
RETURNS, como por ejemplo RETURNS CHAR(n), o un parámetro de salida de
un procedimiento especificado como CHAR(n), donde n es la longitud del valor
CHAR, debe existir un terminador nulo dentro de los primeros n+1 bytes del
almacenamiento intermedio. Si se encuentra un terminador nulo dentro de los
primeros n+1 bytes del almacenamiento intermedio, los restantes bytes, hasta el
byte n, se establecen en los caracteres en blanco de ASCII (X'20'). Si no se
encuentra ningún terminador nulo, se produce un error de SQL (SQLSTATE
39501).
Para los parámetros de entrada y salida de los valores de retorno de
procedimientos o funciones del tipo de datos CHAR que también especifican la
cláusula FOR BIT DATA, que indica que los datos se deben manipular en su
formato binario, no se utilizan terminadores nulos para indicar el final del valor
del parámetro. Para el valor de retorno de la función RETURNS CHAR(n) FOR
BIT DATA o para un parámetro de salida de CHAR(n) FOR BIT DATA, los n
primeros bytes del almacenamiento intermedio se copian independientemente de
las ocurrencias de los terminados nulos de serie dentro de los n primeros bytes.
Los caracteres de terminador nulo identificados dentro del almacenamiento
intermedio se pasan por alto como terminados nulos y simplemente se tratan
como datos normales.
Tenga precaución al utilizar las funciones normales de manejo de series C en
una rutina que manipule un valor FOR BIT DATA, ya que muchas de estas
funciones buscan un terminador nulo para delimitar un argumento de serie y los
terminadores nulos (X'00') pueden aparecer legítimamente en medio de un valor
FOR BIT DATA. El uso de las funciones C en los valores FOR BIT DATA puede
causar el truncamiento no deseado del valor de datos.
Cuando defina parámetros de tipo carácter de una rutina, piense en la
posibilidad de utilizar VARCHAR en lugar de CHAR, puesto que DB2 no
promociona los argumentos VARCHAR a CHAR y los literales de serie se
consideran automáticamente VARCHAR. Por ejemplo, suponga que define una
UDF del modo siguiente:
CREATE FUNCTION SIMPLE(INT,CHAR(1))...
Si invoca la función SIMPLE utilizando datos VARCHAR
(... SIMPLE(1,’A’)...), recibirá un error SQLCODE -440 (SQLSTATE 42884)
indicando que no se ha encontrado la función, y es posible que los usuarios
finales de esta función no perciban la razón del mensaje. En el ejemplo anterior,
’A’ es VARCHAR, por lo que puede convertirlo a CHAR o puede definir el
parámetro como VARCHAR.
v VARCHAR(n) FOR BIT DATA o LONG VARCHAR con o sin el modificador
FOR BIT DATA.
Válidos. Representan VARCHAR(n) FOR BIT DATA en C como
SQLUDF_VARCHAR_FBD. Representan LONG VARCHAR en C como SQLUDF_LONG. De
lo contrario, representan estos dos tipos de SQL en C como una estructura
similar a la siguiente del archivo de inclusión sqludf.h:
struct sqludf_vc_fbd
{
unsigned short length; /* longitud de los datos */
char data[1]; /* primer carácter de datos */
};
El [1] indica una matriz para el compilador. No significa que sólo se pase un
carácter; dado que se pasa la dirección de la estructura, y no la estructura real,
proporciona una manera de utilizar la lógica de matrices.
Capítulo 5. Desarrollo de rutinas externas 337
![Page 346: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/346.jpg)
Estos valores no se representan como series C terminadas en nulo porque el
carácter de nulo podría ser admisible formando parte del valor de los datos. Se
pasa explícitamente a la rutina la longitud de los parámetros utilizando la
variable de estructura length. Para la cláusula RETURNS, la longitud que se
pasa a la rutina es la longitud del almacenamiento intermedio. Lo que el cuerpo
de la rutina debe devolver, utilizando la variable de estructura length, es la
longitud real del valor de los datos.
Ejemplo:
struct sqludf_vc_fbd *arg1; /* ejemplo de VARCHAR(n) FOR BIT DATA */
struct sqludf_vc_fbd *result; /* y también de LONG VARCHAR FOR BIT DATA */
v VARCHAR(n) sin FOR BIT DATA.
Válidos. Se representan en C como SQLUDF_VARCHAR o char...[n+1]. (Ésta es una
serie C terminada en nulo.)
Para un parámetro VARCHAR(n), DB2 colocará un nulo en la posición (k+1),
donde k es la longitud de la serie en particular. Las funciones de manejo de
series C son adecuadas para la manipulación de estos valores. Para un valor de
RETURNS VARCHAR(n) o un parámetro de salida de un procedimiento
almacenado, el cuerpo de la rutina debe delimitar el valor real con un nulo
porque DB2 determinará la longitud del resultado a partir de este carácter de
nulo.
Ejemplo:
char arg2[51]; /* ejemplo de VARCHAR(50) */
char *result; /* también se puede aceptar */
v DATE
Válidos. Se representan en C como SQLUDF_DATE o CHAR(10), es decir, como
char...[11]. El valor de fecha siempre se pasa a la rutina con formato ISO:
aaaa-mm-dd
Ejemplo:
char arg1[11]; /* ejemplo de DATE */
char *result; /* también se puede aceptar */
Nota: Para los valores de retorno de DATE, TIME y TIMESTAMP, DB2 exige que
los caracteres estén en el formato definido y, si no es así, DB2 puede
malinterpretar el valor (por ejemplo, 2001-04-03 se interpretaría como el 3
de abril, aunque la intención es que interprete el 4 de marzo) o generaría
un error (SQLCODE -493, SQLSTATE 22007).
v TIME
Válidos. Se representan en C como SQLUDF_TIME o CHAR(8), es decir, como
char...[9]. El valor de hora siempre se pasa a la rutina con formato ISO:
hh.mm.ss
Ejemplo:
char *arg; /* ejemplo para TIME */
char result[9]; /* también se puede aceptar */
v TIMESTAMP
Válidos. Se representan en C como SQLUDF_STAMP o CHAR(26), es decir, como
char...[27]. El valor de indicación de la hora siempre se pasa con el formato
siguiente:
aaaa-mm-dd-hh.mm.ss.nnnnnn
Ejemplo:
char arg1[27]; /* ejemplo de TIMESTAMP */
char *result; /* también se puede aceptar */
v GRAPHIC(n)
338 Desarrollo de aplicaciones de SQL incorporado
![Page 347: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/347.jpg)
Válidos. Se representan en C como SQLUDF_GRAPH o sqldbchar[n+1]. (Ésta es una
serie gráfica terminada en nulo.) Tenga en cuenta que puede utilizar
wchar_t[n+1] en los sistemas operativos en los que wchar_t está definido con 2
bytes de longitud; no obstante, es recomendable sqldbchar.
Para un parámetro GRAPHIC(n), DB2 mueve n caracteres de doble byte al
almacenamiento intermedio y establece los dos bytes siguientes en nulo. Los
datos que se pasan de DB2 a una rutina están en formato DBCS y es de esperar
que el resultado devuelto esté en formato DBCS. Este comportamiento es el
mismo que si se utiliza la opción de precompilador WCHARTYPE
NOCONVERT. Para un valor de RETURNS GRAPHIC(n) o un parámetro de
salida de un procedimiento almacenado, DB2 busca un CHAR GRAPHIC nulo
incorporado y, si lo encuentra, rellena el valor hasta n con caracteres GRAPHIC
en blanco.
Cuando defina parámetros gráficos de una rutina, considere la posibilidad de
utilizar VARGRAPHIC en lugar de GRAPHIC, ya que DB2 no promociona los
argumentos VARGRAPHIC a GRAPHIC. Por ejemplo, suponga que define una
rutina del modo siguiente:
CREATE FUNCTION SIMPLE(GRAPHIC)...
Si invoca la función SIMPLE utilizando datos VARGRAPHIC
(... SIMPLE('literal_gráfico')...), recibirá un error SQLCODE -440
(SQLSTATE 42884) indicando que no se ha encontrado la función, y es posible
que los usuarios finales de esta función no comprendan la razón de este
mensaje. En el ejemplo anterior, literal_gráfico es una serie DBCS literal que
se interpreta como datos VARGRAPHIC, por lo que puede convertirla a
GRAPHIC o puede definir el parámetro como VARGRAPHIC.
Ejemplo:
sqldbchar arg1[14]; /* ejemplo de GRAPHIC(13) */
sqldbchar *arg1; /* también se puede aceptar */
v VARGRAPHIC(n)
Válidos. Se representan en C como SQLUDF_GRAPH o sqldbchar[n+1]. (Ésta es una
serie gráfica terminada en nulo.) Tenga en cuenta que puede utilizar
wchar_t[n+1] en los sistemas operativos en los que wchar_t está definido con 2
bytes de longitud; no obstante, es recomendable sqldbchar.
Para un parámetro VARGRAPHIC(n), DB2 colocará un nulo gráfico en la
posición (k+1), donde k es la longitud de la aparición en particular. Un nulo
gráfico hace referencia a una situación en que todos los bytes del último carácter
de la serie gráfica contienen ceros binarios ('\0's). Los datos que se pasan de
DB2 a una rutina están en formato DBCS y es de esperar que el resultado
devuelto esté en formato DBCS. Este comportamiento es el mismo que si se
utiliza la opción de precompilador WCHARTYPE NOCONVERT. Para un valor
de RETURNS VARGRAPHIC(n) o un parámetro de salida de un procedimiento
almacenado, el cuerpo de la rutina debe delimitar el valor real con un nulo
gráfico, porque DB2 determinará la longitud del resultado a partir de este
carácter de nulo gráfico.
Ejemplo:
sqldbchar args[51], /* ejemplo de VARGRAPHIC(50) */
sqldbchar *result, /* también se puede aceptar */
v LONG VARGRAPHIC
Válidos. Se representan en C como SQLUDF_LONGVARG o como una estructura:
struct sqludf_vg
{
unsigned short length; /* longitud de los datos */
sqldbchar data[1]; /* primer carácter de datos */
};
Capítulo 5. Desarrollo de rutinas externas 339
![Page 348: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/348.jpg)
Tenga en cuenta que, en la estructura anterior, puede utilizar wchar_t en lugar
de sqldbchar en los sistemas operativos en los que wchar_t está definido con 2
bytes de longitud; no obstante, es recomendable el uso de sqldbchar.
El [1] simplemente indica una matriz para el compilador. No significa que sólo
se pase un carácter gráfico. Dado que se pasa la dirección de la estructura, y no
la estructura real, se proporciona una manera de utilizar la lógica de matrices.
No se representan como series gráficas terminadas en nulo. Se pasa
explícitamente a la rutina la longitud de los parámetros, en caracteres de doble
byte, utilizando la variable de estructura length. Los datos que se pasan de DB2
a una rutina están en formato DBCS y es de esperar que el resultado devuelto
esté en formato DBCS. Este comportamiento es el mismo que si se utiliza la
opción de precompilador WCHARTYPE NOCONVERT. Para la cláusula
RETURNS o un parámetro de salida de un procedimiento almacenado, la
longitud que se pasa a la rutina es la longitud del almacenamiento intermedio.
Lo que el cuerpo de la rutina debe devolver, utilizando la variable de estructura
length, es la longitud real del valor de los datos, en caracteres de doble byte.
Ejemplo:
struct sqludf_vg *arg1; /* ejemplo de VARGRAPHIC(n) */
struct sqludf_vg *result; /* y también de LONG VARGRAPHIC */
v BLOB(n) y CLOB(n)
Válidos. Se representan en C como SQLUDF_BLOB, como SQLUDF_CLOB o como una
estructura:
struct sqludf_lob
{
sqluint32 length; /* longitud en bytes */
char data[1]; /* primer byte del lob */
};
El [1] simplemente indica una matriz para el compilador. No significa que sólo
se pase un carácter; dado que se pasa la dirección de la estructura, y no la
estructura real, proporciona una manera de utilizar la lógica de matrices.
No se representan como series C terminadas en nulo. Se pasa explícitamente a la
rutina la longitud de los parámetros utilizando la variable de estructura length.
Para la cláusula RETURNS o un parámetro de salida de un procedimiento
almacenado, la longitud que se devuelve a la rutina es la longitud del
almacenamiento intermedio. Lo que el cuerpo de la rutina debe devolver,
utilizando la variable de estructura length, es la longitud real del valor de los
datos.
Ejemplo:
struct sqludf_lob *arg1; /* ejemplo de BLOB(n), CLOB(n) */
struct sqludf_lob *result;
v DBCLOB(n)
Válidos. Se representan en C como SQLUDF_DBCLOB o como una estructura:
struct sqludf_lob
{
sqluint32 length; /* longitud en caracteres gráficos */
sqldbchar data[1]; /* primer byte del lob */
};
Tenga en cuenta que, en la estructura anterior, puede utilizar wchar_t en lugar
de sqldbchar en los sistemas operativos en los que wchar_t está definido con 2
bytes de longitud; no obstante, es recomendable el uso de sqldbchar.
El [1] simplemente indica una matriz para el compilador. No significa que sólo
se pase un carácter gráfico; dado que se pasa la dirección de la estructura, y no
la estructura real, proporciona una manera de utilizar la lógica de matrices.
340 Desarrollo de aplicaciones de SQL incorporado
![Page 349: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/349.jpg)
No se representan como series gráficas terminadas en nulo. Se pasa
explícitamente a la rutina la longitud de los parámetros utilizando la variable de
estructura length. Los datos que se pasan de DB2 a una rutina están en formato
DBCS y es de esperar que el resultado devuelto esté en formato DBCS. Este
comportamiento es el mismo que si se utiliza la opción de precompilador
WCHARTYPE NOCONVERT. Para la cláusula RETURNS o un parámetro de
salida de un procedimiento almacenado, la longitud que se pasa a la rutina es la
longitud del almacenamiento intermedio. Lo que el cuerpo de la rutina debe
devolver, utilizando la variable de estructura length, es la longitud real del valor
de los datos, con todas estas longitudes expresadas en caracteres de doble byte.
Ejemplo:
struct sqludf_lob *arg1; /* ejemplo de DBCLOB(n) */
struct sqludf_lob *result;
v Tipos diferenciados
Válidos o no válidos en función del tipo base. Los tipos diferenciados se
pasarán a la UDF con el formato del tipo base del UDT, por lo que se pueden
especificar si y sólo si es válido el tipo base.
Ejemplo:
struct sqludf_lob *arg1; /* para tipos diferenciados basados en BLOB(n) */
double *arg2; /* para tipos diferenciados basados en DOUBLE */
char res[5];/* para tipos diferenciados basados en CHAR(4) */
v XML
Válidos. Se representa en C como SQLUDF_XML o como se representa el tipo de
datos CLOB; es decir, con una estructura:
struct sqludf_lob
{
sqluint32 length; /* longitud en bytes */
char data[1]; /* primer byte del lob */
};
El [1] simplemente indica una matriz para el compilador. No significa que sólo
se pase un carácter; dado que se pasa la dirección de la estructura, y no la
estructura real, proporciona una manera de utilizar la lógica de matrices.
No se representan como series C terminadas en nulo. Se pasa explícitamente a la
rutina la longitud de los parámetros utilizando la variable de estructura length.
Para la cláusula RETURNS o un parámetro de salida de un procedimiento
almacenado, la longitud que se devuelve a la rutina es la longitud del
almacenamiento intermedio. Lo que el cuerpo de la rutina debe devolver,
utilizando la variable de estructura length, es la longitud real del valor de los
datos.
Ejemplo:
struct sqludf_lob *arg1; /* ejemplo de XML(n) */
struct sqludf_lob *result;
La asignación de valores de parámetros y variables XML y el acceso a ellos en
código externo de la rutina C y C++ se hace como para los valores CLOB.
v Tipos diferenciados AS LOCATOR, o cualquier tipo de LOB AS LOCATOR
Válidos para los parámetros y resultados de UDF y métodos. Sólo se puede
utilizar para modificar tipos de LOB o cualquier tipo diferenciado que esté
basado en un tipo de LOB. Su representación en C es como SQLUDF_LOCATOR o
como entero de cuatro bytes.
El valor de localizador se puede asignar a cualquier variable del lenguaje
principal de localizador que sea de un tipo compatible, y luego se puede utilizar
en una sentencia de SQL. Esto significa que las variables de localizador
únicamente son de utilidad en las UDF y los métodos definidos con un
Capítulo 5. Desarrollo de rutinas externas 341
![Page 350: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/350.jpg)
indicador de acceso a SQL que sea CONTAINS SQL o superior. Para que sean
compatibles con las UDF y los métodos existentes, las API de localizador se
siguen soportando para las UDF NOT FENCED NO SQL. No se recomienda el
uso de estas API para las funciones nuevas.
Ejemplo:
sqludf_locator *arg1; /* argumento de localizador */
sqludf_locator *result; /* resultado del localizador */
EXEC SQL BEGIN DECLARE SECTION;
SQL TYPE IS CLOB LOCATOR arg_loc;
SQL TYPE IS CLOB LOCATOR res_loc;
EXEC SQL END DECLARE SECTION;
/* Extraer algunos caracteres del medio */
/* del argumento y devolverlos */
*arg_loc = arg1;
EXEC SQL VALUES SUBSTR(arg_loc, 10, 20) INTO :res_loc;
*result = res_loc;
v Tipos estructurados
Válidos para los parámetros y resultados de UDF y métodos en que exista una
función de transformación apropiada. Los parámetros de tipos estructurados se
pasarán a la función o al método en el tipo de resultado de la función de
transformación FROM SQL. Los resultados de tipos estructurados se pasarán en
el tipo de parámetro de la función de transformación TO SQL.
v DATALINK
Válidos. Se representan en C como SQLUDF_DATALINK o como una estructura
similar a la siguiente del archivo de inclusión sqludf.h:
struct sqludf_datalink {
sqluint32 version;
char linktype[4];
sqluint32 url_length;
sqluint32 comment_length;
char reserve2[8];
char url_plus_comment[230];
}
Conceptos relacionados:
v “Variables gráficas del lenguaje principal en rutinas C y C++” en la página 356
v “Archivo de inclusión necesario para el desarrollo de rutinas C y C++
(sqludf.h)” en la página 318
v “Funciones de transformación y grupos de transformación” en Desarrollo de SQL
y rutinas externas
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado C y
C++” en la página 60
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE” en Consulta de SQL, Volumen 2
v “Tipos de datos de SQL soportados en rutinas C y C++” en la página 331
Paso de argumentos a rutinas C, C++, OLE o COBOL
Además de los argumentos de SQL que se especifican en la referencia DML para
una rutina, DB2 pasa argumentos adicionales al cuerpo de la rutina externa. La
naturaleza y el orden de estos argumentos lo determina el estilo de parámetros con
que se ha registrado la rutina. Para asegurarse de que se intercambie correctamente
342 Desarrollo de aplicaciones de SQL incorporado
![Page 351: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/351.jpg)
la información entre los invocadores y el cuerpo de la rutina, se tiene que cerciorar
de que la rutina acepte los argumentos en el orden en que se le pasen, según el
estilo de parámetros que se utilice. El archivo de inclusión sqludf le puede servir
para el manejo y uso de estos argumentos.
Los estilos de parámetros siguientes sólo son aplicables a las rutinas LANGUAGE
C, LANGUAGE OLE y LANGUAGE COBOL.
Rutinas PARAMETER STYLE SQL
��
�
�
argumento-SQL
ind-argumento-SQL
sqlstate nombre-rutina �
� nombre-específico mensaje-diagnóstico
área-reutilizable �
� tipo-llamada
dbinfo ��
Procedimientos PARAMETER STYLE DB2SQL
��
�
argumento-SQL
matriz-ind-argumento-SQL
sqlstate nombre-rutina �
� nombre-específico mensaje-diagnóstico
dbinfo ��
Procedimientos PARAMETER STYLE GENERAL
��
�
argumento-SQL
dbinfo ��
Procedimientos PARAMETER STYLE GENERAL WITH NULLS
��
�
argumento-SQL
matriz-ind-argumento-SQL
dbinfo ��
Nota: Para las UDF y los métodos, PARAMETER STYLE SQL es equivalente a
PARAMETER STYLE DB2SQL.
Los argumentos para los estilos de parámetros anteriores se describen del modo
siguiente:
argumento-SQL...
Cada argumento-SQL representa un valor de entrada o salida definido al
crear la rutina. La lista de argumentos se determina del modo siguiente:
Capítulo 5. Desarrollo de rutinas externas 343
![Page 352: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/352.jpg)
v Para una función escalar, un argumento para cada parámetro de entrada
para la función, seguidos de un argumento-SQL para el resultado de la
función.
v Para una función de tabla, un argumento para cada parámetro de
entrada para la función, seguidos de un argumento-SQL para cada
columna de la tabla de resultados de la función.
v Para un método, un argumento-SQL para el tipo sujeto del método, luego
un argumento para cada parámetro de entrada para el método, seguidos
de un argumento-SQL para el resultado del método.
v Para un procedimiento almacenado, un argumento-SQL para cada
parámetro del procedimiento almacenado.
Cada uno de los argumentos-SQL se utiliza del modo siguiente:
v Parámetro de entrada de una función o método, tipo sujeto de un
método o parámetro IN de un procedimiento almacenado
DB2 establece este argumento antes de llamar a la rutina. El valor de
cada uno de estos argumentos se toma de la expresión especificada en la
invocación de la rutina. Se expresa en el tipo de datos de la definición
del parámetro correspondiente en la sentencia CREATE.
v Resultado de una función o método, o parámetro OUT de un
procedimiento almacenado
La rutina establece este argumento antes de volver a DB2. DB2 asigna el
almacenamiento intermedio y pasa la dirección del mismo a la rutina. La
rutina coloca el valor del resultado en el almacenamiento intermedio.
DB2 asigna un espacio de almacenamiento intermedio suficiente para
que contenga el valor expresado en el tipo de datos. En los tipos de
caracteres y LOB, esto significa que se asigna el tamaño máximo
definido en la sentencia de creación.
Para los métodos y funciones escalares, el tipo de datos del resultado se
define en la cláusula CAST FROM, si está presente, o en la cláusula
RETURNS, si no hay ninguna cláusula CAST FROM presente.
Para las funciones de tabla, DB2 define una optimización del
rendimiento si no se tienen que devolver a DB2 todas las columnas
definidas. Si escribe una UDF que se aproveche de esta característica,
ésta sólo devolverá las columnas que necesite la sentencia que hace
referencia a la función de tabla. Por ejemplo, piense en una sentencia
CREATE FUNCTION para una función de tabla definida con 100
columnas de resultado. Si una sentencia determinada que hace referencia
a la función sólo está interesada en dos de ellas, esta optimización
permite que la UDF sólo devuelva estas dos columnas de cada fila, y no
invierta tiempo en las otras 98 columnas. Para obtener más información
sobre la optimización mencionada, consulte el argumento dbinfo más
adelante.
Por cada valor devuelto, la rutina no debe devolver más bytes de los
necesarios para el tipo de datos y la longitud del resultado. Los valores
máximos se definen durante la creación de la entrada de catálogo de la
rutina. Una sobregrabación por parte de la rutina puede ocasionar
resultados imprevisibles o una terminación anómala.
v Parámetro INOUT de un procedimiento almacenado
Este argumento se comporta como los parámetros IN y OUT y, por
consiguiente, sigue los dos conjuntos de reglas indicados anteriormente.
DB2 establecerá el argumento antes de llamar al procedimiento
almacenado. El almacenamiento intermedio asignado por DB2 para el
344 Desarrollo de aplicaciones de SQL incorporado
![Page 353: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/353.jpg)
argumento es lo suficientemente grande como para contener el tamaño
máximo del tipo de datos del parámetro definido en la sentencia
CREATE PROCEDURE. Por ejemplo, un parámetro INOUT de tipo
CHAR puede tener un varchar de 10 bytes que entre en el
procedimiento almacenado y un varchar de 100 bytes que salga del
procedimiento almacenado. El procedimiento almacenado establece el
almacenamiento intermedio antes de volver a DB2.
DB2 alinea los datos para argumento-SQL en función del tipo de datos y del
sistema operativo del servidor, también conocido como plataforma.
ind-argumento-SQL...
Hay un ind-argumento-SQL para cada argumento-SQL que se pase a la
rutina. El ind-argumento-SQL número n corresponde al argumento-SQL
número n e indica si el argumento-SQL tiene un valor o es nulo (NULL).
Cada uno de los ind-argumento-SQL se utiliza del modo siguiente:
v Parámetro de entrada de una función o método, tipo sujeto de un
método o parámetro IN de un procedimiento almacenado
DB2 establece este argumento antes de llamar a la rutina. Contiene uno
de los valores siguientes:
0 El argumento está presente y no es NULL.
-1 El argumento está presente y su valor es NULL.Si la rutina se ha definido con RETURNS NULL ON NULL INPUT, el
cuerpo de la rutina no tiene necesidad de comprobar un valor NULL.
Sin embargo, si se ha definido con CALLED ON NULL INPUT,
cualquier argumento puede ser NULL y la rutina debe comprobar el
ind-argumento-SQL antes de utilizar el argumento-SQL correspondiente.
v Resultado de una función o método, o parámetro OUT de un
procedimiento almacenado
La rutina establece este argumento antes de volver a DB2. La rutina
utiliza este argumento para señalar si el valor del resultado en concreto
es NULL:
0 El resultado no es NULL.
-1 El resultado es el valor NULL.Aunque la rutina se haya definido con RETURNS NULL ON NULL
INPUT, el cuerpo de la rutina tiene que establecer el ind-argumento-SQL
del resultado. Por ejemplo, una función de división puede establecer el
resultado en nulo cuando el denominador sea cero.
Para los métodos y funciones escalares, DB2 trata un resultado NULL
como un error aritmético si se dan las circunstancias siguientes:
– El parámetro de configuración de base de datos dft_sqlmathwarn es
YES
– Uno de los argumentos de entrada es nulo debido a un error
aritmético
También sucede así si se define la función con la opción RETURNS
NULL ON NULL INPUT
Para las funciones de tabla, si la UDF se aprovecha de la optimización
utilizando la lista de columnas del resultado, sólo es necesario establecer
los indicadores correspondientes a las columnas requeridas.
v Parámetro INOUT de un procedimiento almacenado
Este argumento se comporta como los parámetros IN y OUT y, por
consiguiente, sigue los dos conjuntos de reglas indicados anteriormente.
DB2 establecerá el argumento antes de llamar al procedimiento
Capítulo 5. Desarrollo de rutinas externas 345
![Page 354: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/354.jpg)
almacenado. El procedimiento almacenado establece el
ind-argumento-SQL antes de volver a DB2.
Cada ind-argumento-SQL toma la forma de un valor SMALLINT. DB2 alinea
los datos para ind-argumento-SQL en función del tipo de datos y del
sistema operativo del servidor.
matriz-ind-argumento-SQL
En la matriz-ind-argumento-SQL, existe un elemento para cada
argumento-SQL pasado al procedimiento almacenado. El elemento número
n de la matriz-ind-argumento-SQL corresponde al argumento-SQL número n
e indica si el argumento-SQL tiene un valor o es NULL.
Cada elemento de la matriz-ind-argumento-SQL se utiliza del modo
siguiente:
v Parámetro IN de un procedimiento almacenado
DB2 establece este elemento antes de llamar a la rutina. Contiene uno de
los valores siguientes:
0 El argumento está presente y no es NULL.
-1 El argumento está presente y su valor es NULL.
Si el procedimiento almacenado se ha definido con RETURNS NULL ON
NULL INPUT, el cuerpo del procedimiento almacenado no tiene
necesidad de comprobar un valor NULL. Sin embargo, si se ha definido
con CALLED ON NULL INPUT, cualquier argumento puede ser NULL
y el procedimiento almacenado debe comprobar el ind-argumento-SQL
antes de utilizar el argumento-SQL correspondiente.
v Parámetro OUT de un procedimiento almacenado
La rutina establece este elemento antes de volver a DB2. La rutina utiliza
este argumento para señalar si el valor del resultado en concreto es
NULL:
0 o positivo
El resultado no es NULL.
negativo
El resultado es el valor NULL.v Parámetro INOUT de un procedimiento almacenado
Este elemento se comporta como los parámetros IN y OUT y, por
consiguiente, sigue los dos conjuntos de reglas indicados anteriormente.
DB2 establecerá el argumento antes de llamar al procedimiento
almacenado. El procedimiento almacenado establece el elemento de
matriz-ind-argumento-SQL antes de volver a DB2.
Cada elemento de matriz-ind-argumento-SQL toma la forma de un valor
SMALLINT. DB2 alinea los datos para matriz-ind-argumento-SQL en función
del tipo de datos y del sistema operativo del servidor.
sqlstate La rutina establece este argumento antes de volver a DB2. Ésta lo puede
utilizar para señalar condiciones de aviso o error. La rutina puede
establecer este argumento en cualquier valor. El valor ’00000’ significa que
no se ha detectado ninguna condición de aviso ni de error. Los valores que
empiezan por ’01’ son condiciones de aviso. Los valores que empiezan por
cualquier cosa distinta de ’00’ y ’01’ son condiciones de error. Cuando se
llama a la rutina, el argumento contiene el valor ’00000’.
Para las condiciones de error, la rutina devuelve un SQLCODE de -443.
Para las condiciones de aviso, devuelve un SQLCODE de +462. Si el
SQLSTATE es 38001 ó 38502, el SQLCODE es -487.
346 Desarrollo de aplicaciones de SQL incorporado
![Page 355: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/355.jpg)
El sqlstate toma la forma de un valor CHAR(5). DB2 alinea los datos para
sqlstate en función del tipo de datos y del sistema operativo del servidor.
nombre-rutina
DB2 establece este argumento antes de llamar a la rutina. Se trata del
nombre de función calificado que se pasa de DB2 a la rutina
El formato del nombre-rutina que se pasa es el siguiente:
esquema.rutina
Las distintas partes se separan mediante un punto. Éstos son dos ejemplos:
PABLO.BLOOP WILLIE.FINDSTRING
Este formato permite utilizar el mismo cuerpo de rutina para varias rutinas
externas, y sigue diferenciando entre las rutinas cuando se las invoca.
Nota: Aunque es posible incluir un punto en nombres de objeto y nombres
de esquema, no es aconsejable. Por ejemplo, si una función ROTATE
se encuentra en un esquema OBJ.OP, el nombre de rutina que se
pasa a la función es OBJ.OP.ROTATE, y no resulta obvio si el nombre
de esquema es OBJ u OBJ.OP.
El nombre-rutina adopta el formato de un valor VARCHAR(257). DB2 alinea
los datos para nombre-rutina en función del tipo de datos y del sistema
operativo del servidor.
nombre-específico
DB2 establece este argumento antes de llamar a la rutina. Se trata del
nombre específico de la rutina que se pasa de DB2 a la rutina.
Éstos son dos ejemplos:
WILLIE_FIND_FEB99 SQL9904281052440430
El usuario proporciona este primer valor en su sentencia CREATE. El
segundo valor, si el usuario no especifica ninguno, lo genera DB2 a partir
de la indicación de la hora actual.
Al igual que con el argumento nombre-rutina, la razón para pasar este valor
consiste en brindar a la rutina un medio para distinguir exactamente qué
rutina concreta lo está invocando.
El nombre-específico toma la forma de un valor VARCHAR(18). DB2 alinea
los datos para nombre-específico en función del tipo de datos y del sistema
operativo del servidor.
mensaje-diagnóstico
La rutina establece este argumento antes de volver a DB2. La rutina puede
utilizar este argumento para insertar texto de mensaje en un mensaje de
DB2.
Cuando la rutina devuelve un error o un aviso, utilizando el argumento
sqlstate descrito anteriormente, puede incluir aquí información descriptiva.
DB2 incluye esta información como señal en su mensaje.
DB2 establece el primer carácter en nulo antes de llamar a la rutina. Al
volver, trata la serie como una serie C terminada en nulo. Esta serie se
incluirá en la SQLCA como señal de la condición de error. Como mínimo,
la primera parte de esta serie aparecerá en la SQLCA o en el mensaje del
CLP de DB2. No obstante, el número real de caracteres que aparecerán
Capítulo 5. Desarrollo de rutinas externas 347
![Page 356: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/356.jpg)
depende de las longitudes de las otras señales, puesto que DB2 trunca las
señales para que se ajusten al límite impuesto por la SQLCA respecto a la
longitud total de las señales. Evite utilizar X'FF' en el texto, ya que este
carácter se utiliza para delimitar señales en la SQLCA.
La rutina no debe devolver más texto del que quepa en el almacenamiento
intermedio de VARCHAR(70) que se le pasa. Una sobregrabación por parte
de la rutina puede ocasionar resultados imprevisibles o una terminación
anómala.
DB2 supone que las señales de mensajes devueltas a DB2 por la rutina
están en la misma página de códigos que la rutina. La rutina se debe
asegurar de que es así. Si se utiliza el subconjunto ASCII invariable de 7
bits, la rutina puede devolver las señales de mensajes en cualquier página
de códigos.
El mensaje-diagnóstico toma la forma de un valor VARCHAR(70). DB2 alinea
los datos para mensaje-diagnóstico en función del tipo de datos y del sistema
operativo del servidor.
área-reutilizable
DB2 establece este argumento antes de invocar la UDF o al método. Sólo
está presente para las funciones y los métodos en que se ha especificado la
palabra clave SCRATCHPAD durante el registro. Este argumento es una
estructura, exactamente igual que la estructura utilizada para pasar un
valor de cualquiera de los tipos de datos LOB, con los elementos
siguientes:
v Un INTEGER que contiene la longitud del área reutilizable. Si se cambia
la longitud del área reutilizable, se producirá un SQLCODE -450
(SQLSTATE 39501)
v El área reutilizable real inicializada completamente con ceros binarios del
modo siguiente:
– Para los métodos y las funciones escalares, se inicializa antes de la
primera llamada y DB2 no la suele examinar ni modificar después.
– Para las funciones de tabla, el área reutilizable se inicializa antes de la
primera (FIRST) llamada a la UDF si se especifica FINAL CALL en la
sentencia CREATE FUNCTION. A partir de esta llamada, el contenido
del área reutilizable está totalmente bajo el control de la función de
tabla. Si se ha especificado, o asumido por omisión, NO FINAL CALL
para una función de tabla, el área reutilizable se inicializa para cada
llamada OPEN, y el contenido de la misma está totalmente bajo el
control de la función de tabla entre llamadas OPEN. (Esto puede ser
muy importante para una función de tabla utilizada en una unión o
en una subconsulta. Si es necesario mantener el contenido del área
reutilizable a lo largo de las llamadas OPEN, se debe especificar
FINAL CALL en la sentencia CREATE FUNCTION. Si se especifica
FINAL CALL, además de las llamadas OPEN, FETCH y CLOSE
normales, la función de tabla recibirá también llamadas FIRST y
FINAL, con el objetivo de mantener el área reutilizable y liberar
recursos.)
El área reutilizable se puede correlacionar en la rutina utilizando el mismo
tipo que un CLOB o un BLOB, puesto que el argumento que se pasa tiene
la misma estructura.
Asegúrese de que el código de la rutina no realiza cambios fuera del
almacenamiento intermedio del área reutilizable. Una sobregrabación por
348 Desarrollo de aplicaciones de SQL incorporado
![Page 357: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/357.jpg)
parte de la rutina puede causar resultados imprevisibles o una terminación
anómala y puede que DB2 experimente una anomalía no leve.
Si en una subconsulta se hace referencia a un método o una UDF escalar
que emplea un área reutilizable, es posible que DB2 decida renovar el área
reutilizable entre invocaciones de la subconsulta. Esta renovación se
produce después de realizar una llamada final, en caso de que se haya
especificado FINAL CALL para la UDF.
DB2 inicializa el área reutilizable de forma que el campo de datos esté
alineado para el almacenamiento de cualquier tipo de datos. Esto puede
hacer que la estructura entera del área reutilizable, incluido el campo de
longitud, esté alineada incorrectamente.
tipo-llamada
DB2 establece este argumento, si está presente, antes de invocar la UDF o
al método. Este argumento está presente para todas las funciones de tabla
y para los métodos y funciones escalares en que se ha especificado FINAL
CALL durante el registro.
A continuación, se indican todos los valores posibles actuales para
tipo-llamada. La UDF o el método debe contener una sentencia de
conmutación o de caso que pruebe explícitamente todos los valores
esperados, en lugar de contener lógica del tipo “if A do AA, else if B do
BB, else it must be C so do CC”. Esto es así porque puede que en el futuro
se añadan tipos de llamadas adicionales y, si no prueba explícitamente la
condición C, tendrá problemas cuando se añadan las nuevas posibilidades.
Notas:
1. Para todos los valores de tipo-llamada, puede ser conveniente que la
rutina establezca un valor de retorno de sqlstate y de mensaje-diagnóstico.
Esta información no se repetirá en las descripciones siguientes de cada
uno de los tipos-llamada. Para todas las llamadas, DB2 emprenderá la
acción indicada descrita anteriormente para estos argumentos.
2. El archivo de inclusión sqludf.h está destinado a la utilización con
rutinas. El archivo contiene definiciones simbólicas para los valores de
tipo-llamada siguientes, que se escriben como constantes.
Para los métodos y funciones escalares, tipo-llamada contiene:
SQLUDF_FIRST_CALL (-1)
Ésta es la primera (FIRST) llamada a la rutina para esta
sentencia. El área reutilizable (si la hay) se establece con
ceros binarios cuando se llama a la rutina. Se pasan los
valores de todos los argumentos y la rutina debe realizar
las acciones puntuales de inicialización que sean necesarias.
Además, una llamada FIRST a un método o una UDF
escalar es como una llamada NORMAL, en el sentido en
que se espera que desarrolle y devuelva una respuesta.
Nota: Si se especifica SCRATCHPAD pero no así FINAL
CALL, la rutina no tendrá este argumento de
tipo-llamada para identificar la llamada realmente
primera. En lugar de esto, se tendrá que basar en el
estado del área reutilizable, todo ceros.
SQLUDF_NORMAL_CALL (0)
Ésta es una llamada NORMAL. Se pasan todos los valores
de entrada de SQL y se espera que la rutina desarrolle y
Capítulo 5. Desarrollo de rutinas externas 349
![Page 358: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/358.jpg)
devuelva el resultado. También puede que la rutina
devuelva información de sqlstate y de mensaje-diagnóstico.
SQLUDF_FINAL_CALL (1)
Ésta es una llamada FINAL; es decir, no se pasa ningún
valor de argumento-SQL ni de ind-argumento-SQL, y los
intentos de examinar estos valores pueden causar
resultados imprevisibles. Si también se pasa un área
reutilizable, ésta permanece inalterada desde la llamada
anterior. Se espera que la rutina libere recursos en este
punto.
SQLUDF_FINAL_CRA (255)
Ésta es una llamada FINAL, idéntica a la llamada FINAL
descrita antes, con una característica adicional, a saber, que
se crea para rutinas que están definidas como capaces de
emitir SQL, y se crea en un momento en que la rutina no
debe emitir SQL, a excepción de CLOSE cursor. (SQLCODE
-396, SQLSTATE 38505) Por ejemplo, cuando DB2 está en
medio de un proceso COMMIT, no puede tolerar nuevo
SQL, y cualquier llamada FINAL emitida para una rutina
en ese momento será una llamada 255 FINAL. Las rutinas
que no estén definidas para contener ningún nivel de
acceso a SQL nunca recibirán una llamada 255 FINAL,
mientras que las rutinas que utilizan SQL pueden recibir
cualquier tipo de llamada FINAL.
Liberación de recursos
De un método o una UDF escalar se espera que liberen los recursos que
han necesitado, por ejemplo memoria. Si se especifica FINAL CALL para la
rutina, esa llamada FINAL es el lugar natural en el que liberar recursos,
siempre que también se especifique SCRATCHPAD y se utilice para hacer
un seguimiento del recurso. Si no se especifica FINAL CALL, cualquier
recurso adquirido se debe liberar en la misma llamada.
Para las funciones de tabla, tipo-llamada contiene:
SQLUDF_TF_FIRST (-2)
Ésta es la primera (FIRST) llamada, que sólo se produce si
se ha especificado la palabra clave FINAL CALL para la
UDF. El área reutilizable se establece con ceros binarios antes
de esta llamada. Los valores de los argumentos se pasan a
la función de tabla. La función de tabla puede adquirir
memoria o realizar otra inicialización puntual de sólo
recursos. No se trata de una llamada OPEN, la cual sigue a
ésta. En una llamada FIRST, la función de tabla no debe
devolver ningún dato a DB2, ya que DB2 hace caso omiso
de los datos.
SQLUDF_TF_OPEN (-1)
Ésta es la llamada OPEN. El área reutilizable se inicializará
si se especifica NO FINAL CALL, pero no necesariamente
en caso contrario. En OPEN se pasan los valores de todos
los argumentos de SQL a la función de tabla. La función de
tabla no debe devolver ningún dato a DB2 en la llamada
OPEN.
350 Desarrollo de aplicaciones de SQL incorporado
![Page 359: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/359.jpg)
SQLUDF_TF_FETCH (0)
Ésta es una llamada FETCH y DB2 espera que la función
de tabla devuelva una fila que comprenda el conjunto de
valores de retorno o una condición de fin de tabla,
indicada por el valor ’02000’ de SQLSTATE. Si se pasa el
área reutilizable a la UDF, al entrar ésta permanece
inalterada respecto a la llamada anterior.
SQLUDF_TF_CLOSE (1)
Ésta es una llamada CLOSE para la función de tabla.
Equilibra la llamada OPEN y se puede utilizar para
realizar cualquier proceso CLOSE externo (por ejemplo,
cerrar un archivo fuente) y para la liberación de recursos
(especialmente para el caso de NO FINAL CALL).
En los casos que implican una unión o una subconsulta, se
pueden repetir secuencias de llamadas
OPEN/FETCH.../CLOSE dentro de la ejecución una
sentencia, pero sólo habrá una llamada FIRST y una
llamada FINAL. Las llamadas FIRST y FINAL sólo se
producen si se especifica FINAL CALL para la función de
tabla.
SQLUDF_TF_FINAL (2)
Ésta es una llamada FINAL, que sólo se produce si se ha
especificado FINAL CALL para la función de tabla.
Equilibra la llamada FIRST y sólo se produce una vez por
ejecución de la sentencia. Está destinada a liberar recursos.
SQLUDF_TF_FINAL_CRA (255)
Ésta es una llamada FINAL, idéntica a la llamada FINAL
descrita antes, con una característica adicional, digamos
que está formada por UDF que están definidas como
capaces de emitir SQL, y se ha creado en un momento en
que la UDF no debe emitir SQL, a excepción de CLOSE
cursor. (SQLCODE -396, SQLSTATE 38505) Por ejemplo,
cuando DB2 está en medio de un proceso COMMIT, no
puede tolerar nuevo SQL, y cualquier llamada FINAL
emitida para una UDF en ese momento será una llamada
255 FINAL. Tenga en cuenta que las UDF que no están
definidas para contener un nivel de acceso a SQL nunca
recibirán una llamada 255 FINAL, mientras que las UDF
que utilizan SQL pueden recibir cualquier tipo de llamada
FINAL.
Liberación de recursos
Escriba las rutinas de forma que liberen los recursos que adquieran. Para
las funciones de tabla, existen dos lugares naturales para esta liberación: la
llamada CLOSE y la llamada FINAL. La llamada CLOSE equilibra cada
llamada OPEN y se puede producir varias veces en la ejecución de una
sentencia. La llamada FINAL sólo se produce si se especifica FINAL CALL
para la UDF, y únicamente se produce una vez por sentencia.
Si puede aplicar un recurso en todas las secuencias de
OPEN/FETCH/CLOSE de la UDF, escriba la UDF de forma que adquiera
el recurso en la llamada FIRST y lo libere en la llamada FINAL. El área
reutilizable es un lugar natural para hacer un seguimiento de este recurso.
Para las funciones de tabla, si se especifica FINAL CALL, el área
Capítulo 5. Desarrollo de rutinas externas 351
![Page 360: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/360.jpg)
reutilizable sólo se inicializa antes de la llamada FIRST. Si no se especifica
FINAL CALL, se reinicializa antes de cada llamada OPEN.
Si un recurso es específico para cada secuencia de OPEN/FETCH/CLOSE,
escriba la UDF de forma que libere el recurso en la llamada CLOSE.
Nota: Cuando una función de tabla está en una subconsulta o unión, es
muy posible que se produzcan varias apariciones de la secuencia de
OPEN/FETCH/CLOSE, según cómo decida organizar la ejecución
de la sentencia el Optimizador de DB2.
El tipo-llamada toma la forma de un valor INTEGER. DB2 alinea los datos
para tipo-llamada en función del tipo de datos y del sistema operativo del
servidor.
dbinfo DB2 establece este argumento antes de llamar a la rutina. Sólo está
presente si la sentencia CREATE para la rutina especifica la palabra clave
DBINFO. El argumento es la estructura sqludf_dbinfo definida en el
archivo de cabecera sqludf.h. Las variables de esta estructura que
contienen nombres e identificadores pueden ser más largas que el valor
más largo posible en este release de DB2, pero se definen de esta manera a
efectos de compatibilidad con releases futuros. Puede utilizar la variable de
longitud que complementa cada variable de nombre y de identificador
para leer o extraer la porción de la variable que se utilice realmente. La
estructura dbinfo contiene los elementos siguientes:
1. Longitud del nombre de base de datos (dbnamelen)
Longitud del nombre de base de datos siguiente. Este campo es un entero
corto sin signo.
2. Nombre de base de datos (dbname)
Nombre de la base de datos conectada actualmente. Este campo es un
identificador largo de 128 caracteres. El campo longitud del nombre de
base de datos descrito anteriormente identifica la longitud real de este
campo. No contiene un terminador nulo ni ningún relleno.
3. Longitud del ID de autorización de la aplicación (authidlen)
Longitud del ID de autorización de la aplicación siguiente. Este campo es
un entero corto sin signo.
4. ID de autorización de la aplicación (authid)
ID de autorización de ejecución de la aplicación. Este campo es un
identificador largo de 128 caracteres. No contiene un terminador nulo
ni ningún relleno. El campo longitud del ID de autorización de la
aplicación descrito anteriormente identifica la longitud real de este
campo.
5. Páginas de códigos del entorno (codepg)
Se trata de una unión de tres estructuras de 48 bytes; una es común
para todos los productos de la base de datos DB2 (cdpg_db2), otra se
utiliza en las rutinas escritas para versiones anteriores de la base de
datos DB2 (cdpg_cs) y la última se utiliza en versiones anteriores de
DB2 UDB para z/OS y OS/390 (cdpg_mvs). Con miras a la
portabilidad, es recomendable que la estructura común, cdpg_db2, se
utilice en todas las rutinas.
La estructura cdgp_db2 está formada por una matriz
(db2_ccsids_triplet) de tres conjuntos de información de página de
códigos que representa los esquemas de codificación posibles de la
base de datos del modo siguiente:
352 Desarrollo de aplicaciones de SQL incorporado
![Page 361: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/361.jpg)
a. Esquema de codificación ASCII. Tenga en cuenta que, para
mantener la compatibilidad con la versión anterior de la base de
datos DB2, si la base de datos es Unicode, la información
correspondiente al esquema de codificación Unicode se colocará
aquí, además de aparecer en el tercer elemento.
b. Esquema de codificación EBCDIC
c. Esquema de codificación Unicode
Después de la información de los esquemas de codificación, se
encuentra el índice de matriz del esquema de codificación para la
rutina (db2_encoding_scheme).
Cada elemento de la matriz está compuesto por tres campos:
v db2_sbcs. Página de códigos de un solo byte, un entero largo sin
signo.
v db2_dbcs. Página de códigos de doble byte, un entero largo sin
signo.
v db2_mixed. Página de códigos compuesta (también conocida como
página de códigos mixta), un entero largo sin signo. 6. Longitud del nombre de esquema (tbschemalen)
Longitud del nombre del esquema siguiente. Contiene 0 (cero) si no se
pasa un nombre de tabla. Este campo es un entero corto sin signo.
7. Nombre del esquema (tbschema)
Esquema del nombre de la tabla siguiente. Este campo es un
identificador largo de 128 caracteres. No contiene un terminador nulo
ni ningún relleno. El campo longitud del nombre de esquema descrito
anteriormente identifica la longitud real de este campo.
8. Longitud del nombre de tabla (tbnamelen)
Longitud del nombre de la tabla siguiente. Contiene 0 (cero) si no se
pasa un nombre de tabla. Este campo es un entero corto sin signo.
9. Nombre de la tabla (tbname)
Nombre de la tabla que se está actualizando o insertando. Este campo
sólo se establece si la referencia a la rutina se encuentra a la derecha
de una cláusula SET de una sentencia UPDATE o si es un elemento de
la lista VALUES de una sentencia INSERT. Este campo es un
identificador largo de 128 caracteres. No contiene un terminador nulo
ni ningún relleno. El campo longitud del nombre de tabla descrito
anteriormente identifica la longitud real de este campo. El campo
nombre del esquema descrito anteriormente forma, junto con este campo,
el nombre de tabla completamente calificado.
10. Longitud del nombre de columna (colnamelen)
Longitud del nombre de columna siguiente. Contiene un 0 (cero) si no
se pasa un nombre de columna. Este campo es un entero corto sin
signo.
11. Nombre de la columna (colname)
Bajo las mismas condiciones exactas que se aplican al nombre de la
tabla, este campo contiene el nombre de la columna que se ha de
actualizar o insertar; de lo contrario, es imprevisible. Este campo es un
identificador largo de 128 caracteres. No contiene un terminador nulo
ni ningún relleno. El campo longitud del nombre de columna descrito
anteriormente identifica la longitud real de este campo.
12. Número de versión/release (ver_rel)
Capítulo 5. Desarrollo de rutinas externas 353
![Page 362: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/362.jpg)
Campo de 8 caracteres que identifica el producto y la versión, el
release y el nivel de modificación del mismo, con el formato pppvvrrm,
donde:
v ppp identifica el producto, del modo siguiente:
DSN DB2 Universal Database para z/OS o OS/390
ARI SQL/DS o DB2 para VM o VSE
QSQ DB2 Universal Database para iSeries
SQL DB2 Database para Linux, UNIX y Windowsv vv es un identificador de versión de dos dígitos.
v rr es un identificador de release de dos dígitos.
v m es un identificador de nivel de modificación de un dígito.13. Campo reservado (resd0)
Este campo es para usos futuros.
14. Plataforma (platform)
Sistema operativo (plataforma) del servidor de aplicaciones, tal como
se indica a continuación:
SQLUDF_PLATFORM_AIX AIX
SQLUDF_PLATFORM_HP HP-UX
SQLUDF_PLATFORM_LINUX
Linux
SQLUDF_PLATFORM_MVS OS/390
SQLUDF_PLATFORM_NT Windows 2000, Windows XP
SQLUDF_PLATFORM_SUN Sistema operativo Solaris
SQLUDF_PLATFORM_WINDOWS95
Windows 95, Windows 98, Windows
Me
SQLUDF_PLATFORM_UNKNOWN
Plataforma o sistema operativo
desconocidoPara informarse sobre sistemas operativos adicionales no incluidos en
la lista anterior, consulte el contenido del archivo sqludf.h.
15. Número de entradas de la lista de columnas de la función de tabla
(numtfcol)
Número de entradas distintas de cero que existen en la lista de
columnas de la función de tabla especificada en el campo lista de
columnas de la función de tabla siguiente.
16. Campo reservado (resd1)
Este campo es para usos futuros.
17. ID de rutina del procedimiento almacenado que ha invocado la rutina
actual (procid)
El ID de rutina del procedimiento almacenado coincide con la
columna ROUTINEID de SYSCAT.ROUTINES, que se puede utilizar
para recuperar el nombre del procedimiento almacenado que realiza la
invocación. Este campo es un entero con signo de 32 bits.
18. Campo reservado (resd2)
Este campo es para usos futuros.
19. Lista de columnas de la función de tabla (tfcolumn)
Si ésta es una función de tabla, este campo es un puntero a una matriz
de enteros cortos que DB2 asigna dinámicamente. Si se trata de
cualquier otro tipo de rutina, este puntero es nulo.
Sólo se utiliza este campo para las funciones de tabla. Sólo son de
interés las n primeras entradas, donde n se especifica en el campo
354 Desarrollo de aplicaciones de SQL incorporado
![Page 363: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/363.jpg)
número de entradas de la lista de columnas de la función de tabla, numtfcol.
n puede equivaler a 0, y n es inferior o igual al número de columnas
de resultado definidas para la función en la cláusula RETURNS
TABLE(...) de la sentencia CREATE FUNCTION. Los valores
corresponden a los números ordinales de las columnas que esta
sentencia necesita de la función de tabla. Un valor de ‘1’ significa la
primera columna de resultado definida, ‘2’ significa la segunda
columna de resultado definida, y así sucesivamente, y los valores
pueden seguir cualquier orden. Tenga en cuenta que n puede ser igual
a cero, es decir, que la variable numtfcol puede ser cero, para una
sentencia parecida a SELECT COUNT(*) FROM TABLE(TF(...)) AS QQ, en
que la consulta no necesita ningún valor de columna real.
Esta matriz representa una oportunidad para realizar una
optimización. La UDF no tiene necesidad de devolver todos los
valores de todas las columnas de resultado de la función de tabla,
únicamente de aquéllas que sean necesarias en el contexto en concreto,
y éstas son las columnas identificadas (por número) en la matriz.
Dado que esta optimización puede complicar la lógica de la UDF para
lograr beneficios en el rendimiento, la UDF puede elegir devolver
todas las columnas definidas.
20. Identificador exclusivo de la aplicación (appl_id)
Este campo es un puntero a una serie C terminada en nulo que
identifica de forma exclusiva la conexión de la aplicación con DB2.
DB2 lo genera durante la conexión.
La serie tiene una longitud máxima de 32 caracteres y su formato
exacto depende del tipo de conexión establecida entre el cliente y DB2.
Generalmente, toma la forma siguiente:
x.y.ts
donde x e y varían según el tipo de conexión, pero ts es una
indicación de la hora de 12 caracteres con formato
AAMMDDHHMMSS, que DB2 ajusta potencialmente para asegurar su
exclusividad.
Ejemplo: *LOCAL.db2inst.980707130144
21. Campo reservado (resd3)
Este campo es para usos futuros.
Conceptos relacionados:
v “Estilos de parámetros de rutinas externas” en la página 298
v “Archivo de inclusión necesario para el desarrollo de rutinas C y C++
(sqludf.h)” en la página 318
Información relacionada:
v “appl_id - Application ID monitor element” en System Monitor Guide and
Reference
v “Sentencia CREATE FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia CREATE METHOD” en Consulta de SQL, Volumen 2
v “Sentencia CREATE PROCEDURE” en Consulta de SQL, Volumen 2
v “Sentencia CREATE TYPE (Estructurado)” en Consulta de SQL, Volumen 2
Capítulo 5. Desarrollo de rutinas externas 355
![Page 364: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/364.jpg)
Variables gráficas del lenguaje principal en rutinas C y C++
Generalmente, cualquier rutina escrita en C o C++ que reciba o devuelva datos
gráficos a través de su entrada o salida de parámetros se debe precompilar con la
opción WCHARTYPE NOCONVERT. Esto es debido a que los datos gráficos que
se pasan mediante dichos parámetros se considera que están en formato DBCS, en
lugar del formato de código de procesos wchar_t. La utilización de NOCONVERT
significa que los datos gráficos manipulados en sentencias de SQL de la rutina
también estarán en formato DBCS, coincidiendo así con el formato de los datos de
parámetros.
Con WCHARTYPE NOCONVERT, no se produce ninguna conversión del código
de caracteres entre la variable gráfica del lenguaje principal y el gestor de bases de
datos. Los datos de una variable gráfica del lenguaje principal se envían al gestor
de bases de datos y se reciben del mismo como caracteres DBCS inalterados. Si no
utiliza WCHARTYPE NOCONVERT, también podrá manipular datos gráficos en
formato wchar_t en una rutina; sin embargo, deberá realizar manualmente las
conversiones de entrada y salida.
Se puede utilizar CONVERT en las rutinas FENCED, lo que afectará a los datos
gráficos de las sentencias de SQL incluidas en la rutina, pero no a los datos
pasados a través de los parámetros de la rutina. Las rutinas NOT FENCED se
deben crear utilizando la opción NOCONVERT.
En resumen, los datos gráficos pasados a una rutina o devueltos por ésta mediante
sus parámetros de entrada o salida están en formato DBCS, independientemente de
cómo se haya precompilado con la opción WCHARTYPE.
Conceptos relacionados:
v “Opción del precompilador WCHARTYPE para datos gráficos en aplicaciones de
SQL incorporado C y C++” en la página 98
Información relacionada:
v “Mandato PRECOMPILE” en Consulta de mandatos
Decoración de tipos de C++
Los nombres de las funciones de C++ se pueden sobrecargar. Pueden coexistir dos
funciones de C++ con el mismo nombre si tienen argumentos distintos, por
ejemplo:
int func( int i )
e
int func( char c )
Por omisión, los compiladores C++ decoran con tipos o ’despedazan’ los nombres
de función. Esto significa que se añaden nombres de tipo de argumento a sus
nombres de función correspondientes para resolverlos, como por ejemplo en
func__Fi y func__Fc para los dos ejemplos anteriores. Los nombres despedazados
serán distintos en cada sistema operativo, por lo que no se puede transportar el
código que utiliza explícitamente un nombre despedazado.
En los sistemas operativos Windows, el nombre de función decorado con tipos se
puede determinar a partir del archivo .obj (objeto).
356 Desarrollo de aplicaciones de SQL incorporado
![Page 365: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/365.jpg)
Con el compilador Microsoft Visual C++ en Windows, puede utilizar el mandato
dumpbin para determinar el nombre de función decorado con tipos a partir del
archivo .obj (objeto), del modo siguiente:
dumpbin /symbols myprog.obj
donde myprog.obj es el archivo de objeto del programa.
En los sistemas operativos UNIX, el nombre de función decorado con tipos se
puede determinar a partir del archivo .o (objeto), o de la biblioteca compartida,
utilizando el mandato nm. Este mandato puede producir una salida considerable,
por lo que se le aconseja que conduzca la salida a través de grep para buscar la
línea correcta, del modo siguiente:
nm myprog.o | grep myfunc
donde myprog.o es el archivo de objeto del programa y myfunc es la función en el
archivo fuente del programa.
La salida producida por todos estos mandatos incluye una línea con el nombre de
función despedazado. Por ejemplo, en UNIX, dicha línea es parecida a la siguiente:
myfunc__FPlT1PsT3PcN35| 3792|unamex| | ...
Una vez obtenido el nombre de función despedazado de uno de los mandatos
anteriores, lo podrá utilizar en el mandato apropiado. Esto se muestra más
adelante en este apartado al utilizar el nombre de función despedazado que se ha
obtenido en el ejemplo de UNIX anterior. Un nombre de función despedazado
obtenido en Windows se utilizaría de la misma manera.
Cuando se registra una rutina con la sentencia CREATE, la cláusula EXTERNAL
NAME debe especificar el nombre de función despedazado. Por ejemplo:
CREATE FUNCTION myfunco(...) RETURNS...
...
EXTERNAL NAME ’/whatever/path/myprog!myfunc__FPlT1PsT3PcN35’
...
Si la biblioteca de rutinas no contiene nombres de funciones de C++ sobrecargados,
existe la opción de utilizar extern "C" para hacer que el compilador no decore con
tipos los nombres de función. (Tenga en cuenta que siempre puede sobrecargar los
nombres de función de SQL asignados a las UDF, ya que DB2 resuelve qué función
de biblioteca debe invocar basándose en el nombre y los parámetros que toma.)
Capítulo 5. Desarrollo de rutinas externas 357
![Page 366: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/366.jpg)
En este ejemplo, el compilador no decora con tipos las UDF fold y findvwl, que se
deben registrar en la sentencia CREATE FUNCTION utilizando sus nombres
llanos. De forma similar, si un método o procedimiento almacenado C++ se
codifica con extern "C", se utilizará su nombre de función no decorado en la
sentencia CREATE.
Conceptos relacionados:
v “Manejo de parámetros en procedimientos PROGRAM TYPE MAIN o
PROGRAM TYPE SUB” en Desarrollo de SQL y rutinas externas
v “Estilos de parámetros de rutinas externas” en la página 298
Devolución de conjuntos de resultados desde procedimientos C
y C++
Puede desarrollar procedimientos C y C++ que devuelvan conjuntos de resultados
a una rutina o aplicación llamadora implementada mediante una API que permita
recuperar conjuntos de resultados de procedimientos. La mayoría de las API
permiten recuperar conjuntos de resultados de procedimientos, pero no en el caso
de SQL incorporado.
La representación C y C++ de un conjunto de resultados es un cursor SQL.
Cualquier cursor SQL que se haya declarado y abierto, pero no explícitamente
cerrado dentro de un procedimiento, antes del retorno del procedimiento se puede
devolver al llamador. El orden en que se devuelven los conjuntos de resultados al
llamador coincide con el orden en que los objetos cursor se abren dentro de la
rutina. No se necesitan parámetros adicionales en la sentencia CREATE
PROCEDURE ni en la implementación del procedimiento para devolver un
conjunto de resultados.
#include <string.h>
#include <stdlib.h>
#include "sqludf.h"
/*---------------------------------------------------------------------*/
/* función fold: salida = la serie de entrada se dobla en el punto */
/* indicado por el segundo argumento. */
/* entradas: CLOB, serie de entrada */
/* LONG posición por la que doblar */
/* salida: CLOB serie doblada */
/*---------------------------------------------------------------------*/
extern "C" void fold(
SQLUDF_CLOB *in1, /* entrada CLOB a doblar */
...
...
}
/* fin de UDF: fold */
/*---------------------------------------------------------------------*/
/* función find_vowel: */
/* devuelve la posición de la primera vocal */
/* devuelve un error si no hay ninguna vocal */
/* definida como NOT NULL CALL */
/* entradas: VARCHAR(500) */
/* salida: INTEGER */
/*---------------------------------------------------------------------*/
extern "C" void findvwl(
SQLUDF_VARCHAR *in, /* entrada smallint */
...
...
}
/* fin de UDF: findvwl */
358 Desarrollo de aplicaciones de SQL incorporado
![Page 367: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/367.jpg)
Prerrequisitos:
Un conocimiento general de cómo se crean las rutinas C y C++ le ayudará a seguir
los pasos del procedimiento que figura más abajo para devolver resultados de un
procedimiento C o C++.
Creación de rutinas C y C++
Los cursores declarados en procedimientos de SQL incorporado en C o C++ no son
cursores desplazables.
Procedimiento:
Para devolver un conjunto de resultados de un procedimiento C o C++:
1. En la sentencia CREATE PROCEDURE del procedimiento C o C++, debe
especificar, junto con cualquier otra cláusula pertinente, la cláusula DYNAMIC
RESULT SETS con un valor igual al número máximo de conjuntos de
resultados que debe devolver el procedimiento.
2. Los marcadores de parámetros no son necesarios en la declaración de un
procedimiento para un conjunto de resultados que se va a devolver al llamador.
3. En la implementación de procedimiento C o C++ de la rutina, declare un cursor
mediante la sentencia DECLARE CURSOR en la sección de declaraciones en las
que se declaran las variables del lenguaje principal. La declaración del cursor
asocia un SQL al cursor.
4. Dentro del código de la rutina C o C++, abra el cursor ejecutando la sentencia
OPEN. Con ello se ejecuta la consulta especificada en la sentencia DECLARE
CURSOR, y el resultado de la consulta se asocia al cursor.
5. Opcional: capte filas del conjunto de resultados asociado al cursor mediante la
sentencia FETCH.
6. No ejecute la sentencia CLOSE que sirve para cerrar el cursor en ningún
momento anterior al retorno del procedimiento al llamador. El cursor abierto se
devolverá como conjunto de resultados al llamador cuando el procedimiento
retorne.
Cuando se deja abierto más de un cursor después del retorno de un
procedimiento, los conjuntos de resultados asociados a los cursores se
devuelven al llamador en el orden en que se abrieron. Con el procedimiento no
se pueden devolver más del número máximo de conjuntos de resultados
especificados por el valor de la cláusula DYNAMIC RESULT SETS. Si el
número de cursores que se han dejado abiertos en la implementación del
procedimiento es mayor que el valor especificado por la cláusula DYNAMIC
RESULT SETS, los conjuntos de resultados en exceso no se devuelven. Cuando
se da esta situación, DB2 no indica ningún mensaje de error o aviso.
Una vez que la creación del procedimiento C o C++ se ha completado
satisfactoriamente, ya se puede invocar el procedimiento con la sentencia CALL
desde el procesador de línea de mandatos (CLP) de DB2 o desde una ventana de
mandatos de DB2 para verificar que los conjuntos de resultados se han devuelto
satisfactoriamente al llamador.
Si desea obtener información sobre la llamada a procedimientos y otros tipos de
rutinas:
v Invocación de la rutina
Capítulo 5. Desarrollo de rutinas externas 359
![Page 368: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/368.jpg)
Consideraciones sobre la precompilación y vinculación para
rutinas de SQL incorporado
Concept text
Creación de rutinas C y C++
Los procedimientos y funciones que hacen referencia a una biblioteca C o C++ se
crean de forma similar a las rutinas externas con otras implementaciones. Esta
tarea comprende unos pasos, incluida la formulación de la sentencia CREATE para
la rutina, la codificación de la implementación de la rutina, la precompilación, la
compilación y enlace de código, y el despliegue de código fuente.
Elegirá implementar una rutina C o C++ si:
v Desea encapsular lógica compleja en una rutina que acceda a la base de datos o
que realice una acción fuera de la base de datos.
v Necesita que la lógica encapsulada se invoque desde cualquiera de estos
elementos: diversas aplicaciones, el CLP, otra rutina (procedimiento, función
(UDF) o método) o un activador.
v Se siente más cómodo codificando este lógica con lenguaje de programación de
SQL incorporado como C o C++.
Requisitos previos:
v Conocimiento de la implementación de rutinas C y C++. Para obtener
información sobre las rutinas C y C++ en general, consulte:
– Rutinas C y C++ “Rutinas C y C++” en la página 314v El Cliente DB2, que incluye el soporte de desarrollo de aplicaciones debe estar
instalado en el sistema cliente.
v El servidor de bases de datos debe ejecutar un sistema operativo que dé soporte
a un compilador C o C++ soportado de DB2 para el desarrollo de rutinas.
v Los compiladores necesarios deben estar instalados en el servidor de base de
datos.
v Autorización para ejecutar la sentencia CREATE correspondiente a la rutina
externa. Si desea saber cuáles son los privilegios necesarios para ejecutar la
sentencia CREATE PROCEDURE o la sentencia CREATE FUNCTION, consulte
la documentación de la sentencia.
Procedimiento:
1. Codifique la lógica de la rutina en el lenguaje de programación elegido: C o
C++.
v Para obtener información general sobre rutinas C y C++ y características de
las rutinas C y C++, consulte los temas a los que se hace referencia en la
sección Requisitos previos.
v Incluya los archivos de cabecera de C o C++ necesarios para funciones
adicionales de C, así como los archivos de cabecera de C o C++ de DB2
necesarios para el tipo de datos de SQL y el soporte de ejecución de SQL.
Incluya los siguientes archivos de cabecera: sqludf.h, sql.h, sqlda.h, sqlca.h y
memory.h.
v Debe implementarse una signatura de parámetro de rutina utilizando uno de
los estilos de parámetros soportados. Se recomienda utilizar el estilo de
parámetros SQL para todas las rutinas C y C++. Las áreas reutilizables y las
360 Desarrollo de aplicaciones de SQL incorporado
![Page 369: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/369.jpg)
estructuras dbinfo se pasan a las rutinas C y C++ como parámetros. Si desea
más información sobre las signaturas de parámetros y las implementaciones
de parámetros, consulte:
– “Parámetros de rutinas C y C++” en la página 319
– “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
– “Estilo de parámetros SQL en procedimientos C y C++” en la página 320v Declare variables del lenguaje principal y marcas de parámetros de la misma
manera que se hace para las aplicaciones C y C++ de SQL incorporado.
Utilice correctamente los tipos de datos que se correlacionan con tipos de
datos de SQL de DB2. Para obtener más información sobre la correlación de
tipos de datos entre DB2 y C o C++, consulte:
– Tipos de datos de SQL soportados en aplicaciones y rutinas C y C++v Incluya la lógica de la rutina. La lógica de la rutina puede constar de
cualquier código soportado en el lenguaje de programación C o C++.
También puede incluir la ejecución de sentencias de SQL incorporado, que se
implementan de la misma manera que para las aplicaciones de SQL
incorporado. Para obtener más información sobre la ejecución de sentencias
de SQL en SQL incorporado, consulte:
– ″Ejecución de sentencias de SQL en aplicaciones de SQL incorporado″
v Si la rutina es un procedimiento y desea devolver un conjunto de resultados
al llamador de la rutina, no es necesario ningún parámetro para el conjunto
de resultados. Si desea más información sobre la devolución de conjuntos de
resultados desde rutinas:
– Devolución de conjuntos de resultados procedentes de procedimientos C y
C++v Establezca un valor de retorno de rutina al final de la rutina.
2. Construya el código para generar un archivo de biblioteca. Para obtener
información sobre cómo crear rutinas C y C++ de SQL incorporado, consulte:
v “Creación del código de rutinas C y C++” en la página 3623. Copie la biblioteca al directorio de función de DB2 del servidor de bases de
datos. Es recomendable almacenar las bibliotecas asociadas con rutinas de DB2
en el directorio de función. Para conocer más acerca del directorio de función,
consulte la cláusula EXTERNAL de una de las sentencias siguientes: CREATE
PROCEDURE o CREATE FUNCTION.
Puede copiar la biblioteca en otro directorio del servidor, pero para invocar la
rutina satisfactoriamente, debe anotar el nombre de la vía de acceso totalmente
calificada de la biblioteca, ya que lo necesitará en el paso siguiente.
4. Ejecute de forma dinámica o estática la sentencia CREATE de lenguaje SQL
correspondiente para el tipo de rutina: CREATE PROCEDURE o CREATE
FUNCTION.
v Especifique la cláusula LANGUAGE con el valor: C
v Especifique la cláusula PARAMETER STYLE con el nombre del estilo de
parámetros soportado que se ha implementado en el código de la rutina. Se
recomienda utilizar PARAMETER STYLE SQL.
v Especifique la cláusula EXTERNAL con el nombre de la biblioteca que se ha de
asociar con la rutina utilizando uno de los valores siguientes:
– el nombre de vía de acceso completamente calificado de la biblioteca de
rutina
– el nombre de vía de acceso relativo de la biblioteca de rutina en relación
con el directorio de función.
Capítulo 5. Desarrollo de rutinas externas 361
![Page 370: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/370.jpg)
Por omisión, DB2 buscará la biblioteca en el directorio de función, a menos
que se especifique un nombre de vía de acceso completamente calificado o
relativo para la biblioteca en la cláusula EXTERNAL.
v Especifique DYNAMIC RESULT SETS con un valor numérico si la rutina es
un procedimiento y ha de devolver uno o varios conjunto de resultados al
llamador.
v Especifique otros valores de cláusula no por omisión en la sentencia CREATE
a utilizar para caracterizar la rutina.
Para invocar la rutina C o C++, consulte Invocación de la rutina
Conceptos relacionados:
v “Parámetros de rutinas C y C++” en la página 319
v “Estilo de parámetros SQL en procedimientos C y C++” en la página 320
v “Estilo de parámetros SQL en funciones C y C++” en la página 324
v “Invocación de rutinas” en Desarrollo de SQL y rutinas externas
v “Rutinas C y C++” en la página 314
Tareas relacionadas:
v “Creación del código de rutinas C y C++” en la página 362
Información relacionada:
v “Tipos de datos de SQL soportados en rutinas C y C++” en la página 331
Creación del código de rutinas C y C++
Creación del código de rutinas C y C++
Una vez se ha escrito el código de implementación de una rutina C o C++ de SQL
incorporado, se debe incorporar en una biblioteca y desplegar para que se pueda
invocar la rutina. Aunque los pasos a seguir para crear rutinas C y C++ de SQL
incorporado son parecidos a los necesarios para crear aplicaciones C y C++ de SQL
incorporado, hay algunas diferencias. Los mismos pasos se pueden seguir si no
hay sentencias de SQL incorporado dentro de las rutinas; el procedimiento será
más rápido y sencillo.
Hay dos formas de crear rutinas C y C++:
v Mediante scripts de creación de ejemplo de DB2 (UNIX) o archivos de proceso
por lotes de creación (Windows)
v Especificando mandatos del compilador de DB2 y C o C++ desde una ventana
de mandatos de DB2
Los scripts de creación de ejemplo de DB2 y los archivos de proceso por lotes
correspondientes a rutinas están diseñados para crear rutinas de ejemplo de DB2
(procedimientos y funciones definidas por el usuario), así como rutinas creadas por
el usuario para un determinado sistema operativo utilizando los compiladores
soportados por omisión.
Hay un conjunto separado de scripts de creación de ejemplo de DB2 y de archivos
de proceso por lotes para C y C++. En general, es más fácil crear rutinas de SQL
incorporado utilizando los scripts de creación o los archivos de proceso por lotes,
que se pueden modificar fácilmente si hace falta; sin embargo, suele resultar útil
saber cómo crear rutinas desde ventanas de mandatos de DB2.
362 Desarrollo de aplicaciones de SQL incorporado
![Page 371: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/371.jpg)
Para obtener más información sobre cada uno de los métodos para crear rutinas,
consulte los enlaces relacionados.
Conceptos relacionados:
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
v “Almacenamiento y mantenimiento de paquetes” en la página 219
v “Rutinas C y C++” en la página 314
Tareas relacionadas:
v “Creación de código de rutinas C y C++ desde ventanas de mandatos de DB2”
en la página 371
v “Creación de código de rutinas C y C++ mediante scripts bldrtn de ejemplo” en
la página 363
Información relacionada:
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
v “Opciones de compilación y enlace para rutinas C de AIX” en la página 373
v “Opciones de compilación y enlace para rutinas C++ de AIX” en la página 374
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
v “Opciones de compilación y enlace para rutinas C y C++ de Windows” en la
página 384
v “Opciones de compilación y enlace para rutinas IBM COBOL de Windows” en la
página 395
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows” en la página 396
Creación de códigos de rutinas C y C++ mediante el scripts
bldrtn de ejemplo
Creación de código de rutinas C y C++ mediante scripts bldrtn de ejemplo: La
creación de código fuente de rutinas C y C++ es una subtarea de la creación de
rutinas C y C++. Esta tarea se puede realizar de forma rápida y fácil mediante los
scripts de creación de ejemplo (UNIX) y los archivos de proceso por lotes
(Windows) de DB2. Los scripts de creación de ejemplo se pueden utilizar para el
código fuente con o sin sentencias de SQL incorporado. Los scripts de creación se
ocupan de la precompilación, compilación y enlace del código fuente C y C++, que
de otro modo se tiene que hacer con pasos individuales desde la línea de
mandatos. También se ocupan de vincular cualquier paquete a la base de datos
especificada.
Los scripts de creación de ejemplo para crear rutinas C y C++ se denominan
bldrtn. Se encuentran en directorios de DB2 junto con los programas de ejemplo
que se pueden crear con ellos, en las siguientes ubicaciones:
v Para C: sqllib/samples/c/
v Para C++: sqllib/samples/cpp/
El script bldrtn se puede utilizar para crear un archivo de código fuente que
contenga implementaciones de procedimientos y funciones. El script hace lo
siguiente:
Capítulo 5. Desarrollo de rutinas externas 363
![Page 372: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/372.jpg)
v Establece una conexión con una base de datos especificada por el usuario
v Precompila el archivo de código fuente especificado por el usuario
v Vincula el paquete con la base de datos actual
v Compila y enlaza el código fuente para generar una biblioteca compartida
v Copia la biblioteca compartida en el directorio de función de DB2 en el servidor
de bases de datos
Los scripts bldrtn aceptan dos argumentos:
v El nombre de un archivo de código fuente sin extensión de archivo
v El nombre de una base de datos con la que se establecerá una conexión
El parámetro correspondiente a la base de datos es opcional. Si no se proporciona
un nombre de base de datos, el programa utiliza la base de datos por omisión
sample. Puesto que las rutinas se tienen que crear en la misma instancia en la que
reside la base de datos, no se necesitan argumentos para ID de usuario y
contraseña.
Requisitos previos:
v Archivo de código fuente que contenga una o más implementaciones de rutina.
v El nombre de la base de datos dentro de la instancia de DB2 actual en la que se
van a crear las rutinas.
Procedimiento:
Para crear un archivo de código fuente que contenga una o más implementaciones
de código de rutina, siga los pasos siguientes.
1. Abra una ventana de mandatos de DB2.
2. Copie el archivo de código fuente en el mismo directorio que el script bldrtn.
3. Si las rutinas se van a crear en la base de datos sample, especifique el nombre
del script de creación seguido del nombre del archivo de código fuente sin la
extensión de archivo .sqc o .sqC.
bldrtn <nombre-archivo>
Si las rutinas se van a crear en otra base de datos, especifique el nombre del
script de creación, el nombre del archivo de código fuente sin extensión de
archivo y el nombre de la base de datos:
bldrtn <nombre-archivo> <nombre-basedatos>
El script precompila, compila y enlaza el código fuente y genera una biblioteca
compartida. Luego el script copia la biblioteca compartida en el directorio de
función en el servidor de bases de datos.
4. Si no es la primera vez que se crea el archivo de código fuente que contiene las
implementaciones de rutinas, detenga y vuelva a iniciar la base de datos para
asegurarse de que DB2 utiliza la nueva versión de la biblioteca compartida.
Puede hacerlo especificando db2stop seguido de db2start en la línea de
mandatos.
Cuando haya creado satisfactoriamente la biblioteca compartida de rutinas y la
haya desplegado en el directorio de función en el servidor de bases de datos, debe
completar los pasos asociados a la tarea de crear rutinas C y C++. Una vez
completada la creación de rutinas, podrá invocar las rutinas.
Información relacionada:
364 Desarrollo de aplicaciones de SQL incorporado
![Page 373: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/373.jpg)
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows” en la página 396
v “Opciones de compilación y enlace para rutinas C de AIX” en la página 373
v “Opciones de compilación y enlace para rutinas C++ de AIX” en la página 374
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
v “Opciones de compilación y enlace para rutinas C y C++ de Windows” en la
página 384
v “Opciones de compilación y enlace para rutinas IBM COBOL de Windows” en la
página 395
Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX): DB2 proporciona scripts de creación para compilar y enlazar programas
en C y C++. Se encuentran en el directorio sqllib/samples/c para rutinas en C y
en el directorio sqllib/samples/cpp para rutinas en C++, junto con programas de
ejemplo que se pueden crear con estos archivos.
El script bldrtn contiene los mandatos para crear rutinas (procedimientos
almacenados y funciones definidas por el usuario). El script compila la rutina y
crea una biblioteca compartida que puede ser cargada por el gestor de bases de
datos y llamada por una aplicación cliente.
El primer parámetro, $1, especifica el nombre del archivo fuente. El segundo
parámetro, $2, especifica el nombre de la base de datos a la que desea conectarse.
El parámetro correspondiente a la base de datos es opcional. Si no se proporciona
un nombre de base de datos, el programa utiliza la base de datos por omisión
sample. Debido a que el procedimiento almacenado se debe crear en la misma
instancia donde reside la base de datos, no hay parámetros para el ID de usuario
ni la contraseña.
Procedimiento:
Los ejemplos siguientes muestran cómo crear bibliotecas compartidas de rutinas
mediante:
v procedimientos almacenados
v funciones definidas por el usuario (UDF) de SQL no incorporado
v funciones definidas por el usuario (UDF) de SQL incorporado
Biblioteca compratida de procedimientos almacenados
Puede crear el programa de ejemplo spserver a partir del archivo fuente
spserver.sqc para C y spserver.sqC para C++:
1. Si conecta con la base de datos sample, especifique el nombre del script de
creación y el nombre del programa:
bldrtn spserver
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn spserver basedatos
Capítulo 5. Desarrollo de rutinas externas 365
![Page 374: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/374.jpg)
El script copia la biblioteca compartida en el directorio sqllib/function del
servidor.
2. A continuación, catalogue las rutinas ejecutando el script spcat en el servidor:
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.
Puede también ejecutar los scripts spdrop.db2 y spcreate.db2 por separado.
3. A continuación, si no es la primera vez que se crea el procedimiento
almacenado, detenga y reinicie la base de datos para asegurarse que se
reconoce la nueva versión de la biblioteca compartida. Lo puede hacer entrando
en la línea de mandatos db2stop seguido de db2start.
Una vez creada la biblioteca compartida, spserver, puede crear la aplicación
cliente, spclient, la cual accede a la biblioteca compartida.
Puede crear spclient utilizando el archivo de script, bldapp.
Para invocar los procedimientos almacenados en la biblioteca compartida, ejecute
la aplicación cliente de ejemplo, especificando lo siguiente: spclient basedatos
IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre de base de datos.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la biblioteca compartida, spserver, y ejecuta diversas
funciones de procedimiento almacenado en la base de datos del servidor. Los datos
resultantes se devuelven a la aplicación cliente.
Biblioteca compartida de UDF de SQL incorporado
Puede crear el programa de función definida por el usuario de SQL incorporado,
udfemsrv, a partir del archivo fuente udfemsrv.sqc para C y udfemsrv.sqC para
C++. Si conecta con la base de datos sample, especifique el nombre del script de
creación y el nombre del programa:
bldrtn udfemsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn udfemsrv basedatos
El script copia la UDF en el directorio sqllib/function.
366 Desarrollo de aplicaciones de SQL incorporado
![Page 375: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/375.jpg)
Una vez creado el programa udfemsrv, puede crear la aplicación cliente, udfemcli,
que llama al programa. Puede crear el programa cliente udfemcli a partir del
archivo fuente udfemcli.sqc, contenido en sqllib/samples/c, utilizando el script
bldapp.
Para invocar las UDF de la biblioteca compartida, ejecute la aplicación cliente,
especificando lo siguiente: udfemcli basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre de base de datos.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la biblioteca compartida, udfemsrv, y ejecuta las
funciones definidas por el usuario contenidas en la base de datos del servidor. Los
datos resultantes se devuelven a la aplicación cliente.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Tareas relacionadas:
v “Creación de aplicaciones en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 225
Información relacionada:
v “Opciones de compilación y enlace para rutinas C de AIX” en la página 373
v “Opciones de compilación y enlace para rutinas C de HP-UX” en la página 376
v “Opciones de compilación y enlace para rutinas C de Linux” en la página 378
v “Opciones de compilación y enlace para rutinas C de Solaris” en la página 381
Ejemplos relacionados:
v “bldrtn -- Builds AIX C routines (stored procedures and UDFs) (C)”
v “bldrtn -- Builds HP-UX C routines (stored procedures and UDFs) (C)”
v “bldrtn -- Builds Linux C routines (stored procedures or UDFs) (C)”
v “bldrtn -- Builds Solaris C routines (stored procedures or UDFs) (C)”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
v “spclient.sqc -- Call various stored procedures (C)”
v “spserver.sqc -- Definition of various types of stored procedures (C)”
v “udfemcli.sqc -- Call a variety of types of embedded SQL user-defined functions.
(C)”
v “udfemsrv.sqc -- Call a variety of types of embedded SQL user-defined
functions. (C)”
Creación de rutinas C/C++ en Windows: DB2 proporciona scripts de creación
para compilar y enlazar programas de la API de DB2 y de SQL incorporado en C y
Capítulo 5. Desarrollo de rutinas externas 367
![Page 376: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/376.jpg)
C++. Estos archivos residen en los directorios sqllib/samples/c y
sqllib\samples\cpp, junto con programas de ejemplo que se pueden crear a partir
de esos archivos.
El archivo de proceso por lotes bldrtn.bat contiene los mandatos para crear
rutinas (procedimientos almacenados y funciones definidas por el usuario) de SQL
incorporado. El archivo de proceso por lotes crea una DLL en el servidor. Utiliza
dos parámetros como entrada, que están representados dentro del archivo de
proceso por lotes por las variables %1 y %2.
El primer parámetro, %1, especifica el nombre del archivo fuente. El archivo de
proceso por lotes utiliza el nombre del archivo fuente para el nombre de la DLL El
segundo parámetro, %2, especifica el nombre de la base de datos a la que desea
conectarse. Debido a que la DLL se debe crear en la misma instancia donde reside
la base de datos, no hay parámetros para el ID de usuario ni la contraseña.
Sólo es obligatorio el primer parámetro, el nombre del archivo fuente. El nombre
de la base de datos es opcional. Si no se proporciona un nombre de base de datos,
el programa utiliza la base de datos por omisión sample.
Procedimiento:
Los ejemplos siguientes muestran cómo crear las DLL de rutinas mediante:
v procedimientos almacenados
v funciones definidas por el usuario (UDF) de SQL no incorporado
v funciones definidas por el usuario (UDF) de SQL incorporado
DLL de procedimiento almacenado
Para crear la DLL spserver a partir del archivo fuente C, spserver.sqc, o a partir
del archivo fuente C++, spserver.sqx:
1. Escriba el nombre del archivo de proceso por lotes y el nombre del programa:
bldrtn spserver
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn spserver basedatos
El archivo de proceso por lotes utiliza el archivo de definición de módulos,
spserver.def, que reside en el mismo directorio que los programas de ejemplo,
para crear la DLL. El archivo de proceso por lotes copia la DLL, spserver.dll,
en el directorio sqllib\function del servidor.
2. A continuación, catalogue las rutinas ejecutando el script spcat en el servidor:
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.
Puede también ejecutar los scripts spdrop.db2 y spcreate.db2 por separado.
3. A continuación, detenga y rearranque la base de datos para que se reconozca la
nueva DLL. Si es necesario, establezca la modalidad de archivo para la DLL a
fin de que la instancia de DB2 pueda acceder a la DLL.
368 Desarrollo de aplicaciones de SQL incorporado
![Page 377: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/377.jpg)
Una vez creada la DLL, spserver, puede crear la aplicación cliente spclient, la
cual accede a la DLL.
Puede crear spclient utilizando el archivo de proceso por lotes, bldapp.bat.
Para invocar la DLL, ejecute la aplicación cliente de ejemplo, especificando lo
siguiente:
spclient basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre de base de datos.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la DLL, spserver, la cual ejecuta varias rutinas
contenidas en la base de datos del servidor. Los datos resultantes se devuelven a la
aplicación cliente.
DLL de funciones definidas por el usuario de SQL no incorporado
Para crear la función definida por el usuario udfsrv a partir del archivo fuente
udfsrv.c, especifique:
bldrtn udfsrv
El archivo de proceso por lotes utiliza el archivo de definición de módulos,
udfsrv.def, que reside en el mismo directorio que los programas de ejemplo, para
crear la DLL de función definida por el usuario. El archivo de proceso por lotes
copia la DLL de función definida por el usuario, udfsrv.dll, en el directorio
sqllib\function del servidor.
Una vez creado el programa udfsrv, puede crear la aplicación cliente, udfcli, la
cual llama al programa. Se proporcionan versiones en C y C++ de este programa
para la CLI de DB2 y de SQL incorporado.
Puede crear el programa udfcli de la CLI de DB2 a partir del archivo fuente
udfcli.c situado en sqllib\samples\cli utilizando el archivo de proceso por lotes
bldapp.
Puede crear el programa en C udfcli de SQL incorporado a partir del archivo
fuente udfcli.sqc, situado en sqllib\samples\c, utilizando el archivo de proceso
por lotes bldapp.
Puede crear el programa en C++ udfcli de SQL incorporado a partir del archivo
fuente udfcli.sqx, situado en sqllib\samples\cpp, utilizando el archivo de proceso
por lotes bldapp.
Para ejecutar la UDF (función definida por el usuario), especifique:
udfcli
Capítulo 5. Desarrollo de rutinas externas 369
![Page 378: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/378.jpg)
La aplicación solicitante llama a la función ScalarUDF de la DLL udfsrv.
DLL de UDF de SQL incorporado
Para crear la biblioteca de función definida por el usuario de SQL incorporado
udfemsrv, a partir del archivo fuente C udfemsrv.sqc de sqllib\samples\c, o a
partir del archivo C++ udfemsrv.sqx de sqllib\samples\cpp, especifique:
bldrtn udfemsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn udfemsrv basedatos
El archivo de proceso por lotes utiliza el archivo de definición de módulos,
udfemsrv.def, que reside en el mismo directorio que los programas de ejemplo,
para crear la DLL de función definida por el usuario. El archivo de proceso por
lotes copia la DLL de función definida por el usuario, udfemsrv.dll, en el
directorio sqllib\function del servidor.
Una vez creado el programa udfemsrv, puede crear la aplicación cliente, udfemcli,
que llama al programa. Puede crear udfemcli a partir del archivo fuente C
udfemcli.sqc de sqllib\samples\c, o a partir del archivo fuente C++ udfemcli.sqx
de sqllib\samples\cpp, utilizando el archivo de proceso por lotes bldapp.
Para ejecutar la UDF (función definida por el usuario), especifique:
udfemcli
La aplicación solicitante llama a las UDF contenidas en la DLL udfemsrv.
Información relacionada:
v “Opciones de compilación y enlace para rutinas C y C++ de Windows” en la
página 384
Ejemplos relacionados:
v “bldrtn.bat -- Builds C routines (stored procedures and UDFs) on Windows”
v “embprep.bat -- Prep and binds a C/C++ or Micro Focus COBOL embedded
SQL program on Windows”
v “spclient.sqc -- Call various stored procedures (C)”
v “spserver.sqc -- Definition of various types of stored procedures (C)”
v “udfcli.sqc -- Call a variety of types of user-defined functions (C)”
v “udfemcli.sqc -- Call a variety of types of embedded SQL user-defined functions.
(C)”
v “udfemsrv.sqc -- Call a variety of types of embedded SQL user-defined
functions. (C)”
v “udfsrv.c -- Defines a variety of types of user-defined functions (C)”
v “bldrtn.bat -- Builds C++ routines (stored procedures and UDFs) on Windows”
v “spclient.sqC -- Call various stored procedures (C++)”
v “spserver.sqC -- Definition of various types of stored procedures (C++)”
v “udfcli.sqC -- Call a variety of types of user-defined functions (C++)”
v “udfemcli.sqC -- Call a variety of types of embedded SQL user-defined
functions. (C++)”
370 Desarrollo de aplicaciones de SQL incorporado
![Page 379: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/379.jpg)
v “udfemsrv.sqC -- Call a variety of types of embedded SQL user-defined
functions. (C++)”
v “udfsrv.C -- Defines a variety of types of user-defined functions (C++)”
Creación de código de rutinas C y C++ desde ventanas de
mandatos de DB2
La creación de código fuente de rutinas C y C++ es una subtarea de la creación de
rutinas C y C++. Esta tarea se puede realizar de forma manual desde la línea de
mandatos. Se puede seguir el mismo procedimiento independientemente de si hay
o no sentencias de SQL incorporado dentro del código de rutinas C o C++. Los
pasos de la tarea incluyen precompilación, compilación y enlace de código fuente
C y C++ que contiene implementaciones de rutinas, vinculación del paquete
generado (si había sentencias de SQL incorporado) y despliegue de la biblioteca
compartida. Puede realizar esta tarea desde una ventana de mandatos de DB2
como parte de la prueba del uso de un precompilador, compilador u opción de
vinculación, si desea diferir la vinculación de los paquetes de la rutina hasta más
adelante o si está desarrollando scripts de creación personalizados.
Como alternativa, puede utilizar los scripts de creación de ejemplo de DB2 para
simplificar esta tarea. Consulte: Creación de código de rutinas C y C++ de SQL
incorporado mediante scripts de creación de ejemplo.
Requisitos previos:
v El archivo de código fuente que contenga una o más implantaciones de rutinas
C o C++ de SQL incorporado.
v El nombre de la base de datos dentro de la instancia de DB2 actual en la que se
van a crear las rutinas.
v Las opciones de compilación y enlace específicas del sistema operativo
necesarias para crear rutinas C y C++. Consulte los temas a los que se hace
referencia en los enlaces relacionados al final de este tema.
Procedimiento:
Para crear un archivo de código fuente que contenga una o más implementaciones
de código de rutina, siga los pasos siguientes. A continuación se describe un
ejemplo que muestra cada uno de los pasos:
1. Abra una ventana de mandatos de DB2.
2. Navegue hasta el directorio que contiene el archivo de código fuente.
3. Establezca una conexión con la base de datos en la que se van a crear las
rutinas.
4. Precompile el archivo de código fuente.
5. Enlace el paquete que se ha generado con la base de datos.
6. Compile el archivo de código fuente.
7. Enlace el archivo de código fuente para generar una biblioteca compartida. Para
ello hay que utilizar algunas opciones de compilación y enlace específicas de
DB2 correspondientes a compilador que se utiliza.
8. Copie la biblioteca compartida en el directorio de función de DB2 en el
servidor de bases de datos.
9. Si no es la primera vez que se crea el archivo de código fuente que contiene las
implementaciones de rutinas, detenga y vuelva a iniciar la base de datos para
asegurarse de que DB2 utiliza la nueva versión de la biblioteca compartida.
Puede hacerlo emitiendo el mandato db2stop seguido del mandato db2start.
Capítulo 5. Desarrollo de rutinas externas 371
![Page 380: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/380.jpg)
Cuando haya creado y desplegado satisfactoriamente la biblioteca de rutinas, debe
completar los pasos asociados a la tarea de crear rutinas C y C++. La creación de
rutinas C y C++ incluye un paso para ejecutar la sentencia CREATE para cada
rutina implementada en el archivo de código fuente. Este paso también de debe
completar para poder invocar las rutinas.
Ejemplo:
El siguiente ejemplo muestra la recreación de un archivo de código fuente C++ de
SQL incorporado denominado myfile.sqC que contiene implementaciones de
rutinas. Las rutinas se crean en un sistema operativo AIX utilizando el compilador
IBM VisualAge C++ soportado por omisión para generar una biblioteca de rutinas
de 32 bits.
1. Abra una ventana de mandatos de DB2.
2. Navegue hasta el directorio que contiene el archivo de código fuente.
3. Establezca una conexión con la base de datos en la que se van a crear las
rutinas.
db2 connect to <nombre-basedatos>
4. Precompile el archivo de código fuente con el mandato PREPARE.
db2 prep myfile.sqC bindfile
El precompilador generará salida que indicará si la precompilación se ha
realizado satisfactoriamente o si se ha producido algún error. Este paso genera
un bindfile denominado myfile.bnd que se puede utilizar para generar un
paquete en el siguiente paso.
5. Enlace el paquete generado con la base de datos mediante el mandato BIND.
db2 bind myfile.bnd
El programa de utilidad bind generará salida que indicará si la vinculación se
ha realizado satisfactoriamente o si se ha producido algún error.
6. Compile el archivo de código fuente mediante las opciones recomendadas de
compilación y enlace:
xlC_r -qstaticinline -I$HOME/sqllib/include -c $myfile.C
El compilador generará salida si se produce algún error. Este paso genera un
archivo de exportación denominado myfile.exp.
7. Enlace el archivo de código fuente para generar una biblioteca compartida.
xlC_r -qmkshrobj -o $1 $1.o -L$ HOME/sqllib/include/lib32 -lDB2
El enlazador generará salida si se produce algún error. Este paso genera un
archivo de biblioteca compartida denominado myfile.
8. Copie la biblioteca compartida en el directorio de función de DB2 en el
servidor de bases de datos.
rm -f ~HOME/sqllib/function/myfile
cp myfile $HOME/sqllib/function/myfile
Este paso asegura que la biblioteca de la rutina está en el directorio por
omisión en el que DB2 busca bibliotecas de rutinas. Consulte el tema sobre la
creación de rutinas C y C++ para obtener más información sobre el despliegue
de bibliotecas de rutinas.
9. Detenga y vuelva a iniciar la base de datos puesto que se trata de una
recreación de un archivo de código fuente de rutina anteriormente creado.
372 Desarrollo de aplicaciones de SQL incorporado
![Page 381: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/381.jpg)
db2stop
db2start
La creación de rutinas C y C++ suele resultar más sencilla si se utilizan los scripts
de creación de ejemplo específicos del sistema operativo, que también se pueden
utilizar como referencia para ver cómo crear rutinas desde la línea de mandatos.
Conceptos relacionados:
v “Vinculación de paquetes de SQL incorporado con una base de datos” en la
página 210
v “Precompilación de aplicaciones de SQL incorporado con el mandato
PRECOMPILE” en la página 201
v “Revinculación de paquetes existentes con el mandato REBIND” en la página
215
Información relacionada:
v “Opciones de compilación y enlace para rutinas C de AIX” en la página 373
v “Opciones de compilación y enlace para rutinas C++ de AIX” en la página 374
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
v “Opciones de compilación y enlace para rutinas C y C++ de Windows” en la
página 384
v “Opciones de compilación y enlace para rutinas IBM COBOL de Windows” en la
página 395
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows” en la página 396
v “Mandato BIND” en Consulta de mandatos
v “Mandato PRECOMPILE” en Consulta de mandatos
Opciones de compilación y enlace para rutinas C y C++
Opciones de compilación y enlace para rutinas C de AIX: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C (procedimientos almacenados y funciones definidas por el usuario)
con el compilador C de IBM para AIX, tal como muestra el script de creación
bldrtn.
Capítulo 5. Desarrollo de rutinas externas 373
![Page 382: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/382.jpg)
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
xlc_r Utilizar la versión de varias hebras del compilador C de IBM, que es necesaria
porque las rutinas se pueden ejecutar en el mismo proceso que otras rutinas
(THREADSAFE) o en el propio motor (NOT FENCED).
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Opciones de enlace:
xlc_r Indica la utilización de la versión de varias hebras del compilador como interfaz
del editor de enlaces.
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-qmkshrobj
Hace que se cree la biblioteca compartida.
-o $1 Especifica el nombre del archivo de salida.
$1.o Especifica el archivo objeto.
-ldb2 Enlazar con la biblioteca de DB2.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/$LIB. Si el usuario no especifica la opción -L, el
compilador utiliza esta vía de acceso: /usr/lib:/lib.
-bE:$1.exp
Especifica un archivo de exportación. El archivo de exportación contiene una lista
de las rutinas.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Información relacionada:
v “Opciones de compilación y enlace de aplicaciones de API de DB2 y de SQL
incorporado de C de AIX” en la página 234
Ejemplos relacionados:
v “bldrtn -- Builds AIX C routines (stored procedures and UDFs) (C)”
Opciones de compilación y enlace para rutinas C++ de AIX: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C++ (procedimientos almacenados y funciones definidas por el usuario)
con el compilador XL C/C++ de IBM para AIX, tal como muestra el script de
creación bldrtn.
374 Desarrollo de aplicaciones de SQL incorporado
![Page 383: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/383.jpg)
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
xlC_r Utilizar la versión de varias hebras del compilador IBM XL C/C++, que es
necesaria porque las rutinas se pueden ejecutar en el mismo proceso que otras
rutinas (THREADSAFE) o en el propio motor (NOT FENCED).
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Opciones de enlace:
xlC_r Indica la utilización de la versión de varias hebras del compilador como interfaz
del editor de enlaces.
$EXTRA_CFLAG
Contiene ″-q64″ para una instancia en que está habilitado el soporte de 64 bits; de
lo contrario, no contiene ningún valor.
-qmkshrobj
Hace que se cree una biblioteca compartida.
-o $1 Especifica la salida como archivo de biblioteca compartida.
$1.o Especifica el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/$LIB. Si el usuario no especifica la opción -L, el
compilador utiliza esta vía de acceso: /usr/lib:/lib.
-ldb2 Enlazar con la biblioteca de DB2.
-bE:$1.exp
Especifica un archivo de exportación. El archivo de exportación contiene una lista
de las rutinas.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
v “Creación de procedimientos almacenados de SQL incorporado en C o C++ con
archivos de configuración” en la página 384
v “Creación de funciones definidas por el usuario en C o C++ con archivos de
configuración (AIX)” en la página 386
Información relacionada:
v “Opciones de compilación y enlace de aplicaciones de la API de administración
de DB2 y de SQL incorporado en C++ de AIX” en la página 235
Ejemplos relacionados:
v “bldrtn -- Builds AIX C++ routines (stored procedures and UDFs) (C++)”
Capítulo 5. Desarrollo de rutinas externas 375
![Page 384: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/384.jpg)
Opciones de compilación y enlace para rutinas C de HP-UX: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C (procedimientos almacenados y funciones definidas por el usuario)
con el compilador C de HP-UX, tal como muestra el script de creación bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cc Indica el compilador C.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.+u1 Permitir el acceso a datos no alineados. Sólo si la aplicación utiliza datos no
alineados.
+z Generar código independiente de la posición.
-Ae Habilita la modalidad ampliada ANSI de HP.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
-I$DB2PATH/include.
-D_POSIX_C_SOURCE=199506L
Opción de la biblioteca de hebras de POSIX que asegura que esté definido
_REENTRANT, opción necesaria porque las rutinas se pueden ejecutar en el
mismo proceso que otras rutinas (THREADSAFE) o en el propio motor (NOT
FENCED).
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Opciones de enlace:
ld Indica la utilización del enlazador para la edición de enlaces.
-b Crear una biblioteca compartida en lugar de un ejecutable normal.
-o $1 Especifica la salida como archivo de biblioteca compartida.
$1.o Especifica el archivo objeto del programa.
$EXTRA_LFLAG
Especificar la vía de acceso de tiempo de ejecución. Si se establece, para 32 bits
contiene el valor ″+b$HOME/sqllib/lib32″, y para 64 bits: ″+b$HOME/sqllib/lib64″.
Si no se establece, no contiene ningún valor.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Para 32 bits: $HOME/sqllib/lib32; para 64 bits: $HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
-lpthread
Establece un enlace con la biblioteca de hebras de POSIX.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Ejemplos relacionados:
376 Desarrollo de aplicaciones de SQL incorporado
![Page 385: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/385.jpg)
v “bldrtn -- Builds HP-UX C routines (stored procedures and UDFs) (C)”
Opciones de compilación y enlace para rutinas C++ de HP-UX: La tabla
siguiente muestra las opciones de compilación y enlace que DB2 recomienda para
crear rutinas en C++ (procedimientos almacenados y funciones definidas por el
usuario) con el compilador HP-UX C++, tal como muestra el script de creación
bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
aCC Indica el compilador aC++ de HP.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.+u1 Permite el acceso a datos no alineados.
+z Generar código independiente de la posición.
-ext Permite el uso de diversas extensiones de C++, tales como el soporte para ″long
long″.
-mt Permite el soporte de hebras para el compilador aC++ de HP, que es necesario
porque las rutinas se pueden ejecutaren el mismo proceso que otras rutinas
(THREADSAFE) o en el propio motor (NOT FENCED).
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$DB2PATH/include
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
Capítulo 5. Desarrollo de rutinas externas 377
![Page 386: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/386.jpg)
Opciones de enlace:
aCC Hace que el compilador aC++ de HP se utilice como interfaz del editor de enlaces.
$EXTRA_CFLAG
Si la plataforma HP-UX es IA64 y está habilitado el soporte de 64 bits, este
distintivo contiene el valor +DD64; si está habilitado el soporte de 32 bits, contiene
el valor +DD32. Si la plataforma HP-UX es PA-RISC y está habilitado el soporte de
64 bits, contiene el valor +DA2.0W. Para el soporte de 32 bits en una plataforma
PA-RISC, este distintivo contiene el valor +DA2.0N.
+DD64 Se debe utilizar para generar código de 64 bits para HP-UX en IA64.
+DD32 Se debe utilizar para generar código de 32 bits para HP-UX en IA64.
+DA2.0W
Se debe utilizar para generar código de 64 bits para HP-UX en PA-RISC.
+DA2.0N
Se debe utilizar para generar código de 32 bits para HP-UX en PA-RISC.-mt Permite el soporte de hebras para el compilador aC++ de HP, que es necesario
porque las rutinas se pueden ejecutaren el mismo proceso que otras rutinas
(THREADSAFE) o en el propio motor (NOT FENCED).
-b Crear una biblioteca compartida en lugar de un ejecutable normal.
-o $1 Especifica el ejecutable.
$1.o Especifica el archivo objeto del programa.
$EXTRA_LFLAG
Especificar la vía de acceso de tiempo de ejecución. Si se establece, para 32 bits
contiene el valor -Wl,+b$HOME/sqllib/lib32, y para 64 bits contiene
-Wl,+b$HOME/sqllib/lib64. Si no se establece, no contiene ningún valor.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Para 32 bits: ″$HOME/sqllib/lib32″; para 64 bits: ″$HOME/sqllib/lib64″.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Conceptos relacionados:
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Ejemplos relacionados:
v “bldrtn -- Builds HP-UX C++ routines (stored procedures and UDFs) (C++)”
Opciones de compilación y enlace para rutinas C de Linux: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C (procedimientos almacenados y funciones definidas por el usuario)
con el compilador C de Linux, tal como muestra el script de creación bldrtn.
378 Desarrollo de aplicaciones de SQL incorporado
![Page 387: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/387.jpg)
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
$CC El compilador gcc o xlc_r.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este
archivo de script tiene pasos separados para la compilación y la edición de
enlaces.
-D_REENTRANT
Define la opción _REENTRANT, que es necesaria pues las rutinas se pueden
ejecutar en el mismo proceso que otras rutinas (THREADSAFE) o en el propio
motor (NOT FENCED).
Opciones de enlace:
$CC El compilador gcc o xlc_r; hace que el compilador se utilice como interfaz del
editor de enlaces.
$LINK_FLAGS
Contiene el valor ″$EXTRA_C_FLAGS $SHARED_LIB_FLAG″
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
$SHARED_LIB_FLAG
Contiene -shared para el compilador gcc o -qmkshrobj para el compilador xlc_r.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-Wl,-rpath,$DB2PATH/lib32″. Para 64 bits contiene
el valor ″-Wl,-rpath,$DB2PATH/lib64″.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
-lpthread
Establece un enlace con la biblioteca de hebras de POSIX.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Capítulo 5. Desarrollo de rutinas externas 379
![Page 388: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/388.jpg)
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Ejemplos relacionados:
v “bldrtn -- Builds Linux C routines (stored procedures or UDFs) (C)”
Opciones de compilación y enlace para rutinas C++ de Linux: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C++ (procedimientos almacenados y funciones definidas por el usuario)
con el compilador C++ de Linux, tal como muestra el script de creación bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
g++ Indica el compilador C++ de GNU/Linux.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-fpic Genera código independiente de la posición.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este
archivo de script tiene pasos separados para la compilación y la edición de
enlaces.
-D_REENTRANT
Define la opción _REENTRANT, que es necesaria pues las rutinas se pueden
ejecutar en el mismo proceso que otras rutinas (THREADSAFE) o en el propio
motor (NOT FENCED).
380 Desarrollo de aplicaciones de SQL incorporado
![Page 389: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/389.jpg)
Opciones de enlace:
g++ Hace que el compilador se utilice como interfaz del editor de enlaces.
$EXTRA_C_FLAGS
Contiene uno de los siguientes valores:
v -m31 en Linux sólo para zSeries, para crear una biblioteca de 32 bits;
v -m32 en Linux para x86, x86_64 y POWER, para crear una biblioteca de 32 bits;
v -m64 en Linux para zSeries, POWER, x86_64, para crear una biblioteca de 32
bits; o
v Ningún valor en Linux para IA64, para crear una biblioteca de 64 bits.
-shared
Genera una biblioteca compartida.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-Wl,-rpath,$DB2PATH/lib32″. Para 64 bits contiene
el valor ″-Wl,-rpath,$DB2PATH/lib64″.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
-lpthread
Establece un enlace con la biblioteca de hebras de POSIX.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Conceptos relacionados:
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
Ejemplos relacionados:
v “bldrtn -- Builds Linux C++ routines (stored procedures and UDFs) (C++)”
Opciones de compilación y enlace para rutinas C de Solaris: La tabla siguiente
muestra las opciones de compilación y enlace que DB2 recomienda para crear
rutinas en C (procedimientos almacenados y funciones definidas por el usuario)
con el compilador C de Forte, tal como muestra el script de creación bldrtn.
Capítulo 5. Desarrollo de rutinas externas 381
![Page 390: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/390.jpg)
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cc Indica el compilador C.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Permite el soporte de varias hebras, que es necesario pues las rutinas se pueden
ejecutar en el mismo proceso que otras rutinas (THREADSAFE) o en el propio
motor (NOT FENCED).
-DUSE_UI_THREADS
Permite el uso de las API de hebras ″UNIX International″ de Sun.
-Kpic Genera código independiente de la posición para bibliotecas compartidas.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este script
tiene pasos separados para la compilación y la edición de enlaces.
Opciones de enlace:
cc Hace que el compilador se utilice como interfaz del editor de enlaces.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Esta opción es necesaria porque la biblioteca de DB2 se enlaza con -mt.
-G Genera una biblioteca compartida.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-R$DB2PATH/lib32″, y para 64 bits contiene el
valor ″-R$DB2PATH/lib64″.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas en C o C++ mediante el script de creación de ejemplo
(UNIX)” en la página 365
Ejemplos relacionados:
v “bldrtn -- Builds Solaris C routines (stored procedures or UDFs) (C)”
Opciones de compilación y enlace para rutinas C++ de Solaris: La tabla
siguiente muestra las opciones de compilación y enlace que DB2 recomienda para
382 Desarrollo de aplicaciones de SQL incorporado
![Page 391: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/391.jpg)
crear rutinas en C++ (procedimientos almacenados y funciones definidas por el
usuario) con el compilador C++ de Forte, tal como muestra el script de creación
bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
CC Indica el compilador C++.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Permite el soporte de varias hebras, que es necesario pues las rutinas se pueden
ejecutar en el mismo proceso que otras rutinas (THREADSAFE) o en el propio
motor (NOT FENCED).
-DUSE_UI_THREADS
Permite el uso de las API de hebras ″UNIX International″ de Sun.
-Kpic Genera código independiente de la posición para bibliotecas compartidas.
-I$DB2PATH/include
Especifica la ubicación de los archivos de inclusión de DB2.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. Este script
tiene pasos separados para la compilación y la edición de enlaces.
Opciones de enlace:
CC Hace que el compilador se utilice como interfaz del editor de enlaces.
-xarch=$CFLAG_ARCH
Esta opción asegura que el compilador creará ejecutables válidos cuando
establezca un enlace con libdb2.so. El valor de $CFLAG_ARCH es ″v8plusa″ para
la modalidad de 32 bits, o ″v9″ para la modalidad de 64 bits.
-mt Esta opción es necesaria porque la biblioteca de DB2 se enlaza con -mt.
-G Genera una biblioteca compartida.
-o $1 Especifica el ejecutable.
$1.o Incluir el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas estáticas y compartidas de DB2 durante
el enlace. Por ejemplo, para 32 bits: $HOME/sqllib/lib32, y para 64 bits:
$HOME/sqllib/lib64.
$EXTRA_LFLAG
Especifica la ubicación de las bibliotecas compartidas de DB2 durante la ejecución.
Para 32 bits contiene el valor ″-R$DB2PATH/lib32″, y para 64 bits contiene el
valor ″-R$DB2PATH/lib64″.
-ldb2 Enlazar con la biblioteca de DB2.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Conceptos relacionados:
v “Creación de aplicaciones y rutinas escritas en C y C++” en la página 225
Ejemplos relacionados:
v “bldrtn -- Builds Solaris C++ routines (stored procedures or UDFs) (C++)”
Capítulo 5. Desarrollo de rutinas externas 383
![Page 392: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/392.jpg)
Opciones de compilación y enlace para rutinas C y C++ de Windows: A
continuación se muestran las opciones de compilación y enlace recomendadas para
DB2 para crear rutinas C y C++ (procedimientos almacenados y funciones
definidas por el usuario) en Windows con el compilador Microsoft Visual C++, tal
como se muestra en el archivo de proceso por lotes bldrtn.bat.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
%BLDCOMP%
Variable del compilador. El valor por omisión es cl, que indica el compilador
Microsoft Visual C++. Puede tener también el valor icl, que indica el compilador
Intel C++ para aplicaciones de 32 ó 64 bits, o ecl, que indica el compilador Intel
C++ para aplicaciones Itanium de 64 bits.
-Zi Habilitar la información de depuración.
-Od Inhabilitar la optimización.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
-W2 Emitir mensajes de aviso, de error, de error grave y de error no recuperable.
-DWIN32
Opción de compilador necesaria para los sistemas operativos Windows.
-MD Enlace utilizando MSVCRT.LIB
Opciones de enlace:
link Indica la utilización del enlazador para la edición de enlaces.
-debug Hace que se incluya información de depuración.
-out:%1.dll
Crear un archivo .DLL.
%1.obj Incluir el archivo objeto.
db2api.lib
Enlazar con la biblioteca de DB2.
-def:%1.def
Archivo de definición de módulos.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas C/C++ en Windows” en la página 367
Ejemplos relacionados:
v “bldrtn.bat -- Builds C++ routines (stored procedures and UDFs) on Windows”
v “bldrtn.bat -- Builds C routines (stored procedures and UDFs) on Windows”
Creación de procedimientos almacenados de SQL incorporado
en C o C++ con archivos de configuración
El archivo de configuración, stp.icc en sqllib/samples/c y sqllib/samples/cpp, le
permite crear procedimientos almacenados de SQL incorporado de DB2 en C y
C++ en AIX.
Procedimiento:
384 Desarrollo de aplicaciones de SQL incorporado
![Page 393: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/393.jpg)
Para utilizar el archivo de configuración a fin de crear la biblioteca compartida de
procedimientos almacenados de SQL incorporado, spserver, a partir del archivo
fuente spserver.sqc, siga estos pasos:
1. Asigne a la variable de entorno STP el nombre del programa, de este modo:
v En el shell bash o Korn:
export STP=spserver
v En el shell C:
setenv STP spserver
2. Si su directorio de trabajo contiene un archivo stp.ics, resultante de la creación
de un programa diferente con el archivo stp.icc, suprima el archivo stp.ics
mediante este mandato:
rm stp.ics
Si para el mismo programa que ahora creará de nuevo ya existe un archivo
stp.ics, no es necesario suprimir el archivo.
3. Compile el programa de ejemplo, especificando:
vacbld stp.icc
Nota: El mandato vacbld está incluido en VisualAge C++.
La biblioteca compartida de procedimientos almacenados se copia en el directorio
sqllib/function del servidor.
A continuación, catalogue los procedimientos almacenados de la biblioteca
compartida ejecutando el script spcat en el servidor:
spcat
Este script conecta con la base de datos ″sample″, descataloga mediante spdrop.db2
los procedimientos almacenados que se hubieran catalogado previamente, luego los
cataloga llamando a spcreate.db2, y finalmente desconecta de la base de datos.
Puede también ejecutar los scripts spdrop.db2 y spcreate.db2 por separado.
A continuación, detenga y rearranque la base de datos para que se reconozca la
nueva biblioteca compartida. Si es necesario, establezca la modalidad de archivo
para la biblioteca compartida a fin de que la instancia de DB2 pueda acceder a la
biblioteca.
Una vez creada la biblioteca compartida de procedimientos almacenados, spserver,
puede crear la aplicación cliente, spclient, la cual llama a los procedimientos
almacenados contenidos en la biblioteca. Puede crear spclient utilizando el
archivo de configuración, emb.icc.
Para invocar los procedimientos almacenados, ejecute la aplicación cliente de
ejemplo, especificando lo siguiente: spclient basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre.
IDusuario
Es un ID de usuario válido.
Capítulo 5. Desarrollo de rutinas externas 385
![Page 394: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/394.jpg)
contraseña
Es una contraseña válida.
La aplicación cliente accede a la biblioteca compartida, spserver, la cual ejecuta
diversas funciones de procedimiento almacenado contenidas en la base de datos
del servidor. Los datos resultantes se devuelven a la aplicación cliente.
Tareas relacionadas:
v “Creación de aplicaciones de SQL incorporado y de API de DB2 en C o C++ con
archivos de configuración (AIX)” en la página 230
v “Creación de funciones definidas por el usuario en C o C++ con archivos de
configuración (AIX)” en la página 386
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
Creación de funciones definidas por el usuario en C o C++ con
archivos de configuración (AIX)
El archivo de configuración udf.icc, contenido en sqllib/samples/c y
sqllib/samples/cpp, le permite crear funciones definidas por el usuario en C o
C++ en AIX.
Procedimiento:
Para utilizar el archivo de configuración a fin de crear el programa de función
definida por el usuario udfsrv, a partir del archivo fuente udfsrv.c, siga estos
pasos:
1. Asigne a la variable de entorno UDF el nombre del programa, de este modo:
v En el shell bash o Korn:
export UDF=udfsrv
v En el shell C:
setenv UDF udfsrv
2. Si su directorio de trabajo contiene un archivo udf.ics, resultante de la creación
de un programa diferente con el archivo udf.icc, suprima el archivo udf.ics
mediante este mandato:
rm udf.ics
Si para el mismo programa que ahora creará de nuevo ya existe un archivo
udf.ics, no es necesario suprimir el archivo.
3. Compile el programa de ejemplo, especificando:
vacbld udf.icc
Nota: El mandato vacbld está incluido en VisualAge C++.
La biblioteca de UDF se copia en el directorio sqllib/function del servidor.
Si es necesario, establezca la modalidad de archivo para la función definida por el
usuario a fin de que la instancia de DB2 pueda ejecutar la función.
Una vez creado el programa udfsrv, puede crear la aplicación cliente, udfcli, la
cual llama al programa. El programa se proporciona en versiones para CLI de DB2
y para SQL incorporado.
386 Desarrollo de aplicaciones de SQL incorporado
![Page 395: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/395.jpg)
Puede crear el programa udfcli de la CLI de DB2, a partir del archivo fuente
udfcli.c, contenido en sqllib/samples/cli, utilizando el archivo de configuración
cli.icc.
Puede crear el programa udfcli de SQL incorporado, a partir del archivo fuente
udfcli.sqc, contenido en sqllib/samples/c, utilizando el archivo de configuración
emb.icc.
Para invocar la UDF, ejecute la aplicación solicitante de ejemplo entrando el
nombre del ejecutable:
udfcli
La aplicación solicitante llama a la función ScalarUDF de la biblioteca udfsrv.
Tareas relacionadas:
v “Creación de aplicaciones de SQL incorporado y de API de DB2 en C o C++ con
archivos de configuración (AIX)” en la página 230
v “Creación de procedimientos almacenados de SQL incorporado en C o C++ con
archivos de configuración” en la página 384
v “Configuración del entorno de desarrollo de SQL incorporado” en la página 12
Reconstrucción de bibliotecas compartidas para rutinas de DB2
DB2 situará en la antememoria, una vez cargadas, las bibliotecas compartidas
utilizadas para procedimientos almacenados y funciones definidas por el usuario.
Si está desarrollando una rutina, puede que desee cargar varias veces la misma
biblioteca, y esta utilización de la antememoria le impedirá obtener la última
versión de una biblioteca compartida. La manera de evitar problemas derivados de
la antememoria depende del tipo de rutina:
1. Rutinas delimitadas, no protegidas por hebras. La palabra clave
KEEPFENCED de configuración del gestor de bases de datos tiene un valor por
omisión de YES. Este valor mantiene vivo el proceso en modalidad delimitada.
Este valor por omisión puede interferir con la recarga de la biblioteca. Es
preferible cambiar el valor de esta palabra clave por NO mientras esté
desarrollando rutinas delimitadas, sin protección por hebras, y luego revertir al
valor YES cuando esté preparado para cargar la versión final de la biblioteca
compartida. Para obtener más información, consulte Actualización del archivo
de configuración del gestor de bases de datos .
2. Rutinas fiables o protegidas por hebras. A excepción de las rutinas de SQL
(incluidos los procedimientos de SQL), la única manera de asegurarse que se
obtenga una versión actualizada de la biblioteca de rutinas de DB2 cuando se
utilice dicha biblioteca para rutinas fiables o protegidas por hebras, consiste en
reciclar la instancia de DB2 entrando db2stop seguido de db2start en la línea de
mandatos. Esto no es necesario para una rutina de SQL puesto que, cuando se
recrea, el compilador utiliza un nuevo nombre de biblioteca exclusivo para
evitar posibles conflictos.
Para las rutinas que no son de SQL, también puede evitar los problemas derivados
de la antememoria creando la nueva versión de la rutina con una biblioteca cuyo
nombre sea distinto (por ejemplo, foo.a pasa a ser foo.1.a) y utilizando después las
sentencias ALTER PROCEDURE o ALTER FUNCTION de SQL con la nueva
biblioteca.
Tareas relacionadas:
Capítulo 5. Desarrollo de rutinas externas 387
![Page 396: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/396.jpg)
v “Actualización del archivo de configuración del gestor de bases de datos” en
Desarrollo de SQL y rutinas externas
Información relacionada:
v “Sentencia ALTER FUNCTION” en Consulta de SQL, Volumen 2
v “Sentencia ALTER PROCEDURE” en Consulta de SQL, Volumen 2
Procedimientos COBOL
Procedimientos COBOL
Los procedimientos COBOL se deben escribir de forma similar a los subprogramas
COBOL.
Manejo de parámetros en un procedimiento COBOL
Cada parámetro que un procedimiento debe aceptar o pasar se debe
declarar en LINKAGE SECTION. Por ejemplo, este fragmento de código
corresponde a un procedimiento que acepta dos parámetros IN (un
CHAR(15) y un INT) y pasa un parámetro OUT (un INT):
LINKAGE SECTION.
01 IN-SPERSON PIC X(15).
01 IN-SQTY PIC S9(9) USAGE COMP-5.
01 OUT-SALESSUM PIC S9(9) USAGE COMP-5.
Asegúrese de que los tipos de datos COBOL que declare estén
correctamente correlacionados con tipos de datos SQL. Para obtener una
lista detallada de las correlaciones de tipos de datos entre SQL y COBOL,
consulte ″Tipos de datos SQL soportados en COBOL″.
Cada parámetro se deberá listar entonces en PROCEDURE DIVISION. El
ejemplo siguiente muestra una PROCEDURE DIVISION que corresponde a
las definiciones de parámetros del ejemplo anterior de LINKAGE
SECTION.
PROCEDURE DIVISION USING IN-SPERSON
IN-SQTY
OUT-SALESSUM.
Cómo salir de un procedimiento COBOL
Para salir correctamente del procedimiento, utilice los mandatos siguientes:
MOVE SQLZ-HOLD-PROC TO RETURN-CODE.
GOBACK.
Con estos mandatos, el procedimiento le devuelve correctamente a la
aplicación cliente. Esto resulta especialmente importante cuando llama al
procedimiento una aplicación cliente COBOL local.
Al crear un procedimiento COBOL, es muy recomendable que utilice el script de
creación escrito para su sistema operativo y compilador. Los scripts de creación
para Micro Focus COBOL se encuentran en el directorio sqllib/samples/cobol_mf.
Los scripts de creación para IBM COBOL se encuentran en el directorio
sqllib/samples/cobol.
A continuación, se muestra un ejemplo de procedimiento COBOL que acepta dos
parámetros de entrada y luego devuelve un parámetro de salida y un conjunto de
resultados:
388 Desarrollo de aplicaciones de SQL incorporado
![Page 397: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/397.jpg)
IDENTIFICATION DIVISION.
PROGRAM-ID. "NEWSALE".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INSERT-STMT.
05 FILLER PIC X(24) VALUE "INSERT INTO SALES (SALES".
05 FILLER PIC X(24) VALUE "_PERSON,SALES) VALUES (’".
05 SPERSON PIC X(16).
05 FILLER PIC X(2) VALUE "’,".
05 SQTY PIC S9(9).
05 FILLER PIC X(1) VALUE ")".
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 INS-SMT-INF.
05 INS-STMT.
49 INS-LEN PIC S9(4) USAGE COMP.
49 INS-TEXT PIC X(100).
01 SALESSUM PIC S9(9) USAGE COMP-5.
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
LINKAGE SECTION.
01 IN-SPERSON PIC X(15).
01 IN-SQTY PIC S9(9) USAGE COMP-5.
01 OUT-SALESSUM PIC S9(9) USAGE COMP-5.
PROCEDURE DIVISION USING IN-SPERSON
IN-SQTY
OUT-SALESSUM.
MAINLINE.
MOVE 0 TO SQLCODE.
PERFORM INSERT-ROW.
IF SQLCODE IS NOT EQUAL TO 0
GOBACK
END-IF.
PERFORM SELECT-ROWS.
PERFORM GET-SUM.
GOBACK.
INSERT-ROW.
MOVE IN-SPERSON TO SPERSON.
MOVE IN-SQTY TO SQTY.
MOVE INSERT-STMT TO INS-TEXT.
MOVE LENGTH OF INSERT-STMT TO INS-LEN.
EXEC SQL EXECUTE IMMEDIATE :INS-STMT END-EXEC.
GET-SUM.
EXEC SQL
SELECT SUM(SALES) INTO :SALESSUM FROM SALES
END-EXEC.
MOVE SALESSUM TO OUT-SALESSUM.
SELECT-ROWS.
EXEC SQL
DECLARE CUR CURSOR WITH RETURN FOR SELECT * FROM SALES
END-EXEC.
IF SQLCODE = 0
EXEC SQL OPEN CUR END-EXEC
END-IF.
La sentencia CREATE PROCEDURE que corresponde a este procedimiento es la
siguiente:
CREATE PROCEDURE NEWSALE ( IN SALESPERSON CHAR(15),
IN SALESQTY INT,
OUT SALESSUM INT)
RESULT SETS 1
EXTERNAL NAME ’NEWSALE!NEWSALE’
Capítulo 5. Desarrollo de rutinas externas 389
![Page 398: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/398.jpg)
FENCED
LANGUAGE COBOL
PARAMETER STYLE SQL
MODIFIES SQL DATA
La sentencia anterior presupone que la función COBOL se halla en una biblioteca
denominada NEWSALE.
Nota: Al registrar un procedimiento COBOL en los sistemas operativos Windows,
tome la precaución siguiente cuando identifique un cuerpo de
procedimiento almacenado en la cláusula EXTERNAL NAME de la sentencia
CREATE. Si utiliza un ID de vía de acceso absoluto para identificar el
cuerpo del procedimiento, debe añadir la extensión .dll. Por ejemplo:
CREATE PROCEDURE NEWSALE ( IN SALESPERSON CHAR(15),
IN SALESQTY INT,
OUT SALESSUM INT)
RESULT SETS 1
EXTERNAL NAME ’NEWSALE!NEWSALE’
FENCED
LANGUAGE COBOL
PARAMETER STYLE SQL
MODIFIES SQL DATA
EXTERNAL NAME ’d:\mylib\NEWSALE.dll’
Conceptos relacionados:
v “Sentencias de SQL incorporado en aplicaciones COBOL” en la página 7
v “Rutinas externas” en la página 275
Tareas relacionadas:
v “Creación de rutinas IBM COBOL en AIX” en la página 396
v “Creación de rutinas IBM COBOL en Windows” en la página 399
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
v “Creación de rutinas Micro Focus COBOL en Windows” en la página 401
Información relacionada:
v “Tipos de datos de SQL soportados en aplicaciones de SQL incorporado
COBOL” en la página 67
v “Sentencia CREATE PROCEDURE (Externo)” en Consulta de SQL, Volumen 2
v “Paso de argumentos a rutinas C, C++, OLE o COBOL” en la página 342
v “Soporte para el desarrollo de procedimientos externos en COBOL” en la página
390
Soporte para el desarrollo de procedimientos externos en
COBOL
Para desarrollar procedimientos externos en COBOL debe utilizar el software de
desarrollo COBOL soportado.
Todo el software de desarrollo soportado para desarrollar aplicaciones de bases de
datos en COBOL, se puede utilizar también para el desarrollo de procedimientos
externos en COBOL.
Conceptos relacionados:
v “Procedimientos COBOL” en la página 388
390 Desarrollo de aplicaciones de SQL incorporado
![Page 399: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/399.jpg)
v “Interfaces API y lenguajes de programación soportados para el desarrollo de
rutinas externas” en la página 290
Información relacionada:
v “Soporte para el desarrollo de aplicaciones de bases de datos en COBOL” en
Iniciación al desarrollo de aplicaciones de bases de datos
Creación de rutinas COBOL
Opciones de compilación y enlace para rutinas COBOL
Opciones de compilación y enlace para rutinas IBM COBOL de AIX: A
continuación se muestran las opciones de compilación y enlace que se recomiendan
para DB2 para crear rutinas COBOL (procedimientos almacenados) con el
compilador IBM COBOL para AIX en AIX, tal como se muestra en el script de
creación bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cob2 El compilador IBM COBOL para AIX.
-qpgmname\(mixed\)
Indica al compilador que permita llamadas a los puntos de entrada de biblioteca
utilizando nombres con mayúsculas y minúsculas mezcladas.
-qlib Indica al compilador que procese las sentencias COPY.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
-I$DB2PATH/include/cobol_a
Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
$HOME/sqllib/include/cobol_a.
Opciones de enlace:
cob2 Indica la utilización del compilador para realizar la edición de enlaces.
-o $1 Especifica la salida como archivo de biblioteca compartida.
$1.o Especifica el archivo objeto del procedimiento almacenado.
checkerr.o
Hace que se incluya el archivo objeto de programa de utilidad para la
comprobación de errores.
-bnoentry
Indica que no se especifique el punto de entrada por omisión de la biblioteca
compartida.
-bE:$1.exp
Especifica un archivo de exportación. El archivo de exportación contiene una lista
de los procedimientos almacenados.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/lib32.
-ldb2 Enlazar con la biblioteca del gestor de bases de datos.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
Capítulo 5. Desarrollo de rutinas externas 391
![Page 400: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/400.jpg)
v “Creación de rutinas IBM COBOL en AIX” en la página 396
v “Configuración del compilador IBM COBOL en AIX” en la página 256
Información relacionada:
v “Opciones de compilación y enlace para aplicaciones IBM COBOL de AIX” en la
página 259
v “Archivos include para aplicaciones de SQL incorporado COBOL” en la página
50
Ejemplos relacionados:
v “bldrtn -- Builds AIX COBOL routines (stored procedures)”
Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX: A
continuación se muestran las opciones de compilación y enlace que se recomiendan
para DB2 para crear rutinas COBOL (procedimientos almacenados) con el
compilador Micro Focus COBOL en AIX, tal como se muestra en el script de
creación bldrtn. Tenga en cuenta que los archivos de inclusión de DB2 MicroFocus
COBOL se localizan configurando la variable de entorno COBCPY, de modo que
no se necesita el distintivo -I en el paso de compilación. Consulte el script bldapp
para ver un ejemplo.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cob El compilador MicroFocus COBOL.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. La
compilación y la edición de enlaces son pasos separados.
$EXTRA_COBOL_FLAG="-C MFSYNC"
Habilita el soporte de 64 bits.
-x Compila y crea un módulo objeto cuando se utiliza con la opción -c.
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-x Hace que se cree una biblioteca compartida.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/lib32.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
v “Configuración del compilador Micro Focus COBOL en AIX” en la página 257
Información relacionada:
392 Desarrollo de aplicaciones de SQL incorporado
![Page 401: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/401.jpg)
v “Opciones de compilación y enlace para aplicaciones Micro Focus COBOL de
AIX” en la página 260
Ejemplos relacionados:
v “bldrtn -- Builds AIX Micro Focus COBOL routines (stored procedures)”
Opciones de compilación y enlace para rutinas Micro Focus COBOL de HP-UX:
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear rutinas COBOL (procedimientos almacenados) con el
compilador Micro Focus COBOL en HP-UX, tal como muestra el script de creación
bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cob Indica el compilador COBOL.
$EXTRA_COBOL_FLAG
Contiene ″-C MFSYNC″ si la plataforma HP-UX es IA64 y el soporte de 64 bits
está habilitado.
Opciones de enlace:
-y Especifica que la salida deseada es una biblioteca compartida.
-o $1 Especifica el ejecutable.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2.
-ldb2 Enlazar con la biblioteca compartida de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
v “Configuración del compilador Micro Focus COBOL en HP-UX” en la página
258
Ejemplos relacionados:
v “bldrtn -- Builds HP-UX Micro Focus COBOL routines (stored procedures)”
Opciones de compilación y enlace para rutinas Micro Focus COBOL de Solaris:
La tabla siguiente muestra las opciones de compilación y enlace que DB2
recomienda para crear rutinas COBOL (procedimientos almacenados) con el
compilador Micro Focus COBOL en Solaris, tal como muestra el script de creación
bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cob Indica el compilador COBOL.
-cx Compila para crear el módulo objeto.
$EXTRA_COBOL_FLAG
Para soporte de 64 bits, contiene el valor ″-C MFSYNC″; de lo contrario, no
contiene ningún valor.
Capítulo 5. Desarrollo de rutinas externas 393
![Page 402: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/402.jpg)
Opciones de enlace:
cob Hace que el compilador se utilice como interfaz del editor de enlaces.
-y Crea una biblioteca compartida autónoma auto-contenida.
-o $1 Especifica el programa ejecutable.
$1.o Especifica el archivo objeto del programa.
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2. Por ejemplo: $HOME/sqllib/lib64.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
v “Configuración del compilador Micro Focus COBOL en Solaris” en la página 258
Ejemplos relacionados:
v “bldrtn -- Builds Solaris Micro Focus COBOL routines (stored procedures)”
Opciones de compilación y enlace para rutinas Micro Focus COBOL de Linux:
A continuación se muestran las opciones de compilación y enlace que se
recomiendan para DB2 para crear rutinas COBOL (procedimientos almacenados)
con el compilador Micro Focus COBOL en Linux, tal como se muestra en el script
de creación bldrtn.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación y enlace:
cob Indica el compilador COBOL
$EXTRA_COBOL_FLAG
Para el soporte de 64 bits, contiene el valor ″-C MFSYNC″; de lo contrario, no
contiene ningún valor.
-y Especifica compilar para objetos callable compartidos independientes
-o $1 Especifica el ejecutable.
$1.cbl Especifica el archivo fuente
-L$DB2PATH/$LIB
Especifica la ubicación de las bibliotecas compartidas de tiempo de ejecución de
DB2.
-ldb2 Enlazar con la biblioteca de DB2.
-ldb2gmf
Establece un enlace con la biblioteca del gestor de excepciones de DB2
correspondiente a Micros Focus COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL de UNIX” en la página 398
v “Configuración del compilador Micro Focus COBOL en Linux” en la página 255
394 Desarrollo de aplicaciones de SQL incorporado
![Page 403: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/403.jpg)
Ejemplos relacionados:
v “bldrtn -- Builds Linux Micro Focus COBOL routines (stored procedures)”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
Opciones de compilación y enlace para rutinas IBM COBOL de Windows: A
continuación se muestran las opciones de compilación y enlace recomendadas para
DB2 para crear rutinas COBOL (procedimientos almacenados y funciones definidas
por el usuario) en Windows con el compilador IBM VisualAge COBOL, tal como se
muestra en el archivo de proceso por lotes bldrtn.bat.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cob2 El compilador IBM VisualAge COBOL.
-qpgmname(mixed)
Indica al compilador que permita llamadas a los puntos de entrada de biblioteca
utilizando nombres con mayúsculas y minúsculas mezcladas.
-c Hace que se efectúe solamente la compilación, no la edición de enlaces. El archivo
de proceso por lotes tiene pasos separados para la compilación y la edición de
enlaces.
-qlib Indica al compilador que procese las sentencias COPY.
-Ivía Especifica la ubicación de los archivos de inclusión de DB2. Por ejemplo:
-I"%DB2PATH%\include\cobol_a".
%EXTRA_COMPFLAG%
Si "set IBMCOB_PRECOMP=true" no posee comentarios, el precompilador IBM se
utilizará para precompilar el SQL incorporado. Se invocará con una de las
siguientes formulaciones, en función de los parámetros de entrada:
-q"SQL(’database sample CALL_RESOLUTION DEFERRED’)"
precompilar utilizando la base de datos de ejemplo por omisión, y diferir
la resolución de la llamada.
-q"SQL(’database %2 CALL_RESOLUTION DEFERRED’)"
precompilar utilizando una base de datos especificada por el usuario, y
diferir la resolución de la llamada.
Opciones de enlace:
ilink Utilizar el enlazador IBM VisualAge COBOL.
/free Formato libre.
/nol Sin logotipo.
/dll Crear la DLL con el nombre del programa fuente.
db2api.lib
Enlazar con la biblioteca de DB2.
%1.exp Incluir el archivo de exportación.
%1.obj Incluir el archivo objeto del programa.
iwzrwin3.obj
Incluir el archivo de objeto proporcionado por IBM VisualAge COBOL.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas IBM COBOL en Windows” en la página 399
v “Configuración del compilador IBM COBOL en Windows” en la página 253
Ejemplos relacionados:
v “bldrtn.bat -- Builds Windows VisualAge COBOL routines (stored procedures)”
Capítulo 5. Desarrollo de rutinas externas 395
![Page 404: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/404.jpg)
Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows: La tabla siguiente muestra las opciones de compilación y enlace que
DB2 recomienda para crear rutinas en COBOL (procedimientos almacenados y
funciones definidas por el usuario) cuando se utiliza Windows y el compilador
Micro Focus COBOL, tal como muestra el archivo de proceso por lotes bldrtn.bat.
Opciones de compilación y enlace para bldrtn:
Opciones de compilación:
cobol Indica el compilador Micro Focus COBOL.
/case Impide que los símbolos externos se conviertan en mayúsculas.
Opciones de enlace:
cbllink
Utilizar el enlazador Micro Focus COBOL para la edición de enlaces.
/d Crear un archivo .dll.
db2api.lib
Enlazar con la biblioteca DB2 de la API.
Consulte la documentación del compilador para conocer otras opciones de compilador.
Tareas relacionadas:
v “Creación de rutinas Micro Focus COBOL en Windows” en la página 401
v “Configuración del compilador Micro Focus COBOL en Windows” en la página
254
Ejemplos relacionados:
v “bldrtn.bat -- Builds Windows Micro Focus Cobol routines (stored procedures)”
Creación de rutinas IBM COBOL en AIX
DB2 proporciona scripts de creación para compilar y enlazar programas COBOL de
SQL incorporado y de la API de DB2. Estos scripts residen en el directorio
sqllib/samples/cobol, junto con programas de ejemplo que se pueden crear a
partir de esos archivos.
El bldrtn, que reside en sqllib/samples/cobol, contiene los mandatos para crear
rutinas (procedimientos almacenados). El script compila las rutinas y crea una
biblioteca compartida que puede ser llamada por una aplicación cliente.
El primer parámetro, $1, especifica el nombre del archivo fuente. El segundo
parámetro, $2, especifica el nombre de la base de datos a la que desea conectarse.
Debido a que la biblioteca compartida se debe crear en la misma instancia donde
reside la base de datos, no hay parámetros para el ID de usuario ni la contraseña.
Sólo es obligatorio el primer parámetro, el nombre del archivo fuente. El script
utiliza el nombre del archivo fuente, $1, como nombre de la biblioteca compartida.
El nombre de la base de datos es opcional. Si no se proporciona un nombre de
base de datos, el programa utiliza la base de datos por omisión sample.
Procedimiento:
Si conecta con la base de datos ″sample″, especifique lo siguiente para crear el
programa de ejemplo outsrv a partir del archivo fuente outsrv.sqb:
396 Desarrollo de aplicaciones de SQL incorporado
![Page 405: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/405.jpg)
bldrtn outsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn outsrv basedatos
El archivo de script copia la biblioteca compartida en el directorio sqllib/function
del servidor.
Una vez creada la biblioteca compartida de la rutina, outsrv, puede crear la
aplicación cliente, outcli, la cual llama a la rutina contenida en la biblioteca. Puede
crear outcli utilizando el archivo de script bldapp.
Para invocar la rutina, ejecute la aplicación cliente de ejemplo, especificando lo
siguiente:
outcli basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias remoto, u otro nombre.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la biblioteca compartida, outsrv, la cual ejecuta la
rutina del mismo nombre contenida en la base de datos del servidor, y devuelve
los datos resultantes a la aplicación cliente.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Tareas relacionadas:
v “Creación de aplicaciones IBM COBOL en AIX” en la página 246
Información relacionada:
v “Opciones de compilación y enlace para rutinas IBM COBOL de AIX” en la
página 391
v “Ejemplos de COBOL” en la página 408
Ejemplos relacionados:
v “bldrtn -- Builds AIX COBOL routines (stored procedures)”
v “embprep -- To prep and bind a COBOL embedded SQL sample on AIX”
v “outcli.sqb -- Call stored procedures using the SQLDA structure (IBM COBOL)”
v “outsrv.sqb -- Demonstrates stored procedures using the SQLDA structure (IBM
COBOL)”
Capítulo 5. Desarrollo de rutinas externas 397
![Page 406: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/406.jpg)
Creación de rutinas Micro Focus COBOL de UNIX
DB2 proporciona scripts de creación para compilar y enlazar programas Micro
Focus COBOL de SQL incorporado y de la API de DB2. Estos scripts residen en el
directorio sqllib/samples/cobol_mf, junto con programas de ejemplo que se
pueden crear a partir de esos archivos.
El script bldrtn contiene los mandatos para crear rutinas (procedimientos
almacenados). El script compila el archivo fuente de la rutina y crea una biblioteca
compartida que puede ser llamada por una aplicación cliente.
El primer parámetro, $1, especifica el nombre del archivo fuente. El script utiliza el
nombre del archivo fuente como nombre de la biblioteca compartida. El segundo
parámetro, $2, especifica el nombre de la base de datos a la que desea conectarse.
Debido a que la biblioteca compartida se debe crear en la misma instancia donde
reside la base de datos, no hay parámetros para el ID de usuario ni la contraseña.
Sólo es obligatorio el primer parámetro, el nombre del archivo fuente. El nombre
de la base de datos es opcional. Si no se proporciona un nombre de base de datos,
el programa utiliza la base de datos por omisión sample.
Valores:
Antes de crear las rutinas de Micro Focus COBOL, debe ejecutar estos mandatos:
db2stop
db2set DB2LIBPATH=$LD_LIBRARY_PATH
db2set DB2ENVLIST="COBDIR LD_LIBRARY_PATH"
db2set
db2start
Asegúrese de que db2stop detiene la base de datos. El último mandato db2set se
emite para comprobar los valores: compruebe que DB2LIBPATH y DB2ENVLIST estén
definidos correctamente.
Procedimiento:
Si conecta con la base de datos ″sample″, especifique lo siguiente para crear el
programa de ejemplo outsrv a partir del archivo fuente outsrv.sqb:
bldrtn outsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn outsrv basedatos
El archivo de script copia la biblioteca compartida en el directorio sqllib/function
del servidor.
Una vez creado el procedimiento almacenado outsrv, puede crear la aplicación
cliente outcli que llama al procedimiento almacenado. Puede crear outcli
utilizando el archivo de script bldapp.
Para invocar el procedimiento almacenado, ejecute la aplicación cliente de ejemplo,
especificando lo siguiente:
outcli basedatos IDusuario contraseña
donde
398 Desarrollo de aplicaciones de SQL incorporado
![Page 407: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/407.jpg)
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la biblioteca compartida, outsrv, la cual ejecuta la
función de procedimiento almacenado del mismo nombre contenida la base de
datos el servidor. A continuación los datos resultantes se devuelven a la aplicación
cliente.
Tareas relacionadas:
v “Creación de aplicaciones Micro Focus COBOL de UNIX” en la página 248
Información relacionada:
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de AIX” en
la página 392
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de HP-UX”
en la página 393
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de Linux”
en la página 394
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de Solaris”
en la página 393
Ejemplos relacionados:
v “bldrtn -- Builds AIX Micro Focus COBOL routines (stored procedures)”
v “bldrtn -- Builds HP-UX Micro Focus COBOL routines (stored procedures)”
v “bldrtn -- Builds Linux Micro Focus COBOL routines (stored procedures)”
v “bldrtn -- Builds Solaris Micro Focus COBOL routines (stored procedures)”
v “outcli.sqb -- Call stored procedures using the SQLDA structure (MF COBOL)”
v “outsrv.sqb -- Demonstrates stored procedures using the SQLDA structure (MF
COBOL)”
v “embprep -- To prep and bind C/C++ and Micro Focus COBOL embedded SQL
programs (C)”
Creación de rutinas IBM COBOL en Windows
DB2 proporciona archivos de creación para compilar y enlazar programas de la
API de DB2 y de SQL incorporado en IBM COBOL. Estos archivos residen en el
directorio sqllib\samples\cobol, junto con programas de ejemplo que se pueden
crear a partir de esos archivos.
DB2 da soporte a dos precompiladores para crear aplicaciones IBM COBOL en
Windows, el precompilador de DB2 y el precompilador de IBM COBOL. El valor
por omisión es el precompilador de DB2. El precompilador de IBM COBOL se
puede seleccionar descomentando la línea apropiada del archivo de proceso por
lotes que se esté utilizando. La precompilación con IBM COBOL la realiza el
propio compilador, utilizando opciones de precompilación específicas.
Capítulo 5. Desarrollo de rutinas externas 399
![Page 408: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/408.jpg)
El archivo de proceso por lotes bldrtn.bat contiene los mandatos para crear
rutinas (procedimientos almacenados) de SQL incorporado. El archivo de proceso
por lotes compila las rutinas y crea una DLL en el servidor. Utiliza dos parámetros
como entrada, que están representados dentro del archivo de proceso por lotes por
las variables %1 y %2.
El primer parámetro, %1, especifica el nombre del archivo fuente. El archivo de
proceso por lotes utiliza el nombre del archivo fuente, %1, como nombre de la DLL.
El segundo parámetro, %2, especifica el nombre de la base de datos a la que desea
conectarse. Debido a que el procedimiento almacenado se debe crear en la misma
instancia donde reside la base de datos, no hay parámetros para el ID de usuario
ni la contraseña.
Sólo es obligatorio el primer parámetro, el nombre del archivo fuente. El nombre
de la base de datos es opcional. Si no se proporciona un nombre de base de datos,
el programa utiliza la base de datos por omisión sample.
Si utiliza el precompilador de DB2 por omisión, bldrtn.bat pasa los parámetros al
archivo de precompilación y vinculación, embprep.bat.
Si se utiliza el precompilador de IBM COBOL, bldrtn.bat copia el archivo fuente
.sqb en un archivo fuente .cbl. El compilador realiza la precompilación sobre el
archivo fuente .cbl con opciones de precompilación específicas.
Procedimiento:
Si conecta con la base de datos ″sample″, especifique lo siguiente para crear el
programa de ejemplo outsrv a partir del archivo fuente outsrv.sqb:
bldrtn outsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn outsrv basedatos
El archivo de proceso por lotes copia la DLL en la vía de acceso sqllib\function
del servidor.
Una vez creada la DLL outsrv, puede crear la aplicación cliente outcli, la cual
llama a la rutina contenida en la DLL y que tiene el mismo que la DLL. Puede
crear outcli utilizando el archivo de proceso por lotes bldapp.bat.
Para invocar la rutina outsrv, ejecute la aplicación cliente de ejemplo,
especificando lo siguiente:
outcli basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, su alias remoto u otro nombre.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
400 Desarrollo de aplicaciones de SQL incorporado
![Page 409: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/409.jpg)
La aplicación cliente accede a la DLL outsrv, la cual ejecuta la rutina del mismo
nombre contenida en la base de datos del servidor, y devuelve los datos resultantes
a la aplicación cliente.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Información relacionada:
v “Ejemplos de COBOL” en la página 408
v “Opciones de compilación y enlace para rutinas IBM COBOL de Windows” en la
página 395
Ejemplos relacionados:
v “bldrtn.bat -- Builds Windows VisualAge COBOL routines (stored procedures)”
v “embprep.bat -- To prep and bind a COBOL embedded SQL program on
Windows”
v “outcli.sqb -- Call stored procedures using the SQLDA structure (IBM COBOL)”
v “outsrv.sqb -- Demonstrates stored procedures using the SQLDA structure (IBM
COBOL)”
Creación de rutinas Micro Focus COBOL en Windows
DB2 proporciona archivos de creación para compilar y enlazar programas de la
API de DB2 y de SQL incorporado en Micro Focus COBOL. Estos archivos residen
en el directorio sqllib\samples\cobol_mf, junto con programas de ejemplo que se
pueden crear a partir de esos archivos.
El archivo de proceso por lotes bldrtn.bat contiene los mandatos para crear
rutinas (procedimientos almacenados) de SQL incorporado. El archivo de proceso
por lotes compila las rutinas y crea una DLL en el servidor. El archivo utiliza dos
parámetros como entrada, que están representados dentro del archivo de proceso
por lotes por las variables %1 y %2.
El primer parámetro, %1, especifica el nombre del archivo fuente. El archivo de
proceso por lotes utiliza el nombre del archivo fuente, %1, como nombre de la DLL.
El segundo parámetro, %2, especifica el nombre de la base de datos a la que desea
conectarse. Debido a que el procedimiento almacenado se debe crear en la misma
instancia donde reside la base de datos, no hay parámetros para el ID de usuario
ni la contraseña.
Sólo es obligatorio el primer parámetro, el nombre del archivo fuente. El nombre
de la base de datos es opcional. Si no se proporciona un nombre de base de datos,
el programa utiliza la base de datos por omisión sample.
Procedimiento:
Si conecta con la base de datos ″sample″, especifique lo siguiente para crear el
programa de ejemplo outsrv a partir del archivo fuente outsrv.sqb:
bldrtn outsrv
Si conecta con otra base de datos, especifique también el nombre de la base de
datos:
bldrtn outsrv basedatos
Capítulo 5. Desarrollo de rutinas externas 401
![Page 410: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/410.jpg)
El archivo de script copia la DLL en el directorio sqllib/function del servidor.
Una vez creada la DLL outsrv, puede crear la aplicación cliente outcli, la cual
llama a la rutina contenida en la DLL y que tiene el mismo que la DLL. Puede
crear outcli utilizando el archivo de proceso por lotes bldapp.bat.
Para invocar la rutina outsrv, ejecute la aplicación cliente de ejemplo,
especificando lo siguiente:
outcli basedatos IDusuario contraseña
donde
basedatos
Es el nombre de la base de datos a la que desea conectarse. El nombre
podría ser sample, o su alias, u otro nombre.
IDusuario
Es un ID de usuario válido.
contraseña
Es una contraseña válida correspondiente al ID de usuario.
La aplicación cliente accede a la DLL outsrv, la cual ejecuta la rutina del mismo
nombre contenida en la base de datos del servidor. A continuación los datos
resultantes se devuelven a la aplicación cliente.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
Información relacionada:
v “Ejemplos de COBOL” en la página 408
v “Opciones de compilación y enlace para rutinas Micro Focus COBOL de
Windows” en la página 396
Ejemplos relacionados:
v “bldrtn.bat -- Builds Windows Micro Focus Cobol routines (stored procedures)”
v “outcli.sqb -- Call stored procedures using the SQLDA structure (MF COBOL)”
v “outsrv.sqb -- Demonstrates stored procedures using the SQLDA structure (MF
COBOL)”
v “embprep.bat -- Prep and binds a C/C++ or Micro Focus COBOL embedded
SQL program on Windows”
402 Desarrollo de aplicaciones de SQL incorporado
![Page 411: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/411.jpg)
Parte 3. Apéndices
© Copyright IBM Corp. 1993, 2006 403
![Page 412: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/412.jpg)
404 Desarrollo de aplicaciones de SQL incorporado
![Page 413: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/413.jpg)
Apéndice A. Ejemplos de SQL incorporado
Ejemplos de C
Directorio UNIX: sqllib/samples/c. Directorio Windows: sqllib\samples\c.
Extensiones de archivos: .c (sin SQL incorporado); .sqc (SQL incorporado)
Tabla 29. Archivos de programas de ejemplo de C
Tipo de ejemplo Nombre del programa de ejemplo Descripción del programa
Nivel de cliente cli_info.c Cómo obtener y definir información a nivel de cliente.
clisnap.c Cómo capturar una instantánea a nivel de cliente.
clisnapnew.c Cómo obtener una instantánea a nivel de cliente
(utilizando API).
Nivel de instancia inattach.c Cómo conectar/desconectar respecto a una instancia.
inauth.sqc Cómo visualizar autorizaciones a nivel de instancia.
ininfo.c Cómo obtener y definir información a nivel de instancia.
insnap.c Cómo capturar una instantánea a nivel de instancia.
insnapnew.c Cómo obtener una instantánea a nivel de instancia
(utilizando API).
instart.c Cómo detener e iniciar la instancia local actual.
© Copyright IBM Corp. 1993, 2006 405
![Page 414: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/414.jpg)
Tabla 29. Archivos de programas de ejemplo de C (continuación)
Tipo de ejemplo Nombre del programa de ejemplo Descripción del programa
Nivel de base de
datos
autostore.c Cómo utilizar la función de almacenamiento automático
para una base de datos.
dbauth.sqc Cómo visualizar/otorgar/revocar autorizaciones a nivel
de base de datos.
dbcfg.sqc Cómo configurar parámetros de base de datos y de
gestor de bases de datos.
dbconn.sqc Cómo conectar y desconectar con respecto de una base
de datos.
dbcreate.c Cómo crear y eliminar bases de datos.
dbhistfile.sqc Cómo leer y actualizar una entrada de archivo de
historia de recuperación de base de datos.
dbinfo.c Cómo obtener y definir información a nivel de base de
datos.
dbinline.sqc Cómo utilizar el lenguaje de procedimientos SQL
incorporados.
dbinspec.sqc Cómo verificar la integridad arquitectural con la API de
DB2 db2Inspect.
dblogconn.sqc Cómo leer archivos de registro de base de datos de
forma asíncrona con una conexión de base de datos.
dblognoconn.sqc Cómo leer archivos de registro de base de datos de
forma asíncrona sin ninguna conexión de base de datos.
dbmcon.sqc Cómo conectar y desconectar con respecto a varias bases
de datos.
dbmcon1.h Archivo de cabecera de dbmcon1.sqc.
dbmcon1.sqc Archivo de soporte de dbmcon.sqc.
dbmcon2.h Archivo de cabecera de dbmcon2.sqc.
dbmcon2.sqc Archivo de soporte de dbmcon.sqc.
dbmigrat.c Cómo migrar una base de datos.
dbpkg.sqc Cómo trabajar con paquetes.
dbrec.sqc Cómo utilizar la API db2GetRecommendations.
dbrecov.sqc Cómo recuperar una base de datos.
dbredirect.sqc Cómo realizar una Restauración redirigida de una base
de datos.
dbrestore.sqc Cómo restaurar una base de datos a partir de una copia
de seguridad.
dbrollfwd.sqc Cómo realizar una retrotracción después de una
restauración de una base de datos.
dbsample.sqc Cómo crear la base de datos de ejemplo de forma que
incluya tablas y vistas de Host y AS/400.
dbsnap.c Cómo capturar una instantánea a nivel de base de datos.
dbsnapnew.c Cómo obtener una instantánea a nivel de base de datos
(utilizando API).
dbthrds.sqc Cómo utilizar las API de múltiples contextos en UNIX.
dbthrds.sqc Cómo utilizar las API de múltiples contextos en
Windows.
dbuse.sqc Cómo utilizar objetos de base de datos.
getlogs.sqc Cómo obtener una vista de cliente de entradas de
archivo de anotaciones cronológicas de diagnóstico.
Nivel de espacio
de tabla
tscreate.sqc Cómo crear y eliminar agrupaciones de
almacenamientos intermedios y espacios de tablas.
tsinfo.sqc Cómo obtener información a nivel de espacio de tabla.
406 Desarrollo de aplicaciones de SQL incorporado
![Page 415: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/415.jpg)
Tabla 29. Archivos de programas de ejemplo de C (continuación)
Tipo de ejemplo Nombre del programa de ejemplo Descripción del programa
Nivel de tabla getmessage.sqc Cómo obtener un mensaje de error en el entorno local
necesario con sustitución de símbolos.
largerid.sqc Cómo ampliar el soporte a RID grandes en
tablas/espacios de tabla nuevos y existentes.
setintegrity.sqc Cómo ejecutar SET INTEGRITY en línea sobre una tabla.
tbast.sqc Cómo utilizar una tabla de etapas para actualizar una
Tabla de resumen automático diferida.
tbcompress.sqc Cómo crear tablas con opciones de compresión de
valores por omisión y nulos.
tbconstr.sqc Cómo trabajar con restricciones de tabla.
tbcreate.sqc Cómo crear, modificar y eliminar tablas.
tbident.sqc Cómo utilizar columnas de identidad.
tbinfo.sqc Cómo obtener y definir información a nivel de tabla.
tbintrig.sqc Cómo utilizar un desencadenante ’INSTEAD OF’ en una
vista.
tbload.sqc Cómo cargar en una base de datos particionada.
tbloadcursor.sqc Cómo cargar datos devueltos desde una sentencia
SELECT en una tabla mediante el método CURSOR o el
método de soporte REMOTEFETCH.
tbmerge.sqc Cómo utilizar la sentencia MERGE.
tbmod.sqc Cómo modificar información de una tabla.
tbmove.sqc Cómo mover datos de tablas.
tbonlineinx.sqc Cómo crear y reorganizar índices en una tabla.
tbpriv.sqc Cómo visualizar/otorgar/revocar privilegios a nivel de
tabla.
tbread.sqc Cómo leer información de una tabla.
tbreorg.sqc Cómo reorganizar una tabla.
tbrowcompress.sqc Cómo ejecutar la compresión de filas sobre una tabla.
tbrunstats.sqc Cómo ejecutar runstats sobre una tabla.
tbsavept.sqc Cómo utilizar puntos de salvar externos.
tbsel.sqc Cómo seleccionar de entre: inserción, actualización,
supresión.
tbselcreate.db2 Cómo crear las tablas para el programa tbsel.
tbseldrop.db2 Cómo eliminar las tablas del programa tbsel.
tbtemp.sqc Cómo utilizar una tabla temporal declarada.
tbtrig.sqc Cómo utilizar un desencadenante en una tabla.
tbumqt.sqc Cómo utilizar tablas de consultas materializadas (tablas
de resumen).
tbunion.sqc Cómo insertar utilizando una vista UNION ALL.
Nivel de tipo de
datos
dtformat.sqc Cómo utilizar extensiones de formato de datos de carga
e importación.
dtlob.sqc Cómo leer y escribir datos de LOB.
dtudt.sqc Cómo crear, utilizar y eliminar tipos diferenciados
definidos por el usuario.
Nivel de función
de DB2
fnuse.sqc Cómo utilizar funciones de SQL.
Apéndice A. Ejemplos de SQL incorporado 407
![Page 416: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/416.jpg)
Tabla 29. Archivos de programas de ejemplo de C (continuación)
Tipo de ejemplo Nombre del programa de ejemplo Descripción del programa
Nivel de
procedimiento
almacenado
spcat Script del catálogo de procedimientos almacenados para
el programa spserver. Este script llama a spdrop.db2 y
spcreate.db2.
spcreate.db2 Script de CLP para emitir sentencias CREATE
PROCEDURE.
spdrop.db2 Script de CLP para eliminar procedimientos
almacenados del catálogo.
spclient.sqc Programa cliente utilizado para llamar a las rutinas de
servidor declaradas en spserver.sqc.
spserver.sqc Rutinas de procedimiento almacenado creadas y
ejecutadas en el servidor.
Nivel de UDF udfcli.sqc Aplicación cliente que sirve para llamar a la función
definida por el usuario contenida en udfsrv.c, udfsrv.C.
udfsrv.c Función definida por el usuario ScalarUDF invocada por
udfcli.sqc
udfemcli.sqc Aplicación cliente que sirve para llamar a la biblioteca
de funciones definidas por el usuario de SQL
incorporado, udfemsrv.
udfemsrv.sqc Biblioteca de funciones definidas por el usuario de SQL
incorporado invocada por udfemcli.
Otros evm.sqc Cómo crear y analizar supervisores de sucesos de
archivos, conexiones y tablas.
utilrecov.c Programas de utilidad para los archivos de copia de
seguridad, restauración y registro.
utilsnap.c Programas de utilidad para los programas de ejemplo
de supervisión de capturas.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
v “Programas de utilidad de comprobación de errores” en la página 223
v “Archivos de ejemplo” en Temas de ejemplos
Ejemplos de COBOL
Directorios de UNIX. IBM COBOL: sqllib/samples/cobol; Micro Focus COBOL:
sqllib/samples/cobol_mf.
Directorios de Windows. IBM COBOL: sqllib\samples\cobol; Micro Focus
COBOL: sqllib\samples\cobol_mf.
Nota: Los ejemplos de COBOL no están estructurados según el diseño de niveles
de DB2 utilizado para los ejemplos de C, CLI, C++, C#, Java, Perl, PHP,
Visual Basic ADO y Visual Basic .NET.
Tabla 30. Programas COBOL de ejemplo de la API de DB2 sin SQL incorporado
Programa de
ejemplo API incluida
checkerr.cbl v sqlaintp - Obtener mensaje de error
v sqlogstt - Obtener mensaje de SQLSTATE
client.cbl v sqleqryc - Consultar cliente
v sqlesetc - Definir cliente
408 Desarrollo de aplicaciones de SQL incorporado
![Page 417: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/417.jpg)
Tabla 30. Programas COBOL de ejemplo de la API de DB2 sin SQL
incorporado (continuación)
Programa de
ejemplo API incluida
d_dbconf.cbl v sqleatin - Conectar
v sqledtin - Desconectar
v sqlfddb - Obtener valores por omisión de configuración de base de
datos
d_dbmcon.cbl v sqleatin - Conectar
v sqledtin - Desconectar
v sqlfdsys - Obtener valores por omisión de configuración de gestor
de bases de datos
db_udcs.cbl v sqleatin - Conectar
v sqlecrea - Crear base de datos
v sqledrpd - Eliminar base de datos
dbcat.cbl v sqlecadb - Catalogar base de datos
v db2DbDirCloseScan - Cerrar exploración de directorio de base de
datos
v db2DbDirGetNextEntry - Obtener entrada siguiente del directorio
de base de datos
v db2DbDirOpenScan - Abrir exploración de directorio de base de
datos
v sqleuncd - Descatalogar base de datos
dbcmt.cbl v sqledcgd - Cambiar comentario de base de datos
v db2DbDirCloseScan - Cerrar exploración de directorio de base de
datos
v db2DbDirGetNextEntry - Obtener entrada siguiente del directorio
de base de datos
v db2DbDirOpenScan - Abrir exploración de directorio de base de
datos
v sqleisig - Instalar gestor de señales
dbconf.cbl v sqleatin - Conectar
v sqlecrea - Crear base de datos
v sqledrpd - Eliminar base de datos
v sqlfrdb - Restaurar configuración de base de datos
v sqlfudb - Actualizar configuración de base de datos
v sqlfxdb - Obtener configuración de base de datos
dbinst.cbl v sqleatcp - Conectar y cambiar contraseña
v sqleatin - Conectar
v sqledtin - Desconectar
v sqlegins - Obtener instancia
dbmconf.cbl v sqleatin - Conectar
v sqledtin - Desconectar
v sqlfrsys - Restaurar configuración de gestor de bases de datos
v sqlfusys - Actualizar configuración de gestor de bases de datos
v sqlfxsys - Obtener configuración de gestor de bases de datos
Apéndice A. Ejemplos de SQL incorporado 409
![Page 418: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/418.jpg)
Tabla 30. Programas COBOL de ejemplo de la API de DB2 sin SQL
incorporado (continuación)
Programa de
ejemplo API incluida
dbsnap.cbl v sqleatin - Conectar
v sqlmonss - Obtener instantánea
dbstart.cbl v sqlepstart - Iniciar gestor de bases de datos
dbstop.cbl v sqlefrce - Forzar aplicación
v sqlepstp - Detener gestor de bases de datos
dcscat.cbl v sqlegdad - Catalogar bases de datos DCS
v sqlegdcl - Cerrar exploración de directorio DCS
v sqlegdel - Descatalogar base de datos DCS
v sqlegdge - Obtener entrada de directorio DCS para base de datos
v sqlegdgt - Obtener entradas de directorio DCS
v sqlegdsc - Abrir exploración de directorio DCS
ebcdicdb.cbl v sqleatin - Conectar
v sqlecrea - Crear base de datos
v sqledrpd - Eliminar base de datos
migrate.cbl v sqlemgdb - Migrar base de datos
monreset.cbl v sqleatin - Conectar
v sqlmrset - Restaurar monitor
monsz.cbl v sqleatin - Conectar
v sqlmonss - Obtener instantánea
v sqlmonsz - Calcular tamaño necesario para almacenamiento
intermedio de salida de sqlmonss()
nodecat.cbl v sqlectnd - Catalogar nodo
v sqlencls - Cerrar exploración de directorio de nodo
v sqlengne - Obtener entrada siguiente del directorio de nodo
v sqlenops - Abrir exploración de directorio de nodo
v sqleuncn - Descatalogar nodo
restart.cbl v sqlerstd - Reiniciar base de datos
setact.cbl v sqlesact - Definir cadena de contabilidad
sws.cbl v sqleatin - Conectar
v sqlmon - Obtener/Actualizar conmutadores de monitor
Tabla 31. Programas COBOL de ejemplo de la API de DB2 con SQL incorporado
Programa de
ejemplo API incluida
dbauth.sqb v sqluadau - Obtener autorizaciones
dbstat.sqb v db2Reorg - Reorganizar tabla
v db2Runstats - Ejecutar estadísticas
expsamp.sqb v db2Export - Exportar
v sqluimpr - Importar
410 Desarrollo de aplicaciones de SQL incorporado
![Page 419: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/419.jpg)
Tabla 31. Programas COBOL de ejemplo de la API de DB2 con SQL
incorporado (continuación)
Programa de
ejemplo API incluida
impexp.sqb v db2Export - Exportar
v sqluimpr - Importar
loadqry.sqb v db2LoadQuery - Cargar consulta
rebind.sqb v sqlarbnd - Volver a vincular
tabscont.sqb v sqlbctcq - Cerrar consulta del contenedor del espacio de tabla
v sqlbftcq - Recuperar consulta del contenedor del espacio de tabla
v sqlbotcq - Abrir consulta del contenedor del espacio de tabla
v sqlbtcq - Consulta del contenedor del espacio de tabla
v sqlefmem - Liberar memoria
tabspace.sqb v sqlbctsq - Cerrar consulta del espacio de tabla
v sqlbftpq - Recuperar consulta del espacio de tabla
v sqlbgtss - Obtener estadísticas del espacio de tabla
v sqlbmtsq - Consulta del espacio de tabla
v sqlbotsq - Abrir consulta del espacio de tabla
v sqlbstpq - Consulta individual del espacio de tabla
v sqlefmem - Liberar memoria
tload.sqb v db2Export - Exportar
v sqluload - Cargar
v sqluvqdp - Inmovilizar espacios de tablas para tabla
tspace.sqb v sqlbctcq - Cerrar consulta del contenedor del espacio de tabla
v sqlbctsq - Cerrar consulta del espacio de tabla
v sqlbftcq - Recuperar consulta del contenedor del espacio de tabla
v sqlbftpq - Recuperar consulta del espacio de tabla
v sqlbgtss - Obtener estadísticas del espacio de tabla
v sqlbmtsq - Consulta del espacio de tabla
v sqlbotcq - Abrir consulta del contenedor del espacio de tabla
v sqlbotsq - Abrir consulta del espacio de tabla
v sqlbstpq - Consulta individual del espacio de tabla
v sqlbstsc - Definir contenedores del espacio de tabla
v sqlbtcq - Consulta del contenedor del espacio de tabla
v sqlefmem - Liberar memoria
Tabla 32. Programas COBOL de ejemplo con SQL incorporado sin ninguna API de DB2
Nombre del
programa de
ejemplo Descripción del programa
advsql.sqb Muestra el uso de expresiones complejas de SQL, tales como CASE,
CAST, y selecciones completas escalares.
cursor.sqb Muestra el uso de un cursor que utiliza SQL estático.
delet.sqb Muestra el uso de SQL estático para suprimir elementos de una base de
datos.
Apéndice A. Ejemplos de SQL incorporado 411
![Page 420: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/420.jpg)
Tabla 32. Programas COBOL de ejemplo con SQL incorporado sin ninguna API de
DB2 (continuación)
Nombre del
programa de
ejemplo Descripción del programa
dynamic.sqb Muestra el uso de un cursor que utiliza SQL dinámico.
joinsql.sqb Muestra el uso de expresiones de unión complejas de SQL.
lobeval.sqb Muestra el uso de localizadores de LOB y difiere la evaluación de los
datos LOB propiamente dichos.
lobfile.sqb Muestra el uso de los descriptores de archivo de LOB.
lobloc.sqb Muestra el uso de los localizadores de LOB.
openftch.sqb Muestra cómo recuperar, actualizar y suprimir filas utilizando SQL
estático.
static.sqb Muestra el uso de SQL estático para recuperar información.
tabsql.sqb Muestra el uso de expresiones complejas de tabla de SQL.
trigsql.sqb Muestra el uso de desencadenantes y restricciones complejos de SQL.
updat.sqb Muestra el uso de SQL estático para actualizar una base de datos.
varinp.sqb Muestra el uso de datos de entrada variables para llamadas a sentencias
de SQL dinámico incorporadas utilizando marcadores de parámetros.
Conceptos relacionados:
v “Creación de aplicaciones de SQL incorporado mediante el script de creación de
ejemplo” en la página 221
v “Programas de utilidad de comprobación de errores” en la página 223
v “Archivos de ejemplo” en Temas de ejemplos
Ejemplos de REXX
Directorio AIX: sqllib/samples/rexx. Directorio Windows: sqllib\samples\rexx.
Tabla 33. Archivos de programas de ejemplo de REXX.
Nombre del
archivo de
ejemplo
Descripción del archivo
blobfile.cmd Muestra el manejo de los BLOB (Binary Large OBject).
chgisl.cmd Muestra el uso de la API: CHANGE ISOLATION LEVEL.
client.cmd Muestra el uso de las API: SET CLIENT y QUERY CLIENT.
d_dbconf.cmd Muestra el uso de la API: GET DATABASE CONFIGURATION DEFAULTS
d_dbmcon.cmd Muestra el uso de la API: GET DATABASE MANAGER
CONFIGURATION DEFAULTS
db_udcs.cmd Muestra el uso de las API CREATE DATABASE y DROP DATABASE para
simular el comportamiento de una secuencia de clasificación de DB2 para
MVS/ESA CCSID 500 (EBCDIC International).
dbauth.cmd Muestra el uso de la API: GET AUTHORIZATIONS
412 Desarrollo de aplicaciones de SQL incorporado
![Page 421: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/421.jpg)
Tabla 33. Archivos de programas de ejemplo de REXX. (continuación)
Nombre del
archivo de
ejemplo
Descripción del archivo
dbcat.cmd Muestra el uso de las API siguientes:
CATALOG DATABASE
CLOSE DATABASE DIRECTORY SCAN
GET NEXT DATABASE DIRECTORY ENTRY
OPEN DATABASE DIRECTORY SCAN
UNCATALOG DATABASE
dbcmt.cmd Muestra el uso de las API siguientes:
CHANGE DATABASE COMMENT
GET ERROR MESSAGE
INSTALL SIGNAL HANDLER
dbconf.cmd Muestra el uso de las API siguientes:
CREATE DATABASE
DROP DATABASE
GET DATABASE CONFIGURATION
RESET DATABASE CONFIGURATION
UPDATE DATABASE CONFIGURATION
dbinst.cmd Muestra el uso de las API siguientes:
ATTACH TO INSTANCE
DETACH FROM INSTANCE
GET INSTANCE
dbmconf.cmd Muestra el uso de las API siguientes:
GET DATABASE MANAGER CONFIGURATION
RESET DATABASE MANAGER CONFIGURATION
UPDATE DATABASE MANAGER CONFIGURATION
dbstart.cmd Muestra el uso de la API: START DATABASE MANAGER
dbstat.cmd Muestra el uso de las API siguientes:
REORGANIZE TABLE
RUN STATISTICS
dbstop.cmd Muestra el uso de las API siguientes:
FORCE USERS
STOP DATABASE MANAGER
dcscat.cmd Muestra el uso de las API siguientes:
ADD DCS DIRECTORY ENTRY
CLOSE DCS DIRECTORY SCAN
GET DCS DIRECTORY ENTRY FOR DATABASE
GET DCS DIRECTORY ENTRIES
OPEN DCS DIRECTORY SCAN
UNCATALOG DCS DIRECTORY ENTRY
dynamic.cmd Muestra el uso de un cursor que utiliza SQL dinámico
ebcdicdb.cmd Muestra el uso de las API CREATE DATABASE y DROP DATABASE para
simular el comportamiento de una secuencia de clasificación de DB2 para
MVS/ESA CCSID 037 (EBCDIC - inglés americano)
impexp.cmd Muestra el uso de las API: EXPORT e IMPORT.
lobeval.cmd Muestra cómo diferir la evaluación de un LOB dentro de una base de
datos
lobfile.cmd Muestra el uso de los descriptores de archivo de LOB
lobloc.cmd Muestra el uso de los localizadores de LOB
lobval.cmd Muestra el uso de los LOB
Apéndice A. Ejemplos de SQL incorporado 413
![Page 422: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/422.jpg)
Tabla 33. Archivos de programas de ejemplo de REXX. (continuación)
Nombre del
archivo de
ejemplo
Descripción del archivo
migrate.cmd Muestra el uso de la API: MIGRATE DATABASE
nodecat.cmd Muestra el uso de las API siguientes:
CATALOG NODE
CLOSE NODE DIRECTORY SCAN
GET NEXT NODE DIRECTORY ENTRY
OPEN NODE DIRECTORY SCAN
UNCATALOG NODE
quitab.cmd Muestra el uso de la API: QUIESCE TABLESPACES FOR TABLE
rechist.cmd Muestra el uso de las API siguientes:
CLOSE RECOVERY HISTORY FILE SCAN
GET NEXT RECOVERY HISTORY FILE ENTRY
OPEN RECOVER HISTORY FILE SCAN
PRUNE RECOVERY HISTORY FILE ENTRY
UPDATE RECOVERY HISTORY FILE ENTRY
restart.cmd Muestra el uso de la API: RESTART DATABASE
sqlecsrx.cmd Es un ejemplo de secuencia de clasificación
updat.cmd Utiliza SQL dinámico para actualizar una base de datos
Conceptos relacionados:
v “Archivos de ejemplo” en Temas de ejemplos
Tareas relacionadas:
v “Creación de aplicaciones Object REXX en Windows” en la página 267
414 Desarrollo de aplicaciones de SQL incorporado
![Page 423: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/423.jpg)
Apéndice B. Información técnica sobre DB2 Database
Visión general de la información técnica de DB2
La información técnica de DB2 está disponible a través de las herramientas y los
métodos siguientes:
v Centro de información de DB2
– Temas
– Ayuda para herramientas de DB2
– Programas de ejemplo
– Guías de aprendizajev Manuales de DB2
– Archivos PDF (descargables)
– Archivos PDF (del CD en PDF de DB2)
– manuales en copia impresav Ayuda de línea de mandatos
– Ayuda de mandatos
– Ayuda de mensajesv Programas de ejemplo
IBM proporciona periódicamente actualizaciones de la documentación. Si accede a
la versión en línea del Centro de información de DB2 en ibm.com, no es necesario
que instale las actualizaciones de la documentación porque IBM mantiene
actualizada esta versión. Si ha instalado el Centro de información de DB2, es
recomendable instalar las actualizaciones de la documentación. Las actualizaciones
de la documentación permiten actualizar la información que instaló desde el CD
del Centro de información de DB2 o que descargó de Passport Advantage a
medida que información nueva pasa a estar disponible.
Nota: Los temas del Centro de información de DB2 se actualizan con más
frecuencia que los manuales en PDF o impresos. Para obtener la información
más actualizada, instale las actualizaciones de la documentación cuando
estén disponibles, o consulte el Centro de información de DB2 en ibm.com.
Puede acceder a información técnica adicional de DB2 como, por ejemplo, notas
técnicas, White papers y Redbooks en línea en el sitio ibm.com. Acceda al sitio de
la biblioteca de software de gestión de información de DB2 en
http://www.ibm.com/software/data/sw-library/.
Comentarios sobre la documentación
Agradecemos los comentarios sobre la documentación de DB2. Si tiene sugerencias
sobre cómo podemos mejorar la documentación de DB2, envíe un correo
electrónico a [email protected]. El personal encargado de la documentación de
DB2 lee todos los comentarios de los usuarios, pero no puede responder
directamente a cada uno. Proporcione ejemplos específicos siempre que sea posible
de manera que podamos comprender mejor sus problemas. Si realiza comentarios
sobre un tema o archivo de ayuda determinado, incluya el título del tema y el
URL.
© Copyright IBM Corp. 1993, 2006 415
![Page 424: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/424.jpg)
No utilice esta dirección de correo electrónico para contactar con el Servicio al
cliente de DB2. Si tiene un problema técnico de DB2 que no está tratado por la
documentación, consulte al centro local de servicio técnico de IBM para obtener
ayuda.
Conceptos relacionados:
v “Características del Centro de información de DB2” en Centro de información de
DB2 en línea
v “Archivos de ejemplo” en Temas de ejemplos
Tareas relacionadas:
v “Invocación de ayuda de mandatos desde el procesador de línea de mandatos”
en Consulta de mandatos
v “Invocación de ayuda de mensajes desde el procesador de línea de mandatos”
en Consulta de mandatos
v “Actualización del Centro de información de DB2 instalado en el sistema o en
un servidor de intranet” en la página 421
Información relacionada:
v “Biblioteca técnica de DB2 en formato PDF” en la página 416
Biblioteca técnica de DB2 en formato PDF
Las tablas siguientes describen la biblioteca de DB2 que está disponible en el
Centro de publicaciones de IBM en www.ibm.com/shop/publications/order.
Aunque las tablas identifican los manuales en copia impresa disponibles, puede
que dichos manuales no estén disponibles en su país o región.
La información de estos manuales es fundamental para todos los usuarios de DB2;
esta información le resultará útil tanto si es un programador o un administrador de
bases de datos como si trabaja con DB2 Connect u otros productos de DB2.
Tabla 34. Información técnica de DB2
Nombre Número de documento Copia impresa disponible
Administration Guide:
Implementation
SC10-4221 Sí
Administration Guide: Planning SC10-4223 Sí
Consulta de las API
administrativas
SC11-3192 Sí
Vistas y rutinas administrativas
SQL
SC11-3194 No
Call Level Interface Guide and
Reference, Volume 1
SC10-4224 Sí
Call Level Interface Guide and
Reference, Volume 2
SC10-4225 Sí
Consulta de mandatos SC11-3179 No
Data Movement Utilities Guide
and Reference
SC10-4227 Sí
Data Recovery and High
Availability Guide and Reference
SC10-4228 Sí
416 Desarrollo de aplicaciones de SQL incorporado
![Page 425: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/425.jpg)
Tabla 34. Información técnica de DB2 (continuación)
Nombre Número de documento Copia impresa disponible
Desarrollo de aplicaciones
ADO.NET y OLE DB
SC11-3178 Sí
Desarrollo de aplicaciones de SQL
incorporado
SC11-3190 Sí
Desarrollo de SQL y rutinas
externas
SC11-3381 No
Desarrollo de aplicaciones Java SC11-3189 Sí
Desarrollo de aplicaciones Perl y
PHP
SC11-3187 No
Iniciación al desarrollo de
aplicaciones de bases de datos
SC11-3188 Sí
Iniciación a la instalación y
administración de DB2 en Linux
y Windows
GC11-3195 Sí
Consulta de mensajes Volumen 1 SC11-3184 No
Consulta de mensajes Volumen 2 SC11-3198 No
Guía de migración GC11-3196 Sí
Net Search Extender Guía de
administración y del usuario
Nota: El HTML para este
documento no se instala desde
el CD de documentación
HTML.
SH10-9290 Sí
Performance Guide SC10-4222 Sí
Query Patroller Administration
and User’s Guide
GC10-4241 Sí
Guía rápida de iniciación para
clientes DB2
GC11-3182 No
Guía rápida de iniciación para
servidores DB2
GC11-3181 Sí
Spatial Extender y Geodetic Data
Management Feature Guía del
usuario y manual de consulta
SC11-3229 Sí
Guía de SQL SC11-3191 Sí
Consulta de SQL, Volumen 1 SC11-3180 Sí
Consulta de SQL, Volumen 2 SC11-3193 Sí
System Monitor Guide and
Reference
SC10-4251 Sí
Troubleshooting Guide GC10-4240 No
Guía de aprendizaje de Visual
Explain
SC11-3357 No
Novedades SC11-3185 Sí
XML Extender Administración y
programación
SC11-3230-00 Sí
XML Guide SC10-4254 Sí
XQuery Reference SC18-9796 Sí
Apéndice B. Información técnica sobre DB2 Database 417
![Page 426: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/426.jpg)
Tabla 35. Información técnica específica de DB2 Connect
Nombre Número de documento Copia impresa disponible
DB2 Connect Guía del usuario SC11-3197 Sí
Quick Beginnings for DB2
Connect Personal Edition
GC10-4244 Sí
Guía rápida de iniciación para
servidores DB2 Connect
GC11-3183 Sí
Tabla 36. Información técnica de integración de la información de WebSphere
Nombre Número de documento Copia impresa disponible
WebSphere Information
Integration: Administration Guide
for Federated Systems
SC19-1020 Sí
WebSphere Information
Integration: ASNCLP Program
Reference for Replication and
Event Publishing
SC19-1018 Sí
WebSphere Information
Integration: Configuration Guide
for Federated Data Sources
SC19-1034 No
WebSphere Information
Integration: SQL Replication
Guide and Reference
SC19-1030 Sí
Nota: Las Notas de release de DB2 proporcionan información adicional específica
para el release del producto y el nivel de fixpack. Para obtener más
información, consulte los enlaces relacionados.
Conceptos relacionados:
v “Visión general de la información técnica de DB2” en la página 415
v “Acerca de las notas del release” en Notas del release
Tareas relacionadas:
v “Pedido de manuales de DB2 en copia impresa” en la página 418
Pedido de manuales de DB2 en copia impresa
Si necesita manuales de DB2 en copia impresa, puede comprarlos en línea en
varios, pero no en todos los países o regiones. Siempre puede hacer pedidos de
manuales de DB2 en copia impresa a través del representante local de IBM.
Recuerde que algunos manuales en copia software del CD Documentación en PDF
de DB2 no están disponibles en copia impresa. Por ejemplo, ningún volumen de
Consulta de mensajes de DB2 está disponible como manual impreso.
Las versiones impresas de muchos de los manuales de DB2 disponibles en el CD
de la Documentación PDF de DB2 se pueden solicitar a IBM por una cantidad.
Dependiendo desde dónde realice el pedido, podrá solicitar manuales en línea,
desde el Centro de publicaciones de IBM. Si la realización de pedidos en línea no
está disponible en su país o región, siempre puede hacer pedidos de manuales de
418 Desarrollo de aplicaciones de SQL incorporado
![Page 427: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/427.jpg)
DB2 en copia impresa al representante local de IBM. Tenga en cuenta que no todos
los manuales del CD de la Documentación PDF de DB2 están disponibles en copia
impresa.
Nota: La documentación más actualizada y completa de DB2 se mantiene en el
Centro de información 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
línea en su país o región, consulte el Centro de publicaciones de IBM en el sitio
http://www.ibm.com/shop/publications/order. Debe seleccionar un país, región
o idioma para poder acceder a la información sobre pedidos de publicaciones y,
a continuación, seguir las instrucciones sobre pedidos para su localidad.
v Para hacer pedidos de manuales de DB2 en copia impresa a través del
representante local de IBM:
– Localice la información 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 país, región o idioma
para acceder a la página de presentación de las publicaciones apropiadas
para su localidad. Desde esta página, siga el enlace ″Acerca de este sitio″.– Cuando llame, indique que desea hacer un pedido de una publicación de
DB2.
– Proporciónele al representante los títulos y los números de documento de los
manuales que desee solicitar .
Conceptos relacionados:
v “Visión general de la información técnica de DB2” en la página 415
Información relacionada:
v “Biblioteca técnica de DB2 en formato PDF” en la página 416
Visualización de la ayuda para estados de SQL desde el procesador
de línea de mandatos
DB2 devuelve un valor de SQLSTATE para las condiciones que pueden ser el
resultado de una sentencia de SQL. La ayuda de SQLSTATE explica los
significados de los estados de SQL y los códigos de las clases de estados de SQL.
Procedimiento:
Para invocar la ayuda para estados de SQL, abra el procesador de línea de
mandatos y entre:
? sqlstate o ? código de clase
donde sqlstate representa un estado de SQL válido de cinco dígitos y código de clase
representa los dos primeros dígitos del estado de SQL.
Apéndice B. Información técnica sobre DB2 Database 419
![Page 428: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/428.jpg)
Por ejemplo, ? 08003 visualiza la ayuda para el estado de SQL 08003, y ? 08
visualiza la ayuda para el código de clase 08.
Tareas relacionadas:
v “Invocación de ayuda de mandatos desde el procesador de línea de mandatos”
en Consulta de mandatos
v “Invocación de ayuda de mensajes desde el procesador de línea de mandatos”
en Consulta de mandatos
Acceso a diferentes versiones del Centro de información de DB2
Para obtener los temas de DB2 Versión 9, la URL del Centro de información de
DB2 es http://publib.boulder.ibm.com/infocenter/db2luw/v9/.
Para obtener los temas de DB2 Versión 8, vaya a la URL del Centro de información
Versión 8 en: http://publib.boulder.ibm.com/infocenter/db2luw/v8/.
Tareas relacionadas:
v “Setting up access to DB2 contextual help and documentation” en Administration
Guide: Implementation
Visualización de temas en el idioma preferido en el Centro de
información de DB2
El Centro de información de DB2 intenta visualizar los temas en el idioma
especificado en las preferencias del navegador. Si un tema no se ha traducido al
idioma preferido, el Centro de información de DB2 visualiza dicho tema en inglés.
Procedimiento:
Para visualizar temas en su idioma preferido en el navegador Internet Explorer:
1. En Internet Explorer, pulse en el botón Herramientas —> Opciones de Internet
—> Idiomas.... Se abrirá la ventana Preferencias de idioma.
2. Asegúrese de que su idioma preferido esté especificado como la primera
entrada de la lista de idiomas.
v Para añadir un nuevo idioma a la lista, pulse el botón Agregar....
Nota: La adición de un idioma no garantiza que el sistema tenga los fonts
necesarios para visualizar los temas en el idioma preferido.
v Para mover un idioma hacia el principio de la lista, seleccione el idioma y
pulse el botón Subir hasta que el idioma esté en primer lugar en la lista de
idiomas.3. Limpie la antememoria del navegador y, a continuación, renueve la página para
visualizar el Centro de información de DB2 en su idioma preferido.
Para visualizar temas en su idioma preferido en un navegador Firefox o Mozilla:
1. Seleccione el botón Herramientas —> Opciones —> Idiomas. Se visualizará el
panel Idiomas en la ventana Preferencias.
2. Asegúrese de que su idioma preferido esté especificado como la primera
entrada de la lista de idiomas.
420 Desarrollo de aplicaciones de SQL incorporado
![Page 429: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/429.jpg)
v Para añadir un nuevo idioma a la lista, pulse el botón Añadir... a fin de
seleccionar un idioma en la ventana Añadir idiomas.
v Para mover un idioma hacia el principio de la lista, seleccione el idioma y
pulse el botón Subir hasta que el idioma esté en primer lugar en la lista de
idiomas.3. Limpie la antememoria del navegador y, a continuación, renueve la página para
visualizar el Centro de información de DB2 en su idioma preferido.
En algunas combinaciones de navegador y sistema operativo, puede que también
tenga que cambiar los valores regionales del sistema operativo al entorno local y al
idioma de su elección.
Conceptos relacionados:
v “Visión general de la información técnica de DB2” en la página 415
Actualización del Centro de información de DB2 instalado en el
sistema o en un servidor de intranet
Si ha instalado localmente un Centro de información de DB2, puede descargar
temas actualizados. El valor de 'Última actualización' que se encuentra la final de
la mayoría de los temas indica el nivel actual de ese tema.
Para determinar si hay una actualización disponible para todo el Centro de
información de DB2, busque el valor de 'Última actualización' en la página Web
inicial del Centro de información. Compare el valor contenido en la página Web
inicial instalada localmente con la fecha de la actualización descargable más
reciente contenida en http://www.ibm.com/software/data/db2/udb/support/icupdate.html. Puede actualizar el Centro de información instalado localmente si
está disponible una actualización descargable más reciente.
Para actualizar el Centro de información de DB2 instalado localmente debe:
1. Detener el Centro de información de DB2 en el sistema, y reiniciar el Centro de
información en modalidad autónoma. La ejecución del Centro de información
en modalidad autónoma impide que otros usuarios de la red accedan al Centro
de información, y permite descargar y aplicar actualizaciones.
2. Utilice la función Actualizar para determinar si hay paquetes de actualización
disponibles en IBM.
Nota: También existen actualizaciones en CD. Para conocer detalles sobre cómo
configurar el Centro de información para instalar actualizaciones desde
CD, vea los enlaces correspondientes.Si hay paquetes de actualización disponibles, utilice la función Actualizar para
descargar los paquetes. (La función actualizar sólo está disponible en
modalidad autónoma.)
3. Detenga el Centro de información autónomo y reinicie el servicio Centro de
información de DB2 en el sistema.
Procedimiento:
Para actualizar el Centro de información de DB2 instalado en el sistema o en el
servidor de intranet:
1. Detenga el servicio Centro de información de DB2.
Apéndice B. Información técnica sobre DB2 Database 421
![Page 430: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/430.jpg)
v En Windows, pulse en Inicio → Panel de control → Herramientas
administrativas → Servicios. Después, pulse con el botón derecho del ratón
en el servicio Centro de información de DB2 y seleccione Detener.
v En Linux, especifique el mandato siguiente:
/etc/init.d/db2icdv9 stop
2. Inicie el Centro de información en modalidad autónoma.
v En Windows:
a. Abra una ventana de mandatos.
b. Navegue a la vía de acceso en la que está instalado el Centro de
información. Por omisión, el Centro de información de DB2 está instalado
en el directorio C:\Archivos de programa\IBM\Centro de información de
DB2\Versión 9.
c. Ejecute el archivo help_start.bat utilizando la vía de acceso
completamente calificada para el Centro de información de DB2:
<directorio de Centro de información de DB2>\doc\bin\help_start.bat
v En Linux:
a. Vaya hasta la vía de acceso en la que está instalado el Centro de
información. Por omisión, el Centro de información de DB2 está instalado
en el directorio /opt/ibm/db2ic/V9.
b. Ejecute el script help_start utilizando la vía de acceso totalmente
calificada del Centro de información de DB2:
<directorio del Centro de información de DB2>/doc/bin/help_start
Se inicia el navegador Web por omisión de los sistemas para visualizar el
Centro de información autónomo.
3. Pulse en el botón Actualizar (
). En la derecha del panel del Centro de
información, pulse en Buscar actualizaciones. Se visualiza una lista de
actualizaciones para la documentación existente.
4. Para iniciar el proceso de descarga, compruebe las selecciones que desea
descargar, después pulse en Instalar actualizaciones.
5. Cuando finalice el proceso de descarga e instalación, pulse en Finalizar.
6. Detenga el Centro de información autónomo.
v En Windows, ejecute el archivo help_end.bat utilizando la vía de acceso
completamente calificada para el Centro de información de DB2:
<directorio de Centro de información 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 ningún otro método para concluir help_start.bat.
v En Linux, ejecute el script help_end utilizando la vía de acceso totalmente
calificada del Centro de información de DB2:
<directorio del Centro de información 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 ningún otro método para concluir el script help_start.7. Reinicie el servicio Centro de información de DB2.
v En Windows, pulse en Inicio → Panel de control → Herramientas
administrativas → Servicios. Después, pulse con el botón derecho del ratón
en el servicio Centro de información de DB2 y seleccione Inicio.
422 Desarrollo de aplicaciones de SQL incorporado
![Page 431: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/431.jpg)
v En Linux, especifique el mandato siguiente:
/etc/init.d/db2icdv9 start
El Centro de información de DB2 actualizado visualiza los temas nuevos y
actualizados.
Conceptos relacionados:
v “Opciones de instalación del Centro de información de DB2” en Guía rápida de
iniciación para servidores DB2
Tareas relacionadas:
v “Instalación del Centro de información de DB2 utilizando el asistente de
instalación de DB2 (Linux)” en Guía rápida de iniciación para servidores DB2
v “Instalación del Centro de información de DB2 mediante el Asistente de
instalación de DB2 (Windows)” en Guía rápida de iniciación para servidores DB2
Guías de aprendizaje de DB2
Las guías de aprendizaje de DB2 le ayudan a conocer diversos aspectos de
productos DB2. Se proporcionan instrucciones paso a paso a través de lecciones.
Antes de comenzar:
Puede ver la versión XHTML de la guía de aprendizaje desde el Centro de
información en el sitio http://publib.boulder.ibm.com/infocenter/db2help/.
Algunas lecciones utilizan datos o código de ejemplo. Consulte la guía de
aprendizaje para obtener una descripción de los prerrequisitos para las tareas
específicas.
Guías de aprendizaje de DB2:
Para ver la guía de aprendizaje, pulse el título.
Almacén de datos XML nativos
Configure una base de datos DB2 para almacenar datos XML y realizar
operaciones básicas con el almacén de datos XML nativos.
Guía de aprendizaje de Visual Explain
Analizar, optimizar y ajustar sentencias de SQL para obtener un mejor
rendimiento al utilizar Visual Explain.
Conceptos relacionados:
v “Visual Explain overview” en Administration Guide: Implementation
Información de resolución de problemas de DB2
Existe una gran variedad de información para la resolución y determinación de
problemas para ayudarle en la utilización de productos DB2.
Documentación de DB2
Puede encontrar información sobre la resolución de problemas en la
publicación DB2 Troubleshooting Guide o en la sección Soporte y
resolución de problemas del Centro de información de DB2. En ellas
encontrará información sobre cómo aislar e identificar problemas
Apéndice B. Información técnica sobre DB2 Database 423
![Page 432: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/432.jpg)
utilizando herramientas y programas de utilidad de diagnóstico de DB2,
soluciones a algunos de los problemas más habituales y otros consejos
sobre cómo solucionar problemas que podría encontrar en los productos
DB2.
Sitio Web de soporte técnico de DB2
Consulte el sitio Web de soporte técnico de DB2 si tiene problemas y desea
obtener ayuda para encontrar las causas y soluciones posibles. El sitio de
soporte técnico tiene enlaces a las publicaciones más recientes de DB2,
notas técnicas, Informes autorizados de análisis 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 técnico de DB2 en la dirección
http://www.ibm.com/software/data/db2/udb/support.html
Conceptos relacionados:
v “Introduction to problem determination” en Troubleshooting Guide
v “Visión general de la información técnica de DB2” en la página 415
Términos y condiciones
Los permisos para utilizar estas publicaciones se otorgan sujetos a los siguientes
términos 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, explícitos o implícitos, sobre las publicaciones ni
sobre ninguna información, datos, software u otra propiedad intelectual contenida
en el mismo.
IBM se reserva el derecho de retirar los permisos aquí concedidos cuando, a su
discreción, el uso de las publicaciones sea en detrimento de su interés o cuando,
según determine IBM, las instrucciones anteriores no se cumplan correctamente.
No puede descargar, exportar ni volver a exportar esta información excepto en el
caso de cumplimiento total con todas las leyes y regulaciones vigentes, incluyendo
todas las leyes y regulaciones sobre exportación de los Estados Unidos.
IBM NO GARANTIZA EL CONTENIDO DE ESTAS PUBLICACIONES. LAS
PUBLICACIONES SE PROPORCIONAN ″TAL CUAL″ Y SIN GARANTÍA DE
NINGUNA CLASE, NI EXPLÍCITA NI IMPLÍCITA, INCLUYENDO PERO SIN
LIMITARSE A LAS GARANTÍAS IMPLÍCITAS DE COMERCIALIZACIÓN, NO
VULNERACIÓN E IDONEIDAD PARA UN FIN DETERMINADO.
424 Desarrollo de aplicaciones de SQL incorporado
![Page 433: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/433.jpg)
Apéndice C. Avisos
Es posible que IBM no comercialice en todos los países algunos productos,
servicios o características descritos en este manual. Consulte al representante local
de IBM para obtener información 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 sólo se pueda utilizar dicho
producto, programa o servicio de IBM. En su lugar se puede utilizar cualquier
producto, programa o servicio funcionalmente equivalente que no vulnere ninguno
de 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 tramitación que afecten al
tema tratado en este documento. La posesión 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 información de doble byte
(DBCS), puede ponerse en contacto con el Departamento de Propiedad Intelectual
de IBM de su país/región o escribir a:
IBM World Trade Asia Corporation
Licensing
2-31 Roppongi 3-chome, Minato-ku
Tokio 106, Japón
El párrafo siguiente no es aplicable al Reino Unido ni a ningún país/región en
donde tales disposiciones sean incompatibles con la legislación local:
INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA
ESTA PUBLICACIÓN “TAL CUAL”, SIN GARANTÍA DE NINGUNA CLASE, NI
EXPLÍCITA NI IMPLÍCITA, INCLUIDAS, PERO SIN LIMITARSE A ELLAS, LAS
GARANTÍAS IMPLÍCITAS DE NO VULNERACIÓN DE DERECHOS,
COMERCIALIZACIÓN O IDONEIDAD PARA UN FIN DETERMINADO. Algunos
estados no permiten la exclusión de garantías expresas o implícitas en
determinadas transacciones, por lo que es posible que esta declaración no sea
aplicable en su caso.
Esta publicación puede contener inexactitudes técnicas o errores tipográficos.
Periódicamente se efectúan cambios en la información aquí contenida; dichos
cambios se incorporarán a las nuevas ediciones de la publicación. IBM puede
efectuar, en cualquier momento y sin previo aviso, mejoras y cambios en los
productos y programas descritos en esta publicación.
Las referencias hechas en esta publicación a sitios Web que no son de IBM se
proporcionan sólo para la comodidad del usuario y no constituyen un aval de esos
sitios Web. La información contenida en estos sitios Web no forma parte de la
información del presente producto IBM y el usuario es responsable de la
utilización de dichos sitios.
© Copyright IBM Corp. 1993, 2006 425
![Page 434: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/434.jpg)
IBM puede utilizar o distribuir cualquier información que se le facilite de la
manera que considere adecuada, sin contraer por ello ninguna obligación con el
remitente.
Los licenciatarios de este programa que deseen obtener información sobre él con el
fin de habilitar: (i) el intercambio de información entre programas creados de
forma independiente y otros programas (incluido éste) y (ii) el uso mutuo de la
información intercambiada, deben ponerse en contacto con:
IBM Canada Limited
Office of the Lab Director
8200 Warden Avenue
Markham, Ontario
L6G 1C7
CANADÁ
Dicha información puede estar disponible, sujeta a los términos 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 según los términos 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. Además, algunas mediciones
pueden haberse calculado mediante extrapolación. Los resultados reales pueden
variar. Los usuarios del presente manual deben verificar los datos aplicables para
su entorno específico.
La información 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 públicamente. IBM no ha probado esos productos y no puede
confirmar la exactitud del rendimiento, la compatibilidad ni ninguna otra
afirmación 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 están sujetas a cambio o cancelación
sin previo aviso, y sólo representan objetivos.
Este manual puede contener ejemplos de datos e informes que se utilizan en
operaciones comerciales diarias. Para ilustrarlos de la forma más 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 técnicas de programación en diversas plataformas
operativas. Puede copiar, modificar y distribuir estos programas de ejemplo como
desee, sin pago alguno a IBM con la intención de desarrollar, utilizar, comercializar
o distribuir programas de aplicaciones de acuerdo con la interfaz de programación
426 Desarrollo de aplicaciones de SQL incorporado
![Page 435: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/435.jpg)
de aplicaciones correspondiente a la plataforma operativa para la que están 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 función 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) (año). Partes de este código proceden de programas de
ejemplo de IBM Corp. © Copyright IBM Corp. _entre el o los años_. Reservados
todos los derechos.
Marcas registradas
Los nombres de empresas, productos o servicios identificados en la biblioteca de
documentación de DB2 Versión 9 pueden ser marcas registradas o marcas de
servicios de International Business Machines Corporation o de otras empresas. La
información sobre marcas registradas de IBM Corporation en los Estados Unidos
y/o en otros países está ubicada en http://www.ibm.com/legal/copytrade.shtml.
Los términos siguientes son marcas registradas de otras empresas y se han
utilizado como mínimo en uno de los documentos de la biblioteca de
documentación 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 países.
Intel, Itanium, Pentium y Xeon son marcas registradas de Intel Corporation en los
Estados Unidos y/o en otros países.
Java y todas las marcas registradas basadas en Java son marcas registradas de Sun
Microsystems, Inc. en los Estados Unidos y/o en otros países.
UNIX es una marca registrada de The Open Group en los Estados Unidos y/o en
otros países.
Linux es una marca registrada de Linus Torvalds en los Estados Unidos y/o en
otros países.
Otros nombres de empresas, productos o servicios, pueden ser marcas registradas
o marcas de servicio de otras empresas.
Apéndice C. Avisos 427
![Page 436: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/436.jpg)
428 Desarrollo de aplicaciones de SQL incorporado
![Page 437: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/437.jpg)
Índice
Caracteres
Especiales#ifdefs
restricciones para C/C++ 112
.NETarchivos de proceso por lotes 221
Aactualizaciones
Centro de información 421
Centro de información de DB2 421
AIXaplicaciones C
opciones de compilación y
enlace 234
aplicaciones C++opciones de compilación y
enlace 235
aplicaciones COBOL de IBMcreación 246
opciones de compilación y
enlace 259
aplicaciones COBOL de Micro Focusopciones de compilación y
enlace 260
funciones definidas por el usuario en
C++creación con archivos de
configuración 386
procedimientos almacenados en C++creación con archivos de
configuración 384
rutinas Copciones de compilación y
enlace 373
rutinas C++opciones de compilación y
enlace 374
rutinas COBOL de IBMcreación 396
opciones de compilación y
enlace 391
rutinas COBOL de Micro Focusopciones de compilación y
enlace 392
SQL incorporado en C++creación con archivos de
configuración 230
almacenamientoasociación para albergar filas 158
declarar suficientes entidades
SQLVAR 153
API Bindcreación de paquetes 214
vinculación diferida 217
API GET ERROR MESSAGErecuperación de mensajes de
error 191
API GET ERROR MESSAGE
(continuación)variables REXX predefinidas 143
aplicacionesmigración 269
aplicaciones C/C++acceso a bases de datos de varias
hebras 31
Archivos de entrada y salida 43
Ejecución de sentencias de SQL
estático 151
aplicaciones COBOLArchivos de entrada y salida 43
Ejecución de sentencias de SQL
estático 151
Variables del lenguaje principal 119
restricciones 119
aplicaciones FORTRANArchivos de entrada y salida 43
Variables del lenguaje principal 133
aplicaciones multiconexiónarchivos de creación 221
creación de C/C++ de Windows 232
aplicaciones multihebraarchivos de creación 221
creación con C/C++ de
Windows 227
aplicaciones REXX 265
Variables del lenguaje principal 142
APPC (Comunicación Avanzada
Programa a Programa)manejo de interrupciones 194
archivosdeclaraciones de referencia en
C/C++ 106
archivos de configuraciónpara VisualAge C++ en AIX 229
VisualAge 225
archivos de creación 221
Archivos de inclusiónBibliotecas 47
archivos de proceso por lotes 221
archivos de vinculación 198, 204
compatibilidad con versiones
anteriores 216
REXX 266
soporte para aplicaciones REXX 266
archivos includerequisitos
C/C 48
COBOL 50
FORTRAN 53
SQLpara C/C 48
para COBOL 50
para FORTRAN 53
SQL1252ACOBOL 50
FORTRAN 53
SQL1252BCOBOL 50
archivos include (continuación)SQL1252B (continuación)
FORTRAN 53
SQLADEF para C/C++ 48
SQLAPREPpara C/C 48
para COBOL 50
para FORTRAN 53
SQLCApara C/C 48
para COBOL 50
para FORTRAN 53
SQLCA_92COBOL 50
FORTRAN 53
SQLCACNFORTRAN 53
SQLCACSFORTRAN 53
SQLCLI para C/C++ 48
SQLCLI1 para C/C++ 48
SQLCODESpara C/C 48
para COBOL 50
para FORTRAN 53
SQLDACOBOL 50
para C/C 48
para FORTRAN 53
SQLDACTFORTRAN 53
SQLE819Apara C/C 48
para COBOL 50
para FORTRAN 53
SQLE819Bpara C/C 48
para COBOL 50
para FORTRAN 53
SQLE850Apara C/C 48
para COBOL 50
para FORTRAN 53
SQLE850Bpara C/C 48
para COBOL 50
para FORTRAN 53
SQLE932Apara C/C 48
para COBOL 50
para FORTRAN 53
SQLE932Bpara C/C 48
para COBOL 50
para FORTRAN 53
SQLEAUpara C/C 48
para COBOL 50
para FORTRAN 53
SQLENVCOBOL 50
© Copyright IBM Corp. 1993, 2006 429
![Page 438: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/438.jpg)
archivos include (continuación)SQLENV (continuación)
FORTRAN 53
para C/C 48
SQLETSDCOBOL 50
SQLEXT para C/C++ 48
SQLJACB para C/C++ 48
SQLMONCOBOL 50
FORTRAN 53
para C/C 48
SQLMONCTpara COBOL 50
SQLSTATEpara C/C 48
para COBOL 50
para FORTRAN 53
SQLSYSTM para C/C++ 48
SQLUDF para C/C++ 48
SQLUTBCQCOBOL 50
SQLUTBSQCOBOL 50
SQLUTILpara C/C 48
para COBOL 50
para FORTRAN 53
SQLUV para C/C++ 48
SQLUVEND para C/C++ 48
SQLXA para C/C++ 48
ubicaciónen COBOL 7
área de comunicaciones de SQL
(SQLCA) 56
áreas reutilizablespara UDF y métodos 285
plataformas de 32 y 64 bits 289
avisos 425
ayudapara sentencias de SQL 419
visualizar 420
Bbases de datos
accesovarias hebras 31
utilizando contextos distintos 31
bibliotecas compartidasrutina de revinculación 387
blob, tipo de C/C++ 60
blob_file, tipo de C/C++ 60
BLOB-FILE, tipo de COBOL 67
blob_locator, tipo de C/C++ 60
BLOB-LOCATOR, tipo de COBOL 67
bloqueosliberación de cursor 181
CC
aplicacionescreación en UNIX 225
creación en Windows 227
C (continuación)aplicaciones (continuación)
opciones de compilación en
AIX 234
opciones de compilación en
HP-UX 236
opciones de compilación en
Linux 239
opciones de compilación en
Solaris 242
opciones de compilación en
Windows 245
aplicaciones multiconexióncreación en Windows 232
aplicaciones multihebraWindows 227
archivos de creación 221
Archivos de proceso por lotes 268
archivos del programa de utilidad de
comprobación de errores 223
ejemplos 405
entorno de desarrollo 44
funcionesestilos de parámetros 324
Plantilla de aplicación 44
procedimientosconjuntos de resultados 358
estilos de parámetros 320
rutinas 314
archivo de inclusión 318
área reutilizable como parámetro
de función 329
cláusula PROGRAM TYPE 330
conjuntos de resultados 326
creación 362, 363, 371
creación en UNIX 365
creación en Windows 367
crear 360
diseño 316
estilos de parámetros 319
estructura dbinfo como
parámetro 327
herramientas de desarrollo 316
opciones de compilación en
AIX 373
opciones de compilación en
HP-UX 376
opciones de compilación en
Linux 378
opciones de compilación en
Solaris 381
opciones de compilación en
Windows 384
parámetros 319
parámetros de indicador de
nulo 320
pase de parámetros 326
rutinas de 32 bits en un servidor
de bases de datos de 64 bits 307
sintaxis para pasar
argumentos 342
soporte de desarrollo 315
tipos de datos de SQL soportados
en 331
C++aplicaciones
creación en Windows 227
C++ (continuación)aplicaciones (continuación)
opciones de compilación en
AIX 235
opciones de compilación en
HP-UX 238
opciones de compilación en
Linux 241
opciones de compilación en
Solaris 244
opciones de compilación en
Windows 245
aplicaciones multiconexióncreación en Windows 232
aplicaciones multihebraWindows 227
archivos de configuración VisualAge
en AIX 229
archivos de creación 221
archivos del programa de utilidad de
comprobación de errores 223
decoración de tipos para cuerpos de
rutinas 356
funcionesestilos de parámetros 324
procedimientosconjuntos de resultados 358
estilos de parámetros 320
rutinas 314
archivo de inclusión 318
área reutilizable como parámetro
de función 329
cláusula PROGRAM TYPE 330
conjuntos de resultados 326
creación 362, 363, 371
creación en Windows 367
crear 360
diseño 316
estilos de parámetros 319
estructura dbinfo como
parámetro 327
herramientas de desarrollo 316
opciones de compilación en
AIX 374
opciones de compilación en
HP-UX 377
opciones de compilación en
Linux 380
opciones de compilación en
Solaris 382
opciones de compilación en
Windows 384
parámetros 319
parámetros de indicador de
nulo 320
pase de parámetros 326
rutinas de 32 bits en un servidor
de bases de datos de 64 bits 307
soporte de desarrollo 315
tipos de datos de SQL soportados
en 331
C# .NETarchivos de proceso por lotes 221
calificación y operaciones de miembros
en C/C++ 110
campo SQLSTATE 190
430 Desarrollo de aplicaciones de SQL incorporado
![Page 439: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/439.jpg)
CAST FROM, cláusulamanejo de tipos de datos 334
Centro de informaciónactualización 421
ver en idiomas diferentes 420
versiones 420
Centro de información de DB2actualización 421
ver en idiomas diferentes 420
versiones 420
char, tipo de datos de C/C++ 60
cláusula FOR UPDATE 188
clientesinvocar procedimientos almacenados
en REXX 175
CLOB (character large object)C/C++, conversión 60
tipo de datosC/C++ 112
COBOL 67
FORTRAN 70
REXX 72
variables indicadoras 77
CLOB-FILE, tipo de COBOL 67
clob_file, tipo de datos de C/C++ 60
CLOB-LOCATOR, tipo de COBOL 67
clob_locator, tipo de datos de C/C++ 60
COBOL, lenguajeAIX
compilador de IBM 256
compilador de Micro Focus 257
aplicaciones COBOL de IBMcreación en AIX 246
creación en Windows 249
opciones de compilación en
AIX 259
opciones de compilación en
Windows 263
aplicaciones de Micro Focuscreación en UNIX 248
creación en Windows 251
opciones de compilación en
AIX 260
opciones de compilación en
HP-UX 261
opciones de compilación en
Linux 262
opciones de compilación en
Solaris 261
opciones de compilación en
Windows 264
archivos de creación 221
archivos del programa de utilidad de
comprobación de errores 223
archivos include 50
Comentarios 150
Conexión con base de datos 58
consideraciones sobre EUC en chino
(tradicional) 129
consideraciones sobre EUC en
japonés 129
declaración de variables del lenguaje
principal 120
declaración de variables gráficas del
lenguaje principal 125
declaraciones de datos LOB 126
COBOL, lenguaje (continuación)declaraciones de localizadores de
LOB 127
declaraciones de referencias de
archivos 128
Desconexión de base de datos 195
ejemplos 408
estructuras de sistema principal 130
FOR BIT DATA 129
HP-UXutilización del compilador de
Micro Focus 258
Linuxcompilador de Micro Focus 255
nomenclatura de variables del
lenguaje principal 119
procedimientos almacenados 388
REDEFINES 128
restricciones 28
rutinas COBOL de IBMcreación en AIX 396
creación en Windows 399
opciones de compilación en
AIX 391
opciones de compilación en
Windows 395
rutinas de Micro Focuscreación en UNIX 398
creación en Windows 401
opciones de compilación en
AIX 392
opciones de compilación en
HP-UX 393
opciones de compilación en
Linux 394
opciones de compilación en
Solaris 393
opciones de compilación en
Windows 396
sentencias de SQL incorporado 7
Solariscompilador de Micro Focus 258
tablas de indicadores 132
tipos de datos 67
variables de lenguaje principal de tipo
carácter y longitud fija, sintaxis 123
variables del lenguaje principal
numéricas 122
variables SQLCODE 122
variables SQLSTATE 122
Windowscompilador de IBM 253
compilador de Micro Focus 254
COBOL, tipos de datosBINARY 121
BLOB 67
BLOB-FILE 67
BLOB-LOCATOR 67
CLOB 67
CLOB-FILE 67
CLOB-LOCATOR 67
COMP 121
COMP-1 67
COMP-3 67
COMP-4 121
COMP-5 67
DBCLOB 67
COBOL, tipos de datos (continuación)DBCLOB-FILE 67
DBCLOB-LOCATOR 67
PICTURE (PIC), cláusula 67
USAGE cláusula 67
códigos de finalización 56
códigos de resultados 56
códigos de retornodeclaración del SQLCA 56
códigos satisfactorios 56
colocación en serieestructuras de datos 34
SQL, ejecución de sentencias 31
columna, tipos decrear
C/C++ 60
COBOL 67
FORTRAN 70
columnasestablecimiento de valores nulos 81
tipos de datos de SQL soportados 77
coma flotante, parámetro 334
comentariossentencia de SQL incorporado 9
SQL, normas 5, 7, 8
compartidas, bibliotecasrutina de revinculación 387
compilaciónvisión general 209
compiladores 12
crear archivos para 221
utilización de COBOL de IBM en
AIX 256
utilización de COBOL de IBM en
Windows 253
utilización de COBOL de Micro Focus
en AIX 257
utilización de COBOL de Micro Focus
en HP-UX 258
utilización de COBOL de Micro Focus
en Solaris 258
utilización de COBOL de Micro Focus
en Windows 254
comportamiento de ejecución,
DYNAMICRULES 211
comportamiento de invocación,
DYNAMICRULES 211
comportamiento de vinculaciónDYNAMICRULES 211
comprobación de erroresarchivos de programas de
utilidad 223
consideraciones sobre programaciónC/C++ 27
FORTRAN 29
REXX 30
consultasactualizable 188
suprimible 188
contacto con IBM 431
contextosdependencias de aplicación entre 36
dependencias de base de datos
entre 36
establecimiento en aplicaciones DB2
de varias hebrasdescripción 31
Índice 431
![Page 440: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/440.jpg)
copia de seguridadbibliotecas de rutinas externas 305
correlaciones de tipos de datos 59
creación de aplicacionessoporte de 32 y 64 bits 26
utilización de línea mandatos 268
crearrutinas 312, 360
C/C++ 316
CREATE FUNCTION, sentenciaCAST FROM, cláusula 334
cláusula PARAMETER STYLE 324
RETURNS, cláusula 334
CREATE PROCEDURE, sentencia 171
cláusula PARAMETER STYLE 320
cláusula PROGRAM TYPE 330
cursorescolocación al final de la tabla 183
comportamientocon sentencia COMMIT 181
consideraciones sobre COMMIT 181
consideraciones sobre
ROLLBACK 181
declaraciónen programas de SQL estático 184
filasactualización 188
supresión 188
finalidad 176, 180
liberar, comportamiento del
bloqueo 181
nombres, REXX 9
paquete invalidado, recuperar
filas 181
procesarcon estructura de SQLDA 159
en SQL dinámico 185
resumen 180
programa de ejemplo 189
recuperación de varias filas 180
recuperar filas 184
sólo lecturaconsideraciones sobre la unidad de
trabajo 181
declaración 184
SQL dinámico, programa de
ejemplo 187
SQL estático, ejemplo 186
unidad de trabajofinalización 181
varios en aplicación 180
WITH HOLDcomportamiento tras
COMMIT 181
comportamiento tras
ROLLBACK 181
revinculación de paquete durante
unidad de trabajo 181
Ddatos
actualización 188
recuperacióncon SQL estático 176
segunda vez 178
recuperados, guardar 177
datos (continuación)recuperados anteriormente
actualización 180
desplazamiento 177
segunda recuperación 179
supresión 188
datos gráficos de longitud variable
terminados en nulo 60
DB2ARXCS.BND, archivo de vinculación
para REXX 266
DB2ARXNC.BND, archivo de vinculación
para REXX 266
DB2ARXRR.BND, archivo de vinculación
para REXX 266
DB2ARXRS.BND, archivo de vinculación
para REXX 266
DB2ARXUR.BND, archivo de vinculación
para REXX 266
db2bfd, programa de utilidad de
descripción de archivos de
vinculación 210
DB2GENERAL, estilo de parámetros para
rutinas externas 298
DB2INCLUDEvariable de entorno 7
DB2SQL, estilo de parámetros para
rutinas externas 298
DBCLOB-FILE, tipo de COBOL 67
dbclob_file, tipo de datos de C/C++ 60
DBCLOB-LOCATOR, tipo de COBOL 67
dbclob_locator, tipo de datos de
C/C++ 60
dbinfo, argumentofunciones de tabla 281
DDL (lenguaje de definición de datos)rendimiento de SQL dinámico 22
declaraciónvariables del lenguaje principal,
normas 74
variables indicadoras 81
declaración gráfica de la forma
estructurada VARGRAPHICC/C++, sintaxis 101
declaraciones de referencias de archivos
en REXX 148
decoración de tiposcuerpos de rutinas en C++ 356
determinación de problemasguías de aprendizaje 423
información en línea 423
diseño de aplicaciónarchivos include, COBOL 50
consideraciones sobre EUC en japonés
y chino tradicional en COBOL 129
creación de estructura de SQLDA,
directrices 159
declarar suficientes entidades
SQLVAR 153
descripción de sentencia SELECT 157
desplazarse por datos recuperados
anteriormente 177
ejecución de sentencias sin
variables 21
guardar peticiones de usuario
final 166
manejo de errores, directrices 57
pasar datos, directrices 163
diseño de aplicación (continuación)proceso de cursor 181
recepción de valores NULL 81
recuperación de datos por segunda
vez 178
REXX, rutinas de registro 145
sentencias de lista variable,
proceso 165
utilización de marcadores de
parámetros 169
versiones de paquetes con mismo
nombre 219
DML (lenguaje de manipulación de
datos)rendimiento de SQL dinámico 22
documentación 415, 416
términos y condiciones de uso 424
DYNAMICRULEScomportamiento 211
DYNAMICRULES, opción de
precompilación/vinculaciónefectos en SQL dinámico 211
Eejemplos
C 405
COBOL 408
declaración de localizador de archivos
CLOBFORTRAN 139
declaración de referencias de archivos
BLOBCOBOL 128
FORTRAN 140
declaraciones de datos BLOB 103
declaraciones de datos CLOB 103
declaraciones de datos DBCLOB 103
declarar BLOBCOBOL 126
FORTRAN 138
declarar CLOBCOBOL 126
FORTRAN 138
declarar DBCLOB, COBOL 126
declarar localizador de BLOB,
COBOL 127
ejemplo de sección de declaración de
SQL para tipos de datos SQL
soportados 90
IBM COBOL 246
localizador de CLOB 105
marcadores de parámetros, utilizados
en búsqueda y actualización 170
miembros de datos de clase en
sentencias de SQL 108
programa REXX, registrar SQLEXEC,
SQLDBS y SQLDB2 145
referencia de archivos CLOB 106
sintaxis, variables de lenguaje
principal de tipo carácter,
FORTRAN 136
enganche, estado con varias hebras 31
enlacedescripción 209
entidades SQLVARdeclarar número suficiente 156
432 Desarrollo de aplicaciones de SQL incorporado
![Page 441: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/441.jpg)
entidades SQLVAR (continuación)número de variables, declarar 153
entorno, API dearchivo de inclusión
C/C++ 48
COBOL 50
FORTRAN 53
Esquema de paquete 204
estándar FIPS 127-2declaración de SQLSTATE y
SQLCODE como variables del
lenguaje principal 190
estructura de SQLCAarchivo de inclusión para C/C++ 48
archivos includeaplicaciones COBOL 50
aplicaciones FORTRAN 53
avisos 81
campo SQLCODE 190
campo SQLSTATE 190
campo SQLWARN1 81
requisitos 190
varias definiciones 57
visión general 190
estructura de SQLDAasociación con sentencia
PREPARE 21
colocación de información sobre
sentencia preparada en 21
crear 159
declaración 153
declarar suficientes entidades
SQLVAR 156
determinación de tipo de sentencia
arbitraria 164
pasar datos 163
preparar sentencias con estructura
mínima 154
estructura SQLCHARpasar datos con 163
estructura SQLWARN 190
estructuras de datosdefinidas por el usuario con varias
hebras 34
EXEC SQL INCLUDE SQLCA 34
expansión de macrolenguaje C/C++ 112
Extended UNIX Code (EUC)chino (tradicional)
C/C++ 110
consideraciones en COBOL 129
FORTRAN 141
JaponésC/C++ 110
FORTRAN 141
japonés y chino tradicionalconsideraciones en COBOL 129
Ffilas
captación tras paquete
invalidado 181
posicionamiento en tabla 183
recuperación de varias 180
recuperación mediante SQLDA 158
filas (continuación)segunda recuperación
métodos 178
orden de filas 179
FORTRAN, lenguajearchivos include 53
Comentarios 150
Conexión con base de datos 58
consideraciones sobre el chino
tradicional 141
consideraciones sobre el japonés 141
consideraciones sobre
programación 29
declaraciones de datos LOB 138
declaraciones de localizadores de
LOB 139
declaraciones de referencias de
archivos 140
incorporación de sentencias de
SQL 8
juegos de caracteres de varios
bytes 140
restricciones 133
sección de declaración de SQL 134
tipos de datos 70
variables del lenguaje principaldeclaración 134
denominación 133
referencia 8
variables del lenguaje principal
numéricas 135
variables indicadoras 141
variables SQLCODE 135
variables SQLSTATE 135
FORTRAN, tipos de datosBLOB 70
BLOB_FILE 70
BLOB_LOCATOR 70
CHARACTER*n 70
CLOB 70
CLOB_FILE 70
CLOB_LOCATOR 70
conversión con DB2 70
INTEGER*2 70
INTEGER*4 70
REAL*2 70
REAL*4 70
REAL*8 70
fuentesaplicaciones de SQL incorporado 201
funcionesexternas
características 277
parámetroscláusula PARAMETER
STYLE 324
funciones de preprocesadory el precompilador de SQL 112
funciones de tablafunciones de tabla definidas por el
usuario 281
modelo de ejecución de Java 284
funciones definidas por el usuario (UDF)archivos de configuración de C++ de
AIX 386
C/C++argumentos 334
funciones definidas por el usuario
(UDF) (continuación)C/C++ (continuación)
CLOB, tipo de datos 334
parámetros 334
REAL, tipo de datos 334
Tipo de datos BIGINT 334
tipo de datos BLOB 334
tipo de datos CHAR 334
tipo de datos DBCLOB 334
tipo de datos DOUBLE 334
tipo de datos FLOAT 334
tipo de datos INTEGER 334
tipo de datos LONG
VARCHAR 334
tipo de datos SMALLINT 334
tipo de datos VARGRAPHIC 334
VARCHAR FOR BIT DATA, tipo
de datos 334
de tablaSQL-result, argumento 281
SQL-result-ind, argumento 281
DETERMINISTIC 285
devolución de datos 334
guardar el estado 285
modificador FOR BIT DATA 334
NOT DETERMINISTIC 285
parámetros de fecha 334
reentrantes 285
SCRATCHPAD, opción 285
funciones definidas por el usuario (UDF)
para tablasmodelo de proceso 282
funciones escalaresmodelo de proceso 280
visión general 278
Ggenerador de declaraciones db2dclgn
declaración de variables del lenguaje
principal 77
GENERAL, estilo de parámetros para
rutinas externas 298
GENERAL WITH NULLS, estilo de
parámetros para rutinas externas 298
GRAPHIC, parámetro 334
guías de aprendizajeresolución y determinación de
problemas 423
Visual Explain 423
Hhebras
variasconsideraciones sobre aplicaciones
UNIX 35
consideraciones sobre página de
códigos 35
consideraciones sobre página de
códigos de país/región 35
dependencias de aplicación entre
contextos 36
dependencias de base de datos
entre contextos 36
Índice 433
![Page 442: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/442.jpg)
hebras (continuación)varias (continuación)
problemas potenciales 36
recomendaciones 34
utilización en aplicaciones DB2 31
HP-UXopciones de compilación y enlace
aplicaciones C 236
aplicaciones C++ 238
aplicaciones COBOL de Micro
Focus 261
rutinas C 376
rutinas C++ 377
rutinas COBOL de Micro
Focus 393
Iindicaciones horarias
al precompilar 208
información de errorSQLCODE 83
SQLSTATE 83
instantáneas de Explaindurante vinculación 216
interfaces de programación de
aplicaciones (API)para establecer contextos entre hebras
sqleAttachToCtx() 31
sqleBeginCtx() 31
sqleDetachFromCtx() 31
sqleEndCtx() 31
sqleGetCurrentCtx() 31
sqleInterruptCtx() 31
sqleSetTypeCtx() 31
sintaxis para REXX 173
interrupción SIGUSR1 194
interrupciones, SIGUSR1 194
Jjaponés y chino tradicional, juegos de
códigos EUCconsideraciones en COBOL 129
Javaestilo de parámetros para rutinas
externas 298
modelo de ejecución de las funciones
de tabla 284
juegos de caracteresvarios bytes, FORTRAN 140
juegos de códigos en chino (tradicional)consideraciones en COBOL 129
consideraciones para C/C++ 110
FORTRAN 141
juegos de códigos en japonésconsideraciones para C/C++ 110
FORTRAN 141
LLANGLEVEL, opción de precompilación
MIA 60
SAA1 60
variables SQL92E y SQLSTATE o
SQLCODE 92, 122, 135
lectura repetible (RR)método 177
lenguaje C/C++archivos include necesarios 48
Comentarios 150
Conexión con base de datos 58
consideraciones sobre EUC en chino
(tradicional) 110
consideraciones sobre EUC en
japonés 110
consideraciones sobre
programación 27
declaración de variables gráficas del
lenguaje principal 96
declaración gráfica de la forma
estructurada VARGRAPHIC,
sintaxis 101
declaraciones de datos LOB 103
declaraciones de localizadores de
LOB 105
declaraciones de referencias de
archivos 106
Desconexión de base de datos 195
FOR BIT DATA 112
inicialización de variables del lenguaje
principal 112
manejo de series terminadas en
nulo 117
miembros de datos de clase 108
opción WCHARTYPE del
precompilador 98
operador de calificación,
restricción 110
operador de miembro, restricción 110
Procedimientos almacenados 171
puntero a tipo de datos 107
sentencias de SQL incorporado 5
soporte de estructura de sistema
principal 114
sqldbchar, tipo de datos 97
tablas de indicadores 116
tipo de datos wchart 97
tipos de datospara funciones 65
para métodos 65
para procedimientos
almacenados 65
soportados 60
tipos de datos soportados 60
variables del lenguaje principaldeclaración 89
denominación 88
finalidad 86
variables del lenguaje principal
numéricas 92
variables gráficas del lenguaje
principal 96, 102
variables SQLCODE 92
variables SQLSTATE 92
lenguaje REXXAPI
SQLDB2 30
SQLDBS 30
SQLEXEC 30
archivos de vinculación 266
campos decimales de SQLDArecuperar datos 175
lenguaje REXX (continuación)Comentarios 150
Conexión con base de datos 58
consideraciones sobre
programación 30
creación de aplicaciones para
Windows 267
datos LOB 146
declaraciones de localizadores de
LOB 147
declaraciones de referencias de
archivos LOB 148
Desconexión de base de datos 195
ejecución de aplicaciones 265
ejemplos 412
identificadores de cursor 9
incorporación de sentencias de
SQL 9
inicialización de variables 172
invocar procedimientos
almacenados 175
llamada al CLP de DB2 173
procedimientos almacenadosconsideraciones sobre el
servidor 175
llamada 172
visión general 172
registro de rutinas 145
registro de SQLEXEC, SQLDBS y
SQLDB2 145
restricciones 142
sentencias de SQL 9
sintaxis de API 173
tipos de datos 72
variables del lenguaje principaldenominación 142
referencia 142
variables del lenguaje principal LOB,
borrado 149
variables indicadoras 149
variables predefinidas 143
Linuxaplicaciones C
opciones de compilación y
enlace 239
aplicaciones C++opciones de compilación y
enlace 241
aplicaciones COBOL de Micro Focusopciones de compilación y
enlace 262
Bibliotecas 271
Micro Focus COBOLconfiguración del compilador 255
rutinas Copciones de compilación y
enlace 378
rutinas C++opciones de compilación y
enlace 380
rutinas COBOL de Micro Focusopciones de compilación y
enlace 394
LOB (large object), tipos de datosdeclaraciones de datos en
C/C++ 103
434 Desarrollo de aplicaciones de SQL incorporado
![Page 443: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/443.jpg)
LOB (large object), tipos de datos
(continuación)declaraciones de localizador en
C/C++ 105
long, tipo de datos de C/C++ 60
long int, tipo de datos de C/C++ 60
long long, tipo de datos de C/C++ 60
long long int, tipo de datos de
C/C++ 60
LONG VARGRAPHICparámetro de las UDF 334
Mmandato BIND 268
creación de paquetes 214
mandato BIND PACKAGEvolver a vincular 215
mandato PRECOMPILE 198, 203, 268
mandato RUNSTATS 25
manejadores de excepcionesconsideraciones sobre COMMIT y
ROLLBACK 194
finalidad 194
manejadores de interrupcionesconsideraciones sobre COMMIT y
ROLLBACK 194
finalidad 194
manejadores de señalescon sentencias de SQL 194
consideraciones sobre COMMIT y
ROLLBACK 194
finalidad 194
manejo de erroresarchivos include
C/C++ 48
COBOL 50
FORTRAN 53
estructuras de SQLCAutilizar 56
sentencia WHENEVER 57
manejo de interrupciones con sentencias
de SQL 194
manuales imprimidossolicitud 418
marcador de parámetros tipificado 169
marcadores de parámetrosejemplo de programación 170
en proceso de sentencias
arbitrarias 164
entradas SQLVAR 169
tipificados 169
uso en SQL dinámico 169
mensajes de avisotruncamiento 81
mensajes de errordistintivo de condición de aviso 190
distintivo de condición de error 190
distintivo de condición de
excepción 190
estructura de SQLCA 190
estructura SQLWARN 190
manejo de errores 56
SQLSTATE 190
métodosexternas
características 277
MIA LANGLEVEL, opción de
precompilación 60
miembros de datos de clase 108
migraciónSQL incorporado
aplicaciones 269
multibyte, consideraciones sobrejaponés y chino tradicional, juegos de
códigos EUCCOBOL 129
juegos de códigos en chino
(tradicional)C/C 110
FORTRAN 141
juegos de códigos en japonésC/C 110
FORTRAN 141
Nniveles de aislamiento
lectura repetible (RR) 177
NUMERIC, parámetro 334
OObject REXX para Windows 267
ejemplos 412
OLE, rutinas desintaxis para pasar argumentos 342
opción de vinculación EXPLSNAP 216
opción de vinculación FUNCPATH 216
opción WCHARTYPE del precompiladordirectrices 98
tipos de datos disponibles con la
opción NOCONVERT 60
opciones de vinculaciónEXPLSNAP 216
FUNCPATH 216
QUERYOPT 216
operador de miembro, restricción en
C/C 110
optimizadorconsideraciones sobre SQL estático y
dinámico 22
Ppáginas de códigos
consideraciones sobre
vinculación 216
paquetes 204
crear 214
errores de indicación horaria 208
inoperativo 215
no válidoestado 215
revinculación durante unidad de
trabajocomportamiento de cursor 181
soporte de aplicaciones REXX 266
versiones, privilegios 219
versiones con mismo nombre 219
parámetrosestilos para rutinas externas 298
rutinas C/C++ 319
parámetros de COLLECTION 220
pase de contextos entre hebras 31
PICTURE (PIC), cláusula en los tipos de
COBOL 67
plataformas soportadas32 y 64 bits 26
precompilación 201
acceso a servidor de aplicaciones de
sistema principal o AS/400 a través
de DB2 Connect 201
acceso a varios servidores 201
indicaciones horarias 208
programa de utilidad del
marcador 201
señal de coherencia 208
soporte de sentencias de SQL
dinámico 21
precompiladorFORTRAN 29
lenguaje C/C++ 110
PREPARE, sentenciafinalidad 21
proceso de sentencias arbitrarias 164
Privilegios de paquete 219
procedimientosC/C++
conjuntos de resultados 358
parámetroscláusula PARAMETER STYLE de
SQL 320
procedimientos almacenadosaplicaciones REXX 172
archivos de configuración de C++ de
AIX 384
COBOL 388
inicializaciónvariables REXX 172
llamadaREXX 172
sentencia CALL 171
Tipos de parámetros 171
procesador de línea de mandatos (CLP)llamada desde aplicación REXX 173
programa marcador para la
precompilación 201
programas de aplicaciónCOBOL
variables de lenguaje principal,
ejemplo 120
REXXinvocar procedimientos
almacenados, consideraciones
sobre el servidor 175
rutinas de lista de salida 194
SQL incorporado, visión general 3
programas de utilidad, API dearchivo de inclusión para aplicaciones
C/C++ 48
archivos includeaplicaciones COBOL 50
aplicaciones FORTRAN 53
puntos muertosen aplicaciones de varias hebras 36
Índice 435
![Page 444: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/444.jpg)
Qqueryopt, opción de
precompilación/vinculaciónconsideraciones sobre página de
códigos 216
RREAL*2 FORTRAN, tipo de datos de
SQL 70
REAL*4 FORTRAN, tipo de datos de
SQL 70
REAL*8 FORTRAN, tipo de datos de
SQL 70
recuperar datosSQL estático 176
REDEFINES, cláusula de COBOL 128
registro especial CURRENT EXPLAIN
MODEefecto en SQL dinámico
vinculado 214
registro especial CURRENT PATHefecto en SQL dinámico
vinculado 214
registro especial CURRENT QUERY
OPTIMIZATIONefecto en SQL dinámico
vinculado 214
registros especialesCURRENT EXPLAIN MODE 214
CURRENT PATH 214
CURRENT QUERY
OPTIMIZATION 214
rendimientocláusula FOR UPDATE 188
liberación de bloqueos 181
rutinas externas 305
SQL dinámico 22
resolución de problemasguías de aprendizaje 423
información en línea 423
restauraciónbibliotecas de rutinas externas 305
restriccionesCOBOL 28
en C/C++ 112
libdb2.so 271
rutinas 309
RESULT, variable predefinida de
REXX 143
RETURNS, cláusulaCREATE FUNCTION, sentencia 334
rutina SQLDB2, registro para REXX 145
rutina SQLDBS, registro para REXX 145
rutinasarchivos de creación 221
bibliotecas 301
C/C++archivo de inclusión 318
área reutilizable como parámetro
de función 329
cláusula PROGRAM TYPE 330
conjuntos de resultados 326, 358
creación 362, 363, 371
crear 360
descripción 314
rutinas (continuación)C/C++ (continuación)
diseño 316
estilos de parámetros 319, 320
estructura sqludf_scrat 329
herramientas de desarrollo 316
parámetros 319, 327
parámetros de indicador de
nulo 320
pase de parámetros 326
pase por referencia 326
pase por valor 326
rendimiento 307
rutinas de 32 bits en un servidor
de bases de datos de 64 bits 307
soporte de desarrollo 315
soporte de tipo de datos xml 308
tipos de datos de SQL soportados
en 331
variables gráficas del lenguaje
principal 356
clases 301
COBOLsoporte de tipo de datos xml 308
Common Language Runtimesoporte de tipo de datos xml 308
definición de la estructura del área
reutilizable 289
externasAPI y lenguajes de programación
soportados 290, 291
C/C++ 314, 316, 362, 363, 371
características 276, 277
conflictos de denominación 303
copia de seguridad y restauración
de archivos de bibliotecas y
clases 305
crear 297, 312
despliegue de bibliotecas y
clases 301
estilos de parámetros 298
gestión de bibliotecas 305
modificación de archivos de
bibliotecas y clases 304
rendimiento 305
restricciones 277, 309
seguridad 303
sentencias prohibidas 309
soporte de 32 y 64 bits 306
soporte de tipo de datos xml 308
visión general 275
Javasoporte de tipo de datos xml 308
modificación 301
opción WCHARTYPE del
precompilador 356
portabilidad entre plataformas de 32 y
64 bits 289
restricciones 309
revinculación de bibliotecas
compartidas 387
sentencias prohibidas 309
sintaxis para pasar argumentos 342
UDF escalaresvisión general 278
variables gráficas del lenguaje
principal 356
rutinas de lista de salidarestricciones de uso 194
rutinas externas 298
API y lenguajes de programación
soportados 290, 291
archivos de bibliotecas y clasescopia de seguridad y
restauración 305
características 276
conflictos de denominación 303
crear 297, 312
despliegue de bibliotecas y
clases 301
gestión de bibliotecas 305
modificación de archivos de
bibliotecas y clases 304
rendimiento 305
seguridad de archivos de bibliotecas y
clases 303
soporte de 32 bits 306
soporte de 64 bits 306
visión general 275
SSAA1 LANGLEVEL, opción de
precompilación 60
SCRATCHPAD, opciónconservación del estado 285
funciones definidas por el usuario
(UDF) 285
Scripts de creaciónaplicaciones COBOL 246
Rutinas en C y C++ 225
sección de declaraciónC/C++ 90
COBOL 120
en C/C++ 89
en COBOL 120
FORTRAN 134
normas para sentencias 74
secciones críticas 36
secuencias de clasificaciónarchivos include
C/C 48
COBOL 50
FORTRAN 53
semáforos 36
sentencia COMMITasociación con cursor 181
sentencia CREATE ROUTINEPARAMETER STYLE clause 319
sentencia DECLARE CURSORdescripción 184
sentencia DESCRIBEproceso de sentencias arbitrarias 164
sentencia EXECUTEfinalidad 21
sentencia EXECUTE IMMEDIATEfinalidad 21
sentencia FETCHacceso repetido a datos 177
estructura de SQLDA 158
variables del lenguaje principal 152
sentencia INCLUDE SQLCAseudocódigo 56
436 Desarrollo de aplicaciones de SQL incorporado
![Page 445: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/445.jpg)
sentencia INCLUDE SQLDAcreación de estructura de
SQLDA 159
sentencia ROLLBACKasociación con cursor 181
sentencia SELECTactualizar datos recuperados 180
asociación con sentencia
EXECUTE 21
declarar una SQLDA 153
descripción después de asignar
SQLDA 157
lista variable 165
recuperacióndatos una segunda vez 178
varias filas 180
sentencia DECLARE CURSOR 184
sentencia SET CURRENT
PACKAGESET 204, 220
sentencia WHENEVERmanejo de errores 57
sentenciasINCLUDE SQLCA 56
preparar con estructura de SQLDA
mínima 154
sentencias de SQLDinámico 15
Estático 15
guardar peticiones de usuario
final 166
manejadores de excepciones 194
manejadores de interrupciones 194
manejadores de señales 194
REXX 9
serializar ejecución 31
sintaxis en COBOL 7
sintaxis en FORTRAN 8
sintaxis en REXX 9
sintaxis para C/C++ 5
visualización de ayuda 419
señales de coherencia 208
servicios en tiempo de ejecuciónvarias hebras
efecto en enganches 31
short, tipo de datos de C/C++ 60
short int, tipo de datos de C/C++ 60
símbolossustituciones, restricciones del
lenguaje C/C++ 112
sintaxisdeclaraciones de indicador LOB,
REXX 147
incorporación de sentencias de SQLREXX 9
sección de declaraciónC/C++ 89
COBOL 120
FORTRAN 134
sentencias de SQL incorporadoC/C++ 5
COBOL 7
comentarios, C/C++ 5
comentarios, COBOL 7
comentarios, FORTRAN 8
comentarios, REXX 9
evitar división de línea 5
FORTRAN 8
sintaxis (continuación)sentencias de SQL incorporado
(continuación)sustitución de caracteres de
espacio en blanco 5
Solarisaplicaciones
opciones de compilación y enlace
en C 242
opciones de compilación y enlace
en C++ 244
aplicaciones COBOL de Micro Focusopciones de compilación y
enlace 261
rutinasopciones de compilación y enlace
en C 381
opciones de compilación y enlace
en C++ 382
rutinas COBOL de Micro Focusopciones de compilación y
enlace 393
solicitud de manuales de DB2 418
soporte de 32 bitsrutinas externas 306
soporte de 64 bitsrutinas externas 306
soporte de estructura de sistema principalC/C++ 114
COBOL 130
SQL, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQL (Structured Query Language)autorización
SQL incorporado 19
estilo de parámetros para rutinas
externas 298
SQL dinámicocomparación con SQL estático 22
consideraciones 22
cursores, programa de ejemplo 187
declarar SQLDA 153
definición 21
determinación de tipo de sentencia
arbitraria 164
efectos de DYNAMICRULES 211
finalidad 18
limitaciones 21
marcadores de parámetros 169
normas de sintaxis 21
PREPARE, sentencia 21, 152
proceso de cursor 185
proceso de cursores 159
rendimiento 18, 22
sentencia DESCRIBE 21, 152
sentencia EXECUTE 21
sentencia EXECUTE IMMEDIATE 21
sentencia FETCH 152
sentencias arbitrarias, proceso de 164
sentencias soportadas 21
suprimir filas 188
vinculación 214
SQL estáticoconsideraciones 22
SQL estático (continuación)declaración de variables del lenguaje
principal 76
finalidad 16
programa de cursor de ejemplo 186
recuperar datos 176
rendimiento 16
SQL dinámicocomparación 22
utilización de variables de sistema
principal 74
SQL incorporadoaplicaciones
migración 269
archivos de configuración de C++ de
AIX 230
Archivos de inclusión 47
archivos fuente 203
autorización 19
COBOL 7
comentariosC/C++ 5
COBOL 7
normas 8
comentarios en C/C++ 5
compiladores 12
DECLARE SECTION 4
Dinámico 20
diseño 42
entorno de desarrollo 12
Errores y avisos 150, 209
Estático 20
estructura de SQLCA 4
normasC/C++ 5
FORTRAN 8
Paquetes 219
planes de acceso 218
precompilador 209
programación 42
referencia a variables del lenguaje
principal 74, 84
rendimiento 25, 218
sentencias ejecutadas
dinámicamente 150
sentencias ejecutadas
estáticamente 150
sistemas operativos 12
Variables de entrada y salida 80
visión general 3
SQL-result, argumentofunciones de tabla 281
SQL-result-ind, argumentofunciones de tabla 281
SQL_WCHART_CONVERT, macro del
preprocesador 98
SQL1252A, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
SQL1252B, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLADEF, archivo de inclusiónaplicaciones C/C++ 48
SQLAPREP, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
Índice 437
![Page 446: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/446.jpg)
SQLAPREP, archivo de inclusión
(continuación)aplicaciones FORTRAN 53
SQLCA, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLCA (área de comunicaciones de SQL)consideraciones sobre la utilización de
varias hebras 34
SQLCA, variable predefinida 143
SQLCA_92, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLCA_92, estructura 53
SQLCA_CN, archivo de inclusión 53
SQLCA_CS, archivo de inclusión 53
SQLCLI, archivo de inclusión 48
SQLCLI1, archivo de inclusión 48
SQLCODEcampo, estructura de SQLCA 190
códigos de error 56
estructura 190
inclusión de SQLCA 56
SQLCODES, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLDArecuperar datos
programas de aplicación
REXX 175
SQLDA, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLDA (área de descriptores de SQL)consideraciones sobre la utilización de
varias hebras 34
SQLDACT, archivo de inclusión 53
SQLDB2, API de REXX 30, 173
sqldbchar, tipo de datosen rutinas C/C++ 334
selección 97
tipo de columna equivalente 60
SQLDBS, API de REXX 30
SQLE819A, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLE819B, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLE850A, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLE850B, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLE859A, archivo de inclusiónaplicaciones C/C++ 48
SQLE859B, archivo de inclusiónaplicaciones C/C++ 48
SQLE932A, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
SQLE932A, archivo de inclusión
(continuación)aplicaciones FORTRAN 53
SQLE932B, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
sqleAttachToCtx, API 31
SQLEAU, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
sqleBeginCtx, API 31
sqleDetachFromCtx, API 31
sqleEndCtx, API 31
sqleGetCurrentCtx, API 31
sqleInterruptCtx, API 31
SQLENV, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
sqleSetTypeCtx, API 31
SQLETSD, archivo de inclusión 50
SQLExceptionmanejo 191
SQLEXEC, API de REXXproceso de sentencias de SQL 9
registro 145
SQL incorporado 30
SQLEXT, archivo de inclusiónaplicaciones CLI 48
sqlint64, tipo de datos de C/C++ 60
SQLISL, variable predefinida 143
SQLJ (SQL incorporado para Java)archivos de creación 221
SQLJACB, archivo de inclusiónaplicaciones C/C++ 48
SQLMON, archivo de inclusiónaplicaciones COBOL 50
aplicaciones FORTRAN 53
para aplicaciones C/C++ 48
SQLMONCT, archivo de inclusión 50
SQLMSG, variable predefinida 143
SQLRDAT, variable predefinida 143
SQLRIDA, variable predefinida 143
SQLRODA, variable predefinida 143
SQLSTATE, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLSYSTM, archivo de inclusión 48
SQLUDF, archivo de inclusiónaplicaciones C/C++ 48
rutinas C/C++ 318
SQLUTBCQ, archivo de inclusión 50
SQLUTBSQ, archivo de inclusión 50
SQLUTIL, archivo de inclusiónaplicaciones C/C++ 48
aplicaciones COBOL 50
aplicaciones FORTRAN 53
SQLUV, archivo de inclusiónaplicaciones C/C++ 48
SQLUVEND, archivo de inclusión 48
SQLXA, archivo de inclusiónaplicaciones C/C++ 48
Structured Query Language (SQL)dynamic
visión general 18
static 16
sucesos asíncronos 31
Ttablas
colocación del cursor al final 183
nombresresolver no calificados 220
recuperar filas, ejemplo 189
resolución de nombres no
calificados 220
tablas de indicadoresC/C++ 116
soporte de COBOL 132
términos y condicionesuso de publicaciones 424
TIME, parámetro 334
TIMESTAMP, parámetro 334
Tipo de datos BIGINTen SQL estático 77
funciones definidas por el usuario
(UDF)C/C++ 334
tipo de datos BIGINT de SQLC/C++, conversión 60
COBOL 67
FORTRAN 70
tipo de datos BLOBC/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
SQL estático 77
tipo de datos BLOB_FILE FORTRAN 70
tipo de datos BLOB FORTRAN 70
tipo de datos BLOB_LOCATOR
FORTRAN 70
tipo de datos CHARC/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
variables indicadoras 77
tipo de datos CHARACTER*n
FORTRAN 70
tipo de datos CLOB (character large
object)funciones definidas por el usuario
(UDF)C/C++ 334
tipo de datos CLOB_FILE FORTRAN 70
tipo de datos CLOB FORTRAN 70
tipo de datos CLOB_LOCATOR
FORTRAN 70
tipo de datos DATE 77
C/C++, conversión 60
COBOL 67
438 Desarrollo de aplicaciones de SQL incorporado
![Page 447: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/447.jpg)
tipo de datos DATE (continuación)FORTRAN 70
REXX 72
tipo de datos DBCLOBC/C++, conversión 60
COBOL 67
en programas de SQL estático 77
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
tipo de datos DECIMALC/C++, conversión 60
COBOL 67
en SQL estático 77
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
tipo de datos DOUBLE 77
C and C++ programs 60
funciones definidas por el usuario
(UDF)C/C++ 334
tipo de datos FLOAT 77
C/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
tipo de datos FOR BIT DATAC/C++ 112
tipo de datos GRAPHICC/C++, conversión 60
COBOL 67
FORTRAN, no soportado 70
REXX 72
selección 97
tipo de datos INTEGER 77
C/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
tipo de datos INTEGER*2 FORTRAN 70
tipo de datos INTEGER*4 FORTRAN 70
tipo de datos LONG VARCHARC/C++, conversión 60
COBOL 67
en programas de SQL estático 77
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
tipo de datos LONG VARGRAPHICC/C++, conversión 60
COBOL 67
en programas de SQL estático 77
FORTRAN 70
REXX 72
tipo de datos NUMERIC de SQLC/C++, conversión 60
COBOL 67
FORTRAN 70
REXX 72
tipo de datos REAL de SQLC/C++, conversión 60
COBOL 67
conversiónen rutinas C y C++ 334
FORTRAN 70
lista 77
REXX 72
tipo de datos SMALLINTC/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
REXX 72
sentencia CREATE TABLE 77
tipo de datos terminado en nulo de
C/C++ 60
tipo de datos TIMEC/C++, conversión 60
COBOL 67
en sentencia CREATE TABLE 77
FORTRAN 70
REXX 72
tipo de datos TIMESTAMPC/C++, conversión 60
COBOL 67
descripción 77
FORTRAN 70
REXX 72
tipo de datos VARCHARC/C++, conversión 60
C o C++ 112
COBOL 67
en columnas de tablas 77
formato estructurado, C/C++ 60
FORTRAN 70
REXX 72
tipo de datos VARGRAPHICC/C++, conversión 60
COBOL 67
FORTRAN 70
funciones definidas por el usuario
(UDF), C/C++C/C++ 334
lista 77
REXX 72
tipo de datos wchart 334
tipo de datos XML 308
tipo XML 80
tipos de datos 59
BINARYCOBOL 121
C/C++ 60
C/C++, conversión 60
CLOB en C/C++ 112
COBOL 67
conversiónentre DB2 y COBOL 67
entre DB2 y FORTRAN 70
entre DB2 y REXX 72
tipos de datos (continuación)conversión entre DB2 y C/C++ 60
DATALINKvariable del lenguaje principal,
restricción 70
DECIMALFORTRAN 70
FOR BIT DATACOBOL 129
FOR BIT DATA en C/C++ 112
FORTRAN 70
lenguaje de sistema principal y
correspondencias en DB2 77
miembros de datos de clase, declarar
en C/C++ 108
puntero a, declarar en C/C++ 107
selección de tipos gráficos 97
soportados 77
COBOL, normas 67
FORTRAN, normas 70
temas sobre compatibilidad 77
VARCHAR en C/C++ 112
tipos de datos BINARYCOBOL 121
tipos de datos COMPCOBOL 121
tipos de datos COMP-1COBOL 67
tipos de datos COMP-3COBOL 67
tipos de datos COMP-4COBOL 121
tipos de datos COMP-5COBOL 67
tipos de datos de REXX 72
tipos de datos de SQLBIGINT 77
BLOB 77
C/C++, conversión 60
CHAR 77
CLOB 77
COBOL 67
DATE 77
DBCLOB 77
DECIMAL 77
FLOAT 77
FORTRAN 70
funciones definidas por el usuario
(UDF)C/C++ 334
INTEGER 77
LONG VARCHAR 77
LONG VARGRAPHIC 77
REAL 77
REXX 72
SMALLINT 77
TIME 77
TIMESTAMP 77
VARCHAR 77
VARGRAPHIC 77
tipos de datos LOB (large object)declaraciones de datos en
C/C++ 103
declaraciones de localizador en
C/C++ 105
transferencia de datosactualización 180
Índice 439
![Page 448: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/448.jpg)
truncamientovariables del lenguaje principal 81
variables indicadoras 81
UUDF (funciones definidas por el usuario)
de tabla 281
FINAL CALL 282
NO FINAL CALL 282
de tabla, modelo de proceso 282
escalares, FINAL CALL 280
portabilidad del área reutilizable entre
plataformas de 32 y 64 bits 289
unidades de trabajo (UOW)consideraciones sobre cursor 181
finalización, comportamiento del
cursor 181
UNIXaplicaciones C
creación 225
aplicaciones COBOL de Micro Focuscreación 248
rutinas Ccreación 365
rutinas COBOL de Micro Focuscreación 398
USAGE, cláusula en los tipos de
COBOL 67
Vvalor nulo, SQL
recepción por variable de
indicador 81
VARCHAR FOR BIT DATA, tipo de datosfunciones definidas por el usuario
(UDF), C/C++C/C++ 334
variablesREXX, predefinido 143
SQLCODE 92, 122, 135
SQLSTATE 92, 122, 135
variables del lenguaje principalCOBOL, tipos de datos 67
consideradas como globales por el
precompilador para un módulo en
C/C++ 88
declaraciónC/C++ 89
COBOL 120
como puntero a tipo de datos 107
con el generador de declaraciones
db2dclgn 77
FORTRAN 134
gráficas, COBOL 125
localizador de LOB, COBOL 127
normas 74
programas de SQL estático 76
utilización de sentencia de lista de
variables 165
declaraciones de datos LOBC/C++ 103
COBOL 126
FORTRAN 138
REXX 146
variables del lenguaje principal
(continuación)declaraciones de localizadores de LOB
C/C++ 105
FORTRAN 139
REXX 147
declaraciones de referencias de
archivosC/C++ 106
COBOL 128
FORTRAN 140
REXX 148
definición 74
denominaciónC/C++ 88
COBOL 119
FORTRAN 133
REXX 142
en sentencia de lenguaje de sistema
principal 74
en sentencia de SQL 74
en SQL dinámico 21
finalidad 86
gráficoC/C++ 96
FORTRAN 140
inicializar en C/C++ 112
LOB, borrar en REXX 149
miembros de datos de clase en
C/C++ 108
opción WCHARTYPE del
precompilador 98
referenciaC/C++ 86
FORTRAN 8
REXX 142
referencia desde SQL 74, 84
restricción de DATALINK 70
selección de tipos de datos
gráficos 97
series terminadas en nulo, manejo en
C/C++ 117
sintaxis para caracteres de longitud
fija, COBOL 123
SQL estático 74
truncamiento 81
variables del lenguaje principal de tipo
carácterfijas y terminadas en nulo de
C/C++ 94
FORTRAN 136
variables del lenguaje principal
numéricasC/C++ 92
COBOL 122
FORTRAN 135
variables gráficas del lenguaje principalC/C++ 102
COBOL 125
rutinas 356
variables indicadorasdeclaración 81
durante INSERT o UPDATE 81
finalidad 81
FORTRAN 141
REXX 149
truncamiento 81
vinculaciónconsideraciones 216
diferir 217
opciones 214
programa de utilidad de descripción
de archivos de vinculación,
db2bfd 210
sentencias dinámicas 214
visión general 214
VinculaciónCreación de un paquete 198
Visual Basic. NETarchivos de proceso por lotes 221
Visual Explainguía de aprendizaje 423
volver a vinculardescripción 215
mandato REBIND PACKAGE 215
Wwchar_t, tipo de datos
selección 97
WCHARTYPE NOCONVERT, opción del
precompilador 356
Windowsaplicaciones C/C++
creación 227
opciones de compilación y
enlace 245
aplicaciones COBOL de IBMcreación 249
opciones de compilación y
enlace 263
aplicaciones COBOL de Micro Focuscreación 251
opciones de compilación y
enlace 264
rutinas C/C++creación 367
opciones de compilación y
enlace 384
rutinas COBOL de IBMcreación 399
opciones de compilación y
enlace 395
rutinas COBOL de Micro Focuscreación 401
opciones de compilación y
enlace 396
XXML
aplicaciones C/C++Ejecución de expresiones
XQuery 166
aplicaciones COBOLEjecución de expresiones
XQuery 166
codificación de datos 79
declaraciones 79
expresiones XQuery 30, 166
función XMLQUERY 30, 166
recuperación de datosaplicaciones C 85
440 Desarrollo de aplicaciones de SQL incorporado
![Page 449: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/449.jpg)
XML (continuación)recuperación de datos (continuación)
aplicaciones COBOL 85
tipo de datos 79
XQuery 79
Índice 441
![Page 450: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/450.jpg)
442 Desarrollo de aplicaciones de SQL incorporado
![Page 451: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/451.jpg)
Cómo ponerse en contacto con IBM
Para ponerse en contacto con IBM en su país o región, consulte IBM Directory of
Worldwide Contacts en el sitio http://www.ibm.com/planetwide
Para obtener más información sobre productos DB2, vaya a
http://www.ibm.com/software/data/db2/.
© Copyright IBM Corp. 1993, 2006 443
![Page 452: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/452.jpg)
444 Desarrollo de aplicaciones de SQL incorporado
![Page 453: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/453.jpg)
![Page 454: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/454.jpg)
���
SC11-3190-00
![Page 455: db2a1z90](https://reader031.vdocuments.co/reader031/viewer/2022012913/557212e3497959fc0b91256d/html5/thumbnails/455.jpg)
Spine information:
IBM
DB
2 DB
2 Ve
rsió
n 9
Desa
rrol
lo de
ap
licac
ione
s de
SQ
L in
corp
orad
o ��
�