0% encontró este documento útil (0 votos)
5 vistas61 páginas

Manual de DB2: Bases de Datos y SQL

Cargado por

ezcupe
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas61 páginas

Manual de DB2: Bases de Datos y SQL

Cargado por

ezcupe
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

MANUAL DE DB2

Bases de Datos Relacionales (RDBMS)


Una base de datos relacional es un almacén de datos en donde toda la
información visible al usuario esta organizada estructuralmente en forma de
tablas de valores y en donde todas las operaciones de la base de datos operan
sobre estas tablas.

Entendiéndose como tablas de datos a arreglos rectangulares renglón/columna


de los valores de los datos. Estos datos pueden ser numéricos o de texto.

TABLA DE DATOS

NUMERO-EMP APELLIDO-PAAPELLIDO-MA NOMBRE

000001 PEREZ JUAREZ DAVID


000007 MARTINEZ GUZMAN LAURA
000015 ALFARACHE ROJAS JOSE LUIS

Ambiente operativo de una RDBMS

 DB2 corre bajo el sistema operativo MVS


 DB2 se puede accesar por los sig. medios:
- IMS/VS (en línea)
Information Management System/Virtual Storage Data Communications.

- CICS(en línea)
Customer Information Control System

- TSO(en línea)
MVS Time Sharing Option

- BATCH
- Sistemas remotos conectados a través de VTAM
Virtual Telecomunicaciones Access Method

ASTECI S.A. DE C.V.


1
MANUAL DE DB2

Lenguaje SQL
Structured
Query
Language

 El SQL es un lenguaje diseñado para procesar y controlar los datos de una


base de datos relacional.
 SQL significa Structured Query Language (Lenguaje de consulta
estructurada).
 Es un lenguaje sin comandos de procedimiento (No tiene IF, GOTO, Etc.).
 Los comandos de SQL se pueden ejecutar directamente en ambientes
interactivos como SPUFI, QUERY MANAGER, Etc.
 Los comandos de SQL se pueden ejecutar dentro de programas escritos en
lenguajes de alto nivel como COBOL, C, FORTRAN, VBASIC, aprovechando
los ambientes TSO, CICS, etc.
Los comandos de SQL están agrupados en categorías.

 DDL (Data Definición Language): Comandos para definir, modificar o


eliminar objetos DB2 tales como TABLE; VIEW o DATABASE.
 CREATE
 ALTER
 DROP

 DML (Data Manipulation Language): Comandos para consultar, modificar,


añadir o eliminar renglones de tablas DB2.
 SELECT
 UPDATE
 INSERT
 DELETE

 DCL (Data Control Language): Comandos para otorgar o retirar privilegios


sobre objetos DB2
 GRANT y REVOKE

 SQL Para programas


 DECLARE
 EXPLAIN
 OPEN CURSOR
 FETCH
 CLOSE CURSOR
 EXECUTE
 DESCRIBE

 Control de Transacciones
 COMMIT y ROLLBACK

ASTECI S.A. DE C.V.


2
MANUAL DE DB2
Sentencia CREATE TABLE (1)
CREATE TABLE nombre-de-tabla
( Columna-1 Tipo (Longitud) [NOT NULL],
Columna-2 . . . ,
[ PRIMARY KEY (columna ),]
[FOREIGN KEY nombre-rel (columna),]
[REFERENCES nombre-de-tabla,]
[ ON DELETE RESTRICT ]
[ IN data-base-name-tablespaces-name ] )

 La estructura más importante de una BD Relacional es la Tabla.


 CREATE crea una nueva estructura de Tabla dentro de la Base de Datos.
 Los tipos de Datos aceptables más usuales en CREATE son:
 CHAR Tipo de carácter su longitud es un byte por cada Carácter
 DEC Tipo Numérico su longitud es (numero total de dígitos,
decimales).
 SMALLINT Entero de media palabra, no lleva longitud.
 DATE Tipo especial de Fechas, no lleva longitud.

NOMBRE-DE-TABLA

El nombre de la tabla debe de ser un nombre SQL legal por portabilidad es


recomendable manejar nombres cortos y no usar caracteres especiales a
este nivel de tabla las restricciones de relación se definen en el DB2
Manager.

DEFINICIONES DE COLUMNA

Las definiciones de columnas se listan separadas por comas, e incluidas


entre paréntesis. El orden de las definiciones de las columnas determina el
orden de izquierda a derecha de las columnas en la tabla.

Ejemplo 1: Crear la tabla EMPLEADOS.

CREATE TABLE EMPLEADOS


( EMPNO DEC (6,0) NOT NULL,
FIRSTNAME CHAR (10),
MIDINIT CHAR (01),
LASTNAME CHAR (10),
WRKDEPT CHAR (03),
PHONENO CHAR (04),
HIREDATE DATE,
JOBCODE SMALLINT,
EDUCLVL SMALLINT,
BIRTHDATE DATE,
SEX CHAR (01).
SALARY DEC (7,2),
PRIMARY KEY (EMPNO) )

ASTECI S.A. DE C.V.


3
MANUAL DE DB2

Sentencia CREATE TABLE (2)


Cada definición de columna debe incluir:

 Nombre de la columna
 Tipos de Datos
 Indicar si la columna tiene datos obligatorios
 Indicar si la columna tomará valores por omisión

PRIMARY KEY

 Es una columna o combinación de columnas cuyos valores identifican


unívocamente cada renglón en la tabla
 La clave primaria puede comprender hasta 16 columnas y no puede
contener valores nulos.
 Se debe crear un índice único para la clave primaria

FOREING KEY

 Identifica las relaciones de la Tabla con otras Tablas de la Base de Datos.


 La columna o columnas que forman la clave foránea deben pertenecer a la
Tabla que está siendo creada
 La Tabla que es referenciada por la clave foránea es la Tabla padre en la
relación, la Tabla que está siendo definida es el hijo.

IN [Link]-NAME

 Definición de almacenamiento físico para la Tabla


 Cuándo se crea una tabla en DB2, puede asignársele opcionalmente un
espacio de Tablas determinado.
Ejemplo:

CREATE TABLE EMPLEADOS


(Definición-de-Tabla)
IN [Link]

ASTECI S.A. DE C.V.


4
MANUAL DE DB2

TIPOS DE DATOS en SQL

INTEGER Para un entero grande con una precisión de 11 dígitos.

SMALLINT Para un entero pequeño con una precisión de 5 dígitos.

BIGINT Para un entero grande con una precisión de 19 dígitos.

DOUBLE Para un número de punto flotante. Doble precisión y


Flotante son sinónimos de Doble.

DECIMAL Para un número decimal.

BLOB Para una serie de gran objeto binario.

CLOB Para una serie de gran objeto de caracteres.

DBCLOB Para una serie gráfica de longitud variable con una


longitud máxima de 1,073,741,823 caracteres de doble
byte.

CHARACTER Para una serie de caracteres de longitud fija.

VARCHAR Para una serie de caracteres de longitud variable con


una longitud máxima de 4,000.

LONG VARCHAR Para una serie de caracteres de longitud variable con


una longitud máxima de 32,700.

GRAPHIC Para una serie gráfica de longitud fija de caracteres de


doble byte.

VARGRAPHIC Para una serie gráfica de longitud variable con una


longitud máxima de 2,000 caracteres de doble byte.

LONG VARGRAPHIC Para una serie gráfica de longitud variable con una
longitud máxima de 16,350 caracteres de doble byte.

DATE Para una fecha.

TIME Para una hora.

TIMESTAMP Para una indicación de la hora.

REAL Para un número de punto flotante de precisión simple.

ASTECI S.A. DE C.V.


5
MANUAL DE DB2

Sentencia CREATE INDEX


CREATE [UNIQUE] INDEX Nombre-de-Indice
ON Nombre-de-Tabla
(Nombre-de-Columna {ASC | DESC}, . . .)

OBSERVE QUE:

 Un índice es una estructura que permite el acceso directo a los renglones de


una Tabla, en base a los valores de una o más columnas.
 La sentencia CREATE INDEX asigna un nombre al índice, especifica la Tabla
para lo cual se crea el índice, especifica la columna o columnas a indexar y
si deberán estar indexadas en orden ascendente o Descendente.
 La palabra UNIQUE se utiliza para especificar que la columna que esta
siendo indexada debe contener valores únicos.
 El índice se almacena separadamente de la tabla.
 El índice se define automáticamente en la misma base de datos de la tabla.
 El índice almacena valores y punteros a los renglones en donde se
encuentran los valores.

Ejemplo de CREATE INDEX

CREATE UNIQUE INDEX


ON EMPLEADOS
(EMPNO ASC)

ASTECI S.A. DE C.V.


6
MANUAL DE DB2

Sentencia CREATE VIEW


CREATE VIEW Nombre-de-View
( Nombre-de-Columna, ... )
AS SELECT Nombre-de-columna, . . .
FROM Nombre-de-Tabla, . . .
[WHERE Condición ]
[GROUP BY Nombre-Columna, ...]
[HAVING Condición-de-Grupo ]
[ WITH CHECK OPTION ]
 Un VIEW es una selección predefinida de datos (Columnas de una o más
Tablas) con la cuál una aplicación o usuario va a trabajar.
 Es una forma alterna de representar datos que existen en una o varias
tablas.
 No ocupan espacio de memoria, únicamente se almacena la definición del
VIEW en el catalogo DB2.

Ejemplo 1: Crear un VIEW de todos los empleados que pertenezcan al depto


‘D11’ que contenga solamente él numero de empleado, el depto y su
salario.
CREATE VIEW VISTA
(NUMERO,DEPTO,SALARIO)
AS SELECT EMPNO,WRKDEPT,SALARY
FROM EMPLEADOS
WHERE WRKDEPT = ‘D11’
WITH CHECK OPTION

Ejemplo 2: para Consultar el VIEW.


SELECT * FROM VISTA
---------------------------------
NUMERO DEPTO SALARIO
000001 D11 12,500.00
000003 D11 14,800.00

Ejemplo 3: para Modificar el VIEW.


UPDATE VISTA
SET SALARIO = 15000
WHERE SALARIO = 14800

 Modificar un VIEW vigente, provoca una modificación de su tabla base.


 Si se usa la opción WITH CHECK OPTION, no se puede modificar un VIEW de
tal manera que la modificación no cumpla con las condiciones del VIEW

Ejemplo 4: no se puede hacer


UPDATE VISTA
SET DEPTO = ‘XXX’
WHERE SALARIO > 14000
VISTA No se puede modificar porque la opción WITH CHECK OPTION no permite
que se modifique el VIEW de tal manera que no se puedan seleccionar los
ASTECI S.A. DE C.V.
7
MANUAL DE DB2
renglones modificados según las condiciones del VIEW. (VISTA solo selecciona
los renglones con DEPTO = ‘D11’, por lo tanto no puede aceptar renglones con
DEPTO = ‘XXX’).

Sentencia ALTER
ALTER TABLE Nombre-de-Tabla
ADD Nombre-Columna Tipo-Columna
[ ADD PRIMARY KEY ( Nombre-de-Columna) ]
[ ADD FOREIGN KEY ( Nombre-de-Columna) ]
[ DROP PRIMARY KEY ]
[ DROP FOREIGN KEY Nombre-REL ]
OBSERVE QUE:

 ALTER TABLE hace ciertas modificaciones sobre la estructura de una tabla


 Cada una de las cláusulas pueden aparecer solo una vez en la sentencia
(Dos columnas pueden ser añadidas por medio de dos instrucciones ALTER)
 La nueva columna se añade al final de la fila
 El DBMS asigna un valor NULL para la columna recién añadida en todos los
renglones existentes de la Tabla.
 La función ALTER
* No cambia el tipo de datos
* No cambia la longitud de la columna
* No cambia atributos de nulidad
* No Rearregla columnas
* No elimina una columna

Ejemplo1: Añadir la nueva columna COMISION de tipo decimal precisión 7


escala 2 a la tabla empleados

ALTER TABLE EMPLEADOS


ADD COMISION DEC (7,2)

Ejemplo2: Eliminar la clave externa de la tabla empleados

ALTER TABLE EMPLEADOS


DROP FOREIGN KEY

ASTECI S.A. DE C.V.


8
MANUAL DE DB2

Sentencia SELECT
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
[WHERE Condición-de-Búsqueda-por-renglón]
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
Observe Que:

 Una de las funciones más importantes de un Manejador de Base de Datos es


la consulta de Información.
 La sentencia SELECT especifica una consulta a la información almacenada
en la Base de Datos.
 Una consulta devuelve una tabla de resultados o una tabla de resultados
intermedios.
 La declaración SELECT puede usarse interactivamente o programada dentro
de un programa de aplicación.
 La declaración SELECT puede especificarse directamente en una declaración
