Identificadores
Un identificador es un símbolo que se utiliza para formar un nombre. En una sentencia de SQL, un identificador es un identificador de SQL o un identificador del lenguaje principal.
- Identificadores de SQL
Existen dos tipos de identificadores de SQL: ordinarios y delimitados.
- Un identificador ordinario es una letra mayúscula seguida por cero o más caracteres, cada uno de los cuales es una letra en mayúsculas, un dígito o el carácter de subrayado. Tenga en cuenta que pueden utilizarse letras en minúsculas al especificar un identificador ordinario, pero éstas se convertirán en mayúsculas al procesarse. Un identificador ordinario no debe ser una palabra reservada.Ejemplos
WKLYSAL WKLY_SAL - Un identificador delimitado es una secuencia de uno o varios caracteres entre comillas dobles. Los espacios en blanco interlineados en la secuencia son significativos. Los espacios en blanco rezagados en la secuencia no son significativos, a pesar de que se almacenan con el identificador. Dos comillas consecutivas se utilizan para representar unas comillas dentro del identificador delimitado. Se puede utilizar un identificador delimitado cuando la secuencia de caracteres no se considere un identificador ordinario. De esta manera un identificador puede incluir letras en minúsculas.Ejemplos
"WKLY_SAL" "WKLY SAL" "UNION" "wkly_sal"
La conversión de caracteres de los identificadores creados en una página de códigos de doble byte pero utilizados por una aplicación o una base de datos con página de códigos de múltiples bytes puede necesitar una consideración especial: tras la conversión, dichos identificadores pueden superar el límite de longitud de un identificador.
- Un identificador ordinario es una letra mayúscula seguida por cero o más caracteres, cada uno de los cuales es una letra en mayúsculas, un dígito o el carácter de subrayado. Tenga en cuenta que pueden utilizarse letras en minúsculas al especificar un identificador ordinario, pero éstas se convertirán en mayúsculas al procesarse. Un identificador ordinario no debe ser una palabra reservada.
- Identificadores del lenguaje principal
Un identificador del lenguaje principal es un nombre declarado en el programa de lenguaje principal. Las normas para formar un identificador de lenguaje principal son las normas del lenguaje principal. Un identificador de sistema principal no debería tener más de 255 bytes de longitud y no debería empezar por SQL o DB2 (en mayúsculas o en minúsculas).
Convenios de denominación y calificaciones de nombre de objeto implícitas
Las reglas para formar un nombre de objeto de base de datos dependen del tipo del objeto designado por el nombre. Los nombres pueden estar formados por un identificador de SQL único o pueden calificarse con uno o varios identificadores que identifican con más detalle al objeto. Los identificadores deben estar separados por un punto.
Los diagramas de sintaxis utilizan distintos términos para tipos diferentes de nombres. La lista siguiente define dichos términos.
- alias-name
- Nombre calificado mediante esquema que designa un alias.
- attribute-name
- Identificador que designa un atributo de un tipo de datos estructurados.
- array-type-name
- Nombre calificado o no calificado que designa un tipo de matriz definido por el usuario. El formato no calificado de un nombre-tipo-matriz es un identificador de SQL. Un nombre de tipo de matriz no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-tipo-matriz. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si el tipo de matriz está definido en un módulo y se utiliza fuera de este, debe estar calificado por el nombre-módulo.
- authorization-name
- Identificador que designa un usuario, grupo o rol. Para un usuario o un grupo:
- Los caracteres válidos son: 'A' through 'Z'; 'a' through 'z'; '0' through '9'; '#'; '@'; '$'; '_'; '!'; ' '('; ')'; '{'; '}'; '-'; '.'; y '^'.
- Cuando se especifiquen por línea de comandos, habrá que entrecomillar los siguientes caracteres: '!'; ' '('; ')'; '{'; '}'; '-'; '.'; y '^'.
- El nombre no puede empezar por los caracteres 'SYS', 'IBM' ni 'SQL'.
- El nombre no puede ser: 'ADMINS', 'GUESTS', 'LOCAL', 'PUBLIC' ni 'USERS'.
- Un ID de autorización delimitado no debe contener letras en minúsculas.
- bufferpool-name
- Identificador que designa una agrupación de almacenamientos intermedios.
- column-name
- Nombre calificado o no calificado que designa una columna de una tabla o de una vista. El calificador es un nombre de tabla, un nombre de vista, un apodo o un nombre de correlación.
- component-name
- Identificador que designa un componente de etiqueta de seguridad.
- condition-name
- Nombre calificado o no calificado que designa una condición. Un nombre de condición no calificado en una sentencia de SQL se califica implícitamente, según el contexto. Si la condición está definida en un módulo y se utiliza fuera de este, debe estar calificada por el nombre-módulo.
- constraint-name
- Identificador que designa una restricción de referencia, una restricción de clave primaria, una restricción de unicidad o una restricción de comprobación de tabla.
- correlation-name
- Identificador que designa una tabla resultante.
- cursor-name
- Identificador que designa un cursor de SQL. Para compatibilidad entre sistemas principales, se puede utilizar un carácter de guión en el nombre.
- cursor-type-name
- Nombre calificado o no calificado que designa un tipo de cursor definido por el usuario. El formato no calificado de un nombre-tipo-cursor es un identificador de SQL. Un nombre-tipo-cursor no calificado de una sentencia de SQL se califica implícitamente, según el contexto. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-tipo-cursor. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si el tipo de cursor está definido en un módulo y se utiliza fuera de este, debe estar calificado por el nombre-módulo.
- cursor-variable-name
- Nombre, calificado o no calificado, que designa una variable global, una variable local o un parámetro de SQL de tipo cursor. Un nombre de variable de cursor no calificado en una sentencia de SQL se califica implícitamente, según el contexto.
- data-source-name
- Identificador que designa una fuente de datos. Este identificador es la primera de las tres partes de un nombre de objeto remoto.
- db-partition-group-name
- Identificador que designa un grupo de particiones de base de datos.
- descriptor-name
- Dos puntos seguidos de un identificador del lenguaje principal que designa un área de descriptores de SQL (SQLDA). Para obtener la descripción de un identificador de lenguaje principal, consulte Referencias a variables de lenguaje principal. Observe que un nombre de descriptor nunca incluye una variable indicadora.
- distinct-type-name
- Nombre calificado o no calificado que designa un tipo diferenciado. El formato no calificado de un nombre-tipo-diferenciado es un identificador de SQL. Un nombre de tipo diferenciado no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-tipo-diferenciado. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si el tipo diferenciado está definido en un módulo y se utiliza fuera del mismo módulo, debe estar calificado por el nombre-módulo.
- event-monitor-name
- Identificador que designa un supervisor de sucesos.
- function-mapping-name
- Identificador que designa una correlación de funciones.
- function-name
- Nombre calificado o no calificado que designa una función. El formato no calificado de un nombre-función es un identificador de SQL. Un nombre de función no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema, que se determina mediante el contexto en el que aparece la función. El formato calificado puede ser un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo seguido de un punto y de un identificador de SQL. Si la función se publica en un módulo y se utiliza fuera del mismo módulo, debe estar calificada por el nombre-módulo.
- global-variable-name
- Nombre, calificado o no calificado, que designa una variable global. El formato no calificado de un nombre-variable-global es un identificador de SQL. Un nombre de variable global no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-variable-global. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si la variable global está definida en un módulo y se utiliza fuera de este, debe estar calificada por el nombre-módulo.
- group-name
- Identificador no calificado que designa un grupo de transformación definido para un tipo estructurado.
- host-variable
- Secuencia de símbolos que designa una variable del lenguaje principal. Una variable del lenguaje principal incluye al menos un identificador del lenguaje principal, que se explica en Referencias a variables del lenguaje principal.
- index-name
- Nombre calificado mediante esquema que designa un índice o una especificación de índice.
- label
- Identificador que designa una etiqueta en un procedimiento de SQL.
- method-name
- Identificador que designa un método. El contexto de esquema de un método está determinado por el esquema del tipo indicado (o de un supertipo del tipo indicado) del método.
- module-name
- Nombre calificado o no calificado que designa un módulo. Un nombre-módulo no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema, que se determina mediante el contexto en el que aparece el nombre-módulo. La forma calificada es un nombre-esquema seguido de un punto y un identificador de SQL.
- nickname
- Nombre calificado mediante esquema que designa una referencia de servidor federado a una tabla o vista.
- package-name
- Un nombre calificado o no calificado que designa un paquete.
- parameter-name
- Identificador que designa un parámetro al que se puede hacer referencia en un procedimiento, una función definida por el usuario, un método o una extensión de índice.
- partition-name
- Identificador que designa una partición de datos en una tabla particionada.
- period-name
- Identificador que designa un período. SYSTEM_TIME y BUSINESS_TIME son los únicos nombres de período soportados.
- procedure-name
- Nombre calificado o no calificado que designa un procedimiento. El formato no calificado de un nombre-procedimiento es un identificador de SQL. Un nombre de procedimiento no calificado de una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema, que se determina mediante el contexto en el que aparece el procedimiento. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo seguido de un punto y de un identificador de SQL. Si el procedimiento está definido en un módulo y se utiliza fuera de este, debe estar calificado por el nombre-módulo.
- remote-authorization-name
- Identificador que designa un usuario de fuente de datos. Las normas para los nombres de autorización varían de fuente de datos a fuente de datos.
- remote-function-name
- Nombre que designa una función registrada en una base de datos de fuente de datos.
- remote-object-name
- Nombre de tres partes que designa una tabla de fuente de datos o vista y que identifica la fuente de datos en la que reside la tabla o la vista. Las partes de este nombre son nombre-fuente-datos, nombre-esquema-remoto y nombre-tabla-remota.
- remote-schema-name
- Nombre que designa el esquema al que pertenece una tabla de fuente de datos o vista. Este nombre es la segunda de las tres partes de un nombre de objeto remoto.
- remote-table-name
- Nombre que designa una tabla o una vista en una fuente de datos. Este nombre es la tercera de las tres partes de un nombre de objeto remoto.
- remote-type-name
- Tipo de datos soportado por una base de datos de fuente de datos. No utilice el formato largo para los tipos internos (utilice CHAR en vez de CHARACTER, por ejemplo).
- role-name
- Identificador que designa un rol.
- row-type-name
- Nombre calificado o no calificado que designa un tipo de fila definido por el usuario. El formato no calificado de un nombre-tipo-fila es un identificador de SQL. Un nombre-tipo-fila no calificado en una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-tipo-fila. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si el tipo de fila está definido en un módulo y se utiliza fuera de este, debe estar calificado por el nombre-módulo.
- savepoint-name
- Identificador que designa un punto de salvaguarda.
- schema-name
- Identificador que proporciona una agrupación lógica de objetos de SQL. Un nombre de esquema que se utiliza como calificador del nombre de un objeto puede determinarse implícitamente:
- a partir del valor del registro especial CURRENT SCHEMA
- a partir del valor de la opción de precompilación/vinculación QUALIFIER
- sobre la base de un algoritmo de resolución que utilice el registro especial CURRENT PATH
- sobre la base del nombre de esquema de otro objeto en la misma sentencia de SQL.
Para evitar complicaciones, es recomendable no utilizar el nombre SESSION como esquema, excepto para el esquema de tablas temporales globales declaradas (las cuales deben utilizar el nombre de esquema SESSION).
- security-label-name
- Nombre calificado o no calificado que designa una etiqueta de seguridad. El nombre-política-seguridad aplicable califica implícitamente un nombre de etiqueta de seguridad no calificado en una sentencia de SQL, en caso de aplicarse. Si no hay ningún nombre-política-seguridad aplicable implícitamente, el nombre debe ser calificado.
- security-policy-name
- Identificador que designa una política de seguridad.
- sequence-name
- Identificador que designa una secuencia.
- server-name
- Identificador que designa un servidor de aplicaciones. En un sistema federado, el nombre de servidor también designa el nombre local de una fuente de datos.
- specific-name
- Nombre, calificado o no calificado, que designa un nombre específico. Un nombre específico no calificado en una sentencia de SQL se califica implícitamente, según el contexto.
- SQL-variable-name
- Nombre de una variable local en una sentencia de procedimiento de SQL. Los nombres de variables de SQL se pueden utilizar en otras sentencias de SQL donde esté permitido un nombre de variable del lenguaje principal. El nombre puede estar calificado por la etiqueta de la sentencia compuesta donde se declaró la variable de SQL.
- statement-name
- Identificador que designa una sentencia de SQL preparada.
- storagegroup-name
- Identificador que designa un grupo de almacenamiento.
- supertype-name
- Nombre calificado o no calificado que designa el supertipo de un tipo. Un nombre de supertipo no calificado en una sentencia de SQL se califica implícitamente, según el contexto.
- table-name
- Nombre calificado mediante esquema que designa una tabla.
- table-reference
- Nombre calificado o no calificado que designa una tabla. El esquema por omisión califica implícitamente una referencia de tabla no calificada en una expresión.
- tablespace-name
- Identificador que designa un espacio de tablas.
- trigger-name
- Nombre calificado mediante esquema que designa un activador.
- type-mapping-name
- Identificador que designa una correlación de tipos de datos.
- type-name
- Nombre calificado o no calificado que designa un tipo. Un nombre de tipo no calificado en una sentencia de SQL se califica implícitamente, según el contexto.
- typed-table-name
- Nombre calificado mediante esquema que designa una tabla con tipo.
- typed-view-name
- Nombre calificado mediante esquema que designa una vista con tipo.
- usage-list-name
- Nombre calificado mediante esquema que designa una lista de uso.
- user-defined-type-name
- Nombre calificado o no calificado que designa un tipo de datos definido por el usuario. El formato no calificado de un nombre-tipo-definido-por-usuario es un identificador de SQL. Un nombre-tipo-definido-por-usuario no calificado en una sentencia de SQL se califica implícitamente. El calificador implícito es un nombre de esquema o un nombre de módulo, que se determina mediante el contexto en el que aparece el nombre-tipo-definido-por-usuario. El formato calificado es un nombre de esquema seguido de un punto y de un identificador de SQL o un nombre de módulo (que también puede calificarse mediante un nombre-esquema) seguido de un punto y de un identificador de SQL. Si el tipo de datos definido por el usuario está definido en un módulo y se utiliza fuera de este, debe estar calificado por el nombre-módulo.
- view-name
- Nombre calificado mediante esquema que designa una vista.
- wrapper-name
- Identificador que designa un derivador.
- XML-schema-name
- Nombre calificado o no calificado que designa un esquema XML.
- xsrobject-name
- Nombre calificado o no calificado que designa un objeto en el depósito de esquemas XML.
Alias para los objetos de la base de datos
Se puede considerar que un alias es un nombre alternativo para un objeto SQL. Por consiguiente, puede hacerse referencia a un objeto SQL en una sentencia de SQL utilizando su nombre o su alias.
Un alias público es un nombre al que se puede hacer referencia siempre sin calificar su nombre con un nombre de esquema. El calificador implícito de un alias público es SYSPUBLIC, que también se puede especificar explícitamente.
Los alias también se conocen con el nombre de sinónimos.
Un alias se puede utilizar donde esté basado el objeto. Se puede crear un alias aunque no exista el objeto (aunque debe existir en el momento de compilar una sentencia que hace referencia al mismo). Puede hacer referencia a otro alias si no se realizan referencias circulares ni repetitivas a lo largo de la cadena de alias. Un alias sólo puede hacer referencia a un módulo, apodo, secuencia, tabla, vista u otro alias dentro de la misma base de datos. No se puede utilizar un nombre de alias donde se espera un nombre de objeto nuevo, como por ejemplo en las sentencias CREATE TABLE o CREATE VIEW; por ejemplo, si se ha creado el nombre de alias de tabla PERSONAL, sentencias posteriores como CREATE TABLE PERSONAL ... devolverán un error.
La opción de hacer referencia a un objeto mediante un alias no se muestra explícitamente en los diagramas de sintaxis, ni se menciona en las descripciones de sentencias de SQL.
Un alias no calificado nuevo de un tipo de objeto determinado, por ejemplo, para una secuencia, no puede tener el mismo nombre completamente calificado que un objeto ya existente de dicho tipo de objeto. Por ejemplo, un alias de secuencia llamado ORDERID no se puede definir en el esquema KANDIL para el nombre de secuencia KANDIL ORDERID.
SELECT * FROM PBIRD.SALESse convierte en realidad en SELECT * FROM DSPN014.DIST4_SALES_148ID de autorización y nombres de autorización
Un ID de autorización es una serie de caracteres obtenida por el gestor de bases de datos cuando se establece una conexión entre el gestor de bases de datos y un proceso de aplicación o un proceso de preparación de programa. Designa un conjunto de privilegios. También puede designar a un usuario o a un grupo de usuarios, pero su propiedad no la controla el gestor de bases de datos.
- El control de autorizaciones de sentencias de SQL
- Un valor por omisión para la opción de precompilación/vinculación QUALIFIER y el registro especial CURRENT SCHEMA. También se incluye el ID de autorización en el registro especial CURRENT PATH por omisión y en la opción de precompilación/vinculación FUNCPATH.
- En un paquete que tenga un comportamiento de vinculación, el ID de autorización utilizado es el ID de autorización del propietario del paquete.
- En un paquete que tenga un comportamiento de definición, el ID de autorización utilizado es el ID de autorización correspondiente a la persona que define la rutina.
- En un paquete que tenga un comportamiento de ejecución, el ID de autorización utilizado es el ID de autorización actual del usuario que ejecute el paquete.
- En un paquete que tenga un comportamiento de invocación, el ID de autorización utilizado es el ID de autorización actualmente en vigor al invocar la rutina. Este ID se denomina ID de autorización de ejecución.
Un nombre de autorización especificado en una sentencia de SQL no se debe confundir con el ID de autorización de la sentencia. Un nombre de autorización es un identificador que se utiliza en varias sentencias de SQL. Un nombre de autorización se utiliza en la sentencia CREATE SCHEMA para designar al propietario del esquema. Un nombre de autorización se utiliza en las sentencias GRANT y REVOKE para designar el destino de la operación de otorgamiento (grant) o revocación (revoke). Otorgar privilegios a X significa que X (o un miembro del grupo o rol X) será posteriormente el ID de autorización de las sentencias que necesitan dichos privilegios.
ejemplos
- Supongamos que SMITH es el ID de usuario y el ID de autorización que el gestor de bases de datos ha obtenido al establecer una conexión con el proceso de aplicación. La siguiente sentencia se ejecuta interactivamente:
SMITH es el ID de autorización de la sentencia. Por lo tanto, en una sentencia de SQL dinámico, el valor por omisión del registro especial CURRENT SCHEMA será SMITH y, en SQL estático, el valor por omisión de la opción de precompilación/vinculación QUALIFIER será SMITH. La autorización para ejecutar la sentencia se compara con SMITH, y SMITH es el calificador implícito nombre-tabla basado en las reglas de calificación descritas en Convenios de denominación y calificaciones de nombres de objetos implícitos.GRANT SELECT ON TDEPT TO KEENEKEENE es un nombre de autorización especificado en la sentencia. Se otorga el privilegio SELECT en SMITH.TDEPT a KEENE.
- Suponga que SMITH tiene autorización de administración y es el ID de autorización de las siguientes sentencias de SQL dinámico sin que se emita ninguna sentencia SET SCHEMA durante la sesión:
Elimina la tabla SMITH.TDEPT.DROP TABLE TDEPT
Elimina la tabla SMITH.TDEPT.DROP TABLE SMITH.TDEPT
Elimina la tabla KEENE.TDEPT. Observe que KEENE.TDEPT y SMITH.TDEPT son tablas diferentes.DROP TABLE KEENE.TDEPT
KEENE es el nombre de autorización especificado en la sentencia que crea un esquema denominado PAYROLL. KEENE es el propietario del esquema PAYROLL y se le otorgan los privilegios CREATEIN, ALTERIN y DROPIN, con la posibilidad de otorgarlos a otros.CREATE SCHEMA PAYROLL AUTHORIZATION KEENE
Características de SQL dinámico durante la ejecución
La opción DYNAMICRULES BIND determina el ID de autorización que se utiliza para comprobar la autorización cuando se procesan sentencias de SQL dinámico. Además, la opción también controla otros atributos de SQL dinámico como, por ejemplo, el calificador implícito que se utiliza para las referencias a objetos no calificadas y si es posible invocar dinámicamente ciertas sentencias de SQL.
El conjunto de valores para el ID de autorización y otros atributos de SQL dinámico se denomina el comportamiento de las sentencias de SQL dinámico. Los cuatro comportamientos posibles son ejecución, vinculación, definición e invocación. Tal como se muestra en la tabla siguiente, la combinación del valor de la opción DYNAMICRULES BIND y el entorno de ejecución determina el comportamiento que se utiliza. Es valor por omisión es DYNAMICRULES RUN, que implica un comportamiento de ejecución.
| Valor de DYNAMICRULES | Comportamiento de las sentencias de SQL dinámico en un entorno de programa autónomo | Comportamiento de las sentencias de SQL dinámico en un entorno de rutina |
|---|---|---|
| BIND | Comportamiento de vinculación | Comportamiento de vinculación |
| EJECUTAR | Comportamiento de ejecución | Comportamiento de ejecución |
| DEFINEBIND | Comportamiento de vinculación | Definir comportamiento |
| DEFINERUN | Comportamiento de ejecución | Definir comportamiento |
| INVOKEBIND | Comportamiento de vinculación | Comportamiento de invocación |
| INVOKERUN | Comportamiento de ejecución | Comportamiento de invocación |
- Run behavior
- El ID de autorización del usuario (el ID que inicialmente se ha conectado a la base de datos) que ejecuta el paquete se utiliza como valor para la comprobación de autorización de las sentencias de SQL dinámico. Este ID de autorización también se utiliza como valor inicial para la calificación implícita de referencias de objetos no calificados dentro de sentencias de SQL dinámico.
- Bind behavior
- Durante la ejecución, se utilizan todas las normas que se aplican al SQL estático para la autorización y calificación. Se utiliza el ID de autorización del propietario del paquete como valor para la comprobación de autorización de sentencias de SQL dinámico. Se utiliza el calificador por omisión de paquete para la calificación implícita de referencias de objetos no calificados dentro de las sentencias de SQL dinámico.
- Define behavior
- El comportamiento de definición sólo se aplica si la sentencia de SQL dinámico está en un paquete que se ejecuta en un contexto de rutina y el paquete se ha vinculado con DYNAMICRULES DEFINEBIND o DYNAMICRULES DEFINERUN. Se utiliza el ID de autorización del definidor de rutina (no el vinculador de paquetes de la rutina) como valor para la comprobación de autorización de las sentencias de SQL dinámico. Este ID de autorización también se utiliza para la calificación implícita de referencias de objetos no calificados en las sentencias de SQL dinámico de dicha rutina.
- Invoke behavior
- El comportamiento de invocación sólo se aplica si la sentencia de SQL dinámico está en un paquete que se ejecuta en un contexto de rutina y el paquete se ha vinculado con DYNAMICRULES INVOKEBIND o DYNAMICRULES INVOKERUN. El ID de autorización de sentencias en vigor cuando se invoca la rutina se utiliza como valor para la comprobación de autorización de las sentencias de SQL dinámico. Este ID de autorización también se utiliza para la calificación implícita de referencias de objetos no calificados en las sentencias de SQL dinámico de dicha rutina. La tabla siguiente muestra un resumen.
| Entorno que se invoca | ID utilizado |
|---|---|
| Cualquier SQL estático | Valor implícito o explícito del propietario (OWNER) del paquete del que procedía el SQL que invocaba la rutina |
| Utilizado en definiciones de vistas o activadores | Persona que define la vista o el activador |
| SQL dinámico de un paquete con comportamiento de vinculación | Valor implícito o explícito del propietario (OWNER) del paquete del que procedía el SQL que invocaba la rutina |
| SQL dinámico de un paquete con comportamiento de ejecución | ID utilizado para efectuar la conexión inicial con la base de datos |
| SQL dinámico de un paquete con comportamiento de definición | Persona que define la rutina que utiliza el paquete del que procedía el SQL que invocaba la rutina |
| SQL dinámico de un paquete con comportamiento de invocación | El ID autorización actual que invoca la rutina |
- Restricted statements when run behavior does not apply
- Cuando está en vigor un comportamiento de vinculación, definición o invocación, no es posible utilizar las siguientes sentencias de SQL dinámico: GRANT, REVOKE, ALTER, CREATE, DROP, COMMENT, RENAME, SET INTEGRITY, SET EVENT MONITOR STATE; o consultas que hacen referencia a un apodo.
- Considerations regarding the DYNAMICRULES option
- No se puede utilizar el registro especial CURRENT SCHEMA para calificar las referencias a objetos no calificadas en las sentencias de SQL dinámico ejecutadas desde un paquete con comportamiento de vinculación, definición o invocación. Esto es así incluso después de emitir la sentencia SET CURRENT SCHEMA para cambiar el registro especial CURRENT SCHEMA; el valor del registro se cambia pero no se utiliza.
En caso de que se haga referencia a varios paquetes durante una sola conexión, todas las sentencias de SQL dinámico que estos paquetes hayan preparado mostrarán el comportamiento especificado por la opción DYNAMICRULES para dicho paquete en concreto y el entorno en el que se utilicen.
Es importante tener presente que, cuando un paquete muestra un comportamiento de vinculación, no debe otorgarse a la persona que vincula el paquete ninguna autorización que no se desee que tenga el usuario del paquete ya que una sentencia dinámica utilizará el ID de autorización del propietario del paquete. De forma similar, cuando un paquete muestra un comportamiento de definición, no debe otorgarse a la persona que define la rutina ninguna autorización que no se desee que tenga el usuario del paquete.
ID de autorización y preparación de sentencias
Si se especifica la opción VALIDATE BIND durante la ejecución, los privilegios necesarios para manejar tablas y vistas también deben existir durante la vinculación. Si estos privilegios o los objetos referenciados no existen y está en vigor la opción SQLERROR NOPACKAGE, la operación de vinculación no será satisfactoria. Si se especifica la opción SQLERROR CONTINUE, la operación de vinculación será satisfactoria y se marcarán las sentencias erróneas. Si se intenta ejecutar una de estas sentencias, se producirá un error.
Si un paquete se vincula con la opción VALIDATE RUN, se realiza todo el proceso normal de vinculación, pero no es necesario que existan todavía los privilegios necesarios para utilizar las tablas y vistas referenciadas en la aplicación. Si durante la vinculación no existe un privilegio necesario, se realiza una operación de vinculación incremental cada vez que se ejecuta por primera vez la sentencia en una aplicación y deben existir todos los privilegios que la sentencia necesita. Si no existe un privilegio necesario, la ejecución de la sentencia no es satisfactoria.
La comprobación de autorización durante la ejecución se realiza utilizando el ID de autorización del propietario del paquete.
Nombres de columna
- Declarar el nombre de una columna como, por ejemplo, en una sentencia CREATE TABLE.
- Identificar una columna como, por ejemplo, en una sentencia CREATE INDEX.
- Especificar los valores de la columna como, por ejemplo, en los contextos siguientes:
- En una función agregada, un nombre de columna especifica todos los valores de la columna en la tabla de resultados intermedia o de grupo a la que se aplica la función. Por ejemplo, MAX(SALARY) aplica la función MAX a todos los valores de la columna SALARY de un grupo.
- En una cláusula GROUP BY o ORDER BY, un nombre de columna especifica todos los valores de la tabla de resultado intermedia a los que se aplica la cláusula. Por ejemplo, ORDER BY DEPT ordena una tabla de resultado intermedia según los valores de la columna DEPT.
- En una expresión, una condición de búsqueda o una función escalar, un nombre de columna especifica un valor para cada fila o grupo al que se aplica la construcción. Por ejemplo, cuando la condición de búsqueda CODE = 20 se aplica a alguna fila, el valor especificado por el nombre de columna CODE es el valor de la columna CODE en esa fila.
- Redenominar temporalmente una columna, como en la cláusula-correlación de una referencia-tabla en una cláusula FROM.
Nombres de columna calificados
Un calificador para un nombre de columna puede ser un nombre de tabla, vista, apodo o alias o un nombre de correlación.
- Según la forma de la sentencia COMMENT ON, puede que se deba calificar un nombre de una sola columna. No se deben calificar nombres de varias columnas.
- Donde el nombre de columna especifique valores de la columna, puede calificarse como opción del usuario.
- En la cláusula de asignación de una sentencia UPDATE, puede calificarse en la opción del usuario.
- En todos los demás contextos, un nombre de columna no debe calificarse.
Cuando un calificador es opcional, puede cumplir dos finalidades. Se describen en Calificadores de nombre de columna para evitar ambigüedades y Calificadores de nombre de columna en referencias correlacionadas.
Nombres de correlaciones
FROM X.MYTABLE ZCon Z definida como nombre de correlación para X.MYTABLE, sólo puede utilizarse Z para calificar una referencia a una columna de esa instancia de X.MYTABLE en esa sentencia SELECT.
Un nombre de correlación se asocia con una tabla, una vista, un apodo, un alias, una expresión de tabla anidada, una función de tabla o una referencia de tabla de cambio de datos sólo dentro del contexto en el que se ha definido. Por lo tanto, puede definirse el mismo nombre de correlación con distintos propósitos en diferentes sentencias o bien en distintas cláusulas de la misma sentencia.
Como calificador, un nombre de correlación puede utilizarse para evitar ambigüedades o para establecer una referencia correlacionada. También se puede utilizar simplemente como un nombre abreviado de una referencia de tabla. En el ejemplo, Z podría haberse utilizado simplemente para evitar tener que entrar X.MYTABLE más de una vez.
Si se especifica un nombre de correlación para una tabla, vista, apodo o alias, cualquier referencia a una columna de esa instancia de la tabla, vista, apodo o alias debe utilizar el nombre de correlación en lugar del nombre de tabla, vista, apodo o alias. Por ejemplo, la referencia a EMPLOYEE.PROJECT del ejemplo siguiente no es correcto, porque se ha especificado un nombre de correlación para EMPLOYEE:
FROM EMPLOYEE E
WHERE EMPLOYEE.PROJECT='ABC' * incorrect* E, tal como se muestra en el ejemplo siguiente:
FROM EMPLOYEE E
WHERE E.PROJECT='ABC' FROM EMPLOYEE E, DEPARTMENTUn nombre de tabla, vista, apodo o alias que está expuesto en una cláusula FROM puede ser igual a otro nombre de tabla, vista o apodo expuesto en esa cláusula FROM o cualquier nombre de correlación de la cláusula FROM. Esta situación puede dar como resultado una serie de referencias ambiguas de nombres de columna que acaban devolviendo un código de error (SQLSTATE 42702).
- Dada una cláusula FROM:
FROM EMPLOYEE E1, EMPLOYEEuna referencia calificada como, por ejemplo, EMPLOYEE.PROJECT indica una columna de la segunda instancia de EMPLOYEE en la cláusula FROM. Una referencia calificada a la primera instancia de EMPLOYEE debe utilizar el nombre de correlación
E1
(E1.PROJECT). - Dada una cláusula FROM:
FROM EMPLOYEE, EMPLOYEE E2una referencia calificada como, por ejemplo, EMPLOYEE.PROJECT indica una columna de la primera instancia de EMPLOYEE en la cláusula FROM. Una referencia calificada a la segunda instancia de EMPLOYEE debe utilizar el nombre de correlación
E2
(E2.PROJECT). - Dada una cláusula FROM:
FROM EMPLOYEE, EMPLOYEElos dos nombres de tabla expuestos que se incluyen en esta cláusula (EMPLOYEE y EMPLOYEE) son los mismos. Esto está permitido, pero las referencias a nombres de columnas específicos resultarían ambiguas (SQLSTATE 42702).
- Dada la sentencia siguiente:
SELECT * FROM EMPLOYEE E1, EMPLOYEE E2 * incorrect * WHERE EMPLOYEE.PROJECT = 'ABC'la referencia calificada EMPLOYEE.PROJECT es incorrecta, porque las dos instancias de EMPLOYEE en la cláusula FROM tienen nombres de correlación. En cambio, las referencias a PROJECT deben estar calificadas con algún nombre de correlación (E1.PROJECT o E2.PROJECT).
- Dada una cláusula FROM:
FROM EMPLOYEE, X.EMPLOYEEuna referencia a una columna en la segunda instancia de EMPLOYEE debe utilizar X.EMPLOYEE (X.EMPLOYEE.PROJECT). Si X es el valor del registro especial CURRENT SCHEMA en SQL estático o la opción de precompilación/vinculación QUALIFIER de SQL dinámico, no se puede hacer ninguna referencia a las columnas porque resultaría ambigua.
La utilización del nombre de correlación en la cláusula FROM permite, también, la opción de especificar una lista de nombres de columna que se han de asociar con las columnas de la tabla resultante. Igual que los nombres de correlación, estos nombres de columna listados se convierten en los nombres expuestos de las columnas que deben utilizarse en las referencias a las columnas en toda la consulta. Si se especifica una lista de nombres de columna, los nombres de columna de la tabla principal se convierten en no expuestos.
Dada una cláusula FROM:
FROM DEPARTMENT D (NUM,NAME,MGR,ANUM,LOC)
una referencia calificada como, por ejemplo, D.NUM indica la primera columna de la tabla DEPARTMENT que se ha definido en la tabla como DEPTNO. Una referencia a D.DEPTNO utilizando esta cláusula FROM es incorrecta ya que el nombre de columna DEPTNO es un nombre de columna no expuesto.
Calificadores de nombres de columna para evitar ambigüedades
En el contexto de una función, de una cláusula GROUP BY, de una cláusula ORDER BY, de una expresión o de una condición de búsqueda, un nombre de columna hace referencia a los valores de una columna en alguna tabla, vista, apodo, expresión de tabla anidada o función de tabla. Las tablas, vistas, apodos, expresiones de tablas anidadas y funciones de tabla donde puede residir la columna se denominan tablas de objetos del contexto. Dos o más tablas de objetos pueden contener columnas con el mismo nombre; un nombre de columna se puede calificar para indicar la tabla de la cual procede la columna. Los calificadores de nombres de columna también son útiles en los procedimientos de SQL para diferenciar los nombres de columna de los nombres de variables de SQL utilizados en sentencias de SQL.
Una expresión de tabla anidada o una función de tabla trata las referencias-tabla que la preceden en la cláusula FROM como tablas de objetos. Las referencias-tabla que siguen no se tratan como tablas de objetos.
Designadores de tabla
SELECT CORZ.COLA, OWNY.MYTABLE.COLA
FROM OWNX.MYTABLE CORZ, OWNY.MYTABLE- Un nombre que sigue a una tabla, vista, apodo, alias, expresión de tabla anidada o función de tabla es a la vez un nombre de correlación y un designador de tabla. Así pues, CORZ es un designador de tabla. CORZ sirve para calificar el primer nombre de columna de la lista de selección.
- Una tabla expuesta, un nombre de vista, un apodo o alias es un designador de tabla. Así pues, OWNY.MYTABLE es un designador de tabla. OWNY.MYTABLE sirve para calificar el nombre de la segunda columna de la lista de selección.
Al calificar una columna con el nombre de tabla expuesto de un designador de tabla, se puede utilizar la forma calificada o no calificada del nombre expuesto de tabla. Si se utiliza la forma calificada, el calificador debe ser el mismo que el calificador por omisión del nombre expuesto de tabla.
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEEes válido porque la tabla EMPLOYEE a la que se hace referencia en la cláusula FROM califica completamente CORPDATA.EMPLOYEE, que coincide con el calificador de la columna WORKDEPT.SELECT EMPLOYEE.WORKDEPT, REGEMP.WORKDEPT
FROM CORPDATA.EMPLOYEE, REGION.EMPLOYEE REGEMPtambién es válido, porque la primera columna de lista de selección hace referencia al designador de tabla expuesto no calificado CORPDATA.EMPLOYEE, que se encuentra en la cláusula FROM y la segunda columna de lista de selección hace referencia al nombre de correlación REGEMP del objeto de tabla REGION.EMPLOYEE, que también se encuentra en la cláusula FROM.SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEEno es válido porque la tabla EMPLOYEE a la que se hace referencia en la cláusula FROM califica completamente REGION.EMPLOYEE y el calificador de la columna WORKDEPT representa la tabla CORPDATA.EMPLOYEE.Cada designador de tabla debe ser exclusivo en una cláusula FROM determinada para evitar la aparición de referencias ambiguas a columnas.
Evitar referencias no definidas o ambiguas
- Ninguna tabla de objetos contiene una columna con el nombre especificado. La referencia no está definida.
- El nombre de columna está calificado mediante un designador de tabla, pero la tabla designada no incluye una columna con el nombre especificado. De nuevo, la referencia no está definida.
- El nombre no está calificado, y hay más de una tabla de objetos que incluye una columna con ese nombre. La referencia es ambigua.
- El designador de tabla califica al nombre de columna, pero la tabla designada no es única en la cláusula FROM y ambas apariciones de la tabla designada incluyen la columna. La referencia es ambigua.
- El nombre de columna de una expresión de tabla anidada que no va precedida por la palabra clave TABLE o en una función de tabla o expresión de tabla anidada que es el operando derecho de una unión externa derecha o una unión externa completa y el nombre de columna no hace referencia a una columna de una referencia-tabla de la selección completa de la expresión de tabla anidada. La referencia no está definida.
Evite las referencias ambiguas calificando un nombre de columna con un designador de tabla definido exclusivamente. Si la columna está en varias tablas de objetos con nombres distintos, los nombres de tabla pueden utilizarse como designadores. Las referencias ambiguas también se pueden evitar sin la utilización del designador de tabla dando nombres exclusivos a las columnas de una de las tablas de objetos utilizando la lista de nombres de columna que siguen al nombre de correlación.
- Si el ID de autorización de la sentencia es CORPDATA:
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEEes una sentencia válida.
- Si el ID de autorización de la sentencia es REGION:
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE * incorrect *no es válido, porque EMPLOYEE representa la tabla REGION.EMPLOYEE, pero el calificador para WORKDEPT representa una tabla distinta, CORPDATA.EMPLOYEE.
Calificadores de nombres de columna en referencias correlacionadas
Una selección completa es una forma de consulta que puede utilizarse como componente de varias sentencias de SQL. Una selección completa utilizada en una condición de búsqueda de cualquier sentencia se denomina subconsulta. Una selección completa utilizada para recuperar un único valor como, por ejemplo, una expresión en una sentencia se denomina una selección completa escalar o subconsulta escalar. Una selección completa utilizada en la cláusula FROM de una consulta se denomina expresión de tabla anidada. Se hace referencia a las subconsultas de las condiciones de búsqueda, subconsultas escalares y expresiones de tabla anidadas como subconsultas en el resto de este tema.
Una subconsulta puede contener subconsultas propias y estas, a su vez, pueden contener subconsultas. De este modo, una sentencia de SQL puede contener una jerarquía de subconsultas. Los elementos de la jerarquía que contienen subconsultas están en un nivel superior que las subconsultas que contienen.
Cada elemento de la jerarquía contiene uno o más designadores de tabla. Una consulta puede hacer referencia no solamente a las columnas de las tablas identificadas en su mismo nivel dentro de la jerarquía, sino también a las columnas de las tablas anteriormente identificadas en la jerarquía, hasta alcanzar el estrato más elevado. Una referencia a una columna de una tabla identificada en un nivel superior se llama referencia correlacionada.
Para la compatibilidad con los estándares existentes de SQL, se permiten nombres de columna calificados y no calificados como referencias correlacionadas. Sin embargo, es aconsejable calificar todas las referencias de columnas utilizadas en subconsultas; de lo contrario, los nombres de columna idénticos pueden conducir a resultados no deseados. Por ejemplo, si se modifica una tabla de una jerarquía de modo que contenga el mismo nombre de columna que la referencia correlacionada y la sentencia se vuelve a preparar, la referencia se aplicará en la tabla modificada.
Cuando se califica un nombre de columna en una subconsulta, se busca en cada nivel de jerarquía, comenzando en la misma subconsulta en la que aparece el nombre de columna calificado y continuando hacia niveles superiores de la jerarquía, hasta que se encuentre un designador de tabla que coincida con el calificador. Una vez encontrado, se verifica que la tabla contenga la columna en cuestión. Si se encuentra la tabla en un nivel superior que el nivel que contiene el nombre de columna, es que este es una referencia correlacionada para el nivel donde se encontró el designador de tabla. Una expresión de tabla anidada debe ir precedida por la palabra clave TABLE opcional para buscar en la jerarquía superior la selección completa de la expresión de tabla anidada.
Cuando el nombre de columna de una subconsulta no se califica, se busca en las tablas a las que se hace referencia en cada nivel de la jerarquía, empezando en la misma subconsulta en la que aparece el nombre de columna y siguiendo hacia niveles superiores de la jerarquía hasta que se encuentre un nombre de columna que coincida. Si la columna se encuentra en una tabla en un nivel superior al nivel que contiene el nombre de columna, es que este es una referencia correlacionada para el nivel donde se ha encontrado la tabla que contiene la columna. Si se encuentra el nombre de columna en más de una tabla en un nivel en concreto, la referencia es ambigua y se considera un error.
- T.C se utiliza en una expresión de una subconsulta.
- T no designa una tabla utilizada en la cláusula de la subconsulta.
- T designa una tabla utilizada en un nivel superior de la jerarquía que contiene la subconsulta.
Debido a que una misma tabla, vista o apodo pueden estar identificados en muchos niveles, se recomienda utilizar nombres de correlación exclusivos como designadores de tabla. Si T se utiliza para designar una tabla a más de un nivel (T es el propio nombre de tabla o un nombre de correlación duplicado), T.C se refiere al nivel en el que T se utiliza que más directamente contiene la subconsulta que incluye T.C. Si se necesita una correlación a un nivel superior, habrá que usar un nombre de correlación exclusivo.
La referencia correlacionada T.C identifica un valor de C en una fila o grupo de T a la que se aplican dos condiciones de búsqueda: la condición 1 en la subconsulta, y la condición 2 en algún nivel superior. Si se utiliza la condición 2 en una cláusula WHERE, se evalúa la subconsulta para cada fila a la que se aplica la condición 2. Si se utiliza la condición 2 en una cláusula HAVING, se evalúa la subconsulta para cada grupo al que se aplica la condición 2.
SELECT EMPNO, LASTNAME, WORKDEPT
FROM EMPLOYEE X
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE WORKDEPT = X.WORKDEPT) DELETE FROM DEPARTMENT THIS
WHERE NOT EXISTS(SELECT *
FROM EMPLOYEE
WHERE WORKDEPT = THIS.DEPTNO)Referencias a variables
Una variable de una sentencia de SQL especifica un valor que puede cambiarse cuando se ejecuta la sentencia de SQL. Existen diferentes tipos de variables utilizadas en sentencias de SQL:
- host variable
- Las sentencias de un lenguaje principal definen las variables del lenguaje principal. Para obtener más información sobre cómo hacer referencia a variables del lenguaje principal, consulte Referencias a variables del lenguaje principal.
- transition variable
- Las variables de transición se definen en un activador y hacen referencia a los valores nuevos o anteriores de las columnas. Para obtener más información sobre cómo hacer referencia a las variables de transición, consulte Sentencia CREATE TRIGGER.
- SQL variable
- Las variables de SQL se definen mediante una sentencia compuesta de SQL en una función de SQL, método de SQL, procedimiento de SQL, activador o sentencia de SQL dinámico. Para obtener más información sobre las variables de SQL, consulte Referencias a parámetros de SQL, variables de SQL y variables globales.
- global variable
- La sentencia CREATE VARIABLE define las variables globales. Para obtener más información sobre las variables globales, consulte
CREATE VARIABLE
y Referencias a parámetros SQL, variables SQL y variables globales. - module variable
- Las variables de módulo se definen mediante la sentencia ALTER MODULE utilizando la operación ADD VARIABLE o PUBLISH VARIABLE. Para obtener más información sobre las variables de módulo, consulte sentencia ALTER MODULE.
- SQL parameter
- Los parámetros de SQL se definen en una sentencia CREATE FUNCTION, CREATE METHOD o CREATE PROCEDURE. Para obtener más información sobre los parámetros de SQL, consulte Referencias a parámetros de SQL, variables de SQL y variables globales.
- parameter marker
- Los marcadores de parámetro se especifican en una sentencia de SQL dinámico donde se especificarían las variables del lenguaje principal si la sentencia fuera una sentencia de SQL estático. Se utiliza un descriptor de SQL o una vinculación de parámetros para asociar un valor con un marcador de parámetro durante el proceso de sentencia de SQL dinámico. Para obtener más información sobre los marcadores de parámetro, consulte Marcadores de parámetro.
Referencias a variables del lenguaje principal
- Una variable en un lenguaje principal como, por ejemplo, una variable C, una variable C++, un elemento de datos COBOL, una variable FORTRAN o una variable Java™
- Una construcción del lenguaje principal generada por un precompilador de SQL a partir de una variable declarada mediante extensiones de SQL
a la que se hace referencia en una sentencia de SQL. Las variables del lenguaje principal se definen directamente mediante las sentencias del lenguaje principal o indirectamente mediante extensiones de SQL.
Una variable del lenguaje principal en una sentencia de SQL debe identificar una variable del lenguaje principal descrita en el programa según las normas para la declaración de variables del lenguaje principal.
Todas las variables del lenguaje principal utilizadas en una sentencia SQL deben declararse en una sección DECLARE de SQL en todos los lenguajes del lenguaje principal excepto REXX. No se debe declarar ninguna variable fuera de una sección DECLARE de SQL con nombres que sean idénticos a variables declaradas en una sección DECLARE de SQL. Una sección DECLARE de SQL empieza por BEGIN DECLARE SECTION y termina por END DECLARE SECTION.
La metavariable variable-lenguaje-principal, tal como se utiliza en los diagramas de sintaxis, muestra una referencia a una variable del lenguaje principal. Una variable del lenguaje principal utilizada como variable de destino en una sentencia SET Variable o en la cláusula INTO de una sentencia FETCH, SELECT INTO o VALUES INTO identifica una variable del lenguaje principal a la que se asigna un valor procedente de una columna de una fila o una expresión. En todos los demás contextos, una variable-lenguaje-principal especifica un valor que ha de pasarse al gestor de bases de datos desde el programa de aplicación.
Generalmente, la metavariable variable-lenguaje-principal se puede expandir en los diagramas de sintaxis a:
Cada identificador-lenguaje-principal debe declararse en el programa fuente. La variable designada por el segundo identificador-lenguaje-principal debe tener un tipo de datos de entero pequeño.
El primer identificador-lenguaje-principal designa la variable principal. Según la operación, proporciona un valor al gestor de bases de datos o bien el gestor de bases de datos le proporciona un valor. Una variable del lenguaje principal de entrada proporciona un valor en la página de códigos de la aplicación en tiempo de ejecución. A la variable del lenguaje principal de salida se le proporciona un valor que, si es necesario, se convierte a la página de códigos de la aplicación en tiempo de ejecución cuando los datos se copian en la variable de la aplicación de salida. Una variable del lenguaje principal determinada puede servir tanto de variable de entrada como de salida en el mismo programa.
El segundo identificador-lenguaje-principal designa su variable indicadora. Las variables de indicador aparecen de dos formas: variables de indicador normales y variables de indicador ampliado.
- Especificar un valor que no sea nulo. Un 0 (cero) o un valor positivo en la variable de indicador especifica que el primer identificador-lenguaje-principal asociado proporciona el valor de esta referencia de variable del lenguaje principal.
- Especificar el valor null. Un valor negativo de la variable indicadora especifica el valor nulo.
- En la salida, indica que se ha producido un error de conversión numérico (como una división por 0 o un desbordamiento) si el parámetro de configuración de base de datos dft_sqlmathwarn está establecido en
yes
(o se ha establecido enyes
durante la vinculación de una sentencia de SQL estático). Un valor -2 de la variable de indicador indica un resultado null a causa de un truncamiento de datos numéricos o avisos FRIENDLY ARITHMETIC. - En la salida, registra la longitud original de una serie truncada (si la fuente del valor no es un tipo de objeto grande).
- En la salida, registra la parte correspondiente a los segundos de una hora si la hora se trunca al asignarse a una variable del lenguaje principal.
- Especificar un valor que no sea nulo. Un 0 (cero) o un valor positivo especifica que el primer identificador-lenguaje-principal asociado proporciona el valor de esta referencia de variable del lenguaje principal.
- Especificar el valor null. Un valor -1, -2, -3, -4 o -6 especifica el valor null.
- Especificar el valor por omisión. Un valor -5 especifica que la columna de destino para esta variable de lenguaje principal tiene que establecerse en su valor por omisión.
- Especificar un valor UNASSIGNED. Un valor -7 especifica que la columna de destino para esta variable de lenguaje principal tiene que tratarse como si no se hubiera especificado en la sentencia.
Las variables de indicador ampliado sólo se habilitan si se solicita; de otro modo, todas las variables de indicador son variables de indicador normales. En comparación con las variables de indicador normales, las variables de indicador ampliado no tienen restricciones adicionales respecto al lugar en el que pueden utilizarse los valores nulos y no nulos. No existen restricciones acerca del uso de valores de variable de indicador ampliado en estructuras de indicador con estructuras de sistema principal. Las restricciones sobre los casos en los que se admiten los valores de variable de indicador ampliado DEFAULT y UNASSIGNED se aplican de forma uniforme, independientemente de cómo se representan en la aplicación de sistema principal. Es probable que los valores de variable de indicador ampliado DEFAULT y UNASSIGNED sólo aparezcan en usos limitados y específicos. Pueden aparecer en expresiones que contienen una sola variable de lenguaje principal o una variable de lenguaje principal que se vaya a convertir de forma explícita (asignada a una columna). Los valores de variable de indicador de salida nunca son variables de indicador ampliado.
Cuando se habilitan las variables de indicador ampliado, no hay restricciones sobre el uso de 0 (cero) o de valores de variable de indicador positivos. Sin embargo, los valores de variable de indicador negativos fuera del rango entre -1 y -7 no pueden ser una entrada (SQLSTATE 22010). Si se habilitan, los valores de variable de indicador ampliado DEFAULT y UNASSIGNED no deben aparecer en contextos en los que no estén soportados (SQLSTATE 22539).
Cuando se habilitan las variables de indicador ampliado, las normas para la validación de tipos de datos en la asignación y comparación son menos estrictas para las variables de lenguaje principal cuyos valores de indicador ampliado son negativos. Las normas de validación de asignación y comparación de tipos de datos no se impondrán para las variables de lenguaje principal con valores NULL, DEFAULT o UNASSIGNED.
Por ejemplo, si se utiliza :HV1:HV2 para especificar un valor de inserción o de actualización y si HV2 es negativo, el valor especificado es el valor nulo. Si HV2 no es negativo, el valor especificado es el valor de HV1.
De igual modo, si se especifica :HV1:HV2 en una cláusula INTO de una sentencia FETCH, SELECT INTO o VALUES INTO, , y se devuelve el valor nulo, HV1 no se cambia y HV2 se establece en un valor negativo Si la base de datos se ha configurado con dft_sqlmathwarn establecido en yes (o lo estaba durante la vinculación de una sentencia de SQL estático), HV2 podría ser -2. Si HV2 es -2, no podría devolverse un valor para HV1 debido a un error en la conversión al tipo numérico de HV1 o a un error al evaluar una expresión aritmética utilizada para determinar el valor de HV1. Si el valor devuelto no es nulo, se asigna dicho valor a HV1 y HV2 se establece en cero (a no ser que la asignación a HV1 necesite el truncamiento de una serie que sea no LOB, en cuyo caso HV2 se establece en la longitud original de la serie). Si una asignación necesita el truncamiento de la parte correspondiente a los segundos de una hora, HV2 se establece en el número de segundos.
Si se omite el segundo identificador del lenguaje principal, la variable del lenguaje principal carece de variable indicadora. El valor especificado por la referencia a la variable del lenguaje principal :HV1 siempre es el valor de HV1 y los valores nulos no se pueden asignar a la variable. Por este motivo, esta forma no debe utilizarse en una cláusula INTO a no ser que la columna correspondiente no pueda incluir valores nulos. Si se utiliza esta forma y la columna contiene valores nulos, el gestor de bases de datos generará un error en tiempo de ejecución.
Una sentencia de SQL que haga referencia a variables del lenguaje principal debe pertenecer al ámbito de la declaración de esas variables del lenguaje principal. Para las variables host a las que se hace referencia en la sentencia SELECT de un cursor, esa norma se aplica más a la sentencia OPEN en lugar de la sentencia DECLARE CURSOR.
Ejemplo
SELECT PROJNAME, PRSTAFF, MAJPROJ
INTO :PNAME, :STAFF :STAFF_IND, :MAJPROJ :MAJPROJ_IND
FROM PROJECT
WHERE PROJNO = 'IF1000'Consideraciones acerca de MBCS: Si es o no es posible utilizar los caracteres de múltiples bytes en un nombre de variable del lenguaje principal depende del lenguaje principal.Variables en SQL dinámico
INSERT INTO DEPARTMENT
VALUES (:HV_DEPTNO, :HV_DEPTNAME, :HV_MGRNO, :HV_ADMRDEPT) INSERT INTO DEPARTMENT VALUES (?, ?, ?, ?) INSERT INTO DEPARTMENT
VALUES (:DEPTNO, :DEPTNAME, :MGRNO, :ADMRDEPT) EXECUTE DYNSTMT
USING :HV_DEPTNO, :HV_DEPTNAME :HV_MGRNO, :HV_ADMRDEPTSe podría utilizar esta misma sentencia EXECUTE si se hubiera preparado la sentencia INSERT utilizando marcadores de parámetro sin nombre y se hubiera denominado la sentencia preparada como DYNSTMT.Referencias a variables LOB
Las variables BLOB, CLOB y DBCLOB regulares, las variables de localizador LOB (consulte Referencias a variables de localizador LOB) y las variables de referencia de archivo LOB (consulte Referencias a variables de referencia de archivo LOB) se pueden definir en todos los lenguajes de sistema principal. Donde se pueden utilizar valores LOB, el término variable-lenguaje-principal en un diagrama de sintaxis puede hacer referencia a una variable del lenguaje principal normal, a una variable localizadora o a una variable de referencia a archivos. Puesto que no son tipos de datos nativos, se utilizan las extensiones SQL y los precompiladores generan las construcciones de lenguaje principal necesarias para poder representar a cada variable. En el caso de REXX, los LOB se correlacionan con series.
A veces es posible definir una variable lo suficientemente grande como para contener todo un valor de objeto grande. Si es así y no hay ninguna ventaja de rendimiento si se utiliza la transferencia diferida de datos desde el servidor, no es necesario un localizador. No obstante, puesto que el lenguaje principal o las restricciones de espacio con frecuencia desaconsejan el almacenamiento de la totalidad de un objeto grande en el almacenamiento temporal al mismo tiempo, o por motivos de rendimiento, puede hacerse referencia a un objeto grande por medio de un localizador, y pueden seleccionarse o actualizarse partes de ese objeto desde variables del lenguaje principal que sólo contengan una parte del objeto grande al mismo tiempo.
Referencias a variables de localizador de LOB
Una variable localizadora es una variable del lenguaje principal que contiene el localizador que representa un valor de LOB en el servidor de aplicaciones.
Una variable localizadora de una sentencia de SQL debe identificar una variable localizadora descrita en el programa de acuerdo a las normas de declaración de variables localizadoras. Siempre se produce indirectamente a través de una sentencia de SQL.
El término variable localizadora, tal como se utiliza en los diagramas de sintaxis, muestra una referencia a una variable localizadora. La metavariable variable-localizadora puede expandirse para que incluya un identificador-lenguaje-principal igual que para la variable-lenguaje-principal.
Como sucede con el resto de variables del lenguaje principal, una variable localizadora de LOB puede tener asociada una variable indicadora. Las variables de indicador para las variables de localizador del lenguaje principal de objeto grande funcionan de la misma manera que las variables de indicador de otros tipos de datos. Cuando una base de datos devuelve un valor nulo, se define la variable indicadora y la variable localizadora del lenguaje principal no se cambia. Esto significa que un localizador jamás puede apuntar a un valor nulo.
Si se hace referencia a una variable localizadora que en ese momento no represente ningún valor, se producirá un error (SQLSTATE 0F001).
Durante la confirmación de la transacción, o en cualquier finalización de transacción, se liberan todos los localizadores que la transacción había adquirido.
Referencias a variables de referencia de archivo LOB
Las variables de referencia a archivos BLOB, CLOB y DBCLOB sirven para la entrada y salida directa de archivo para los LOB y pueden definirse en todos los lenguajes principales. Puesto que no son tipos de datos nativos, se utilizan las extensiones SQL y los precompiladores generan las construcciones de lenguaje principal necesarias para poder representar a cada variable. En el caso de REXX, los LOB se correlacionan con series.
Una variable de referencia a archivos representa (más que contiene) al archivo, de igual manera que un localizador de LOB representa, más que contiene, a los bytes LOB. Las consultas, actualizaciones e inserciones pueden utilizar variables de referencia a archivos para almacenar o recuperar valores de una sola columna.
- Data Type
- BLOB, CLOB o DBCLOB. Esta propiedad se especifica al declarar la variable.
- Direction
- La dirección debe ser especificada por el programa de aplicación durante la ejecución (como parte del valor de Opciones de archivo). La dirección puede ser:
- De entrada (se utiliza como fuente de datos en las sentencias EXECUTE, OPEN, UPDATE, INSERT o DELETE).
- De salida (se utiliza como datos de destino en sentencias las FETCH o SELECT INTO).
- File name
- Debe especificarlo el programa de aplicación en tiempo de ejecución. Puede ser:
- El nombre completo de la vía de acceso de un archivo (opción que se recomienda).
- Un nombre de archivo relativo. Si se proporciona un nombre de archivo relativo, se añade a la vía de acceso actual del proceso cliente.
En una aplicación, sólo debe hacerse referencia a un archivo en una variable de referencia a archivos.
- File Name Length
- Debe especificarlo el programa de aplicación en tiempo de ejecución. Es la longitud del nombre de archivo (en bytes).
- File Options
- Una aplicación debe asignar una las opciones a una variable de referencia a archivos antes de utilizar dicha variable. Las opciones se establecen mediante un valor INTEGER en un campo de la estructura de la variable de referencia a archivos. Se debe especificar alguna de estas opciones para cada variable de referencia a archivos:
- Entrada (de cliente a servidor)
- SQL_FILE_READ
- Archivo regular que se puede abrir, leer y cerrar. (La opción es SQL-FILE-READ en COBOL, sql_file_read en FORTRAN y READ en REXX.)
- Salida (de servidor a cliente)
- SQL_FILE_CREATE
- Crear un nuevo archivo. Si el archivo ya existe, se devuelve un error. (La opción es SQL-FILE-CREATE en COBOL, sql_file_create en FORTRAN y CREATE en REXX.)
- SQL_FILE_OVERWRITE (Overwrite)
- Si ya existe un archivo con el nombre especificado, se sobregraba el contenido del archivo; de lo contrario, se crea un nuevo archivo. (La opción es SQL-FILE-OVERWRITE en COBOL, sql_file_overwrite en FORTRAN y OVERWRITE en REXX.)
- SQL_FILE_APPEND
- Si ya existe un archivo con el nombre especificado, la salida se añade a este; de lo contrario, se crea un nuevo archivo. (La opción es SQL-FILE-APPEND en COBOL, sql_file_append en FORTRAN y APPEND en REXX.)
- Data Length
- No se utiliza en la entrada. En la salida, la implantación establece la longitud de datos en la longitud de los nuevos datos grabados en el archivo. La longitud se mide en bytes.
- Entrada (de cliente a servidor)
Como sucede con el resto de variables del lenguaje principal, una variable de referencia a archivo puede tener asociada una variable de indicador.
Ejemplo de una variable de referencia a archivos de salida (en C)
EXEC SQL BEGIN DECLARE SECTION
SQL TYPE IS CLOB_FILE hv_text_file;
char hv_patent_title[64];
EXEC SQL END DECLARE SECTIONUna vez procesada: EXEC SQL BEGIN DECLARE SECTION
/* SQL TYPE IS CLOB_FILE hv_text_file; */
struct {
unsigned long name_length; // File Name Length
unsigned long data_length; // Data Length
unsigned long file_options; // File Options
char name[255]; // File Name
} hv_text_file;
char hv_patent_title[64];
EXEC SQL END DECLARE SECTION strcpy(hv_text_file.name, "/u/gainer/papers/sigmod.94");
hv_text_file.name_length = strlen("/u/gainer/papers/sigmod.94");
hv_text_file.file_options = SQL_FILE_CREATE;
EXEC SQL SELECT content INTO :hv_text_file from papers
WHERE TITLE = 'The Relational Theory behind Juggling';Ejemplo de una variable de referencia a archivos de entrada (en C)
strcpy(hv_text_file.name, "/u/gainer/patents/chips.13");
hv_text_file.name_length = strlen("/u/gainer/patents/chips.13");
hv_text_file.file_options = SQL_FILE_READ:
strcpy(:hv_patent_title, "A Method for Pipelining Chip Consumption");
EXEC SQL INSERT INTO patents( title, text )
VALUES(:hv_patent_title, :hv_text_file);Referencias a variables del lenguaje principal de tipo estructurado
Las variables de tipo estructurado se pueden definir en todos los lenguajes de sistema principal excepto FORTRAN, REXX y Java. Puesto que no son tipos de datos nativos, se utilizan las extensiones SQL y los precompiladores generan las construcciones de lenguaje principal necesarias para poder representar a cada variable.
Al igual que en todas las demás variables del lenguaje principal, una variable de tipo estructurado puede tener una variable indicadora asociada. Las variables de indicador correspondientes a las variables del lenguaje principal de tipo estructurado actúan de la misma manera que las variables de indicador de otros tipos de datos. Cuando una base de datos devuelve un valor nulo, se define la variable indicadora y la variable del lenguaje principal de tipo estructurado no cambia.
- desde el resultado de la función de transformación FROM SQL para el tipo estructurado tal como está definida por la opción especificada TRANSFORM GROUP del mandato de precompilación; y
- al parámetro de la función de transformación TO SQL para el tipo estructurado tal como está definida por la opción especificada TRANSFORM GROUP del mandato de precompilación.
Si se utiliza un marcador de parámetros en lugar de una variable del lenguaje principal, se deben especificar las características apropiadas del tipo de parámetro en la SQLDA. Esto requiere un conjunto duplicado
de estructuras SQLVAR en la SQLDA, y el campo SQLDATATYPE_NAME de la SQLVAR debe contener el nombre de esquema y nombre de tipo del tipo estructurado. Si se omite el esquema en la estructura SQLDA, se produce un error (SQLSTATE 07002).
Ejemplo
EXEC SQL BEGIN DECLARE SECTION;
static SQL
TYPE IS POLYGON AS BLOB(1M)
hv_poly, hv_point;
EXEC SQL END DECLARE SECTION;Vía de acceso de SQL
La vía de acceso de SQL es una lista ordenada de nombres de esquema. El gestor de bases de datos utiliza la vía de acceso de SQL para resolver el nombre de esquema para nombres de tipos de datos no calificados (tanto tipo incorporado como tipo diferenciado), de variable global, de módulo, de función y de procedimiento que aparecen en cualquier contexto que no sea el del objeto principal de una sentencia CREATE, DROP, COMMENT, GRANT o REVOKE. Para obtener información detallada, consulte Calificación de los nombres de objeto no calificados
.
Por ejemplo, si la vía de acceso de SQL es SYSIBM. SYSFUN, SYSPROC, SYSIBMADM, SMITH, XGRAPHICS2 y se ha especificado un nombre de tipo diferenciado no calificado MYTYPE, el gestor de bases de datos busca MYTYPE en el esquema SYSIBM, después en SYSFUN, a continuación en SYSPROC, luego en SYSIBMADM, después en SMITH y por último en XGRAPHICS2.
- Para las sentencias de SQL estático (salvo para la sentencia de variable CALL), la vía de acceso de SQL utilizada es la vía de acceso de SQL especificada al crear el paquete contenedor, el procedimiento, la función, el activador o la vista.
- Para las sentencias de SQL dinámico (y para la sentencia de variable CALL), la vía de acceso de SQL es el valor del registro especial CURRENT PATH. CURRENT PATH puede definirse mediante la sentencia SET PATH.
Calificación de los nombres de objeto no calificados
Los nombres de objeto no calificados se califican de forma implícita. Las normas para la calificación de un nombre varían en función del tipo de objeto al que identifica el nombre.
Nombres de alias, índice, paquete, secuencia, tabla, activador y vista no calificados
El esquema por omisión califica de forma implícita los nombres de alias, índice, paquete, secuencia, tabla, activador y vista no calificados.
Para las sentencias de SQL estático, el esquema por omisión es el esquema por omisión especificado al crear la función, paquete, procedimiento o activador contenedor.
Para las sentencias de SQL dinámico, el esquema por omisión es el esquema especificado para el proceso de aplicación. El proceso de aplicación puede especificar el esquema por omisión mediante la sentencia SET SCHEMA. Si no se ha especificado explícitamente el esquema por omisión, el esquema por omisión será el ID de autorización de la sentencia.
Nombres no calificados de función, procedimiento, específico, variable global, módulo y tipo definido por el usuario
- Si un nombre no calificado es el objeto principal de una sentencia CREATE, ALTER, COMMENT, DROP, GRANT o REVOKE, el nombre se califica implícitamente utilizando las mismas reglas que para calificar nombres de tabla no calificados (consulte Nombres de alias, índice, paquete, secuencia, tabla, desencadenante y vista no calificados). El objeto principal de una operación ADD, COMMENT, DROP o PUBLISH de la sentencia ALTER MODULE debe especificarse sin ningún calificador.
- Si el contexto de la referencia está ubicado en un módulo, el gestor de bases de datos busca el objeto en el módulo, aplicando la resolución adecuada al tipo de objeto para encontrar una coincidencia. Si no encuentra coincidencias, la búsqueda continúa tal y como se especifica en el punto siguiente.
- En caso contrario, el nombre de esquema implícito se determina de la manera siguiente:
- Para los nombres de tipo diferenciado, el gestor de bases de datos busca en la vía de acceso de SQL y selecciona el primer esquema en dicha vía en el que exista el tipo de datos.
- Para las variables globales, el gestor de bases de datos busca en la vía de acceso de SQL y selecciona el primer esquema en dicha vía en el que exista la variable global.
- Para los nombres de procedimiento, el gestor de bases de datos utiliza la vía de acceso de SQL en combinación con la resolución de procedimiento.
- Para los nombres de función, el gestor de bases de datos utiliza la vía de acceso de SQL en combinación con la resolución de función.
- Para los nombres específicos determinados para las funciones derivadas, consulte
CREATE FUNCTION (derivado)
.
Las nuevas funciones SYSIBM alteran temporalmente las funciones definidas por el usuario no calificadas con el mismo nombre
Es posible que una función existente definida por el usuario o un procedimiento definido por el usuario tengan el mismo nombre y la misma signatura que una nueva función incorporada o rutina administrativa de SQL. En dichos casos, una referencia no calificada a esas funciones o rutinas en una sentencia de SQL dinámico ejecuta la función incorporada o la rutina administrativa de SQL en lugar de la definida por el usuario.
La vía de acceso de SQL por omisión contiene los esquemas SYSIBM, SYSFUN, SYSPROC y SYSIBMADM delante del nombre de esquema que es el valor del registro especial USER. Estos esquemas de sistema también se incluyen en la vía de acceso de SQL cuando se establecen de forma explícita con la sentencia SET PATH o la opción de vinculación FUNCPATH. Durante la resolución de función y la resolución de procedimientos, las funciones incorporadas y las rutinas administrativas de SQL en los esquemas SYSIBM, SYSFUN, SYSPROC y SYSIBMADM se encuentran antes de las funciones definidas por el usuario y los procedimientos definidos por el usuario.
Este cambio no afecta al SQL estático en paquetes u objetos de SQL como vistas, activadores o funciones de SQL. En estos casos, el procedimiento o la función definida por el usuario continúa ejecutándose hasta que se vincula explícita el paquete o se descarta y crea el objeto SQL.
Para ejecutar una rutina definida por el usuario no calificada en lugar de una nueva función SYSIBM con el mismo nombre, cambie el nombre de la rutina definida por el usuario o califique totalmente el nombre antes de ejecutarla. También puede incluir en la vía de acceso de SQL el esquema en el que existe la rutina definida por el usuario delante del esquema en el que existen las funciones incorporadas y las rutinas administrativas de SQL. Sin embargo, al promocionar el esquema en la vía de acceso de SQL aumenta el tiempo de resolución para todas las funciones incorporadas y las rutinas administrativas de SQL porque primero se tienen en cuenta los esquemas del sistema.
Resolución de los nombres de objeto calificados
- un nombre de columna calificado por un nombre de tabla
- un nombre de campo de fila calificado por un nombre de variable
- un nombre de variable calificado por una etiqueta
- un nombre de parámetro de rutina calificado por un nombre de rutina
- Si el contexto de la referencia está ubicado en un módulo y el calificador coincide con el nombre del módulo, el gestor de bases de datos busca el objeto en el módulo, aplicando la resolución adecuada al tipo de objeto para encontrar una coincidencia entre los objetos de módulo publicados y no publicados. Si no encuentra coincidencias, la búsqueda continúa tal y como se especifica en los puntos siguientes.
- Se presupone que el calificador es un nombre de esquema y, si el esquema existe, se resuelve el objeto en el esquema.
- Si el calificador no es un esquema existente o el objeto no se encuentra en el esquema que coincide con el calificador, y este no coincidió con el nombre de módulo de contexto, se busca el primer módulo que coincida con el calificador en los esquemas de la vía de acceso de SQL. Si se dispone de autorización para el módulo que coincide, se resuelve al objeto de dicho módulo, teniendo en cuenta únicamente los objetos de módulo publicados.
- Si el módulo no se encuentra como módulo en la vía de acceso de SQL y el calificador no coincidió con el nombre de módulo de contexto, se busca un sinónimo público de módulo que coincida con el calificador. Si se encuentra, se resuelve el objeto en el módulo identificado por el sinónimo público de módulo, teniendo en cuenta únicamente los objetos de módulo publicados.
