• No results found

de SQL. Las variables anfitrión pueden aparecer en SQL incrustado en cualquier lugar donde aparezca una literal en SQL interactivo. También pueden aparecer en una cláusula INTO de SELECT (vea el párrafo 4) o de FETCH (una vez más, vea la subsección "Ope raciones que involucran cursores") para designar destinos de operaciones de recuperación. 4. Observe la cláusula INTO de la instrucción SELECT de la figura 4.3. La finalidad de esta cláusula es (como acabamos de indicar) especificar las variables de destino en las que se recuperarán valores; la iésima variable de destino mencionada en la cláusula INTO corres ponde al iésimo valor a recuperar, tal como se especifica en la cláusula SELECT. 5. Todas las variables anfitrión a las que se hace referencia en instrucciones SQL deben estar

declaradas (DCL en PL/I) dentro de una sección de declaración de SQL incrustado, la cual está delimitada por las instrucciones BEGIN y END DECLARE SECTION. 6. Todo programa que contenga instrucciones de SQL incrustado debe incluir una variable an

fitrión denominada SQLSTATE. Después ejecutar cualquier instrucción de SQL, un código de estado es devuelto al programa en dicha variable; en particular, un código de es tado de 00000 significa que la instrucción se ejecutó con éxito, y un valor de 02000 significa que la instrucción se ejecutó pero no se encontraron datos para satisfacer la petición. Por lo tanto, toda instrucción SQL del programa debe en principio estar seguida de una compro bación de SQLSTATE y debe tomarse la acción adecuada si el valor no fue el esperado. Sin embargo, en la práctica dichas comprobaciones pueden estar implícitas (vea el párrafo 9). 7. Las variables anfitrión deben tener un tipo de datos apropiado de acuerdo con los usos para los que son puestas. En particular, una variable anfitrión que vaya a ser usada como un des tino (por ejemplo, en SELECT) debe tener un tipo de datos que sea compatible con el de la expresión que proporciona el valor a asignar para ese destino; en forma similar, una varia ble anfitrión que vaya a ser utilizada como un origen (por ejemplo, en INSERT) debe tener un tipo de datos que sea compatible con el de la columna de SQL a la que se van a asignar los valores del origen. Se aplican observaciones similares a una variable anfitrión que va a ser empleada en una comparación o en cualquier otro tipo de operación. Consulte la refe rencia [4.22] para conocer los detalles de lo que significa exactamente que los tipos de datos sean compatibles en el sentido señalado.

8. Las variables anfitrión y las columnas de SQL pueden tener el mismo nombre.

9. Como ya mencioné, toda instrucción de SQL debe en principio estar seguida de una com probación del valor que SQLSTATE devuelve. Para simplificar este proceso se incluye la instrucción WHENEVER. Esta instrucción toma la forma

EXEC SQL WHENEVER <condición> <acción> ;

Aquí, <condición> puede ser SQLERROR o bien NOT FOUND y <acción> puede ser CONTINUE o bien una instrucción GO TO. WHENEVER no es una instrucción ejecutable; más bien es una directiva para el compilador de SQL. "WHENEVER <condición> GO TO <etiqueta>" hace que el compilador inserte una instrucción de la forma "IF <condición> GO TO <etiqueta> END IF" después de encontrar cada instrucción SQL ejecutable;

92 Parte I / Preliminares

"WHENEVER <condición> CONTINUE" hace que no inserte ninguna de dichas instruc- ciones, lo que implica que el programador insertará a mano esas instrucciones. Las dos

<condición> están definidas como sigue:

NOT FOUND significa no se encontraron datos; por lo regular, SQLST ATE = 0 2000

SQLERROR significa ocurrió un error;

vea SQLSTATE en la referencia [4.22]

Cada instrucción WHENEVER encontrada por el compilador de SQL en su examen se- cuencial a través del texto del programa (en busca de una condición en particular), anula a la instrucción anterior encontrada (para esa condición).

10. Por último, observe que —para utilizar la terminología del capítulo 2— el SQL incrustado constituye un acoplamiento débil entre SQL y el lenguaje anfitrión.