DECLARE CURSOR
 Las formas de consultas en SQL:

 SELECT

 FULLSELECT
Es un conjunto de información organizada en forma de tabla como
resultado de una petición, que contiene TODA la información
disponible.

 SUBSELECT
Es un conjunto de información organizada en forma de tabla como
resultado de una petición, que contiene únicamente la información
seleccionada según ciertas reglas.

 SELECT INTO
Subselect que da como resultado un solo Renglón, se utiliza dentro de
un programa de aplicación en el leguaje principal.

ASTECI S.A. DE C.V.


9
MANUAL DE DB2

Sentencia SELECT ALL / DISTINCT


SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
[WHERE Condición-de-Búsqueda-por-renglón]
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
Observe Que:

 SELECT ALL selecciona todos los renglones de la Tabla que cumplan con la
condición
 SELECT DISTINCT Selecciona todos los renglones de la Tabla que cumplan
con la condición, después elimina los Repetidos de la Tabla Resultado.

Ejemplo1: Selecciona los departamentos de todos los renglones de la tabla


EMPLEADOS

SELECT ALL WRKDEPT


FROM EMPLEADOS
------------------------------
WRKDEPT
-------
E21
E21
A00
A00
D21
D21
B00
E21
C01
E11
E11

Ejemplo2: Selecciona los departamentos de todos los renglones de la tabla


EMPLEADOS Eliminado los repetidos

SELECT DISTINCT WRKDEPT


FROM EMPLEADOS
--------------------------------
WRKDEPT
----------
A00
B00
C01
D21
E11
E21

ASTECI S.A. DE C.V.


10
MANUAL DE DB2
Sentencia SELECT * / COLUMNA, ...
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
[WHERE Condición-de-Búsqueda-por-renglón]
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
 SELECT * selecciona todos las Columnas de la Tabla.
 SELECT COLUMNA, ... Selecciona únicamente las columnas que se incluyan
en la Lista.

Ejemplo1: Seleccionar todas las columnas de todos los renglones de la tabla


EMPLEADOS

SELECT *
FROM EMPLEADOS
--------------------------------------------------------------------------
EMPNO FIRSTNAME LASTNAME SEX WRKDEPT HIREDATE BIRTHDATE SALARY
-------- ---------- ---------- --- ------- ---------- ---------- ---------
1, LAURA SALAS F E21 13/09/1996 19/10/1972 15500,00
2, ESTEBAN TORRES F E21 13/09/1996 19/10/1972 9000,00
3, MARCOS LEVI F A00 11/09/1975 12/12/1950 18400,00
4, CARLOS ONZALEZ F A00 11/09/1975 12/12/1950 30500,00
5, MARISA ERNANDEZ F A00 01/01/1965 14/08/1933 28000,00
6, DANIEL SMITH M D21 30/10/1969 12/11/1939 10000,00
13, SYBIL JOHNSON F D21 11/09/1975 05/10/1936 10000,00
14, GONZALO FRIAS F B00 21/11/1963 24/05/1932 17000,00
25, THEODORE SPENCER M E21 19/06/1980 18/12/1956 15400,00
30, SEFORA BENJUR F C01 05/04/1975 11/05/1941 10000,00

Ejemplo2: Seleccionar únicamente las columnas EMPNO, LASTNAME y SALARY


de la tabla EMPLEADOS
SELECT EMPNO,LASTNAME,SALARY
FROM EMPLEADOS
-----------------------------

EMPNO LASTNAME SALARY


-------- ---------- ---------
1, SALAS 15500,00
2, TORRES 9000,00
3, LEVI 18400,00
4, ONZALEZ 30500,00
5, ERNANDEZ 28000,00
6, SMITH 10000,00
13, JOHNSON 10000,00
14, FRIAS 17000,00
25, SPENCER 15400,00
30, BENJUR 10000,00

ASTECI S.A. DE C.V.


11
MANUAL DE DB2

Sentencia SELECT
Cláusula WHERE
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
 La cláusula WHERE selecciona únicamente los Renglones que cumplan con
la condición.
 La cláusula WHERE es optativa.
 Si no se especifica la cláusula WHERE, el SELECT devuelve todos los
renglones de la Tabla.

Ejemplo1:

Seleccionar los Renglones, de la Tabla Empleados, donde el Departamento sea


el ‘A00’, exhibiendo solo las Columnas EMPNO, LASTNAME y SALARY.

SELECT EMPNO,LASTNAME,SALARY
FROM EMPLEADOS
WHERE WRKDEPT = 'A00'
-----------------------------
EMPNO LASTNAME SALARY
-------- ---------- ---------
3, LEVI 18400,00
4, ONZALEZ 30500,00
5, ERNANDEZ 28000,00

Ejemplo2:

Selecciona los Renglones, de la Tabla Empleados, donde el Salario sea mayor


de 15000, exhibiendo solo las Columnas EMPNO, LASTNAME y SALARY.

SELECT EMPNO,LASTNAME,SALARY
FROM EMPLEADOS
WHERE SALARY > 15000
------------------------------
EMPNO LASTNAME SALARY
-------- ---------- ---------
1, SALAS 15500,00
3, LEVI 18400,00
4, ONZALEZ 30500,00
5, ERNANDEZ 28000,00
14, FRIAS 17000,00
25, SPENCER 15400,00

ASTECI S.A. DE C.V.


12
MANUAL DE DB2

Sentencia SELECT
Cláusula WHERE
TEST DE COMPARACION (=,<>,<,<=,>,>=)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna de agrupación]
[HAVING Condición de Búsqueda por Grupo]
[ORDER BY Especificación de ordenación]

Test de comparación

Compara el valor de una expresión con el valor de otra usando los


Operadores de Comparación: (=,<>,<,<=,>,>=).

Ejemplo1:
Hallar el Nombre y Departamento del Empleado cuyo número de
Empleado es 30.

SELECT EMPNO, FIRSTNAME, WRKDEPT


FROM EMPLEADOS
WHERE EMPNO = 30
----------------------------------

EMPNO FIRSTNAME WRKDEPT


------- ---------- -------
00030 SEFORA C01

Ejemplo2:
Listar los empleados cuyo salario actual este por debajo del salario de
11000.

SELECT EMPNO,FIRSTNAME,SALARY
FROM EMPLEADOS
WHERE SALARY < 11000
-------------------------------

EMPNO FIRSTNAME SALARY


-------- ---------- ---------
2, ESTEBAN 9000,00
6, DANIEL 10000,00
13, SYBIL 10000,00
30, SEFORA 10000,00

ASTECI S.A. DE C.V.


13
MANUAL DE DB2

SELECT Cláusula WHERE Test de rango (BETWEEN)


SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
Test de rango (BETWEEN)

Examina si el valor de una expresión cae dentro de un rango especificado de


valores

Ejemplo 1:
Hallar los Empleados cuya fecha del alta esta entre el 01/Enero/1975 y
31/diciembre/1980

SELECT EMPNO,FIRSTNAME,HIREDATE
FROM EMPLEADOS
WHERE HIREDATE
BETWEEN '01/01/1975' AND '31/12/1980'

------------------------------------------------

EMPNO FIRSTNAME HIREDATE


-------- ---------- ----------
3, MARCOS 11/09/1975
4, CARLOS 11/09/1975
13, SYBIL 11/09/1975
25, THEODORE 19/06/1980
30, SEFORA 05/04/1975

Ejemplo 2:
Hallar los empleados cuyo Salario este entre 15000 y 20000.

SELECT EMPNO,FIRSTNAME,SALARY
FROM EMPLEADOS
WHERE SALARY
BETWEEN 15000 AND 20000
-------------------------------

EMPNO FIRSTNAME SALARY


-------- ---------- ---------
1, LAURA 15500,00
3, MARCOS 18400,00
14, GONZALO 17000,00
25, THEODORE 15400,00

ASTECI S.A. DE C.V.


14
MANUAL DE DB2

SELECT WHERE Test de Pertenencia a un grupo (IN)


SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

Test de pertenencia a conjunto (IN)

Comprueba si el valor de una expresión se encuentra dentro de un conjunto


de valores.

Observe que la lista va entre paréntesis y que los valores se indican según
su tipo, Los Textos van entre Apóstrofes, los números no

Ejemplo 1:
Hallar los empleados que su Apellido sea: TORRES, FRIAS y SALAS

SELECT EMPNO, LASTNAME, SALARY


FROM EMPLEADOS
WHERE LASTNAME IN ('TORRES', 'FRIAS', 'SALAS')
----------------------------------------------

EMPNO LASTNAME SALARY


-------- ---------- ---------
1, SALAS 15500,00
2, TORRES 9000,00
14, FRIAS 17000,00

Ejemplo 2:
Hallar los empleados cuyo proyecto sea alguno de los siguientes: 52, 54
y 60

SELECT EMPNO,FIRSTNAME,JOBCODE,SALARY
FROM EMPLEADOS
WHERE JOBCODE IN (52,54,60)
-------------------------------------

EMPNO FIRSTNAME JOBCODE SALARY


-------- ---------- ------- ---------
3, MARCOS 54 18400,00
4, CARLOS 54 30500,00
6, DANIEL 52 10000,00
13, SYBIL 52 10000,00
25, THEODORE 54 15400,00
30, SEFORA 60 10000,00

ASTECI S.A. DE C.V.


15
MANUAL DE DB2

SELECT WHERE correspondencia con patrón


(LIKE O NOT LIKE)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
Test de correspondencia con patrón (LIKE O NOT LIKE)

 Examina si el valor de una columna que contiene datos de cadenas de


caracteres se corresponde a un patrón especificado.
 El patrón es una cadena que pueden incluir uno o más caracteres
comodines (el carácter comodín signo ‘%’ se corresponde con cualquier
secuencia de cero o más caracteres).

Ejemplo 1: Hallar los empleados cuyo nombre comience con las letras ‘MA’.

SELECT EMPNO,FIRSTNAME
FROM EMPLEADOS
WHERE FIRSTNAME LIKE 'MA%'
------------------------------
EMPNO FIRSTNAME
-------- ----------
3, MARCOS
5, MARISA

 El carácter comodín subrayado (_) se corresponde con cualquier carácter


simple.

Ejemplo 2:

SELECT EMPNO,FIRSTNAME
FROM EMPLEADOS
WHERE FIRSTNAME LIKE '_AR__S%'
----------------------------------
EMPNO FIRSTNAME
-------- ----------
3, MARCOS
4, CARLOS

 Los caracteres comodines pueden aparecer en cualquier lugar de la


cadena patrón.
 Pueden haber varios caracteres comodines dentro de una misma cadena.

ASTECI S.A. DE C.V.


16
MANUAL DE DB2

SELECT WHERE Test de valor nulo


(IS NULL / IS NOT NULL)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]
Test de valor nulo ( IS NULL/ IS NOT NULL)

 Examina si una columna tiene un valor NULL (desconocido)

Ejemplo 1:

Hallar a todos los empleados que tengan Comisión NULL en la tabla


STAFF.

SELECT ID,NAME,JOB,COMM
FROM STAFF
WHERE COMM IS NULL
--------------------------------

ID NAME JOB COMM


------ --------- ----- ---------
10 Sanders Mgr -
30 Marenghi Mgr -
50 Hanes Mgr -
100 Plotz Mgr -
140 Fraye Mgr -
160 Molinare Mgr -
210 Lu Mgr -

Ejemplo 2:
Hallar a todos los empleados cuya Comisión no sea NULL

SELECT ID,NAME,JOB,COMM
FROM STAFF
WHERE COMM IS NOT NULL
--------------------------------

ID NAME JOB COMM


------ --------- ----- ---------
20 LEE Sales 612,45
40 O'Brien Sales 846,55
60 Quigley Sales 650,25
ASTECI S.A. DE C.V.
17
MANUAL DE DB2
70 GOUNOT Sales 1152,00

SELECT WHERE Condiciones de búsqueda compuesta


(AND, OR)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

Condiciones de búsqueda compuesta (AND, OR)

AND
Combina dos condiciones de búsqueda que deberán ser ciertas
simultáneamente.

Ejemplo 1:
Hallar los empleados con fecha de Alta ‘13/09/1996’ y cuyo Departamento
sea ‘ E21’.

SELECT EMPNO, FIRSTNAME,WRKDEPT, HIREDATE


FROM EMPLEADOS
WHERE WRKDEPT = 'E21' AND
HIREDATE = '13/09/1996'
-----------------------------------------

EMPNO FIRSTNAME WRKDEPT HIREDATE


-------- ---------- ------- ----------
1, LAURA E21 13/09/1996
2, ESTEBAN E21 13/09/1996
OR
Se utiliza para combinar dos condiciones de búsqueda cuando una, o la otra,
o ambas deban ser ciertas.

Ejemplo 2:
Hallar los Empleados con fecha de Alta ‘11/09/1975’ o ‘19/06/1980’

