Procedimientos almacenados
Los procedimientos almacenados son programas que están hospedados y se ejecutan en un servidor de BD. Es lo que se conoce como aplicaciones cliente. A menudo se escriben en algún dialecto extendido de SQL. Algunas bases de datos también admiten implementaciones en Java, .NET CLR y otros lenguajes de programación.
Entre los usos más frecuentes de los procedimientos almacenados se encuentran las consultas de la BD y la devolución de datos al cliente de llamada o la modificación de bases de datos tras la validación de los parámetros de entrada. Los procedimientos almacenados también pueden realizar otras acciones fuera de la base de datos, como enviar correos electrónicos.
Un procedimiento almacenado puede tener cero o más parámetros de entrada y salida y puede devolver cero o más conjuntos de datos valor de retorno predeterminado. En consecuencia, en MapForce puede llamar a un procedimiento almacenado de varias formas:
•Para obtener datos, como si fuera un componente de origen de la asignación. Esto se aplica a procedimientos que no toman parámetros de entrada. Cuando se ejecuta la asignación se llama al procedimiento y este devuelve un conjunto de datos o parámetros de salida. Puede asignar el conjunto de datos o los parámetros de salida, o ambos, a cualquier otro tipo de datos compatible con MapForce. Para ver un ejemplo consulte Procedimientos almacenados como fuente de datos.
•Como si fuera una llamada a una función, con parámetros. En este caso se suministran todos los parámetros de entrada necesarios desde la aplicación y también se puede asignar el conjunto de datos devuelto, o los parámetros de salida, o ambos, a otros destinos compatibles con MapForce. Para ver un ejemplo consulte Procedimientos almacenados con parámetros de entrada y salida.
•Como si fuera un componente de destino de la asignación. Un caso de uso típico sería llamar a un procedimiento almacenado con parámetros para modificar la base de datos (por ejemplo, insertar un registro). Este enfoque es adecuado si no necesita resultados del procedimiento almacenado. Además, con este enfoque puede ejecutar el procedimiento almacenado dentro de una transacción de BD que se puede revertir en caso de error. Para ver un ejemplo consulte Procedimientos almacenados en componentes de destino.
También puede haber casos en los que necesite llamar a procedimientos almacenados o ejecutar acciones en tablas de bases de datos en un orden concreto (primero insertar, luego actualizar, etc.). Por ejemplo, puede que necesite pasar el parámetro de salida de un procedimiento almacenado a otro procedimiento almacenado. O puede que necesite combinar los datos devueltos por un procedimiento almacenado con datos de una tabla. Ese tipo de acciones se pueden ejecutar con ayuda de las relaciones locales definidas en MapForce, incluso si la base de datos subyacente no aplica relaciones de claves principales/foráneas entre tablas. Para más información, consulte el apartado Procedimientos almacenados y relaciones locales.
Nota: en este apartado usaremos Microsoft SQL Server 2016 y la base de datos "AdventureWorks 2016" para explicar cómo se implementan los procedimientos almacenados en MapForce. La base de datos "AdventureWorks" se puede descargar del sitio web de CodePlex (https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks).
Notas sobre compatibilidad
•Los procedimientos almacenados solo se pueden usar en el motor de ejecución integrado BUILT-IN. Los procedimientos almacenados no son compatibles con la generación de código en C++, C# o Java.
•Tipos de parámetros de entrada/salida: por lo general no son compatibles los tipos definidos por el usuario, tipos cursor, tipos variant y muchos otros tipos de datos de BD menos comunes (como tipos matriz, geometry, CLR, etc.).
•No es compatible la sobrecarga de procedimientos y funciones (varias definiciones de rutinas con el mismo nombre y parámetros diferentes).
•Algunas bases de datos admiten el uso de valores predeterminados en los parámetros de entrada, pero MapForce no lo admite por ahora. No puede omitir parámetros de entrada en la asignación para usar valores predeterminados.
•Los procedimientos almacenados que devuelven varios conjuntos de registros son compatibles o no dependiendo de la combinación de controlador y API de base de datos (ODBC/ADO/ADO.NET/JDBC). Solamente son compatibles los procedimientos que devuelven el mismo número de conjuntos de registro con una estructura de columnas fijas.
•Recomendamos utilizar siempre que se pueda la versión más reciente del controlador nativo de BD que mantenga el proveedor de la BD. No recomendamos utilizar controladores puente como ODBC to ADO Bridge ni ODBC to JDBC Bridge.
•También puede habilitar las transacciones de BD para procedimientos almacenados a los que se llama como datos de destino (consulte Procedimientos almacenados en componentes de destino). Las transacciones no son compatibles con los procedimientos almacenados a los que se llama como datos de origen (sin parámetros de entrada) o aquellos a los que se llama como función (con parámetros de entrada y salida).
La siguiente tabla muestra información específica de cada una de las BD compatibles.
Base de datos | Notas sobre compatibilidad |
---|---|
Access | •Los procedimientos almacenados de las BD de Microsoft Access tienen una funcionalidad muy limitada y no son compatibles con MapForce. |
DB2 | •Compatibles con MapForce: procedimientos almacenados, funciones escalares y funciones con valores de tabla. •No se admiten los valores de retorno de los procedimientos almacenados de BD2 porque no se pueden leer con las APIs de BD que usa MapForce. •Los procedimientos almacenados de valores de rendimiento de DB2 no son compatibles porque no se pueden leer con las APIs de DB que usa MapForce. •Las funciones con valores de fila (RETURNS ROW) no son compatibles. •Se recomienda instalar como mínimo "IBM_DB2 9.7 Fix Pack 3a" para evitar que ocurra un error confirmado con el driver JDBC al leer errores/advertencias tras la ejecución. Esto también soluciona un problema con el proveedor ADO que resulta en que falte un bloque de filas del resultado. |
Firebird | •Compatibles con MapForce: procedimientos almacenados y funciones con valores de tabla |
Informix | •Compatibles con MapForce: procedimientos almacenados y funciones con valores de tabla. |
MariaDB | •Compatibles con MapForce: procedimientos almacenados, funciones escalares |
MySQL | •Compatibles con MapForce: procedimientos almacenados, funciones escalares •MySQL incluye total compatibilidad para procedimientos almacenados y funciones a partir de la versión 5.5. Si usa una versión anterior, la funcionalidad será limitada en MapForce. |
Oracle | •Compatibles con MapForce: procedimientos almacenados, funciones escalares y funciones con valores de tabla. •Se recomienda usar un controlador Oracle nativo en lugar del proveedor Microsoft OLE DB Provider for Oracle. •Oracle tiene una forma especial de devolver conjuntos de resultados al cliente que consiste en usar parámetros de salida de tipo REF CURSOR. Esto es compatible con MapForce en el caso de los procedimientos almacenados, pero no en el de las funciones. Por tanto, los nombres y el número de los conjuntos de registros siempre son fijos para procedimientos almacenados de Oracle. |
PostgreSQL | •Compatibles con MapForce: funciones escalares, funciones con valores de fila, funciones con valores de tabla. También son compatibles los procedimientos almacenados y las funciones independientes, así como los definidos dentro de un paquete Oracle. •En PostgreSQL los parámetros de salida definidos en una función describen las columnas del conjunto de resultados. Esta información se utiliza automáticamente en MapForce (no es necesaria la detección por ejecución ni la entrada manual de conjuntos de registros). Los parámetros de tipo refcursor no son compatibles. |
Progress OpenEdge | •Compatibles con MapForce: procedimientos almacenados. |
SQL Server | •Compatibles con MapForce: procedimientos almacenados, funciones escalares y funciones con valores de tabla. •Recomendamos usar el controlador SQL Server Native Client más reciente en lugar de Microsoft OLE DB Provider for SQL Server. •La API de ADO tiene algunas limitaciones de compatibilidad con algunos tipos de datos introducidos con SQL Server 2008 (datetime2, datetimeoffset). Si detecta problemas de truncamiento de datos con estos tipos temporales cuando use ADO con SQL Server Native Client, puede establecer el argumento de cadena de conexión DataTypeCompatibility=80 o usar ODBC. •Los procedimientos de SQL Server tienen un parámetro de rendimiento implícito de tipo int null que está disponible para asignaciones. Si el procedimiento omite una instrucción RETURN el valor resultante es 0. |
SQLite | •SQLite no usa procedimientos almacenados. |
Teradata | •Compatibles con MapForce: procedimientos almacenados, macros. •No admite funciones escalares, funciones agregadas ni funciones de tabla •Problema conocido: el driver Teradata ODBC no rellena los valores de parámetros de salida después del procedimiento de llamada. |