<html>
<head> <title>SELECT .. ENDSELECT</title> </head> <BODY BGCOLOR="#000000" TEXT="#FFFFFF" LINK="#0099FF" VLINK="#AA0000"> <p align="left">⚠ <b>
<span class="titulo">SELECT .. ENDSELECT</span>⚠ </b>
</p>
<p align="left" class="letras_menu_izquierdo"><span>⚠ <b>
Definicin⚠ </b>
</span></p>
<p align="left" class="letras_menu_izquierdo"><span>Se utiliza
para leer un/os registro/s de una tabla de la base de datos. Lectura de un nico registro de una tabla de la base de datos.</span></p>
<p align="left" class="letras_menu_izquierdo"><span>⚠ <b>
Sintaxis:⚠ </b>
</span></p>
FROM <opciones-from> [ INTO <opciones-into | APPENDING <opciones-appending> ] [ WHERE <opciones-where> ] [ GROUP BY <opciones-group> ] [ ORDER BY <opciones-order> ]. ... [ ENDSELECT. ]</span></pre>
<ul>
<li class="letras_menu_izquierdo"><span>Con la clusula SELECT identificamos los campos que queremos leer, si se usa con la clusula FROM es obligatoria e identifica la tabla que hay que leer.</span></li> <li class="letras_menu_izquierdo"><span>INTO o APPENDING -> Son opcionales e identifican los campos destino de la lectura.</span></li> <li class="letras_menu_izquierdo"><span>WHERE -> Es opcional e identifica las condiciones de seleccin.</span></li> <li class="letras_menu_izquierdo"><span>GROUP BY -> Es opcional y sirve para la agrupacin de campos.</span></li> <li class="letras_menu_izquierdo"><span>ORDER BY -> Es opcional y sirve para marcar el criterio de ordenacin.</span></li> <li class="letras_menu_izquierdo"><span>ENDSELECT -> Marca el final de un bloque si la sentencia SELECT no se ha puesto la opcin SINGLE.</span></li>
</ul>
<p class="letras_menu_izquierdo"><span>La sentencia⚠ <i>
Open SQL⚠ </i>
utilizan de forma automtica el campo mandante. Las sentencias acceden a tablas dependientes de mandante leen y procresan slo los datos del mandante actual (mandante de conexin). Sin la clusula CLIENT SPECIFIED no es posible utilizar el campo mandante en la clusula WHERE (provocan un error de sintaxis). Si rellenamos el campo mandante en las sentencias⚠ <a href="insert.htm" tppabs="insert.htm">
INSERT⚠ </a>
,⚠ <a href="update.htm" tppabs="update.htm">
UPDATE⚠ </a>
o⚠ <a href="delete.htm" tppabs="delete.htm">
DELETE⚠ </a>
no se produce ningn error en tiempo de ejecucin, el sistema sobrescribe el campo mandante del rea de trabajo con el mandante actual antes de procesar la sentencia Open SQL. Si deseamos especificar un mandante distinto al actual debemos utilizar la clusula CLIENT SPECIFIED en las sentencias SELECT,⚠ <a href="insert.htm" tppabs="insert.htm">
INSERT⚠ </a>
,⚠ <a href="update.htm" tppabs="update.htm">
UPDATE⚠ </a>
,⚠ <a href="modify.htm" tppabs="modify.htm">
MODIFY⚠ </a>
o⚠ <a href="delete.htm" tppabs="delete.htm">
DELETE⚠ </a>
.</span></p>
<pre class="letras_menu_izquierdo"><span>... CLIENT SPECIFIED.</span></pre>
<p class="letras_menu_izquierdo"><span>Esta opcin debe ir siemprea continuacin del nombre de la tabla. Con esta opcin desconectamos el automatismo del manejo del campo mandante, por lo tanto, habr que rellenarlo en la sentencias de insercin o modificacin.</span></p>
<p class="letras_menu_izquierdo"><span>La clusula SELECT define
la seleccin sencilla o mltiple de fila, define tambin si las filas duplicadas sern excluidas, as como las columnas que seleccionar.</span></p>
<pre class="letras_menu_izquierdo"><span>SELECT [ SINGLE [ FOR UPDATE ] ] [ DISTINCT ]
{ * | <campos> | MAX(<campo> ) AS <m> | MIN(<campo> ) AS <m> | AVG(<campo> ) AS <m> | SUM(<campo> ) AS <m> | COUNT(* ) as <m> | (lista) COUNT([ DISTINCT ] <campo> ) AS <m> }
...
[ ENDSELECT ].</span></pre> <p class="letras_menu_izquierdo"><span>Para leer todas las columnasde una tabla se utiliza el asterisco (*).</span></p>
<p class="letras_menu_izquierdo"><span>Con la clusula SINGLE
es necesario especificar todos los campos de la clave primaria en la clusula WHERE para identificar de forma nica un registro. Si la lnea no se encuentra SY-SUBRC vale 4. Si el sistema consigue leer hasta una lnea SY-SUBRC valdr 0. Con la clusula FOR UPDATE el sistema bloquea la lnea leda. Slo puede ser utilizada en combinacin con la clusula SINGLE. El programa espera hasta que recibe por parte del sistema confirmacin del bloqueo. Si no se pudiera realizar el bloqueo el programa termina con un error. La clusula no se pudiera realizar el bloqueo el programa termina con un error. La clusula FOR UPDATE debe ser utilizada en combinacin con los mecanismos de bloque y desbloqueo. Con la clusula SINGLE leemos una sola lnea de la tabla y sin la clusula la seleccin es mltiple. Cada vez que el sistema nos deja una lnea sobre el rea de trabajo especificado, se ejecuta el bloque de sentencias hasta la sentencia ENDSELECT.</span></p>
<p class="letras_menu_izquierdo"><span>Con la opcin DISTINCT
automticamente se excluyen las lnea duplicadas. Si al menos se lee una lnea de la tabla, SY-SUBRC vale 0, en caso contrario vale 4. La variable del sistema SY-DBCNT se incrementa en uno por cada paso del bucle. Al final de ste conserva el nmero de lneas ledas.</span></p>
<p class="letras_menu_izquierdo"><span>En lugar de leer todas
las columnas de la tabla se puede leer ciertas columnas o aplicar ciertas funciones a dichas columnas. Veamos todas las posibilidades de la clusula:</span></p>
<ul>
<li class="letras_menu_izquierdo"><span>* -> Son todos los campos de la tabla.</span></li> <li class="letras_menu_izquierdo"><span><campo> -> Es una lista de campos de la tabla.</span></li> <li class="letras_menu_izquierdo"><span>MAX(<campo> ) -> Devuelve el valor mximo de la columna <campo>.</span></li> <li class="letras_menu_izquierdo"><span>MIN(<campo> ) -> Devuelve el valor mnimo de la columna <campo>.</span></li> <li class="letras_menu_izquierdo"><span>AVG(<campo> ) -> Devuelve la media de valores de la columna <campo>.</span></li> <li class="letras_menu_izquierdo"><span>SUM(<campo> ) -> Devuelve la suma de valores de la columna <campo>.</span></li> <li class="letras_menu_izquierdo"><span>COUNT([ DISTINCT ]<campo> ) -> Devuelve el nmero de registros seleccionados. Con DISTINCT slo se cuentan los registros distinto</span></li> <li class="letras_menu_izquierdo"><span>(<tabla> ) -> Es una tabla interna donde se especifica cualquier opcin de las vistas anteriormente.</span></li>
</ul>
<p class="letras_menu_izquierdo"><span>Se deben dejar espaciosen blanco entre los parntesis y el argumento de la funcin. Con la opcin AS se utiliza un nombre alternativo <m>. Si se especifican campos a leer o funciones, la clusula INTO es obligatoria.</span></p>
<blockquote class="letras_menu_izquierdo"><span> Opciones de la
clusula FROM </span></blockquote>
<p class="letras_menu_izquierdo"><span>Esta clusula especifica
la tabla o vista de la base de datos que va a ser leda.</span></p>
<pre class="letras_menu_izquierdo"><span>FROM { <tabla> | <vista> | <tabla> }
[ CLIENT SPECIFIED ] [ BYPASSING BUFFER ] [ UP TO <n> ROWS ]</span></pre> <p class="letras_menu_izquierdo"><span>La tabla o vista <tabla>debe estar definida en el diccionario de datos, y debe estar declarada en el programa en la sentencia⚠ <a href="tables.htm" tppabs="tables.htm">
TABLES⚠ </a>
. Con la opcin BYPASSING BUFFER el sistema lee los datos de la tabla directamente de la base de datos, sin utilizar el buffer de la tabla. Con ellos nos aseguramos de que los datos son los ms recientes. Cuando se define un tabla en el diccionario de datos se puede especificar que el sistema utilice un buffer local de la tabla. Este buffer se actualiza de forma asncrona. Normalmente la sentencia SELECT utiliza este buffer, y no tiene por qu ser la versin ms reciente. Para asegurar la lectura de la ltima versin, se utiliza esta opcin. Si queremos leer un nmero determinado de lneas se utiliza la opcin UP TO <n> ROWS. <n> determina el nmero de lneas a leer. Si <n> es igual a 0 se leen todas las lneas, si <n> es menor que 0, se produce un error en tiempo de ejecucin. Si combinamos la opcin UP TO <n> ROWS con la clusula ORDER BY, el sistema primero ordena la tabla y posteriormente procesa las <n> primeras lneas.</span></p>
<p class="letras_menu_izquierdo"><span>Se puede especificar el
nombre de la tabla en tiempo de ejecucin, para ello, se utiliza la clusula (<campo>). <campo> contiene el nombre de la tabla, y no tiene por qu declararse con la sentencia⚠ <a href="tables.htm" tppabs="tables.htm">
TABLES⚠ </a>
. Con esta opcin la clusula INTO es obligatoria.</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Opciones de la clusula INTO</span></p>
</blockquote>
<p class="letras_menu_izquierdo"><span>Para especificar un reade destino de los datos seleccionados se utiliza la clusula INTO de la sentencia SELECT.</span></p>
<pre class="letras_menu_izquierdo"><span>INTO [ CORRESPONDING FIELD OF ]
{ <rea> | TABLE <tabla> | [ PACKAGE SIZE <n> ] }</span></pre> <p class="letras_menu_izquierdo"><span>Esta clusula es necesariasi queremos utilizar un rea de trabajo distinto al rea de trabajo de la tabla leda. Las reas de trabajo de las tablas se generan automticamente en el momento de declarar la tabla con la sentencia⚠ <a href="tables.htm" tppabs="tables.htm">
TABLES⚠ </a>
. La clusula INTO tambin aparece en otras sentencias⚠ <i>
Open SQL⚠ </i>
como⚠ <a href="fetch.htm" tppabs="fetch.htm">
FETCH⚠ </a>
. El campo <rea> debe estar declarado como objeto de datos y debe tener, al menos, la longitud de los campos ledos. Con la opcin CORRESPONDING FIELD OF el sistema deja los campos sobre la estructura especificada, sobre los campos con el mismo nombre que los ledos. Con la opcin TABLE la lectura se realiza en una sola operacin (no es necesario ENDSELECT) y cada lnea leda es insertada en la tabla interna. Si se especifica la clusula PACKAGE SIZE la lectura se realiza en paquetes de <n> lneas (si es necesario ENDSELECT).</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Opciones de la clusula APPENDING</span></p>
</blockquote>
<p class="letras_menu_izquierdo"><span>Con la clusula APPENDINGlas lneas aadidas en la tabla interna se aaden al final-</span></p>
<pre class="letras_menu_izquierdo"><span>APPENDING [ CORRESPONDING FIELD OF]
TABLE <tabla> [ PACKAGE SIZE <n> ]</span></pre>
<p class="letras_menu_izquierdo"><span>Las opciones CORRESPONDING
FIELDS OF, TABLE y PACKAGE SIZE tienen el mismo significado que en la clusula INTO.</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Opciones de la clusula WHERE</span></p>
</blockquote>
<p class="letras_menu_izquierdo"><span>la clusula WHERE nos permiteindicar los criterios de seleccin. Esta clusula tambin se utiliza en las sentencias⚠ <a href="update.htm" tppabs="update.htm">
UPDATE⚠ </a>
,⚠ <a href="delete.htm" tppabs="delete.htm">
DELETE⚠ </a>
y⚠ <a href="open_cursor.htm" tppabs="open_cursor.htm">
OPEN CURSOR⚠ </a>
.</span></p>
<pre class="letras_menu_izquierdo"><span>WHERE { <campo_bd> <operador> <campo> |
<campo_bd> [ NOT ] BETWEEN <campo1> AND <campo2> | <campo_bd> [ NOT ] LIKE <campo> [ ESCAPE <e> ] | <campo_bd> [ NOT ] IN <campo1> (campo1>, ... , <campon> ) | <campo_bd> IS [ NOT ] NULL | <campo_bd> [ NOT ] IN <criterio_seleccion> | ( <tabla_condiciones> ) } [ { NOT, AND, OR, (, ) } ... ]</span></pre>
<p class="letras_menu_izquierdo"><span>El significado de las opciones
de esta clusula es el siguiente:</span></p>
<ul>
<li class="letras_menu_izquierdo"><span><campo_bd> <operador> <campo> -> Los operadores vlidos para <operador> son los siguientes:</span></li>
</ul>
<table border="0" width="100%"><tr> <td width="33%" class="letras_menu_izquierdo"><span>⚠ <b>
Operador⚠ </b>
</span></td> <td width="33%" class="letras_menu_izquierdo"><span>⚠ <b>
Equivalente⚠ </b>
</span></td> <td width="34%" class="letras_menu_izquierdo"><span>⚠ <b>
Significado⚠ </b>
</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>EQ</span></td> <td width="33%" class="letras_menu_izquierdo"><span>=</span></td> <td width="34%" class="letras_menu_izquierdo"><span>Igual a</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>NE</span></td> <td width="33%" class="letras_menu_izquierdo"><span><> o ><</span></td> <td width="34%" class="letras_menu_izquierdo"><span>No igual</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>LT</span></td> <td width="33%" class="letras_menu_izquierdo"><span><</span></td> <td width="34%" class="letras_menu_izquierdo"><span>Menor que</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>LE</span></td> <td width="33%" class="letras_menu_izquierdo"><span><=</span></td> <td width="34%" class="letras_menu_izquierdo"><span>Menor o igual a</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>GT</span></td> <td width="33%" class="letras_menu_izquierdo"><span>></span></td> <td width="34%" class="letras_menu_izquierdo"><span>Mayor que</span></td> </tr> <tr> <td width="33%" class="letras_menu_izquierdo"><span>GE</span></td> <td width="33%" class="letras_menu_izquierdo"><span>>=</span></td> <td width="34%" class="letras_menu_izquierdo"><span>Mayor o igual que</span></td> </tr>
</table>
<ul><li class="letras_menu_izquierdo"><span><campo_bd> [ NOT ] BETWEEN <campo1> AND <campo2> -> El valor del campo de la base de datos <campo_bd> debe estar comprendido (o no, si se utiliza NOT) entre los valores de los campos <campo1> y <campo2>. <campo1> y <campo2> pueden ser literales.</span></li> <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT ] LIKE <campo> [ ESCAPE <e> ] -> Esta opcin slo puede ser utilizada con campos alfanumricos. El campo de la base de datos debe, o no, corresponder con el patrn <campo>. Patrn significa que el campo puede tener caracteres con un significado especial. El guin bajo ( _ ) representa cualquier carcter individual, el carcter porcentaje ( % ) representa cualquier nmero de caracteres. Si queremos utilizar estos caracteres especiales como carcter significativo hay que anteponerle el carcter de escape <e>.</span></li> <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT ] IN <criterio_seleccion> <campo1> (campo1>, ... , <campon> ) -> El valor de la base de datos debe, o no, ser el valor nulo.</span></li> <li class="letras_menu_izquierdo"><span><campo_bd> IS [ NOT ] NULL -> El valor del campo de la base de datos debe, o no, ser el valor nulo.</span></li> <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT ] IN <criterio_seleccion> -> El campo de la base de datos debe, o no, cumplir las condiciones del criterio.</span></li> <li class="letras_menu_izquierdo"><span>( <tabla_condiciones> ) -> Se puede especificar la expresin en tiempo de ejecucin a travs de la tabla interna <tabla_condiciones>. La tabla debe contener slo un campo alfanmerico de longitud 72. La tabla debe estar especificada entre parntesis sin espacios en blanco entre los parntesis y el nombre de la tabla. Puede estar combinada con expresiones estticas gracias a los operadores AND y OR.</span></li>
</ul>
<p class="letras_menu_izquierdo"><span>Se puede crear una expresincombinada gracias a los operadores AND, OR y NOT. NOT no tiene prioridad sobre AND y a su vez OR. Se pueden utilizar los parntesis para marcar la prioridad en una expresin.</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Hay un formato especial de la sentencia WHERE que es el siguiente:</span></p>
</blockquote>
<pre class="letras_menu_izquierdo"><span>FOR ALL ENTRIES IN <tabla> WHERE <condicin>.</span></pre> <p class="letras_menu_izquierdo"><span>Con esta variante se puedeespecificar condiciones en tiempo de ejecucin. En <condicin> se puede especificar campos de la tabla interna y literales. Con esta variante no se puede utilizar en <condicin> las opciones LIKE, BETWEEN e IN.</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Opciones de la clusula GROUP BY</span></p>
</blockquote>
<p class="letras_menu_izquierdo"><span>Para combinar en contenidode un grupo de lneas de una tabla de la base de datos en una sola lnea se utiliza la clusula GROUP BY.</span></p>
<pre class="letras_menu_izquierdo"><span>GROUP BY { <campo1> ... <campon> | (<tabla>) }</span></pre>
<p class="letras_menu_izquierdo"><span>Con campo <campo1>... <campon> especificamos los campos de agrupamiento. Con (<tabla>) se puede especificar los campos de agrupamiento dinmicamente, es decir, en tiempo de ejecucin.</span></p>
<blockquote>
<p class="letras_menu_izquierdo"><span>Opciones de la clusula ORDER BY</span></p>
</blockquote>
<p class="letras_menu_izquierdo"><span>Con dicha clusula fijamosun criterio de ordenacin en los datos.</span></p>
<pre class="letras_menu_izquierdo"><span>ORDER BY { PRIMARY KEY |
<campo1> [ ASCENDING | DESCENDING ] ... <campon> [ ASCENDING | DESCENDING ] | (<tabla>) }</span></pre>
<p class="letras_menu_izquierdo"><span>Con la opcin PRIMARY KEY
se ordenan por los campo de la clave primaria ascendentemente. <campo1> puede ser cualquier campo de la tabla. Se puede especificar si el criterio de ordenacin, en cada campo, es ascendente (por defecto) o descendente. Si especificamos ms de un campo se ordenarn en la secuencia especificada. Con la opcin (<tabla>) se puede indicar los campos de ordenacin dinmicamente. La lnea de la tabla debe ser del tipo C y longitud 72.</span></p>
<p class="letras_menu_izquierdo"><span>⚠ <b>
Ejemplo:⚠ </b>
</span></p>
WHERE CARRID = 'LH ' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY PRIMARY KEY. WRITE: / SBOOK-BOOKID, SBOOK-CUSTOMID, SBOOK-CUSTTYPE, SBOOK-SMOKER, SBOOK-LUGGWEIGHT, SBOOK-WUNIT, SBOOK-INVOICE.
ENDSELECT.</span></pre>
<p> </p></body>
</html>