SELECT EMPNO, FIRSTNAME,WRKDEPT, HIREDATE


FROM EMPLEADOS
WHERE HIREDATE = '11/09/1975' OR
HIREDATE = '19/06/1980'
--------------------------------------

EMPNO FIRSTNAME WRKDEPT HIREDATE


-------- ---------- ------- ----------
3, MARCOS A00 11/09/1975
ASTECI S.A. DE C.V.
18
MANUAL DE DB2
4, CARLOS A00 11/09/1975
13, SYBIL D21 11/09/1975
25, THEODORE E21 19/06/1980

SELECT WHERE Condiciones negadas de búsqueda


(NOT)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

Condiciones negadas de búsqueda (NOT)

NOT

Selecciona renglones en donde la condición de búsqueda sea falsa

Ejemplo 1:
Hallar los empleados que su fecha de Alta no sean mayor al primero de
Enero de 1975. ( ‘01-01-1975’ )

SELECT EMPNO, FIRSTNAME,WRKDEPT, HIREDATE


FROM EMPLEADOS
WHERE NOT HIREDATE > '01/01/1975'

-----------------------------------------

EMPNO FIRSTNAME WRKDEPT HIREDATE


-------- ---------- ------- ----------
5, MARISA A00 01/01/1965
6, DANIEL D21 30/10/1969
14, GONZALO B00 21/11/1963

Cuando se combinan más de dos condiciones de búsqueda con ‘AND’ ‘OR’ y


‘NOT’, el estándar ANSI/ISO especifica que ‘NOT’ tiene la prioridad más alta,
seguido de ‘AND’ y por último ‘OR’, sin embargo para eliminar ambigüedad
es recomendable el uso de paréntesis.

El operador NOT debe incluirse antes de la condición, negando el resultado


de esta:

Ejemplos:

WHERE SALARY NOT > 50000 <- ERROR

ASTECI S.A. DE C.V.


19
MANUAL DE DB2

WHERE NOT SALARY > 50000 <- NOT NIEGA TODA LA CONDICIÓN

SELECT WHERE Funciones de COLUMNA


SUM (), AVG()
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

Funciones de columna

SQL soporta consultas de datos sumarios mediante funciones de columna a


través de la sentencia SELECT.
Una función de columna SQL procesa una columna entera de datos y
produce un único resultado que sumariza la columna.

 SUM () Calcula el total de una columna.


 AVG () Calcula el valor promedio de una columna.

SUM
Calcula la suma de una columna de valores de datos. Los datos de la
columna deben ser numéricos.
Ejemplo 1:
¿Cuál es la suma de salarios de nuestros empleados?

SELECT SUM(SALARY)
FROM EMPLEADOS
------------------
SUM(SALARY)
--------------
163800,00

AVG
Calcula el promedio de una columna de valores de datos. Los datos de una
columna deben de ser numéricos.
Ejemplo:
¿Cuál es el salario promedio de nuestros empleados?

SELECT AVG(SALARY)
FROM EMPLEADOS
-------------------
AVG(SALARY)
-----------
16380,00

ASTECI S.A. DE C.V.


20
MANUAL DE DB2

SELECT WHERE Funciones de COLUMNA


MIN (), MAX()
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

MIN y MAX

Las funciones de columna MIN() y MAX() determinan los valores mayor y


menor de una columna respectivamente.
Los datos de la columna pueden contener información numérica, de cadena
o de fecha/hora.

 MIN(Columna) Determina el valor mínimo en la columna


 MAX(Columna) Determina el valor máximo en la columna

Ejemplo 1:
¿Cuáles son las fechas de contratación menor y mayor de nuestros
Empleados.?

SELECT MIN(HIREDATE), MAX(HIREDATE)


FROM EMPLEADOS
-----------------------------------

MIN(HIREDATE) MAX(HIREDATE)
------------- ------------
21/11/1963 13/09/1996

Ejemplo 2:
Localizar el menor salario, considerando todos los empleados que
pertenezcan al depto ‘A00’

SELECT MIN(SALARY)
FROM EMPLEADOS
WHERE WRKDEPT = 'A00'
----------------------

MIN(SALARY)
-----------
18400,00

ASTECI S.A. DE C.V.


21
MANUAL DE DB2

SELECT WHERE Funciones de COLUMNA


COUNT (), COUNT(*)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

 COUNT () Cuenta el número de valores en una columna.


 COUNT (*) Cuenta los renglones de la tabla de resultados.
 Los datos pueden ser de cualquier tipo.
 Esta función siempre da como resultado un entero, independiente del tipo
de datos de la columna.

Ejemplo 1:
¿Cuántos Empleados tenemos en la tabla EMPLEADOS?

SELECT COUNT (*)


FROM EMPLEADOS
--------------------------------------

COUNT(*)
--------
10

Ejemplo 2:
¿ Cuantos departamentos distintos tenemos en la tabla EMPLEADOS?

SELECT COUNT (DISTINCT WRKDEPT) AS DEPTOS


FROM EMPLEADOS
------------------------------------------

DEPTOS
------
5

ASTECI S.A. DE C.V.


22
MANUAL DE DB2

SELECT WHERE
Agrupamiento de datos GROUP BY
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación, . . .]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

 GROUP BY, especifica una consulta concentrada.


 Agrupa todos los renglones similares y produce un solo renglón de
resultados por cada grupo.

Ejemplo:
¿Cuántos empleados están asignados a cada Departamento? Sin contar al
depto ‘A00’.

SELECT WRKDEPT,COUNT(*)
FROM EMPLEADOS
WHERE WRKDEPT <> ‘A00’
GROUP BY WRKDEPT

----------------------------

WRKDEPT COUNT(*)
------- -----------
B00 1
C01 1
D21 2
E21 3

Observe que: GROUP BY

 Produce un solo renglón de resultados por cada grupo


 Cuando se utiliza un filtro WHERE, las agrupaciones, se forman con los
datos seleccionados a partir de la cláusula WHERE.
 No acepta solicitud de columnas que produzcan mas de un resultado por
cada grupo.
 Puede agrupar por varias columnas.

ASTECI S.A. DE C.V.


23
MANUAL DE DB2

SELECT
Agrupamiento de datos (GROUP BY)
Selección por grupos (HAVING)
SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación, . . .]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

 HAVING Especifica al SQL que incluya sólo ciertos grupos producidos por la cláusula
GROUP BY en los resultados de la consulta.
 Similar a la cláusula WHERE, utiliza una condición de búsqueda, pero en el caso de
HAVING, la condición trabaja con los grupos ya formados por GROUP BY.

Ejemplo 1:
¿Cuál es el salario promedio de cada departamento, seleccionando solo los Departamentos que
totalizan más de $10,000.00?

SELECT WRKDEPT,AVG(SALARY)
FROM EMPLEADOS
GROUP BY WRKDEPT
HAVING SUM(SALARY) > 10000

---------------------------------

WRKDEPT AVG(SALARY)
------- -------------
A00 25633,333
B00 17000,000
D21 10000,000
E21 13300,000

Observe que:
 HAVING toma en consideración el resultado total de GROUP BY, y después
solo permite la salida de los renglones que cumplan con la condición.
 La condición de HAVING debe ser una condición de grupo aplicable a los
renglones-resultado de GROUP BY.

ASTECI S.A. DE C.V.


24
MANUAL DE DB2

SELECT Ordenamiento de datos ( ORDER BY)


SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación, . . .]
[HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Columna ASC / DESC ]

 ORDER BY Ordena la tabla resultado según el orden de las columnas


indicadas.

Ejemplo 1: Seleccionar a todos los empleados por orden alfabético de sus


apellidos.

SELECT EMPNO, LASTNAME, FIRSTNAME


FROM EMPLEADOS
ORDER BY LASTNAME <- Por default el orden es ascendente
---------------------------------
EMPNO LASTNAME FIRSTNAME
-------- ---------- ----------
30, BENJUR SEFORA
5, ERNANDEZ MARISA
14, FRIAS GONZALO
3, LEVI MARCOS
4, ONZALEZ CARLOS
1, SALAS LAURA
6, SMITH DANIEL
25, SPENCER THEODORE
2, TORRES ESTEBAN

Ejemplo 2: Seleccionar a todos los empleados por orden descendente de sus


sueldos

SELECT EMPNO, LASTNAME, SALARY


FROM EMPLEADOS
ORDER BY SALARY DESC <- Se indica orden descendente
------------------------------
EMPNO LASTNAME SALARY
-------- ---------- ---------
4, ONZALEZ 30500,00
5, ERNANDEZ 28000,00
3, LEVI 18400,00
14, FRIAS 17000,00
1, SALAS 15500,00
25, SPENCER 15400,00
6, SMITH 10000,00
30, BENJUR 10000,00
2, TORRES 9000,00

ASTECI S.A. DE C.V.


25
MANUAL DE DB2

SELECT Combinación de tablas (JOINING)


SELECT [ALL / DISTINCT]
* / Columna, ...
FROM Nombre-de-Tabla, ...
WHERE Condición-de-Búsqueda-por-renglón
[GROUP BY Columna-agrupación, . . .]
[ HAVING Condición-de-Búsqueda-por-Grupo]
[ORDER BY Especificación-ordenación]

Combinación de tablas (JOINING)


JOINING
Los datos seleccionados provienen de más de una tabla.
Ejemplo 1:
Se tienen dos tablas:
PERSONAL
EMPNO FIRSTNAME WRKDEPT
10 Juan Soto B00
33 Roberto Vares E11
34 Heileen Henderson E11
43 Petra Bendavides E11

DEPARTAM
DEPTNO DEPTNAME
D10 PLANNING
C21 MANUFACTURING
E11 OPERATIONS

Hallar los números de empleado y nombre de empleado para todos los


empleados que pertenezcan al departamento ‘OPERATIONS’

SELECT EMPNO,FIRSTNAME, DEPTNAME


FROM PERSONAL, DEPARTAM
WHERE DEPTNO = WRKDEPT
AND DEPTNAME = ‘OPERATIONS’
ORDER BY EMPNO
-------------------------------------
EMPNO FIRSTNAME DEPTNAME
------- ---------- -----------
33 Roberto Vares OPERATIONS
34 Heileen Henderson OPERATIONS
43 Petra Benavides OPERATIONS

Observe que:
 La Cláusula WHERE establece la relación entre las dos tablas.
 Si se omite la cláusula WHERE, el resultado es una combinación de TODOS
los datos de una tabla con TODOS los datos de la otra tabla.

ASTECI S.A. DE C.V.


26
MANUAL DE DB2
UNION [ALL]
SELECT sin ORDER BY
UNION [ALL]
SELECT sin ORDER BY ...
[ORDER BY Columna ASC / DESC , . . .]

 UNION Obtiene dos o más tablas de resultado (una por cada sentencia
SELECT), y después las combina en una sola tabla final de resultados,
ordenando los renglones, según las columnas de selección.
 Cada SELECT debe solicitar el mismo numero de columnas
 Las columnas de selección en cada sentencia SELECT deben ser
compatibles.
 Al final, se pueden ordenar los renglones de la tabla final según convenga.
 Si se usa la opción ALL, no se eliminan los duplicados
 Si se omite la opción ALL, se eliminan los renglones duplicados

Ejemplo 1: Listar el número (EMPNO) de todos los empleados de la tabla


EMPLOYEE que su departamento (WORKDEPT) empiece con 'E' o bien, que
este asignado al proyecto de la tabla EMP_ACT cuyo numero de proyecto
(PROJNO) sea 'MA2100', 'MA2110', o 'MA2112'. Eliminando los duplicados.

SELECT EMPNO FROM EMPLOYEE


WHERE WORKDEPT LIKE 'E%'

UNION

SELECT EMPNO FROM EMP_ACT


WHERE PROJNO IN('MA2100', 'MA2110', 'MA2112')
----------------------------------------------------
EMPNO
------
000010
000050
000090
000100
000110
000150
000170
000190
000280
000290
000300
000310
000320
000330
000340

Observe que la columna seleccionada en cada sentencia SELECT, es


compatible con la columna seleccionada en la otra sentencia SELECT.

ASTECI S.A. DE C.V.


27
MANUAL DE DB2

EXPRESIONES ARITMETICAS
Una expresión aritmética consiste de nombres de columnas y / o valores
numéricos constantes, conectados por operadores aritméticos; por ejemplo:

SALARY + COMM / 12
(SALARY + COMM) / 12
COSTO * IVA

 Los operadores aritméticos son:


 * Producto / División
 + Adición - Substracción
 El DB2 usa la regla de precedencia estándar para evaluar las expresiones
 Primero las multiplicaciones, las divisiones, después sumas y restas
 Los paréntesis se usan para agrupar expresiones.
 Las expresiones aritméticas solo se aplican a los datos numéricos
 SMALLINT INTEGER
 DECIMAL FLOAT
 Una expresión aritmética se puede usar en vez de Nombre de columna en
