Procesos de verbos de objeto comercial
Esta sección describe los aspectos siguientes del
proceso de los verbos de un objeto comercial:
- Determinación del verbo, que describe cómo el
conector determina el verbo que se debe utilizar para cada
objeto comercial de origen.
- Imágenes posteriores y deltas, que define los
términos y describe cómo el conector trabaja con imágenes
posteriores
- Proceso de verbos, que describe los
pasos que el conector emprende al crear, recuperar, actualizar o
suprimir un objeto comercial
- Sentencias de SQL, que describe
cómo el conector utiliza sentencias simples de SQL para
operaciones de selección, actualización, recuperación o supresión
- Procedimientos almacenados, que describe cómo el
conector utiliza procedimientos almacenados
- Confirmación y
retrotracción de transacciones, que describe
brevemente cómo el conector utiliza bloques de transacciones
Determinación del verbo
Un objeto comercial de nivel superior y cada uno de
sus objetos comerciales hijo puede contener sus propios verbos.
Por tanto, un intermediario de integración puede pasar al
conector un objeto comercial que tiene verbos diferentes para
los objetos comerciales padre y los objetos comerciales hijo.
Cuando se da esta condición, el conector utiliza el verbo del
objeto comercial padre de nivel superior para determinar cómo
procesar el objeto comercial completo.
Para obtener más información, consulte Proceso de verbos.
Imágenes posteriores y deltas
Una imagen posterior es el
estado de un objeto comercial después de realizar todos los
cambios en el objeto.
Un delta es un objeto comercial utilizado
en una operación de actualización que sólo contiene valores de
clave y los datos que se deben cambiar.
Puesto que el conector sólo puede trabajar con imágenes
posteriores, cuando recibe un objeto comercial para actualizar,
el conector supone que el objeto comercial representa el estado
deseado de los datos tras la actualización.
Por tanto, cuando un intermediario de integración envía al
conector un objeto comercial con el verbo Actualizar, el
conector cambia la representación actual del objeto comercial en
la base de datos para que coincida exactamente con el objeto
comercial de origen.
Para hacer esto, el conector cambia valores de atributos simples
y añade o elimina objetos comerciales hijo.
Por ejemplo, suponga que el estado actual de Contrato 2345 en
la base de datos es el siguiente:
Suponga también que el intermediario de integración pasa el
objeto comercial siguiente al conector:
Para procesar la actualización, el conector aplica los
cambios siguientes a la base de datos:
- Actualiza los atributos simples en los objetos comerciales
de nivel superior Contrato y Dirección
- Crea el objeto comercial Teléfono
- Actualiza los atributos simples en los objetos comerciales hijo A, B, F y G
- Suprime los objetos comerciales hijo C, D y E
- Crea los objetos comerciales hijo H, I y J
Debido a que el conector supone que cada objeto comercial
que recibe del intermediario de integración representa una
imagen posterior, es importante asegurarse de que cada objeto
comercial enviado para actualizar a ese conector contenga
objetos comerciales hijo existentes válidos.
Aunque no haya cambiado ninguno de los atributos simples de un
objeto comercial hijo, el objeto comercial hijo debe estar
incluido en el objeto comercial de origen.
Sin embargo, existe una forma de impedir que algunos
conectores supriman objetos comerciales hijo faltantes durante
una operación de actualización.
Puede utilizar la información específica de la aplicación
correspondiente al atributo representativo del hijo o matriz de
hijos para indicar al conector que conserve los objetos
comerciales hijo que no estén incluidos en el objeto comercial
de origen.
Para hacer esto, establezca KEEP_RELATIONSHIP en
true. Para obtener más información, consulte Especificación de la
clave foránea de un atributo.
Proceso de verbos
Esta sección describe los pasos que el conector
emprende al crear, recuperar, actualizar o suprimir un objeto
comercial que ha recibido de un intermediario de integración.
El conector procesa los objetos comerciales jerárquicos de forma
recursiva, es decir, ejecuta los mismos pasos para cada objeto
comercial hijo hasta que ha procesado todos los objetos
comerciales individuales.
Nota:
Un objeto comercial de nivel superior que sea un
objeto envoltorio admite la utilización de los verbos de crear,
recuperar, actualizar y suprimir.
La única diferencia en el proceso de un objeto envoltorio es que
el objeto envoltorio no se procesa, sólo se procesan los objetos
que contiene.
Comparación
de objetos comerciales
En diversos momentos del proceso descrito más abajo,
el conector compara dos objetos comerciales para ver si son
idénticos.
Por ejemplo, durante una operación de actualización, el conector
determina si un objeto comercial determinado existe en una
matriz de objetos comerciales.
Para realizar la comprobación, el conector compara el objeto
comercial con cada objeto comercial contenido en la matriz.
Para que dos objetos comerciales sean idénticos, se deben
cumplir estas dos condiciones:
- El tipo de los objetos comerciales sujetos a comparación
debe ser el mismo.
Por ejemplo, un objeto comercial Cliente no se considera nunca
que es idéntico a un objeto comercial Contacto aunque todos sus
atributos sean exactamente los mismos.
- Todos los atributos de clave correspondientes de los dos
objetos comerciales deben contener valores idénticos.
Si un atributo de clave tiene el valor CxIgnore en
ambos objetos comerciales, el conector considera que los objetos
son idénticos.
En cambio, si un atributo de clave tiene el valor
CxIgnore en uno de los objetos comerciales, pero no en
el otro, los objetos comerciales no son idénticos.
Operaciones de creación
Cuando crea un objeto comercial, el conector devuelve
el código de estado VALCHANGE si la operación se ha
realizado satisfactoriamente (con independencia de si la
operación ha causado o no cambios en el objeto comercial), o
devuelve FAIL si la operación ha fallado.
El conector ejecuta los pasos siguientes al crear un objeto
comercial jerárquico:
- Inserta recursivamente cada objeto comercial hijo de
cardinalidad simple contenido con propietario en la base de
datos.
Es decir, el conector crea el objeto hijo y todos los objetos
hijo contenidos en el hijo y en sus hijos.
Si la definición del objeto comercial especifica que un
atributo representa un objeto comercial hijo con cardinalidad
simple y que el atributo está vacío, el conector pasa por alto
el atributo.
Sin embargo, si la definición del objeto comercial necesita que
un atributo represente un hijo y no lo hace, el conector
devuelve un error y detiene el proceso.
- Procesa cada objeto comercial hijo de cardinalidad simple
contenido sin propietario, de la manera siguiente:
- Intenta recursivamente recuperar el hijo de la base de datos
utilizando los valores de clave pasados por el intermediario de
integración.
- Si la recuperación es infructuosa, lo que indica que el hijo
no existe actualmente en la base de datos, el conector devuelve
un error y detiene el proceso.
Si la recuperación se realiza satisfactoriamente, el conector
actualiza recursivamente el objeto comercial hijo.
Nota:
Para que esta manera de proceder sea efectiva
cuando el objeto comercial hijo ya existe en la base de datos de
la aplicación, asegúrese de que las referencias cruzadas de los atributos de clave primaria
de los objetos comerciales hijo sean correctas en las
operaciones de creación.
Si el objeto comercial hijo no existe ya en la base de datos de
la aplicación, establezca los atributos de clave primaria en
CxBlank.
- Inserta el objeto comercial de nivel superior en la base de
datos, de esta manera:
- Establece los valores de clave foránea del objeto de nivel
superior en los valores de clave primaria del correspondiente
objeto comercial hijo representado con cardinalidad simple.
Debido a que los valores contenidos en los objetos comerciales hijo pueden ser establecidos por secuencias o contadores de
base de datos o por la propia base de datos durante la creación
del hijo, este paso asegura que los valores de clave foránea del
padre sean correctos antes de que el conector inserte el padre
en la base de datos.
- Crea un nuevo valor de ID exclusivo para cada atributo definido
automáticamente por la base de datos.
El nombre de la secuencia o contador de base de datos se guarda
en la información específica de la aplicación correspondiente al
atributo.
Si un atributo tiene una secuencia o contador de base de datos
asociado, el valor creado por el conector sobrescribe cualquier
valor pasado por el intermediario de integración.
Para obtener más información sobre la especificación de una
secuencia o contador de base de datos, consulte UID=AUTO en
Información específica de la aplicación para atributos
simples.
- Copia el valor de un atributo en el valor de otro atributo
tal como especifica el parámetro CA (CopyAttribute)
de la información específica de la aplicación correspondiente al
atributo.
Para obtener más información sobre la utilización del parámetro
CA, consulte CA=set_attr_name en Información específica de la aplicación para atributos
simples.
- Inserta el objeto comercial de nivel superior en la base de
datos.
Nota:
Si el objeto comercial de nivel superior es un
objeto envoltorio, no se insertará en la base de datos.
- Procesa cada uno de los objetos comerciales hijo de
cardinalidad simple del objeto de nivel superior en los que la
relación padre/hijo se guarda en el hijo, de la manera
siguiente:
- Establece los valores de clave foránea del hijo para hacer
referencia al valor de los correspondientes atributos de clave
primaria contenidos en el padre.
Debido a que los valores de clave primaria del padre se pueden
haber generado durante la creación del padre, esto asegura que
sean correctos los valores de clave foránea de cada hijo antes
de que el conector inserte el hijo en la base de datos.
- Inserta el hijo en la base de datos.
- Procesa cada uno de los objetos comerciales hijo de
cardinalidad múltiple contenidos en el objeto de nivel superior,
de esta manera:
- Establece los valores de clave foránea de cada hijo para
hacer referencia al valor de los correspondientes atributos de
clave primaria contenidos en el padre.
Debido a que los valores de clave primaria del padre se pueden
haber generado durante la creación del padre, esto asegura que
sean correctos los valores de clave foránea de cada hijo antes
de que el conector inserte el hijo en la base de datos.
- Inserta cada objeto comercial hijo de cardinalidad múltiple
en la base de datos.
Operaciones Retrieve (recuperación)
El conector ejecuta los pasos siguientes al recuperar
objeto comercial jerárquico:
- Elimina todos los objetos comerciales hijo del objeto
comercial de nivel superior que ha recibido del intermediario de
integración.
- Recupera el objeto comercial de nivel superior de la base de
datos.
- Si la recuperación devuelve una sola fila, el conector
continúa el proceso.
- Si la recuperación no devuelve ninguna fila, lo que indica
que el objeto comercial de nivel superior no existe en la base
de datos, el conector devuelve BO_DOES_NOT_EXIST.
- Si la recuperación devuelve más de una fila, el conector
devuelve FAIL.
Notas:
- Un objeto comercial puede tener atributos que no
corresponden a ninguna columna de base de datos, como los
atributos marcadores de posición.
Durante la recuperación, el conector no cambia tales atributos
en el objeto comercial de nivel superior; estos atributos
permanecen establecidos en los valores que han recibido del
intermediario de integración.
En los objetos comerciales hijo, el conector establece tales
atributos en sus valores por omisión durante la recuperación.
- Un objeto comercial de nivel superior que sea un objeto
envoltorio debe contener todos los valores de atributo de los
objetos situados en el nivel inmediatamente por debajo del
objeto envoltorio, los cuales serían necesarios para recuperar los objetos, incluidos los atributos de clave y los
atributos marcadores de posición.
El objeto envoltorio debe tener definidos todos los atributos de
clave y atributos marcadores de posición.
Los atributos simples del objeto envoltorio que se utilizarán
como claves foráneas en los objetos situados en el nivel
inmediatamente por debajo del envoltorio deben estar marcados
como claves en el objeto envoltorio.
- El conector recupera recursivamente todos los objetos
comerciales hijo de cardinalidad múltiple.
Nota:
El conector no exige la unicidad de los valores
al llenar con datos una matriz de objetos comerciales.
Corresponde a la base de datos garantizar la unicidad de los
valores.
Si la base de datos devuelve objetos comerciales hijo
duplicados, el conector devuelve hijos duplicados.
- El conector recupera recursivamente cada hijo de
cardinalidad simple, con independencia de si el objeto comercial
hijo está contenido con o sin propietario.
Nota:
Todos los objetos comerciales hijo de
cardinalidad simple se procesan de acuerdo con su aparición en
el objeto comercial y antes de que se procese el objeto
comercial padre.
La posesión y no-posesión del objeto hijo no determinan la
secuencia de proceso, pero sí el tipo de proceso.
Operaciones
RetrieveByContent
El verbo RetrieveByContent sólo es aplicable al objeto
comercial de nivel superior, pues el conector realiza
operaciones de recuperación basándose en atributos que sólo
existen en el objeto comercial de nivel superior.
Si un objeto comercial de nivel superior utiliza el verbo
RetrieveByContent, se utilizan como criterios de recuperación
todos los atributos no nulos (incluidos los atributos que no son
de clave).
Si se devuelve más de una fila, el conector utiliza la
primera fila como fila resultante y devuelve
MULTIPLE_HITS.
Nota:
El verbo RetrieveByContent no es aplicable a un
objeto comercial de nivel superior que sea un objeto envoltorio.
Operaciones Update (actualización)
Cuando actualiza un objeto comercial, el conector
devuelve el código de estado VALCHANGE si la
operación se ha realizado satisfactoriamente (con independencia
de si la operación ha causado o no cambios en el objeto
comercial), o devuelve FAIL si la operación ha
fallado. Cuando trabaja con una base de datos Oracle, el
conector bloquea los datos mientras los recupera para asegurar su
integridad.
El conector ejecuta los pasos siguientes al actualizar un
objeto comercial jerárquico:
- Utiliza los valores de clave primaria del objeto comercial
de origen para recuperar la entidad correspondiente de la base de
datos.
El objeto comercial recuperado es una representación exacta
del estado actual de los datos en la base de datos.
- Si la recuperación falla, lo que indica que el objeto
comercial de nivel superior no existe en la base de datos, el
conector devuelve BO_DOES_NOT_EXIST y la
actualización falla.
Nota:
Si un objeto comercial de
nivel superior es un objeto envoltorio, no es necesario que
exista en la base de datos.
Sin embargo, el objeto comercial de nivel superior debe contener
todos los valores de atributo de los objetos situados en el
nivel inmediatamente por debajo del objeto envoltorio, los
cuales serían necesarios para recuperar los objetos, incluidos
los atributos de clave y atributos marcadores de posición.
El objeto envoltorio debe tener definidos todos los atributos de
clave y atributos marcadores de posición.
Los atributos simples del objeto envoltorio que se utilizarán
como claves foráneas en los objetos situados en el nivel
inmediatamente por debajo del envoltorio deben estar marcados
como claves en el objeto envoltorio.
- Si la recuperación tiene éxito, el conector compara el
objeto comercial recuperado con el objeto comercial de origen para
determinar qué objetos comerciales hijo necesitan cambios en la
base de datos.
Sin embargo, el conector no compara los valores de atributos
simples del objeto comercial de origen con los contenidos
en el objeto comercial recuperado.
El conector actualiza el valor de todos los atributos simples
que no son de clave.
Si todos los atributos simples del objeto comercial de nivel
superior representan claves, el conector no puede generar una
consulta de actualización para el objeto comercial de nivel
superior.
En este caso, el conector registra un aviso y continúa en el
paso 2.
- El conector actualiza recursivamente todos los hijos de
cardinalidad simple del objeto comercial de nivel superior.
Si la definición de objeto comercial exige que un atributo
represente un objeto comercial hijo, el hijo debe existir tanto
en el objeto comercial de origen como en el objeto comercial
recuperado.
De lo contrario, la actualización falla y el conector devuelve
un error.
El conector maneja los hijos de cardinalidad simple
contenidos con propietario de una de las maneras siguientes:
- Si el hijo existe tanto en el objeto comercial de origen como
en el objeto recuperado, en lugar de actualizar el hijo ya
existente en la base de datos, el conector suprime el hijo
existente y crea un nuevo hijo.
- Si el hijo existe en el objeto comercial de origen, pero no en
el objeto comercial recuperado, el conector lo crea recursivamente
en la base de datos.
- Si el hijo existe en el objeto comercial recuperado, pero no
en el objeto comercial de origen, el conector lo suprime
recursivamente de la base de datos.
El tipo de supresión, física o lógica, depende del valor de la
propiedad ChildUpdatePhyDelete de la operación de supresión.
Para los hijos de cardinalidad simple contenidos sin
propietario, el conector intenta recuperar cada hijo de la base
de datos que esté presente en el objeto comercial de origen.
Si recupera el hijo con éxito, el conector llena con datos el
objeto comercial hijo, pero no lo actualiza, pues el conector
nunca modifica los hijos de cardinalidad simple contenidos sin
propietario.
- Para los objetos comerciales hijo de cardinalidad simple
que guardan la relación padre/hijo en el padre, el conector
establece cada valor de clave foránea del padre en el valor de
la clave primaria existente en el correspondiente objeto
comercial hijo de cardinalidad simple.
Este paso es necesario porque los hijos de cardinalidad simple
se pueden haber añadido a la base de datos en pasos anteriores,
dando lugar a la creación de nuevos ID exclusivos.
- El conector actualiza todos los atributos simples del objeto
comercial recuperado, excepto aquéllos cuyo atributo
correspondiente en el objeto comercial de origen contiene el valor
CxIgnore.
Debido a que el objeto comercial que se
está actualizando debe ser exclusivo, el conector verifica que
como resultado se procese una sola fila.
El conector devuelve un error si se devuelve más de una fila.
- El conector asigna el valor de clave primaria del
correspondiente objeto comercial padre a todos los valores de
clave foránea de cada hijo que guarda la relación padre/hijo en
el hijo (tanto de cardinalidad simple como de cardinalidad
múltiple).
(Cuando se utiliza InterChange Server como intermediario de
integración, normalmente se han establecido referencias cruzadas
entre estos valores durante la correlación de datos).
Sin embargo, este paso es importante para asegurarse de que sean
correctos los valores de clave foránea de los nuevos hijos que
guardan la relación padre/hijo en el hijo, antes de que el
conector actualice esos hijos.
- El conector procesa cada hijo de cardinalidad múltiple del
objeto comercial recuperado de una de las maneras siguientes:
- Si el hijo existe tanto en las matrices de los objetos
comerciales de origen como en los objetos comerciales
recuperados, el conector actualiza recursivamente el hijo en la
base de datos.
- Si el hijo existe en la matriz de origen, pero no en la
matriz del objeto comercial recuperado, el conector crea
recursivamente el hijo en la base de datos.
- Si el hijo existe en la matriz del objeto comercial
recuperado, pero no en la matriz de origen, el conector suprime
recursivamente el hijo de la base de datos, a menos que la
información específica de aplicación correspondiente al atributo
que representa al hijo en el padre tenga el parámetro
KEEP_RELATIONSHIP establecido en true. En
este caso, el conector no suprime el hijo de la base de datos.
Para obtener más información, consulte Especificación de la
clave foránea de un atributo. El tipo de supresión, física o lógica, depende
del valor de la propiedad ChildUpdatePhyDelete de la operación de supresión.
Nota:
El intermediario de integración debe asegurarse
de que los objetos comerciales contenidos con cardinalidad
múltiple en el objeto comercial de origen sean exclusivos (es
decir, que una matriz no contenga dos o más ejemplares del mismo
objeto comercial).
Si el conector recibe duplicados de un objeto comercial en una
matriz de origen, procesará el objeto comercial dos veces, lo cual
puede producir resultados imprevisibles.
Operaciones DeltaUpdate
El proceso del verbo DeltaUpdate es diferente al
proceso del verbo Update en los aspectos siguientes:
- En un DeltaUpdate no se realiza ninguna recuperación antes de
la actualización, a diferencia de lo que ocurre en el proceso
del verbo Update.
- No se realizan comparaciones entre el objeto comercial
de entrada y el objeto comercial existente en la base de datos.
- Todos los hijos se procesan de acuerdo con el verbo definido
en cada objeto hijo.
Si un hijo no tiene un verbo definido en él, el conector
devolverá un error.
Cuando realiza una actualización delta de un objeto
comercial, el conector devuelve el código de estado
VALCHANGE si la operación se ha realizado
satisfactoriamente (con independencia de si la operación ha
causado o no cambios en el objeto comercial), o devuelve
FAIL si la operación ha fallado.
El conector ejecuta los pasos siguientes al efectuar una
actualización delta de un objeto comercial jerárquico:
- Procesa recursivamente todos los hijos de cardinalidad
simple del objeto padre.
Si un hijo está marcado como IsRequired en la especificación del
objeto comercial, el hijo debe estar presente en el objeto de
entrada.
De lo contrario, la actualización delta fallará y el conector
devolverá un error.
- El conector establece todos los valores de clave foránea del
padre que hacen referencia a atributos de hijos de cardinalidad
simple en los valores correspondientes del objeto hijo.
Esto es necesario porque los hijos de cardinalidad simple se
pueden haber añadido a la base de datos en pasos anteriores,
dando lugar a la creación de nuevos valores de secuencia.
- El conector actualiza mediante una sentencia
UPDATE de SQL o un procedimiento almacenado el objeto
actual que se está procesando. Se actualizan todos los atributos
simples del objeto comercial individual, excepto aquellos
atributos que tienen asignado el valor IsIgnore en el objeto
comercial de entrada. El conector no compara a nivel de atributo
el objeto de entrada con el objeto actual para determinar qué
atributos es necesario añadir a la sentencia de actualización;
se actualizan todos los atributos.
Debido a que el objeto que se está actualizando debe ser
exclusivo, el conector verifica que solamente se procese una
sola fila como resultado.
Se devuelve un error si se procesa más de una fila.
- El conector asigna los correspondientes valores del
objeto padre a todos los valores de clave foránea en
todos los hijos de cardinalidad N del objeto actual que hacen
referencia a atributos del padre.
Normalmente ya se habrán establecido referencias cruzadas entre
estos valores durante la correlación de datos; sin embargo, esto
puede no ser así para hijos nuevos existentes en contenedores de
cardinalidad N.
Este paso garantiza que los valores de clave foránea sean
correctos en todos los hijos de cardinalidad N antes de que se
actualicen esos hijos.
- El conector actualiza todos los contenedores de cardinalidad
N del objeto actual.
Cuando se procesan los objetos hijo, se obtiene el verbo de
cada hijo y se realiza la operación apropiada.
Los verbos permitidos en una operación DeltaUpdate para un hijo
son Create, Delete y DeltaUpdate.
- Si se encuentra un verbo Create en el hijo, se crea el hijo
en la base de datos si es un hijo de un propietario.
Los hijos sin propietario se recuperan para comprobar su
existencia en la base de datos.
- Si se encuentra un verbo Delete en el hijo, se suprime ese
hijo.
- Si se encuentra un verbo DeltaUpdate en el hijo, se
actualiza el hijo en la base de datos.
Operaciones Delete (supresión)
Cuando suprime un objeto comercial, el conector
devuelve el estado SUCCESS si la operación ha sido
satisfactoria, o FAIL si la operación ha fallado.
Primero se recupera el objeto comercial padre y luego el
adaptador suprime recursivamente todos los hijos de cardinalidad
simple que sean propiedad del padre; a continuación suprime el
propio padre y finalmente todos los hijos de cardinalidad N.
Los hijos sin propietario, de cardinalidad simple, no se
suprimen nunca.
Si el objeto comercial no existe, el conector devuelve el estado
FAIL.
El conector puede realizar supresiones lógicas y físicas,
dependiendo del valor del Nombre de la columna de estado (valor
SCN) existente en la información específica de la aplicación
correspondiente al objeto.
Si el valor SCN está definido, el conector realiza una supresión
lógica.
Si el valor SCN no está definido, el conector realiza una supresión
física.
Supresiones físicas
El conector ejecuta los pasos siguientes cuando
realiza la supresión física de un objeto comercial jerárquico:
- Suprime recursivamente todos los objetos comerciales hijo de
cardinalidad simple contenidos con propietario.
- Suprime el objeto comercial de nivel superior.
- Suprime recursivamente todos los objetos comerciales hijo
de cardinalidad múltiple.
Nota:
Un objeto comercial de nivel superior que sea un
objeto envoltorio carece de la tabla de base de datos
correspondiente, por lo que no se suprime de la base de datos.
Los valores de atributos simples de un objeto envoltorio no se
tendrán en cuenta.
Supresiones lógicas
El conector ejecuta los pasos siguientes cuando
realiza la supresión lógica de un objeto comercial:
- Emite una sentencia UPDATE que asigna al
atributo de estado del objeto comercial el valor especificado
por la información específica de la aplicación correspondiente
al objeto comercial.
El conector verifica que como resultado se actualice una sola
fila de la base de datos y devuelve un error si se actualiza más
de una fila.
- Realiza una supresión lógica recursiva de todos los hijos de
cardinalidad simple contenidos con propietario y de todos los
hijos de cardinalidad múltiple.
El conector no suprime los hijos de cardinalidad simple
contenidos sin propietario.
Sentencias de SQL
El conector puede utilizar sentencias simples de SQL
para operaciones de selección, actualización, recuperación o
supresión.
Los nombres de columna utilizados para las sentencias de SQL se
obtienen de la propiedad AppSpecificInfo de un
atributo. Cada consulta abarca una sola tabla, a menos que se
emita para una vista.
Procedimientos almacenados
Un procedimiento almacenado es un grupo de sentencias
de SQL que forman una unidad lógica y ejecutan una tarea
determinada.
Un procedimiento almacenado abarca un conjunto de operaciones o
consultas para que el conector las ejecute sobre un objeto
contenido en un servidor de bases de datos.
El conector invoca un procedimiento almacenado en las
circunstancias siguientes:
- Antes de procesar un objeto comercial, para realizar
procesos operacionales preparatorios
- Después de procesar un objeto comercial, para realizar
procesos post-operacionales
- Para ejecutar un conjunto de operaciones sobre un objeto
comercial, en lugar de utilizar una sentencia simple
INSERT, RETRIEVE, UPDATE o
DELETE
Cuando procesa un objeto comercial jerárquico, el conector
puede utilizar un procedimiento almacenado para procesar el
objeto comercial de nivel superior o cualquiera de sus objetos
comerciales hijo.
Pero cada objeto comercial o matriz de objetos comerciales debe
tener su propio procedimiento almacenado.
Especificación de un procedimiento
almacenado
Esta sección describe los pasos que debe seguir para
hacer que el conector utilice un procedimiento almacenado para
un objeto comercial.
Se tratan los temas siguientes:
Adición de atributos
al objeto comercial
Debe añadir una clase especial de atributo al objeto
comercial para cada tipo de procedimiento almacenado que procese
el conector.
Estos atributos representan sólo el tipo de procedimiento
almacenado y la información específica de la aplicación que lo
define.
Estos atributos no utilizan los parámetros de información
específica de la aplicación que se pueden utilizar para un
atributo simple estándar.
Designe el atributo de acuerdo con el tipo de procedimiento
almacenado que se debe utilizar.
Por ejemplo, para hacer que el conector utilice los
procedimientos almacenados AfterUpdate y BeforeRetrieve, añada
los atributos AfterUpdateSP y
BeforeRetrieveSP.
El conector reconoce los nombres siguientes de atributos de
objeto comercial:
BeforeCreateSP
AfterCreateSP
CreateSP
BeforeUpdateSP
AfterUpdateSP
UpdateSP
BeforeDeleteSP
AfterDeleteSP
DeleteSP
BeforeRetrieveSP
AfterRetrieveSP
RetrieveSP
BeforeRetrieveByContentSP
AfterRetrieveByContentSP
RetrieveByContentSP
BeforeRetrieveUpdateSP
AfterRetrieveUpdateSP
RetrieveUpdateSP
BeforeDeltaUpdateSP
AfterDeltaUpdateSP
DeltaUpdateSP
Nota:
Cree un atributo sólo para aquellos
procedimientos almacenados que desee que sean ejecutados por el
conector.
Utilice la información específica de la aplicación o la
correlación de datos (sólo si se utiliza InterChange Server como
intermediario de integración) para especificar valores para
estos atributos antes de que el objeto comercial se envíe al
conector.
Es necesario reiniciar el conector para que reconozca los
cambios hechos en estos valores para las llamadas subsiguientes
realizadas para un objeto comercial.
Sintaxis de un
procedimiento almacenado
La sintaxis para especificar un procedimiento
almacenado es la siguiente:
SPN=nombre_procedimiento_almacenado;RS=true|false[;IP=nombre_atributo1
[:nombre_atributo2 [:...]]] [;OP=nombre_atributo1| RS[:nombre_atributo2| RS [:...]]]
[;IO=nombre_atributo1[:nombre_atributo2[:...]]]
donde:
- nombre_procedimiento_almacenado
- Es el nombre del procedimiento almacenado.
- RS
- Es true si el procedimiento almacenado devuelve
un conjunto de resultados, o false en caso contrario.
El valor por omisión es false. Si el valor es
true, la propiedad ColumnName contenida en
la información específica de la aplicación de un atributo
apunta a la columna apropiada del conjunto de resultados.
Si RS forma parte de la lista de parámetros de salida, ese
parámetro determinado devuelve un conjunto de resultados.
Solamente se permite un sólo parámetro OUT como
conjunto de resultados.
Si se devuelve más de un conjunto de resultados como parámetro
OUT, sólo se devuelve el primer conjunto de
resultados y los demás se pasan por alto.
Actualmente esta característica está disponible para Oracle 8i y
versiones posteriores, para procedimientos almacenados que hacen
uso del Controlador JDBC de Oracle.
Para el procedimiento almacenado contenido en la base de datos,
el parámetro correspondiente debe devolver un tipo
REFCURSOR.
- IP
- Parámetros de entrada: es la lista de atributos de objeto
comercial cuyos valores el conector debe utilizar como valores
de entrada al ejecutar el procedimiento almacenado.
- OP
- Parámetros de salida: es la lista de atributos de objeto
comercial a los cuales el conector debe devolver valores
tras ejecutar el procedimiento almacenado.
Consulte RS para obtener una descripción del conjunto de
resultados.
- IO
- Parámetros de entrada/salida: es la lista de atributos de
objeto comercial cuyos valores el conector debe utilizar como
valores de entrada y a los cuales el conector debe devolver
valores tras ejecutar el procedimiento almacenado.
El orden de los parámetros
nombre_procedimiento_almacenado y RS es
importante, no así el orden de los parámetros entre ellos.
Es decir, no es importante para el conector si el procedimiento
almacenado agrupa todos los parámetros de cada tipo o si mezcla
los tipos de parámetros.
Cuando varios parámetros del mismo tipo estén agrupados juntos,
separe los valores utilizando un signo de dos puntos como
delimitador; no es necesario que repita el tipo de parámetro
para cada valor.
Separe los parámetros de tipos diferentes utilizando un signo de
punto y coma como delimitador.
Cuando especifique valores de parámetros, no coloque un espacio
en blanco en ninguno de los dos lados del signo de igualdad (=).
Ejemplos de procedimientos almacenados que devuelven
conjuntos de resultados
Los ejemplos siguientes hacen uso de los
procedimientos almacenados denominados
CustomerAddressRetrieve y
CustomerAddressRetrieveForOracleDB para devolver un
conjunto de resultados que contiene varias direcciones y se
utiliza para crear un objeto comercial hijo de cardinalidad N.
Nota:
Los conjuntos de resultados se procesan para el
atributo RetrieveSP solamente y se utilizan para crear un objeto
comercial hijo de cardinalidad N.
Para las bases de datos Oracle, el conjunto de resultados se
devuelve como parámetro de salida y es procesado por el
adaptador según convenga.
Para otras bases de datos, el conjunto de resultados es un valor
de retorno devuelto por el procedimiento almacenado.
- CustomerAddressRetrieve (para bases de datos que no
sean Oracle)
Attribute : RetrieveSP
ASI : SPN=CustomerAddressRetrieve;RS=true;IP=CustomerName:IP=Customerld;
OP=ErrorStatus;OP=ErrorMsg
- CustomerAddressRetrieveForOracleDB (para bases de datos Oracle)
Attribute : RetrieveSP
ASI : SPN=CustomerAddressRetrieveForOracleDB;RS=true;IP=CustomerName:
IP=Customerld;OP=RS;OP=ErrorStatus;OP=ErrorMsg
(OP=RS significa que el primer parámetro de salida
es un conjunto de resultados)
Ejemplos de
procedimientos almacenados que no devuelven conjuntos de
resultados
Los ejemplos siguientes hacen uso de los
procedimientos almacenados denominados CustomerInsert
y VendorInsert que obtienen valores a partir de dos
atributos de entrada, y devuelven valores para cuatro atributos
de salida.
Los ejemplos muestran diferentes estructuras para procedimientos
almacenados.
- Los parámetros del mismo tipo están agrupados juntos (IP,
IP, OP, OP, OP, OP, IO):
SPN=CustomerInsert;RS=false;IP=LastName:FirstName;OP=CustomerName:
CustomerID:ErrorStatus:ErrorMessage;IO=VendorID
- Los parámetros del mismo tipo están mezclados (IP, OP, OP,
OP, IP, IO, OP):
SPN=VendorInsert;RS=false;IP=LastName;OP=CustomerName:
CustomerID:ErrorStatus;IP=FirstName;IO=VendorID;OP=ErrorMessage
El conector admite solamente los tipos de datos simples que
son compatibles con el controlador JDBC.
Especificación del
procedimiento almacenado
Existen dos formas de especificar el nombre del
procedimiento almacenado y los valores de sus parámetros:
- Propiedad AppSpecificInfo del atributo
Si la longitud del texto por el que se especifica el
procedimiento almacenado es menor o igual que
4000 bytes, puede especificar el valor en la propiedad
AppSpecificInfo del atributo. Puede utilizar esta
propiedad para especificar el procedimiento almacenado con
independencia de si el conector ha hecho sondeos para el objeto
comercial (es decir, el objeto comercial representa un suceso de
aplicación) o si ha recibido el objeto comercial como petición
de un intermediario de integración.
El ejemplo siguiente muestra la especificación del
procedimiento almacenado en la información específica de la
aplicación.
En este caso, el valor especificado para la propiedad
MaxLength no es importante para el procedimiento
almacenado.
[Attribute]
Name = BeforeCreateSP
Type = String
MaxLength = 15
IsKey = false
IsRequired = false
AppSpecificInfo = SPN=ContactInsert;IP=LastName:FirstName;OP=CustomerName:
CustomerID:ErrorStatus:ErrorMessage
[End]
- Valor del atributo (sólo aplicable si se utiliza
InterChange Server como intermediario de integración)
Si la longitud del texto por el que se especifica el
procedimiento almacenado tiene más de 4000 bytes, debe utilizar
la correlación de valores para especificar el procedimiento
almacenado.
Puede utilizar la correlación de valores para especificar el
procedimiento almacenado sólo si el objeto comercial representa
una petición de intermediario de integración.
Es decir, no puede utilizar el valor de un atributo para
especificar un procedimiento almacenado cuando el conector está
sondeando la presencia de sucesos.
Si el texto del procedimiento almacenado tiene más de
4000 bytes y utiliza la correlación de valores para especificar
el procedimiento almacenado, debe aumentar el valor de la
propiedad MaxLength para dar cabida al texto
completo.
Nota:
Si se ejecuta un procedimiento almacenado para
una operación de creación, actualización o supresión sobre un objeto
comercial jerárquico que contiene una matriz de objetos
comerciales hijo, el conector procesa cada objeto comercial
hijo individualmente.
Por ejemplo, si el conector ejecuta un procedimiento almacenado
BeforeCreate, no procesa la matriz como una unidad,
sino que procesa cada miembro de la matriz.
Cuando el conector procesa un procedimiento almacenado
BeforeRetrieve, el conector actúa sobre un objeto
comercial individual.
Cuando el conector procesa un procedimiento almacenado
AfterRetrieve, el conector actúa sobre todos los
objetos comerciales devueltos por la operación de recuperación.
Proceso de objetos comerciales utilizando procedimientos
almacenados o sentencias simples de SQL
Los temas siguientes describen cómo el conector
procesa los procedimientos almacenados:
Operaciones de creación de objetos
comerciales
Normalmente un procedimiento almacenado Create
devuelve valores que el conector utiliza para cumplimentar los
atributos simples del objeto comercial de nivel superior.
El conector ejecuta los pasos siguientes cuando procesa los
procedimientos almacenados Create (BeforeCreate,
Create, AfterCreate):
- Comprueba si el objeto comercial contiene un atributo
BeforeCreateSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
BeforeCreate.
- Si el procedimiento almacenado devuelve valores mediante
parámetros de salida, el conector utiliza los valores para
definir el valor de atributos simples del objeto comercial.
- El conector crea los objetos comerciales hijo de
cardinalidad simple.
- Establece los valores de clave foránea del objeto comercial
de nivel superior en el valor de clave primaria de cada objeto
comercial hijo de cardinalidad simple.
- Comprueba si el objeto comercial contiene un atributo
CreateSP. Si el objeto comercial contiene el atributo, el
conector invoca el procedimiento almacenado Create
para crear el objeto comercial de nivel superior.
Si el objeto comercial no contiene el atributo, el conector crea
y ejecuta una sentencia INSERT para crear el objeto
comercial de nivel superior.
- Si el procedimiento almacenado Create devuelve
valores mediante parámetros de salida, el conector utiliza los
valores para definir el valor de atributos simples del objeto
comercial.
- El conector establece el valor de clave foránea de cada
hijo de cardinalidad múltiple en el valor del atributo de clave
primaria del padre respectivo del objeto hijo.
- El conector crea los objetos comerciales hijo de
cardinalidad múltiple.
- Comprueba si el objeto comercial contiene un atributo
AfterCreateSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
AfterCreate.
- Si el procedimiento almacenado devuelve valores mediante
parámetros de salida, el conector utiliza los valores para
definir el valor de atributos simples del objeto comercial.
El conector puede utilizar los valores devueltos en el paso
10 para cambiar el valor de un objeto comercial que creó en los
pasos 3 o 5.
Operaciones de
actualización de objetos comerciales
Normalmente un procedimiento almacenado Update
devuelve valores que el conector utiliza para cumplimentar los
atributos simples del objeto comercial de nivel superior.
El conector ejecuta los pasos siguientes cuando procesa los
procedimientos almacenados Update (BeforeUpdate,
Update, AfterUpdate):
- Comprueba si el objeto comercial contiene un atributo
BeforeUpdateSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
BeforeUpdate.
- Si el procedimiento almacenado BeforeUpdate
devuelve valores mediante parámetros de salida, el conector
utiliza los valores para definir el valor de atributos simples
del objeto comercial.
- El conector actualiza los objetos comerciales hijo de
cardinalidad simple.
- Establece los valores de clave foránea del objeto comercial
de nivel superior en el valor de clave primaria de cada objeto
comercial hijo contenido con cardinalidad simple.
- Comprueba si el objeto comercial contiene un atributo
UpdateSP. Si el objeto comercial contiene el atributo, el
conector invoca el procedimiento almacenado Update
para actualizar el objeto comercial de nivel superior.
Si el objeto comercial no contiene el atributo, el conector crea
y ejecuta una sentencia UPDATE para actualizar el
objeto comercial de nivel superior.
- Si el procedimiento almacenado Update devuelve
valores mediante parámetros de salida, el conector utiliza los
valores para definir el valor de atributos simples del objeto
comercial.
- Establece los valores de clave foránea de los hijos de
cardinalidad múltiple para hacer referencia al valor de los
correspondientes atributos de clave primaria contenidos en el
padre.
- El conector actualiza los objetos comerciales hijo de
cardinalidad múltiple.
- Comprueba si el objeto comercial contiene un atributo
AfterUpdateSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
AfterUpdate.
- Si el procedimiento almacenado devuelve valores mediante
parámetros de salida, el conector utiliza los valores para
definir el valor de atributos simples del objeto comercial.
Operaciones de
supresión de objetos comerciales
Un procedimiento almacenado Delete no devuelve valores
al conector.
El conector ejecuta los pasos siguientes cuando procesa los
procedimientos almacenados Delete (BeforeDelete,
Delete, AfterDelete):
- Comprueba si el objeto comercial contiene un atributo
BeforeDeleteSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
BeforeUpdate.
- El conector suprime los objetos comerciales hijo de
cardinalidad simple.
- El conector suprime los objetos comerciales hijo de
cardinalidad múltiple.
- Comprueba si el objeto comercial contiene un atributo
DeleteSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado Delete
para suprimir el objeto comercial de nivel superior.
Si el objeto comercial no contiene el atributo, el conector crea
y ejecuta una sentencia DELETE.
- Comprueba si el objeto comercial contiene un atributo
AfterDeleteSP. Si el objeto comercial contiene el
atributo, el conector invoca el procedimiento almacenado
AfterDelete.
Operaciones de
recuperación de objetos comerciales
Para las operaciones de recuperación simples, se
pueden utilizar procedimientos almacenados para el objeto
comercial de nivel superior, los hijos de cardinalidad simple
así como para los hijos de cardinalidad múltiple.
El orden de los procedimientos es el siguiente:
- BeforeRetrieve
- Retrieve
- AfterRetrieve
El conector crea un objeto temporal para recuperar un objeto
comercial hijo de cardinalidad simple o de cardinalidad múltiple.
El conector aplica el procedimiento almacenado
BeforeRetrieve al objeto comercial temporal.
El procedimiento almacenado AfterRetrieve se aplica a
cada objeto hijo recuperado del contenedor.
El conector ejecuta el procedimiento almacenado
AfterRetrieve después de ejecutar sobre el objeto
comercial una consulta Retrieve generada
dinámicamente a partir de los metadatos del objeto comercial o
un procedimiento almacenado.
De acuerdo con la especificación JDBC, existen tres tipos de
llamadas de procedimiento almacenado
(StoredProcedure):
- {call <nombre_procedimiento_almacenado>(?,?,?)}
- {call <nombre_procedimiento_almacenado>}
- {?= call <nombre_procedimiento_almacenado>(?,?,?)}
donde nombre_procedimiento_almacenado es el nombre
del procedimiento almacenado.
El conector admite la utilización de los dos primeros tipos.
El conector procesará el conjunto de resultados
(ResultSet) devuelto por el procedimiento almacenado
(StoredProcedure).
En la sintaxis del procedimiento almacenado, si
RS=true, se procesa el conjunto de resultados del
procedimiento almacenado.
Si RS=false , no se procesa el conjunto de
resultados. El valor por omisión de RS es
false.
Una vez procesados los valores del conjunto de resultados, se
procesan las variables de salida del procedimiento almacenado.
Si RS=true, los hijos de cardinalidad múltiple no
pueden especificar las variables de salida en el procedimiento
almacenado asociado.
Nota:
El proceso del conjunto de resultados sólo se
permite para las operaciones del verbo Retrieve y para
RetrieveSP.
Proceso del conjunto de resultados devuelto por un
procedimiento almacenado de recuperación
(RetrieveSP)
Para el conjunto de resultados devuelto por el
procedimiento almacenado se obtienen metadatos del conjunto de
resultados (ResultSetMetaData). Se obtienen los
valores de todas las columnas del conjunto de resultados y esos
valores se asignan al atributo correspondiente del objeto
comercial.
La propiedad ColumnName de la información específica de la
aplicación correspondiente a un atributo debe contener el nombre
de columna de ResultSet para asociar el atributo a la columna.
Para los objetos de cardinalidad simple, el correspondiente
conjunto de resultados debe constar de una sola fila.
Si se devuelven varias filas en el conjunto de resultados, se
notifica un error.
Para los hijos de cardinalidad múltiple, se pueden devolver
varias filas a través del conjunto de resultados.
Para cada fila devuelta, se crea un nuevo objeto y se añade al
contenedor.
Luego el contenedor se añade al objeto padre en
el índice de atributo necesario.
El hijo de cardinalidad N de un objeto comercial envoltorio
tiene atributos de procedimiento almacenado, y los atributos
representan los parámetros de entrada y las columnas del
conjunto de resultados.
WRAPPER=true se establece a nivel de la información
específica de la aplicación correspondiente al objeto comercial.
La información específica de la aplicación correspondiente al
objeto comercial hijo tendrá TN=dummy.
Operaciones RetrieveByContent para objetos comerciales
Para las operaciones RetrieveByContent
simples, se pueden utilizar procedimientos almacenados sólo para
el objeto comercial de nivel superior y sus hijos de
cardinalidad simple; es decir, no se pueden utilizar para
devolver un conjunto de resultados ni varias filas.
El orden de los procedimientos es el siguiente:
- BeforeRetrieveByContent
- RetrieveByContent
- AfterRetrieveByContent
El conector crea un objeto temporal para recuperar un objeto
comercial hijo de cardinalidad simple o de cardinalidad
múltiple.
Para los objetos comerciales de cardinalidad múltiple, el
conector aplica el procedimiento almacenado
BeforeRetrieveByContent al objeto comercial temporal.
El procedimiento almacenado AfterRetrieveByContent se
aplica a cada objeto hijo recuperado del contenedor.
El conector ejecuta el procedimiento almacenado
AfterRetrieveByContent después de ejecutar sobre el
objeto comercial una consulta RetrieveByContent
generada dinámicamente a partir de los metadatos del objeto
comercial o un procedimiento almacenado.
En este caso, aunque la recuperación de un objeto comercial
jerárquico también recupera sus objetos comerciales hijo, el
conector ejecuta el procedimiento almacenado
AfterRetrieveByContent para cada objeto comercial
presente en la matriz.
Operaciones
Retrieve-for-Update para objetos comerciales
Los procedimientos almacenados siguientes se invocan
para el objeto comercial de nivel superior y recuperan todos los
objetos comerciales hijo de la misma manera que la operación
Retrieve simple.
El orden de los procedimientos es el siguiente:
- BeforeRetrieveUpdate
- RetrieveUpdate
- AfterRetrieveUpdate
Estos procedimientos almacenados ejecutan las mismas
operaciones que BeforeRetrieve y
AfterRetrieve. Los procedimientos tienen nombres
distintivos para que el usuario pueda crear atributos diferentes
que hagan que el conector ejecute tanto operaciones
BeforeRetrieve como BeforeRetrieveUpdate,
así como operaciones AfterRetrieve y
AfterRetrieveUpdate.
El conector crea un objeto temporal para recuperar un objeto
comercial hijo de cardinalidad simple o de cardinalidad
múltiple.
Para los objetos comerciales de cardinalidad múltiple, el
conector aplica el procedimiento almacenado
BeforeRetrieveUpdate al objeto comercial temporal.
El procedimiento almacenado AfterRetrieveUpdate se
aplica a cada objeto hijo recuperado del contenedor.
El conector ejecuta el procedimiento almacenado
AfterRetrieveUpdate después de ejecutar sobre el
objeto comercial una consulta RETRIEVE generada
dinámicamente a partir de los metadatos del objeto comercial o
un procedimiento almacenado.
En este caso, aunque la recuperación de un objeto comercial
jerárquico también recupera sus objetos comerciales hijo, el
conector ejecuta el procedimiento almacenado
AfterRetrieveUpdate para cada objeto comercial
presente en la matriz.
Confirmación y
retrotracción de transacciones
Cada vez que el conector recibe un objeto comercial
para su proceso, el conector inicia un bloque de transacciones.
Todas las sentencias de SQL que el conector ejecuta
mientras procesa ese objeto comercial están encapsuladas dentro
del bloque de transacciones.
Cuando el conector finaliza el proceso del objeto comercial,
confirma el bloque de transacciones si el proceso se realizó
satisfactoriamente, o retrotrae la transacción si el conector
encontró un error.