Suficiente en lo que respecta a los preliminares. En el resto de esta sección nos concen- traremos de manera específica en las operaciones de manipulación de datos. Como ya indiqué, la mayoría de esas operaciones pueden ser manejadas de manera bastante directa (es decir, con cambios menores en la sintaxis). Sin embargo, las operaciones de recuperación requieren de un tratamiento especial. El problema es que dichas operaciones recuperan (en general) muchas filas, no sólo una, y los lenguajes anfitrión por lo regular no están equipados para manejar la recu- peración de más de una fila a la vez. Por lo tanto, es necesario proporcionar algún tipo de puente entre la capacidad de recuperación en el nivel de conjunto de SQL y la capacidad de recu- peración en el nivel de fila del lenguaje anfitrión; dicho puente lo proporcionan los cursores. Un cursor es un tipo especial de objeto SQL que sólo se aplica al SQL incrustado (debido a que el SQL interactivo no lo necesita). En esencia, consiste en una clase de apuntador {lógico) que puede ser empleado para recorrer un conjunto de filas, apuntando en su momento a cada una de ellas y proporcionando por lo tanto una direccionabilidad para cada una de esas filas a la vez. Sin embargo, postergaremos la explicación detallada de los cursores para una subsección pos- terior y consideraremos primero aquellas instrucciones que no necesitan de cursores.

Operaciones que no involucran cursores

Las instrucciones de manipulación de datos que no necesitan cursores son las siguientes: ■ SELECT individual

■ INSERT

■ UPDATE (excepto la forma CURRENT. Vea más adelante)

■ DELETE (de nuevo, con excepción de la forma CURRENT. Vea más adelante) A continuación damos ejemplos de cada una de estas instrucciones:

SELECT individual: Obtener el status y la ciudad de los proveedores cuyo número de provee- dor está dado por la variable anfitrión V#DADO.

EXEC SQL SELECT STATUS, CIUDAD INTO : CATEGORÍA, : CIUDAD FROM V

Empleamos el término SELECT individual para referirnos a una instrucción SELECT que produce una tabla que contiene una fila como máximo. En el ejemplo, si en la tabla V hay exacta- mente una fila que satisface la condición de la cláusula WHERE, entonces los valores de STATUS y CIUDAD de esa fila serán asignados a las variables CATEGORÍA y CIUDAD de acuerdo con lo solicitado y SQLSTATE quedará establecido como 00000; si ninguna fila de V satisface la condición WHERE, SQLSTATE quedará establecido como 02000; y si más de una fila satis- face la condición, el programa está mal y se asignará un código de error a SQLSTATE.

INSERT: Insertar en la tabla P una parte nueva (número, nombre y peso de parte dados por las

variables anfitrión P#, PARTE y PESOP, respectivamente; el color y la ciudad se desconocen).

EXEC SQL INSERT

INTO P ( P#, PARTE, PESO ) VALUES ( :P#, :PARTE, : PESOP ) ;

A los valores COLOR y CIUDAD de la nueva parte se les asignarán los valores prede-

terminados aplicables. Para una explicación de los valores predeterminados de SQL, consulte

el capítulo 5, sección 5.5.

UPDATE: Aumentar el status de todos los proveedores de Londres en una cantidad dada por

la variable anfitrión AUMENTO.

EXEC SQL UPDATE V

SET STATUS = STATUS + ¡AUMENTO WHERE CIUDAD ■ 'Londres' ;

Si ninguna de las filas de proveedores satisface la condición WHERE, se asignará el valor 02000 a SQLSTATE.

DELETE: Eliminar todos los envíos de proveedores cuya ciudad esté dada por la variable an-

fitrión CIUDAD.

EXEC SOL DELETE FROM VP WHERE :CIUDAD =

( SELECT CIUDAD FROM V WHERE V.V# = VP.V# ) ;

Una vez más, si ninguna fila de VP satisface la condición WHERE, se le asignará 02000 a SQLSTATE. Observe de nuevo la subconsulta anidada (esta vez, en la cláusula WHERE).

Related documents