la selección de columnas, en condiciones de WHERE o de HAVING.

Ejemplo 1: Presentar los ingresos totales de cada empleado de la tabla STAFF,


que pertenezca al depto 20.

SELECT ID, SALARY, COMM, SALARY + COMM AS TOTAL


FROM STAFF
WHERE DEPT = 20
------------------------------------------------------------------------
ID SALARY COMM TOTAL
------ --------- --------- ----------
10 18357.50 - -
20 18171.25 612.45 18783.70
80 13504.60 128.20 13632.80
190 14252.75 126.50 14379.25

Observe que:
 Cuando un valor dentro de una expresión aritmética sea NULL, el resultado
será NULL

Ejemplo 2: Presentar los empleados cuyo ingreso total exceda 20,000


ordenados en forma descendente por sus ingresos.

SELECT NAME, SALARY + COMM AS TOTAL


FROM STAFF
WHERE SALARY + COMM > 20000
ORDER BY 2 DESC
-------------------------------------
NAME TOTAL
--------- ----------
Graham 21200,30
Williams 20094,15

ASTECI S.A. DE C.V.


28
MANUAL DE DB2

Función escalar SUBSTR


SELECT Nom-de-Columnas, .. ,SUBSTR(Columna-1,ARG1,ARG2)
FROM Nombre-de-Tabla
SELECT Nombre-de-Columnas
FROM Nombre-de-Tabla
WHERE SUBSTR(Columna,ARG1,ARG2) = Igualdad

Permite extraer una parte de caracteres de la Columna-1 especificada en el


Paréntesis, partiendo de la posición especificada en el ARG1, y obteniendo en
el resultado un total de Caracteres dependiendo el número que se le haya
asignado al ARG2.

Existe otra forma de utilizar el SUBSTR además de utilizarlo donde se


especifican las columnas y esta es utilizarla en el WHERE

Ejemplo 1:
Listar el número, el nombre, y las primeras cuatro letras del nombre de
todos l los empleados de la tabla EMPLOYEE.

SELECT EMPNO NUMERO, FIRSTNME, SUBSTR(FIRSTNME,1,4) AS NOMBRES


FROM EMPLOYEE
-------------------------------------------------------------
NUMERO FIRSTNME NOMBRES
------ ------------ -------
000010 CHRISTINE CHRI
000020 MICHAEL MICH
000030 SALLY SALL
000050 JOHN JOHN
000060 IRVING IRVI
000070 EVA EVA
000090 EILEEN EILE
000100 THEODORE THEO
000110 VINCENZO VINC
000120 SEAN SEAN

Ejemplo 2: Listar las primeras tres letras de la Columna JOB la tabla STAFF,
eliminando repeticiones.

SELECT DISTINCT SUBSTR(JOB,1,3) AS PUESTO


FROM STAFF
------------------------------------------------------

PUESTO
------
Cle
Mgr
Sal

ASTECI S.A. DE C.V.


29
MANUAL DE DB2

Función escalar LENGTH


SELECT Nom-de-Columnas, .. ,LENGTH(Dato de carácter)
FROM Nombre-de-Tabla
SELECT Nombre-de-Columnas
FROM Nombre-de-Tabla
WHERE LENGTH(Dato de carácter) = Numero
 La función LENGTH devuelve la longitud de un dato de carácter
(CHARACTER O VARCHAR)

Ejemplo 1: Exhibe la longitud de NAME y JOB de los empleados de la tabla


STAFF

SELECT NAME, LENGTH(NAME),


JOB, LENGTH(JOB)
FROM STAFF
-----------------------------
NAME 2 JOB 4
--------- ------ ----- ------
Sanders 7 Mgr 5
LEE 3 Sales 5
Marenghi 8 Mgr 5
O'Brien 7 Sales 5
Gil 3 Mgr 5
Quigley 7 Sales 5
GOUNOT 6 Sales 5
James 5 Clerk 5
Koonitz 7 Sales 5
Plotz 5 Mgr 5

Observe que:
 La columna NAME es de tipo VARCHAR; por lo tanto es de longitud
variable.
 La columna JOB es de tipo CHARACTER (5); es de longitud fija de 5.

Ejemplo 2: Seleccionar únicamente los empleados que tengan nombre de tres


letras.

SELECT NAME, LENGTH(NAME), JOB, LENGTH(JOB)


FROM STAFF
WHERE LENGTH(NAME) = 3
------------------------------------------------------------------------

NAME 2 JOB 4
--------- ----------- ----- -----------
LEE 3 Sales 5
Gil 3 Mgr 5
Ruy 3 - -

Observe que:

ASTECI S.A. DE C.V.


30
MANUAL DE DB2
 Si el contenido de un dato es NULL, entonces el resultado de LENGTH es
NULL.

Función escalar VALUE (COALESCE)


SELECT Nom-de-Columnas, .. ,VALUE(Dato-1,Dato-2,. . . )
FROM Nombre-de-Tabla
 La función VALUE es idéntica a la función COALESCE;
 La función VALUE, analiza el contenido de Dato-1, Dato-2, etc. y devuelve
como resultado el primer valor que no sea NULL.

Ejemplo 1: Listar el numero, la comisión, el salario de los empleados de la tabla


STAFF, en la ultima columna, exhibir o bien COMM, o bien SALARY o el numero
7, según se localice el primer dato no NULL en la lista.

SELECT ID,COMM,SALARY, VALUE(COMM,SALARY, 7) AS NO_NULO


FROM STAFF
-------------------------------------------------------
ID COMM SALARY NO_NULO
------ --------- --------- ---------------
10 - 18357,50 18357,50 <- SALARY es el primero no NULL
20 612,45 18171,25 612,45 <- COMM es el primero no NULL
30 - 17506,75 17506,75 <- SALARY es el primero no NULL
40 846,55 18006,00 846,55 <- COMM es el primero no NULL
50 - 20659,80 20659,80
60 650,25 16808,30 650,25
70 1152,00 16502,83 1152,00
80 128,20 13504,60 128,20
90 1386,70 18001,75 1386,70
100 - - 7,00 <- 7 es el primero no NULL

Ejemplo 2: Listar el numero, la comisión, el salario y el total de ingresos de


cada empleado, sumando el sueldo más la comisión, en caso de que la
comisión sea NULL, sumar cero al salario.

SELECT ID, COMM, SALARY,


SALARY + VALUE(COMM,0) AS TOTAL
FROM STAFF
---------------------------------------
ID COMM SALARY TOTAL
------ --------- --------- -----------
10 - 18357,50 18357,50 <- Si COMM es NULL se suma 0
20 612,45 18171,25 18783,70
30 - 17506,75 17506,75
40 846,55 18006,00 18852,55
50 - 20659,80 20659,80
60 650,25 16808,30 17458,55
70 1152,00 16502,83 17654,83
80 128,20 13504,60 13632,80
90 1386,70 18001,75 19388,45
100 - - - <- Si ambos son NULL, el resultado
es NULL.

ASTECI S.A. DE C.V.


31
MANUAL DE DB2
 Otra manera de manejar los valores NULL es por medio de indicadores (ver pag
55)

Función escalar DECIMAL


SELECT Nom-de-Columnas, .. ,
DECIMAL(Dato numérico, Precisión, Escala )
FROM Nombre-de-Tabla . . .
 La función DECIMAL devuelve como resultado, una representación
decimal del dato numérico asignándole una precisión (numero total de
dígitos), y una escala (Numero de dígitos después del punto decimal).
 El resultado es el mismo valor numérico, pero representado según los
parámetros de la función DECIMAL.

Ejemplo 1; Usar la función DECIMAL, para obtener un valor tipo decimal con
precisión de 5 dígitos y escala de 2 decimales a partir del dato EDUCLVL
(Tipo SMALLINT), el número de empleado EMPNO también debe aparecer.

SELECT EMPNO, EDUCLVL, DECIMAL(EDUCLVL,5,2)


FROM EMPLEADOS
------------------------
EMPNO EDUCLVL 3
-------- ------- -------
1, 78 78,00
2, 78 78,00
3, 23 23,00
4, 23 23,00
5, 18 18,00
6, 15 15,00
13, 16 16,00
14, 28 28,00
25, 14 14,00
30, 20 20,00

Ejemplo 2: exhibir el promedio por departamento de los empleados de la


tabla EMPLEADOS, usando un formato de 8 dígitos con 2 decimales

SELECT WRKDEPT, DECIMAL(AVG(SALARY),8,2)


FROM EMPLEADOS
GROUP BY WRKDEPT
-----------------
WRKDEPT 2
------- ---------
A00 47485,71
B00 52000,00
C01 35000,00
D11 55590,90
D21 26666,66
D22 50000,00

ASTECI S.A. DE C.V.


32
MANUAL DE DB2

Función escalar INTEGER


SELECT Nom-de-Columnas, .. ,
INTEGER(Dato numérico)
FROM Nombre-de-Tabla . . .
 La función INTEGER devuelve como resultado el valor entero del dato
numérico eliminando los posibles decimales.
 El resultado es el mismo valor numérico, pero representado según los
parámetros de la declaración INTEGER.

Ejemplo 1:
Usar la función INTEGER, para obtener un valor de tipo INTEGER del resultado
de la multiplicación de EDLEVEL (Tipo SMALLINT) y de SALARY(DECIMAL 7,2).

SELECT EMPNO, SALARY, EDLEVEL, INTEGER(SALARY / EDLEVEL) AS ENTERO


FROM EMPLOYEE
--------------------------------------------------------------------

EMPNO SALARY EDLEVEL ENTERO


------ ----------- ------- -----------
000010 52750,00 18 2930
000020 41250,00 18 2291
000030 38250,00 20 1912
000050 40175,00 16 2510
000060 32250,00 16 2015
000070 36170,00 16 2260
000090 29750,00 16 1859
000100 26150,00 14 1867

Ejemplo 2:
Obtener la lista de todos los empleados cuyo salario sea igual a 32,250 sin
tomar en consideración los centavos.

SELECT EMPNO, SALARY, EDLEVEL


FROM EMPLOYEE
WHERE INTEGER (SALARY) = 32250
-------------------------------

EMPNO SALARY EDLEVEL


------ ----------- -------
000060 32250,00 16

ASTECI S.A. DE C.V.


33
MANUAL DE DB2

Función escalar FLOAT


SELECT Nom-de-Columnas, .. ,
FLOAT(Dato numérico)
FROM Nombre-de-Tabla . . .
 La función FLOAT devuelve como resultado el valor del dato numérico en la
representación FLOATING POINT.
 El resultado es el mismo valor numérico, pero representado según los
parámetros de la declaración DOUBLE PRECISION.

Ejemplo 1: Localizar el cociente del salario entre la comisión para todos los
empleados de la tabla EMPLOYEE cuya comisión sea mayor que cero, puesto
que tanto SALARY como COMM son datos de tipo DECIMAL, el resultado se
obtendrá en formato de punto flotante (FLOAT) para evitar un posible
OVERFLOW.

SELECT EMPNO, FLOAT(SALARY)/COMM


FROM EMPLOYEE
WHERE COMM > 0
--------------------------------
EMPNO 2
------ ------------------------
000010 +1,25000000000000E+001 <- 1.25 EN FORMATO DE DOBLE PRECISION
000020 +1,25000000000000E+001
000030 +1,25000000000000E+001
000050 +1,25000000000000E+001
000060 +1,25000000000000E+001
000070 +1,25025924645697E+001
000090 +1,25000000000000E+001
000100 +1,25000000000000E+001

ASTECI S.A. DE C.V.


34
MANUAL DE DB2

Función escalar DIGITS


SELECT Nom-de-Columnas, .. ,
DIGITS(Dato numérico)
FROM Nombre-de-Tabla . . .
 La función DIGITS devuelve como resultado el valor del dato numérico
convertido en formato de carácter, eliminando el punto decimal y el signo,
en la representación CHARACTER.
 El resultado es una conversión a TEXTO del valor numérico, pero
representado según los parámetros de la declaración CHARACTER.

Ejemplo 1:

SELECT DISTINCT EMPNO,SALARY,DIGITS(SALARY) AS NUMERO


FROM EMPLOYEE
-----------------------------------------------------

EMPNO SALARY NUMERO


------ ---------- ---------
000010 52750,00 005275000
000020 41250,00 004125000
000030 38250,00 003825000
000050 40175,00 004017500
000060 32250,00 003225000
000070 36170,00 003617000
000090 29750,00 002975000
000100 26150,00 002615000

ASTECI S.A. DE C.V.


35
MANUAL DE DB2

Función escalar HEX


SELECT Nom-de-Columnas, .. ,
HEX(Expresión)
FROM Nombre-de-Tabla . . .

 La función HEX devuelve como resultado el valor de la expresión convertido


en formato de Hexadecimal, la expresión puede ser de cualquier tipo ya sea
numérico o carácter la longitud máxima del tipo de dato es de 254 bytes.

Ejemplo 1:
Exhibir la representación Hexadecimal del campo numérico EDLEVEL
(Smallint 2 Bytes).

SELECT FIRSTNME, MIDINIT, LASTNAME,EDLEVEL, HEX(EDLEVEL) HEXA


FROM EMPLOYEE
-------------------------------------------------------------

FIRSTNME MIDINIT LASTNAME EDLEVEL HEXA


----------- ------- ------------- ------- ----
CHRISTINE I HAAS 18 1200
MICHAEL L THOMPSON 18 1200
SALLY A KWAN 20 1400
JOHN B GEYER 16 1000
IRVING F STERN 16 1000
EVA D PULASKI 16 1000
EILEEN W HENDERSON 16 1000
THEODORE Q SPENSER 14 0E00
VINCENZO G LUCCHESSI 19 1300
SEAN O'CONNELL 14 0E00

Ejemplo 2:
Exhibir la representación Hexadecimal del campo Carácter MIDINIT
(CHARACTER 1 Byte).

SELECT MIDINIT, HEX(MIDINIT) HEXA


FROM EMPLOYEE
----------------------------

MIDINIT HEXA
------- ----
I 49
L 4C
A 41
B 42
F 46
D 44
W 57
Q 51
G 47
20 <- El espacio en blanco tiene el código 20 (32 decimal).

ASTECI S.A. DE C.V.


36
MANUAL DE DB2

Función escalar DATE


SELECT Nom-de-Columnas, .. ,
DATE (Expresión)
FROM Nombre-de-Tabla . . .
 Convierte el valor de la Expresión a un dato de tipo Fecha.
 La Expresión puede ser un String que representa una Fecha en formato
estándar o un número Entero, o un dato en el formato TIMESTAMP.
 Los formatos de Fecha son:
 [Link] -> Formato EUR
 MM/DD/AAAA -> Formato USA
 AAAA-MM-DD -> Formato ISO
 AAAA-MM-DD -> Formato JIS
 El número entero puede ser de 1 a 3652059
 El numero 1 representa el1 de Enero del año 1
 El numero 2 representa el 2 de enero del año 1 etc.
 El dato en formato TIMESTAMP contiene la fecha y la hora en un mismo
grupo.

Ejemplo 1; listar el tiempo transcurrido entre la fecha de contratación


(HIREDATE) y el 1 de enero de 2001.

SELECT EMPNO, LASTNAME, HIREDATE,


DATE('01.01.2001') - HIREDATE AS TRANSCURRIDO
FROM EMPLOYEE
------------------------------------------------------------------------

EMPNO LASTNAME HIREDATE TRANSCURRIDO


------ --------------- ---------- ----------
000010 HAAS 01/01/1965 360000,<- 36 años (00 meses 00 días)
000020 THOMPSON 10/10/1973 270222,
000030 KWAN 05/04/1975 250826,
000050 GEYER 17/08/1949 510415,
000060 STERN 14/09/1973 270317,<- 27 años, 03 meses, 17 días
000070 PULASKI 30/09/1980 200301,
000090 HENDERSON 15/08/1970 300417,
000100 SPENSER 19/06/1980 200612,

Observe que:
 Primero se convirtió el STRING ’01.01.2001’ a tipo DATE, después se efectúo
la resta .
 El resultado se obtiene en formato entero, representando AAAAMMDD; por
ejemplo 200602 representa 20 años, 06 meses, 02 días

Ejemplo 2 Convertir a formato de fecha el número entero 730260 (Es el


numero de días transcurridos desde el 1 de Enero del año 1).

SELECT DATE(730250) AS FECHA FROM CONTROL


-----------------------------------------
FECHA
----------
20/05/2000  20 de mayo de 2000
ASTECI S.A. DE C.V.
37
MANUAL DE DB2

Declaración INSERT
INSERT INTO Nombre de la Tabla
[( Lista de columnas )]
VALUES ( Lista de valores ) \ SUBSELECT
 La declaración INSERT Añade nuevos renglones de una tabla o un VIEW.
 Si se añade un renglón a un VIEW, se añade un renglón a su tabla base.
 Hay dos formatos para esta declaración.
 INSERT vía VALUES añade un nuevo renglón a la tabla, con los valores
suministrados.
 Si no se indica la lista de columnas, se considera que se darán valores
para todas las columnas.
 El numero de columnas en la lista de columnas debe ser igual al
numero de valores en la lista de valores.

 INSERT vía SELECT añade uno o más renglones en la tabla o VIEW


usando los valores de otra tabla o VIEW

Ejemplo 1: Añadir un nuevo departamento en la tabla DEPARTMENT, pero no


asignar gerente (MANAGER) al nuevo departamento.

INSERT INTO DEPARTMENT


(DEPTNO, DEPTNAME, ADMRDEPT)
VALUES ('E31', 'ARCHITECTURE', 'E01')

Observe que:

 Las columnas no asignadas, recibirán el valor NULL.

Ejemplo 2: insertar en la tabla EMPLEADOS, todos los empleados del


departamento G99 de la tabla EMPL_1999.
EMPL_1999 tiene el mismo formato de la tabla EMPLEADOS.

INSERT INTO EMPLEADOS


SELECT *
FROM EMPL_1999
WHERE WRKDEPT = 'G99'

Observe que:

 Las columnas seleccionadas deben coincidir con las columnas de la tabla


receptora.

ASTECI S.A. DE C.V.


38
MANUAL DE DB2

Declaración UPDATE
UPDATE nombre de la Tabla
SET nombre de columna = Expresión \ NULL
[WHERE Condición]

 La declaración UPDATE modifica el valor de las columnas especificadas en


los renglones de una tabla o un VIEW.

 Si se modifica un renglón de un VIEW, se modifica el renglón de su tabla


base.
 UPDATE se usa para modificar uno o más renglones determinados por
una condición en la cláusula WHERE.

 Si se omite la cláusula WHERE, se modifican TODOS los renglones de la


tabla.

Ejemplo 1: Cambiar en la tabla EMPLEADOS, el apellido del empleado cuyo


numero (EMPNO) sea igual a 143 para que se lea MARTINEZ

UPDATE EMPLEADOS
SET LASTNAME = ‘MARTINEZ’
WHERE EMPNO = 143

Ejemplo 2: Todos los empleados del departamento’D11’, cambiaran de


puesto, excepto el gerente (MANAGER), indicar esto cambiando el proyecto
(JOB) a NULL, y los pagos (SALARY, COMM y, BONUS) a cero en la tabla
EMPLOYEE.

UPDATE EMPLOYEE
SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
WHERE WORKDEPT = ‘D11’ AND JOB <> 'MANAGER'

Ejemplo 3: cambiar el sueldo del empleado cuyo EMPNO sea 3 al valor


14000.

UPDATE EMPLEADOS
SET SALARY = 14000
WHERE EMPNO = 3

Observe que:
 Las columnas que no se modifican con UPDATE conservan sus valores anteriores.

ASTECI S.A. DE C.V.


39
MANUAL DE DB2

Declaración DELETE
DELETE FROM nombre de la Tabla
[WHERE Condición]
 La declaración DELETE Elimina renglones de una tabla o un VIEW.
 Si se elimina un renglón de un VIEW, se elimina el renglón de su tabla
base.
 DELETE se usa para eliminar uno o más renglones determinados por una
condición en la cláusula WHERE

 Si se omite la cláusula WHERE, se eliminan TODOS los renglones de la tabla.

Ejemplo 1: Borrar de la tabla EMPLEADOS, los renglones que tengan el


departamento (DEPTNO) igual a ‘A00’

DELETE FROM EMPLEADOS


WHERE DEPTNO = ‘D11’

Ejemplo 2: Borrar todos los subproyectos de la tabla PROJECT que tengan


NULL en la columna MAJPROJ y que pertenezcan al departamento ‘D11’

DELETE FROM PROJECT


WHERE DEPTNO = ‘D11’ AND MAJPROJ IS NULL

Ejemplo 3: Borrar TODOS los renglones de la tabla TEMPORAL

DELETE FROM TEMPORAL

ASTECI S.A. DE C.V.


40
MANUAL DE DB2

Incluir declaraciones SQL en programas COBOL


 Se pueden incluir declaraciones SQL dentro de un programa escrito en un
lenguaje principal, como seria COBOL, PLI, C.
 Las declaraciones SQL no pueden escribirse en programas COBOL que
tengan mas de una PROCEDURE DIVISION.
 Un programa COBOL que contenga declaraciones SQL debe incluir:
 Una variable SQLCODE declarada PICTURE S9(9) BINARY, PICTURE
S9(9) COMP-4, o PICTURE S9(9) COMP
 Una variable SQLSTATE declarada PICTURE X(5)
O,
 Una variable SQLCA que contenga una variable SQLCODE y una
variable SQLSTATE .

 Cada declaración SQL en un programa COBOL debe empezar con EXEC SQL
y terminar con END-EXEC.
 Las palabras reservadas EXEC SQL deben aparecer solas en un solo
renglón, pero el resto de la instrucción puede aparecer en las siguientes
líneas.

 Las variables de COBOL que se utilizan dentro de EXEC SQL deben


declararse en la DECLARE SECTION
 Al terminar la ejecucion de un comando SQL, la variable SQLCODE adquiere
el valor:
 Cero si la operación se ejecuto exitosamente
 Otro valor si no se ejecuto exitosamente.

Ejemplo1: Una declaración UPDATE codificada en un programa COBOL


aparecería como sigue:

EXEC SQL
UPDATE EMPLEADOS
SET WRKDEPT = :WRKDEPT-H
WHERE EMPNO = :EMPNO-H
END-EXEC
IF SQLCODE = 0
CONTINUE
ELSE
MOVE ‘ERROR, NO SE ACTUALIZO’ TO WL-MENSAJE
END-IF

Observe que las variables de COBOL se indican dentro del EXEC SQL con dos
puntos [Link]. :EMPNO-H. Si SQLCODE no es CERO, no se ejecuto con éxito la
instrucción.

ASTECI S.A. DE C.V.


41
MANUAL DE DB2
 Las instrucciones SQL pueden tomarse de un archivo de texto, utilizando la
declaración INCLUDE, no se utiliza COPY para esto.

Ejemplo: EXEC SQL


INCLUDE nombre del archivo de texto
END-EXEC.

Incluir variables de COBOL dentro de Declaraciones


SQL
 Las variables de COBOL que se utilicen dentro de un EXEC SQL, deben
declararse en la WORKING-STORAGE SECTION, en la DECLARE SECTION.

Ejemplo 1; declarar las variables COBOL que se utilizaran para recibir la


información de una tabla de DB2:

WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.

01 EMPNO-H PIC S9(6)V COMP-3.


01 FIRSTNAME-H PIX X(10).
01 MIDINIT-H PIC X(01).
01 LASTNAME-H PIC X(10).
01 WRKDEPT-H PIC X(03).
01 PHONENO-H PIC X(04).
01 HIREDATE-H PIC X(10).
01 JOBCODE-H PIC S9(04) COMP-5.
01 EDUCLVL-H PIC S9(04) COMP-5.
01 BIRTHDATE-H PIC X(10).
01 SEX-H PIC X(01).
01 SALARY-H PIC S9(05)V99 COMP-3.

EXEC SQL END DECLARE SECTION END-EXEC.


Observe que:

 Las variables están declaradas a nivel 01.


 Dependiendo del tipo de columna en DB2, se declara el tipo de variable en
COBOL.
 Las columnas DECIMAL se declaran COMP-3 con signo.
 Las columnas INTEGER se declaran COMP-4 con signo.
 Las columnas SMALLINT se declaran COMP-5 con signo.
 Las columnas CHARACTER se declaran X(longitud).
 Las columnas VARCHAR se declaran X(longitud máxima).

Las variables COBOL declaradas en la DECLARE SECTION, se podrán usar


dentro de las declaraciones SQL , indicándolas con dos puntos P.
Ej. :SALARY-H

Ejemplo, una declaración SELECT INTO quedaría así:

EXEC SQL
ASTECI S.A. DE C.V.
42
MANUAL DE DB2
SELECT EMPNO, SALARY
INTO :EMPNO-H, :SALARY-H
FROM EMPLEADO
WHERE EMPNO = :EMPNO-H
END-EXEC

Equivalencia de variables DB2 – COBOL (1)

Para determinar la equivalencia entre los tipos de variables COBOL y los de


SQL, se puede utilizar la siguiente tabla:

+------------------------------------------------------------------------+
¦ Tipos de datos SQL comparados con tipos de datos COBOL ¦
+------------------------------------------------------------------------¦
¦ Tipos de datos SQL ¦ Tipos de datos COBOL ¦ Notas ¦
+-----------------------+------------------------+-----------------------¦
¦ SMALLINT ¦ S9(4) COMP-4 ¦ Ver Nota 72 ¦
+-----------------------+------------------------+-----------------------¦
¦ INTEGER ¦ S9(9) COMP-4 ¦ ¦
+-----------------------+------------------------+-----------------------¦
¦ DECIMAL(p,s) o ¦ Si p < 19: ¦ 0<=s<=p<=18, donde s ¦
¦ ¦ ¦ es la escala y p es ¦
¦ NUMERIC(p,s) ¦ S9(p-s)V9(s) ¦ la precision. Si ¦
¦ ¦ ¦ s=0, use S9(p) o ¦
¦ ¦ PACKED-DECIMAL ¦ S9(p)V. Si s=p, use ¦
¦ ¦ COMP-3 ¦ SV9(s). ¦
¦ ¦ o ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ S9(p-s)V9(s) DISPLAY ¦ Observe que los campos¦
¦ ¦ ¦ numéricos llevan SIGNO¦
¦ ¦ SIGN LEADING ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ SEPARATE ¦ ¦
¦ ¦ ¦ Use COMP-2 ¦
¦ ¦ Si p > 18: ¦ ¦
¦ ¦ no hay equivalente ¦ ¦
¦ ¦ exacto ¦ ¦
+-----------------------+------------------------+-----------------------¦
¦ FLOAT (single ¦ COMP-1 ¦ ¦
¦ precision) ¦ ¦ ¦
+-----------------------+------------------------+-----------------------¦
¦ FLOAT (double ¦ COMP-2 ¦ ¦
¦ precision) ¦ ¦ ¦
+-----------------------+------------------------+-----------------------¦
¦ CHAR(n) ¦ fixed-length character ¦ n es un entero ¦
¦ ¦ string ¦ positivo. El valor ¦
¦ ¦ ¦ maximo de n depende ¦
¦ ¦ PIC X(n) ¦ del producto. ¦
+-----------------------+------------------------+-----------------------¦
¦ VARCHAR(n) ¦ varying-length ¦ n es un entero ¦
¦ ¦ character string ¦ positivo. El valor ¦
¦ ¦ ¦ maximo de n depende ¦
¦ ¦ PIC X(n) ¦ del producto. ¦
+-----------------------+------------------------+-----------------------¦
¦ GRAPHIC(n) ¦ fixed-length graphic ¦ n es un entero ¦
¦ ¦ string ¦ positivo. El valor ¦
¦ ¦ ¦ maximo de n depende ¦
¦ ¦ ¦ del producto. ¦
+-----------------------+------------------------+-----------------------¦
ASTECI S.A. DE C.V.
43
MANUAL DE DB2
¦ VARGRAPHIC(n) ¦ varying-length graphic ¦ n s un entero positivo¦
¦ ¦ string ¦ su valor maximo depen-¦
¦ ¦ ¦ de del producto. ¦
+------------------------------------------------------------------------+

ASTECI S.A. DE C.V.


44
MANUAL DE DB2

Equivalencia de variables DB2 – COBOL (2)

Tabla para determinar la equivalencia de los tipos de datos COBOL y


SQL

+-----------------------+------------------------+-----------------------+
¦ DATE ¦ fixed-length character ¦ Asigne por lo menos 10¦
¦ ¦ string PIC X(10) ¦ caracteres. ¦
+-----------------------+------------------------+-----------------------¦
¦ TIME ¦ fixed-length character ¦ Asigne por lo menos 6 ¦
¦ ¦ string ¦ caracteres; 8 para ¦
¦ ¦ PIC X(08) ¦ incluir los segundos. ¦
+-----------------------+------------------------+-----------------------¦
¦ TIMESTAMP ¦ fixed-length character ¦ Asigne por lo menos 19¦
¦ ¦ string ¦ caracteres; 26 para ¦
¦ ¦ ¦ incluir microsegundos ¦
¦ ¦ PIC X(26) ¦ en precisión completa.¦
+------------------------------------------------------------------------+

(70) Los campos numéricos se declaran con SIGNO.

(71) En DB2 para OS/400, COMP-1 y COMP-2 no están aceptados por


los compiladores COBOL. En DB2(cs), COMP-1 no esta aceptado.

(72) En DB2(cs), se debe usar COMP-5 en lugar de COMP-4.

(73) En DB2(cs), DISPLAY SIGN LEADING SEPARATE no esta permitido.

Por Ejemplo:

La columna EMPNO en DB2 es de tipo DEC (6,0)


La variable EMPNO-H en COBOL se declara PIC S9(06)V COMP-3

La columna SALARY en DB2 es de tipo DEC (7,2)


La variable SALARY-H en COBOL se declara PIC S9(05)V9(02) COMP-3

La columna EDUCLVL en DB2 es de tipo SMALLINT


La variable EDUCLVL-H en COBOL se declara PIC S9(04) COMP-5

La columna BIRTHDATE en DB2 es de tipo DATE


La variable BIRTHDATE-H en COBOL se declara PIC X(10)

La columna FIRSTNAME en DB2 es de tipo CHAR (10)


La variable FIRSTNAME-H en COBOL se declara PIC X(10)

Observe que:
 Las variables numéricas se declaran con signo [Link] PIC S9(05)V99

ASTECI S.A. DE C.V.


45
MANUAL DE DB2

SELECT INTO en un programa COBOL


SELECT Lista de Columnas
INTO Variables de Host
Cláusula FROM
[Cláusula WHERE ]

 Esta declaración sólo puede utilizarse incluida dentro de un programa de


aplicación.
 La declaración SELECT INTO produce una tabla de resultado que debe
consistir de un solo renglón como máximo.
 Los valores de dicho renglón se asignaran a la lista de variables HOST.
 Si la tabla esta vacía, se asigna un valor de +100 a SQLCODE y ‘02000’
a SQLSTATE, pero no se asigna ningún valor a las variables HOST.
 Si más de un renglón satisface las condiciones del SELECT; se termina el
proceso de la declaración, y se genera un ERROR.
 Las variables de Host deberán estar declaradas en la DECLARE SECTION.
 Se indican con dos puntos dentro de la declaración SQL [Link]. :EMPNO-H
 El primer valor del renglón se asigna a la primera variable de la lista
 El segundo valor del renglón se asigna a la segunda variable de la lista,
Etc.
 El tipo de datos de cada variable de Host debe ser compatible con su
correspondiente columna.
 Si alguno de los valores de las columnas puede ser NULL, es
conveniente usar INDICADORES. (Ver Pag 55)

Ejemplo 1: Obtener el salario máximo de la tabla EMPLEADOS, en la variable


de Host SALARY-MAX-H ( PIC S9(08)V99 COMP-3 ), usando una declaración
incluida en un programa COBOL.
EXEC SQL
SELECT MAX(SALARY)
INTO :SALARY-MAX-H
FROM EMPLEADOS
END-EXEC.

Ejemplo 2: Seleccionar de la tabla EMPLOYEE el renglón correspondiente al


empleado cuyo numero (EMPNO) sea igual al valor almacenado en la
variable de Host EMPNO-H, (PIC S9(06)V COMP-3), Después poner el apellido
(LASTNAME) y el nivel de educación (EDLEVEL) del renglón seleccionado en
las siguientes variables de HOST:
LASTNAME-H ( PIC X(20) ), EDLEVEL-H ( PIC S9(04) COMP-5 ).

EXEC SQL
SELECT LASTNAME, EDLEVEL
INTO :LASTNAME-H, :EDLEVEL-H
FROM EMPLOYEE
WHERE EMPNO = :EMPNO-H
END-EXEC

ASTECI S.A. DE C.V.


46
MANUAL DE DB2
Observe que:
 El resultado de SELECT INTO debe ser un solo renglón.

Declaración UPDATE en un programa COBOL (1)


UPDATE nombre de la Tabla
SET nombre de columna = Expresión \ NULL
[WHERE Condición]

 La declaración UPDATE modifica el valor de las columnas especificadas en


los renglones de una tabla o un VIEW.
 Si se modifica un renglón de un VIEW, se modifica el renglón de su tabla
base.
 Hay dos formatos para esta declaración.
 UPDATE Localizado que se usa para modificar uno o más renglones
determinados por una condición en la cláusula WHERE condición.
 Si la condición no localiza ningún renglón, se genera SQLCODE = 100
 UPDATE Posicionado que se usa para modificar exactamente un renglón
determinado por la posición actual de un cursor leído con FETCH
(WHERE CURRENT OF cursor).
 Si se omite la cláusula WHERE, se modifican TODOS los renglones de la
tabla.

Ejemplo 1: Cambiar en la tabla EMPLEADOS, el apellido del empleado cuyo


numero (EMPNO) sea igual al contenido de la variable Host EMPNO-H, para
que se lea FERNANDEZ

EXEC SQL
UPDATE EMPLEADOS
SET LASTNAME = ‘FERNANDEZ’
WHERE EMPNO = :EMPNO-H
END-EXEC

Ejemplo 2: Todos los empleados del departamento indicado en la variable


Host WORKDEPT-H, cambiaran de puesto, excepto el gerente (MANAGER),
indicar esto cambiando el proyecto (JOB) a NULL, y los pagos (SALARY,
COMM y, BONUS) a cero en la tabla EMPLOYEE.

EXEC SQL
UPDATE EMPLOYEE
SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
WHERE WORKDEPT = :WORKDEPT-H AND JOB <> 'MANAGER'
END-EXEC

Ejemplo 3: cambiar el sueldo del empleado cuyo EMPNO sea 78 al valor


indicado en la variable de Host NVO-SAL-H.

EXEC SQL
UPDATE EMPLEADOS
SET SALARY = :NVO-SAL-H
WHERE EMPNO = 78
END-EXEC

ASTECI S.A. DE C.V.


47
MANUAL DE DB2

Declaración UPDATE en un programa COBOL (2)


UPDATE nombre de la Tabla
SET nombre de columna = Expresión \ NULL
[WHERE CURRENT OF Nombre de cursor]
 La declaración UPDATE modifica el valor de las columnas especificadas en el
renglón de una tabla, Posicionado según el registro actual de un cursor.
 El cursor debe estar declarado con la cláusula FOR UPDATE OF
 Una vez abierto, se lee el cursor con FETCH, y el registro leído es el registro
actual (CURRENT OF Nombre de cursor).

Ejemplo 1: Teniendo un cursor con los datos de la tabla EMPLEADOS,


cambiar los salarios de los empleados que lo requieran según una tabla.

WORKING-STORAGE SECTION.

EXEC SQL DECLARE C1 CURSOR FOR


SELECT *
FROM EMPLEADOS
FOR UPDATE OF SALARY
END-EXEC

...

PROCEDURE DIVISION.
EXEC SQL
OPEN C1
END-EXEC

EXEC SQL
FETCH C1 INTO ...
END-EXEC

SEARCH WT-CAMBIOS
VARYING INDICE
AT END MOVE ‘NO’ TO WS-CAMBIO
WHEN NUMERO(INDICE) = EMPNO-H
MOVE ‘SI’ TO WS-CAMBIO
END-SEARCH

IF WS-CAMBIO = 'SI' THEN


EXEC SQL
UPDATE EMPLEADOS
SET SALARY = :NVO-SAL-H
WHERE CURRENT OF C1 <- Renglón actual
END-EXEC

EXEC SQL
CLOSE C1
ASTECI S.A. DE C.V.
48
MANUAL DE DB2

END-EXEC

Declaración DELETE en un programa COBOL (1)


DELETE FROM nombre de la Tabla
[WHERE Condición]
 La declaración DELETE Elimina renglones de una tabla o un VIEW.
 Si se elimina un renglón de un VIEW, se elimina el renglón de su tabla
base.
 Hay dos formatos para esta declaración.
 DELETE Localizado que se usa para eliminar uno o más renglones
determinados por una condición.
 DELETE Posicionado que se usa para eliminar exactamente un renglón
determinado por la posición actual de un cursor (CURRENT OF cursor).
 Si se omite la cláusula WHERE, se eliminan TODOS los renglones de la tabla.

Ejemplo 1: Borrar de la tabla EMPLEADOS, los renglones que tengan el


departamento (DEPTNO) señalado por la variable Host DEPTNO-H

EXEC SQL
DELETE FROM EMPLEADOS
WHERE DEPTNO = :DEPTNO-H
END-EXEC

Ejemplo 2: Borrar todos los subproyectos de la tabla PROJECT que tengan


NULL en la columna MAJPROJ y que pertenezcan al departamento indicado
por la variable Host DEPTNO-H

EXEC SQL
DELETE FROM PROJECT
WHERE DEPTNO = :DEPTNO-H AND MAJPROJ IS NULL
END-EXEC
IF SQLCODE NOT = 0 THEN
MOVE ‘NO SE EJECUTO LA BAJA’ TO WL-MENSAJE
END-IF

Ejemplo 3: Borrar TODOS los renglones de la tabla TEMPORAL

EXEC SQL
DELETE FROM TEMPORAL
END-EXEC

IF SQLCODE=0 THEN
CONTINUE
ELSE
MOVE ‘NO SE EJECUTO EL COMADO’ TO WL-MENSAJE
END-IF

ASTECI S.A. DE C.V.


49
MANUAL DE DB2
Observe que: Si la operación no se ejecuto exitosamente, el valor de SQLCODE no es
CERO.

Declaración DELETE en un programa COBOL (2)


DELETE FROM Nombre de la Tabla
[WHERE CURRENT OF Nombre de cursor]
 La declaración DELETE elimina el renglón de una tabla, Posicionado según el
registro actual de un cursor.
 Una vez abierto, se lee el cursor con FETCH, y el registro leído es el registro
actual (CURRENT OF Nombre de cursor).

Ejemplo 1: Teniendo un cursor de la tabla EMPLOYEE, que contenga


únicamente a los empleados retirados (JOB = ‘RETIRED’), borrar los
empleados que lo requieran según una tabla.

WORKING-STORAGE SECTION.

EXEC SQL
DECLARE C1 CURSOR FOR
SELECT *
FROM EMPLOYEE
WHERE JOB = 'RETIRED'
END-EXEC

. . .

PROCEDURE DIVISION.

EXEC SQL OPEN C1 END-EXEC

EXEC SQL
FETCH C1 INTO ...
END-EXEC

SEARCH WT-BAJAS
VARYING INDICE
AT END MOVE ‘NO’ TO WS-BAJA
WHEN NUMERO(INDICE) = EMPNO-H
MOVE ‘SI’ TO WS-BAJA
END-SEARCH

IF WS-BAJA = 'SI' THEN


EXEC SQL
DELETE FROM EMPLEADOS
WHERE CURRENT OF C1
END-EXEC

EXEC SQL
CLOSE C1
END-EXEC

ASTECI S.A. DE C.V.


50
MANUAL DE DB2

Declaración INSERT dentro de un programa COBOL


INSERT INTO Nombre de la Tabla
[( Lista de columnas )]
VALUES ( Lista de valores ) \ SUBSELECT
 La declaración INSERT Añade nuevos renglones de una tabla o un VIEW.
 Si se añade un renglón a un VIEW, se añade un renglón a su tabla base.
 Hay dos formatos para esta declaración.
 INSERT vía VALUES añade un nuevo renglón a la tabla, con los valores
suministrados.
 Si no se indica la lista de columnas, se considera que se darán valores
para todas las columnas.
 El numero de columnas en la lista de columnas debe ser igual al
numero de valores en la lista de valores.
 INSERT vía SELECT añade uno o más renglones en la tabla o VIEW
usando los valores de otra tabla o VIEW

Ejemplo 1: Añadir un nuevo departamento en la tabla DEPARTMENT, pero no


asignar gerente (MANAGER) al nuevo departamento.
EXEC SQL
INSERT INTO DEPARTMENT
(DEPTNO, DEPTNAME, ADMRDEPT)
VALUES ('E31', 'ARCHITECTURE', 'E01')
END-EXEC

IF SQLCODE = -803 THEN


MOVE ‘CLAVE DUPLICADA’ TO WL-MENSAJE
END-IF

Observe que:

 Las columnas no asignadas, recibirán el valor NULL.


 Si se intenta insertar un renglón con la CLAVE DUPLICADA, es decir que la
clave ya existe en la tabla; se genera el código SQLCODE = -803 
Negativo.

Ejemplo 2: insertar en la tabla EMPLEADOS, todos los empleados del


departamento G99 de la tabla EMPL_1999.
EMPL_1999 tiene el mismo formato de la tabla EMPLEADOS.

EXEC SQL
INSERT INTO EMPLEADOS
SELECT *
FROM EMPL_1999
WHERE WRKDEPT = 'G99'
END-EXEC

ASTECI S.A. DE C.V.


51
MANUAL DE DB2
Observe que:

 Las columnas seleccionadas deben coincidir con las columnas de la tabla


receptora.

DECLARE CURSOR dentro de un programa COBOL


DECLARE Nombre de cursor
CURSOR [HITH HOLD] FOR
Declaración SELECT
[FOR UPDATE OF Lista de columnas]
 Un CURSOR es una estructura con nombre, dentro de un programa de
aplicación, para señalar renglones específicos, dentro de una tabla de
resultados.
 Un CURSOR se utiliza para recuperar renglones de una tabla de resultados,
generada por un SELECT y, posiblemente hacer modificaciones (UPDATE) o
bajas (DELETE)
 Una manera simple de verlo, es pensar en el CURSOR como una guia para
leer en una tabla de resultados de un SELECT.
 Las declaraciones de variables de Host deben ir ANTES de DECLARE
CURSOR.
 DECLARE CURSOR Define un cursor.
 Esta declaración solo puede incluirse dentro de un programa de aplicación,
no es una declaración ejecutable.
 La opción WITH HOLD evita que el cursor se cierre como una consecuencia
de una operación COMMIT.
 Todos los cursores se cierran implícitamente con una operación ROLLBACK.
 Para usar un cursor, es necesario abrir antes el cursor con la Declaración
OPEN CURSOR.
 Un cursor abierto se puede leer con la declaración FETCH.

Ejemplo 1: Usando un cursor, localizar el nombre (FIRSTNAME), el nivel


educativo (EDUCLVL), el salario (SALARY) para empleados de la tabla
EMPLEADOS que pertenezcan a un departamento dado.

WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 EMPNO-H PIC S9(6)V COMP-3.
01 FIRSTNAME-H PIX X(10).
01 EDUCLVL-H PIC S9(04) COMP-5.
01 WRKDEPT-H PIC X(03).
01 SALARY-H PIC S9(05)V99 COMP-3.
EXEC SQL END DECLARE SECTION END-EXEC.

EXEC SQL DECLARE C1 CURSOR FOR


SELECT EMPNO, FIRSTNAME, EDUCLVL, SALARY
FROM EMPLEADOS
WHERE WRKDEPT = :WRKDEPT-H
END-EXEC
. . .
PROCEDURE DIVISION.
EXEC SQL OPEN C1 END-EXEC

ASTECI S.A. DE C.V.


52
MANUAL DE DB2
EXEC SQL FETCH C1 INTO
:EMPNO-H, :FIRSTNAME-H, :EDUCLVL-H, :SALARY-H
END-EXEC

IF SQLCODE = 0 THEN
MOVE EMPNO-H TO WL-REPORTE
ELSE
MOVE ‘NO HAY DATOS ‘ TO WL-MENSAJE
END-IF

OPEN CURSOR dentro de un programa COBOL


OPEN Nombre de cursor

 OPEN abre un cursor


 La tabla resultado del cursor es el resultado de evaluar la cláusula SELECT
asociada con el cursor.
 La evaluación usa valores actuales de los datos especificados en el SELECT,
y posiciona el cursor en el primer renglón de la tabla Resultado.
 Si la tabla resultante esta vacía, el estado del cursor es ALR (After the Last
Row) o sea fin de cursor.

Ejemplo 1: Abrir un cursor con los datos de la tabla DEPARTMENT.


WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 DEPTNO-H PIC X(03).
01 DEPTNAME-H PIC X(29).
01 MGRNO-H PIC X(06).
01 ADMRDEPT-H PIC X(03).
01 LOCATION-H PIC X(06).
EXEC SQL END DECLARE SECTION END-EXEC.

EXEC SQL DECLARE C2 CURSOR FOR


SELECT *
FROM DEPARTMENT
END-EXEC
. . .

PROCEDURE DIVISION.

EXEC SQL
OPEN C2 <- El cursor esta abierto, ya puede usarse
END-EXEC

EXEC SQL FETCH C2 INTO


:DEPTNO-H, :DEPTNAME-H, :MGRNO-H,
:ADMRDEPT-H, :LOCATION-H
END-EXEC

IF SQLCODE = 0 THEN
MOVE DEPTNO-H TO WL-DEPTNO
MOVE DEPTNAME-H TO WL-DEPTNAME
MOVE MGRNO-H TO WL-MGRNO
MOVE ADMRDEPT-H TO WL-ADMRDEPT
MOVE LOCATION-H TO WL-LOCATION
MOVE SPACES TO WL-MENSAJE
ELSE
MOVE ‘NO HAY DATOS ‘ TO WL-MENSAJE
END-IF

ASTECI S.A. DE C.V.


53
MANUAL DE DB2

PERFORM 520-ESCRIBE-REPORTE

CLOSE CURSOR dentro de un programa COBOL


CLOSE Nombre de cursor
 CLOSE cierra un cursor ABIERTO
 Un cursor cerrado no puede leerse.

Ejemplo 1: Cerrar un cursor abierto con los datos de la tabla DEPARTMENT.

WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 DEPTNO-H PIC X(03).
01 DEPTNAME-H PIC X(29).
01 MGRNO-H PIC X(06).
01 ADMRDEPT-H PIC X(03).
01 LOCATION-H PIC X(06).
EXEC SQL END DECLARE SECTION END-EXEC.

EXEC SQL DECLARE C2 CURSOR FOR


SELECT *
FROM DEPARTMENT
END-EXEC
. . .

PROCEDURE DIVISION.

EXEC SQL
OPEN C2
END-EXEC

EXEC SQL FETCH C2 INTO


:DEPTNO-H, :DEPTNAME-H, :MGRNO-H,
:ADMRDEPT-H, :LOCATION-H
END-EXEC

IF SQLCODE = 0 THEN
MOVE DEPTNO-H TO WL-DEPTNO
MOVE DEPTNAME-H TO WL-DEPTNAME
MOVE MGRNO-H TO WL-MGRNO
MOVE ADMRDEPT-H TO WL-ADMRDEPT
MOVE LOCATION-H TO WL-LOCATION
MOVE SPACES TO WL-MENSAJE
ELSE
MOVE ‘NO HAY DATOS ‘ TO WL-MENSAJE
END-IF

PERFORM 520-ESCRIBE-REPORTE

. . .

EXEC SQL
CLOSE C2 <- El cursor esta cerrado, ya no puede usarse

ASTECI S.A. DE C.V.


54
MANUAL DE DB2
END-EXEC

FETCH CURSOR dentro de un programa COBOL


FETCH Nombre de cursor
INTO Lista de variables de Host

 La declaración FETCH posiciona un cursor en el siguiente renglón de su


tabla resultante y, asigna los valores del renglón a la lista ve variables Host.
 Esta declaración solo puede usarse incluida dentro de un programa de
aplicación, es una declaración ejecutable que NO puede prepararse
dinámicamente.
 Si alguna de las columnas seleccionadas puede tener valor NULL, conviene
incluir en la lista de variables, los indicadores necesarios. (Otra opcion es
COALESCE <ver pag 31>).
 Si después de un FETCH el cursor llega al estado ALR (After the Last Row) o
sea fin de cursor, no se asignan datos a las variables de Host, el SQLCODE
adquiere un valor de +100 y el SQLSTATE toma el valor ‘02000’
Ejemplo 1: leer un cursor con los datos de la tabla STAFF ordenada por
nombre(NAME) para escribir sus percepciones totales (SALARY + COMM),
tomando en consideración que tanto SALARY como COMM pueden tener
valores NULL.
WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 ID-H PIC S9(04) COMP-5.
01 NAME-H PIC X(9).
01 DEPT-H PIC S9(04) COMP-5.
01 SALARY-H PIC S9(05)V99 COMP-3.
01 COMM-H PIC S9(05)V99 COMP-3.
01 INDICA-SALARY-H PIC S9(04) COMP-5
01 INDICA-COMM-H PIC S9(04) COMP-5
EXEC SQL END DECLARE SECTION END-EXEC.

EXEC SQL DECLARE C2 CURSOR FOR


SELECT ID, NAME, DEPT, SALARY, COMM
FROM STAFF
END-EXEC

PROCEDURE DIVISION.
EXEC SQL OPEN C2 END-EXEC

EXEC SQL FETCH C2 INTO


:ID-H, :NAME-H, :DEPT-H,
:SALARY-H :INDICA-SALARY-H, <- Indicador negativo sí la
:COMM-H :INDICA-COMM-H <- variable es NULL
END-EXEC

EVALUATE SQLCODE
WHEN 0
IF INDICA-SALARY-H < 0 THEN

ASTECI S.A. DE C.V.


55
MANUAL DE DB2
MOVE ‘SALARIO NULL ` TO WL-MENSAJE
MOVE 0 TO SALARY-H
END-IF
IF INDICA-COMM-H < 0 THEN
MOVE ‘COMISION NULL ` TO WL-MENSAJE
MOVE 0 TO COMM-H
END-IF
WHEN 100
MOVE ‘FIN DE CURSOR‘ TO WS-CONTROL-CURSOR
END-EVALUATE

Uso de INDICADORES dentro de un programa COBOL


(INDICATOR VARIABLES)
:Variable de Host [INDICATOR] :Variable Indicador
 Un indicador es una variable ENTERA de 2 BYTES (PIC S9(04) COMP-5 o
BINARY).
 Los indicadores se declaran como las variables de Host en la DECLARE
SECTION.
 Los indicadores se asocian a una variable, dentro de las declaraciones de
recuperación
 Durante la recuperación de información (por ejemplo un FETCH), si la
variable asociada con el indicador es NULL; el indicador adquiere un valor
negativo.
 Durante la asignación de valores (Por ejemplo INSERT), si el indicador es
negativo, se asigna un valor NULL a la columna asociada.

Ejemplo: Dada la declaración:

EXEC SQL BEGIN DECLARE SECTION END-EXEC.


01 ID-H PIC S9(04) COMP-5.
01 NAME-H PIC X(9).
01 DEPT-H PIC S9(04) COMP-5.
01 SALARY-H PIC S9(05)V99 COMP-3.
01 COMM-H PIC S9(05)V99 COMP-3.
01 INDICA-SALARY-H PIC S9(04) COMP-5 <- INDICADOR
01 INDICA-COMM-H PIC S9(04) COMP-5 <- INDICADOR
EXEC SQL END DECLARE SECTION END-EXEC.

Se puede usar el INDICADOR dentro de la declaración de recuperación, SELECT


INTO
EXEC SQL
SELECT ID, NAME, DEPT, SALARY, COMM
INTO :ID-H, :NAME-H, DEPT-H,
:SALARY-H INDICA-SALARY-H, <- Indicador negativo sí variable NULL
:COMM-H INDICA-COMM-H <- Indicador negativo sí variable NULL
FROM EMPLEADOS
WHERE ID = :ID-H
END-EXEC

O se puede usar el INDICADOR dentro de la declaración de recuperación,


FETCH
EXEC SQL FETCH C2 INTO
:ID-H, :NAME-H, :DEPT-H,
ASTECI S.A. DE C.V.
56
MANUAL DE DB2
:SALARY-H INDICATOR :INDICA-SALARY-H, <- Indicador negativo sí la
:COMM-H :INDICA-COMM-H <- variable es NULL
END-EXEC

Observe que:
 La palabra INDICATOR para asociar la variable Host con el indicador es
optativa
 Si La Variable recuperada produce un error ([Link]. división entre cero); el
indicador adquiere valor negativo, La variable adquiere valor indefinido y se
genera un SQLCODE positivo. Si no se incluye indicador, el SQLCODE es
negativo, y se genera un error.
 Otra posible opcion para manejar NULL es la funcion COALESCE (ver pag
31)

Manejo de errores de SQL dentro de un programa


COBOL
Usando WHENEVER
WHENEVER NOT FOUND Accion
WHENEVER SQLERROR Accion
WHENEVER SQLWARNING Accion

 La declaracion WHENEVER especifica la accion que tomara el programa


en caso de que ocurra alguno de los eventos siguientes.
o NOT FOUND NO LOCALIZADO, Cuando no se localiza el registro
solicitado (SQLCODE = 100).
o SQLERROR ERROR DE SQL, Cuando ocurre alguna condicion de
error (SQLCODE < 0)
o SQLWARNING AVISO Cuando ocurre una condicion de aviso
(SQLWARN0=’W’ o SQLCODE mayor que 0 pero diferente de
100).
 La accion que puede tomarse seria:
o CONTINUE Para indicar que la aplicación continua con la siguiente
instrucción.
o GO TO Nombre Para indicar que la aplicación pasa al nombre de
procedimiento indicado.

Ejemplo 1: En caso de ocurra cualquier error de SQL, pasar a la rurina 999-


ABORTA

PROCEDURE DIVISION.

EXEC SQL
WHENEVER SQLERROR GO TO 999-ABORTA
END-EXEC

ASTECI S.A. DE C.V.


57
MANUAL DE DB2
Observe que WENEVER debe aparecer ANTES de las declaraciones SQL que se
desea afectar

Ejemplo 2: En caso de cualquier error pasar a 999-ABORTA, si no se localiza


un registro, continuar adelante, si hay algun aviso, continuar con la siuiente
instrucion.

PROCEDURE DIVISION.

EXEC SQL WHENEVER SQLERROR GO TO 999-ABORTA


END-EXEC

EXEC SQL WHENEVER SQLWARNING CONTINUE


END-EXEC

EXEC SQL WHENEVER NOT FOUND CONTINUE


END-EXEC

A partir de este grupo de instrucciones, cada vez que ocurra alguna de las
condiciones indicadas, se ejecutara la accion correspondiente.

COMMIT
EXEC SQL
COMMIT
END-EXEC
 La declaración COMMIT termina la unidad de trabajo actual, y empieza una
nueva.
 COMMIT actualiza y confirma todos los cambios hechos por ALTER, CREATE,
DELETE, DROP, INSERT, UPDATE, GRANT, REVOKE y COMMENT ON durante
la unidad de trabajo.
 Todos los Cursores abiertos con WITH HOLD se conservan, así como los
SELECT preparados para estos Cursores.
 Los Cursores abiertos sin WITH HOLD se cierran y las declaraciones
preparadas para ellos, se destruyen.
 El final del proceso de una aplicación, se considera una operación implícita
de COMMIT o ROLLBACK, por lo tanto una aplicación transportable, debe
ejecutar EXPLICITAMENTE un COMMIT o un ROLLBACK antes del fin de la
aplicación (En los ambientes donde se permita COMMIT o ROLLBACK
explícitos).

Ejemplo
Transferir cierto monto de la comisión (COMM) de un empleado dado a
la comisión (COMM) de otro empleado de la tabla EMPLOYEE. Restando el
monto de un renglón, y sumándolo en el otro.
Utilizar COMMIT para asegurarse que no se confirmaran los cambios en la base
de datos hasta que las dos operaciones se hayan completado exitosamente.

EXEC SQL BEGIN DECLARE SECTION


01 MONTO-H PIC S9(05)V99 COMP-3.
01 DEL_EMPNO-H CHAR(6).
ASTECI S.A. DE C.V.
58
MANUAL DE DB2
01 AL_EMPNO-H CHAR(6).
EXEC SQL END DECLARE SECTION
...

EXEC SQL WHENEVER SQLERROR GOTO 990-ABORTA END-EXEC <- En caso de error
Pasar a 990-ABORTA
PERFORM 070-BUSCA-MONTO-Y-EMPLEADOS

EXEC SQL UPDATE EMPLOYEE


SET COMM = COMM - :MONTO-H
WHERE EMPNO = :DEL_EMPNO
END-EXEC

EXEC SQL UPDATE EMPLOYEE


SET COMM = COMM + :MONTO-H
WHERE EMPNO = :AL_EMPNO
END-EXEC

EXEC SQL COMMIT END-EXEC. <- Si los movimientos se efectuaron sin error,
Los cambios se confirman en la base de datos
. . .
990-ABORTA.
EXEC SQL ROLLBACK END-EXEC.
DISPLAY 'Error en el proceso, los cambios no se ejecutaron’
EXIT.

ROLLBACK
EXEC SQL
ROLLBACK
END-EXEC
 La declaración ROLBACK elimina las modificaciones de la base de datos
hasta la ultima actualización.
 ROLLABACK CANCELA todos los cambios hechos por ALTER, CREATE,
DELETE, DROP, INSERT, UPDATE, GRANT, REVOKE y COMMENT ON durante
la unidad de trabajo.
 Los Cursores abiertos se cierran y las declaraciones preparadas para ellos,
se destruyen.
 El final del proceso de una aplicación, se considera una operación implícita
de COMMIT o ROLLBACK, por lo tanto una aplicación transportable, debe
ejecutar EXPLICITAMENTE un COMMIT o un ROLLBACK antes del fin de la
aplicación (En los ambientes donde se permita COMMIT o ROLLBACK
explícitos).

Ejemplo
Transferir cierto monto de la comisión (COMM) de un empleado dado a
la comisión (COMM) de otro empleado de la tabla EMPLOYEE. Restando el
monto de un renglón, y sumándolo en el otro.
Utilizar COMMIT para asegurarse que no se confirmaran los cambios en la base
de datos hasta que las dos operaciones se hayan completado exitosamente en
caso de error, ejecutar ROLLBACK para cancelar cualquier modificacion desde
el ultimo COMMIT.

EXEC SQL BEGIN DECLARE SECTION


01 MONTO-H PIC S9(05)V99 COMP-3.
ASTECI S.A. DE C.V.
59
MANUAL DE DB2
01 DEL_EMPNO-H CHAR(6).
01 AL_EMPNO-H CHAR(6).
EXEC SQL END DECLARE SECTION
...

EXEC SQL WHENEVER SQLERROR GOTO 990-ABORTA END-EXEC <- En caso de error
Pasar a 990-ABORTA
PERFORM 070-BUSCA-MONTO-Y-EMPLEADOS

EXEC SQL UPDATE EMPLOYEE


SET COMM = COMM - :MONTO-H
WHERE EMPNO = :DEL_EMPNO
END-EXEC

EXEC SQL UPDATE EMPLOYEE


SET COMM = COMM + :MONTO-H
WHERE EMPNO = :AL_EMPNO
END-EXEC

EXEC SQL COMMIT END-EXEC. <- Si los movimientos se efectuaron sin error,
Los cambios se confirman en la base de datos
. . .
990-ABORTA.
EXEC SQL ROLLBACK END-EXEC.
DISPLAY 'Error en el proceso, los cambios no se ejecutaron’
EXIT.

CODIGOS DE RETORNO DEL SQLCODE


Se reciben en COBOL en un campo PIC S9(09) COMP
Observe que los codigos tienen signo y, que la numeración viene en decimal.

Nº CONDITION DESCRIPCION
00 NORMAL Ejecución correcta de la operación
LOS CODIGOS POSITIVOS (EXCEPTO +100) ENCIENDEN
LA CONDICION SQLWARNING DE LA OPERACIÓN
WHENEVER.
+012 UNQUALFIED Nombre de columna sin calificar.
+100 NOT FOUND Reng. No Localizado en FETCH, UPDATE, DELETE, no hay
datos. Enciende la condicion NOT FOUND de WHENEVER
+117 NOT THE SAME Numero de valores para insertar no igual a num de columnas.
+204 UNDEFINED El nombre de la columna no esta definido.
+205 NOT IN TABLE El nombre de columna no esta en la Tabla
+206 NOT IN FROM El nombre de columna no es de la tabla en INSERT o UPDATE.
+304 OUT OF RANGE No se puede asignar un valor a la variable HOST (fuera de
rango)
+331 ASSG NULL Se asigno valor NULL a variable host (STRING intraducible)
+402 LOC UNKNOWN Localización Desconocida.
+403 NOT EXIST El objeto en CREATE ALIAS no existe.
+807 OVERFLOW La multiplicación decimal provoco desbordamiento.
LOS CODIGOS NEGATIVOS ENCIENDEN LA CONDICION
SQLERROR DE LA OPERACIÓN WHENEVER.
-007
-010 NOT TERM El string no esta terminado
-029 INTO REQD Se requiere la clausula INTO
-084 UNACCEPT Declaracion SQL Inaceptable.
ASTECI S.A. DE C.V.
60
MANUAL DE DB2
-101 TOO LONG La declaracion SQL es demasiado larga o compleja
-102 STRG TOO LONG String demasiado largo.
-103 INVALID NUM Literal numerica Invalida.
-109 NOT PERMMITED Clausula no permitida.
-303 NOT ASSIGNED No se puede asignar el valor a la variable Host (No son
compatibles).
-305 NULL VALUE El valor NULL no puede asignarse a la variable Host y, no se
especificaron Indicadores (INDICATORS)
-501 NOT OPEN El cursor utilizado en FETCH o CLOSE no esta abierto
-502 ALREADY OPEN El cursor indicado en OPEN ya esta abierto.
-803 DUPLICATE KEY No se pueden Insertar (INSERT) o Actualizar (UPDATE) valores
porque hay Claves Duplicadas.
-804 PARAM ERROR No se puede ejecuar el comando SQL, hay un error en los
parametros, posiblemente en las variables del programa
-811 MORE THAN ONE La tabla de resultados contiene más de un renglon.

ASTECI S.A. DE C.V.


61

También podría gustarte