La expresión "Procedimiento almacenado" proviene del mundo de los servidores SQL. Cuando una estación cliente envía una petición a un servidor SQL, envía en realidad texto en lenguaje SQL al servidor SQL. Esta petición se analiza sintácticamente (parsing) y es interpretada en el servidor SQL antes de ejecutarse. Obviamente, si el texto de la petición es importante y si la petición se envía varias veces durante una sesión, puede tomar mucho tiempo el envío del código en la red, el análisis y la interpretación de la petición. Así que la idea era encontrar una forma de enviar la petición por la red, analizada e interpretada de una vez y luego ejecutarla únicamente cada vez que se reciba de una estación cliente. La solución era conservar el código fuente de la petición (en otras palabras, un procedimiento) en el servidor y que el cliente envíe una petición con únicamente el nombre del procedimiento a ejecutar. El procedimiento es por lo tanto “guardado” en el servidor y de ahí viene el término “procedimiento almacenado.”
Note que un procedimiento almacenado SQL es un procedimiento que puede recibir parámetros de una estación cliente, ejecutar las tareas para las que fue creado (de manera sincrónica o asincrónica) y posiblemente devolver un resultado al cliente. Cuando un cliente solicita la ejecución de un procedimiento almacenado, en cierta medida, delega la ejecución del código en el equipo servidor.
Aunque utilizamos el término utilizado en la industria, las funcionalidades de los procedimientos almacenados de 4D Server superan significativamente el concepto regular de procedimientos almacenados.
Con 4D en modo local, cuando utiliza un comando como New process, puede abrir un proceso usuario en el cual puede ejecutar un método. Este método se llama un método proceso (ver la sección Métodos de proyecto en el manual Lenguaje de 4D).
Puede hacer lo mismo con 4D Server, en un equipo cliente. Además, utilizando el comando Execute on server en el equipo servidor, puede iniciar un proceso de usuario en el cual ejecutar un método. Además, utilizando el comando EXECUTE ON CLIENT, puede correr un método en otro proceso en un cliente diferente. En ambos casos, el método se llama un procedimiento almacenado y por extensión, el proceso iniciado en el equipo servidor u otro equipo cliente también llamado procedimiento almacenado.
Importante: la diferencia principal entre un procedimiento almacenado SQL y un procedimiento almacenado 4D Server es que en el primer caso usted ejecuta un procedimiento SQL, en el segundo caso, ejecute un proceso 4D autónomo.
Como un proceso 4D normal, un procedimiento almacenado tiene su propio entorno:
Una selección actual por tabla: cada procedimiento almacenado tiene su propia selección actual. Una tabla puede tener una selección actual diferente en cada procedimiento almacenado.
Un registro actual por tabla: cada tabla puede tener un registro actual diferente en cada procedimiento almacenado.
Variables: cada procedimiento almacenado tiene sus propias variables proceso. Las variables proceso son reconocidas únicamente en el contexto del procedimiento almacenado al cual pertenecen.
Tabla por defecto: cada procedimiento almacenado tiene su propia tabla por defecto.
Conjuntos proceso: cada procedimiento almacenado tiene su propia conjunto procesos.
On Error Call: cada procedimiento almacenado tiene su propio método de gestión de errores.
Ventana de depuración: cada procedimiento almacenado tiene su propia ventana de depuración.
En términos de interfaz de usuario, un procedimiento almacenado puede abrir ventanas y mostrar datos (DISPLAY RECORD). Un procedimiento almacenado ejecutado en un equipo cliente 4D permite la entrada de datos. Por otra parte, un procedimiento almacenado ejecutado en el servidor no permite la entrada de datos.
Puede iniciar tantos procedimientos almacenados como lo autorice el sistema (hardware y memoria). De hecho, la máquina servidor debe considerarse como una máquina que no sólo responde a los clientes 4D y a los navegadores web, sino también es capaz de ejecutar procesos que interactúan con otros procesos que corren en el equipo servidor y en las máquinas remotas.
De la misma forma que 4D ofrece un entorno multitareas a los procesos usuario que corren en la máquina, 4D Server ofrece un entorno multitareas a los procedimientos almacenados. Por ejemplo, 4D Server mantiene una tabla de las variables interproceso que pueden ser utilizadas por los procesos almacenados para comunicarse entre ellos.
Nota: la propiedad de método "Ejecutar en servidor" permite ejecutar un método en un proceso en el servidor, pero el método utiliza un proceso "twinned" del proceso cliente, que le permite en particular beneficiarse del entorno de este proceso cliente. En este caso, no es un procedimiento almacenado 4D. Para mayor información, consulte la sección Atributo Ejecutar en servidor.
Gran parte de las funcionalidades de los procesos y comandos descritas en el manual Lenguaje 4D aplican también a los procedimientos almacenados, excepto por la entrada de datos para los procedimientos almacenados ejecutados en el servidor.
Un procedimiento almacenado puede añadir, buscar, ordenar, actualizar o borrar registros. Un procedimiento almacenado puede utilizar conjuntos y selecciones temporales, acceder a documentos en el disco, trabajar con BLOBs, imprimir registros, etc. Piense simplemente que en lugar de hacer algo en la máquina 4D local, lo hace en el equipo servidor o en varios equipos clientes.
Una ventaja evidente de los procedimientos almacenados ejecutados en el servidor es que precisamente un procedimiento almacenado se ejecuta en el equipo servidor, donde se encuentra el motor de la base de datos. Por ejemplo, un APPLY TO SELECTION no es eficiente en la red, pero lo es al interior de un procedimiento almacenado. El ejemplo propuesto en la sección Importación con procedimientos almacenados (ejemplo) muestra la importante optimización del rendimiento que puede alcanzar implementando un procedimiento almacenado.
Los procedimientos almacenados ejecutados en uno o varios equipos clientes permiten optimizar la optimización de la repartición de tareas entre clientes y la comunicación entre varios equipos clientes. Consulte el comando REGISTER CLIENT en el manual Lenguaje para ver un ejemplo de procedimientos almacenados ejecutados en varios equipos clientes.
Sin embargo, la ventaja principal de la arquitectura de los procedimientos almacenados es la dimensión adicional que da a 4D Server. Utilizando procedimientos almacenados puede implementar sus propios servicios 4D Server. El único límite es su imaginación. El ejemplo en la sección Importación con procedimientos almacenados (ejemplo) muestra un procedimiento almacenado que ofrece información sobre 4D Server a sus clientes. Puede, por ejemplo, listar los volúmenes del equipo servidor. Este ejemplo puede expandirse fácilmente para reenviar la información sobre los directorios o documentos al cliente.
De manera general, los procedimientos almacenados ejecutados en el servidor no deben efectuar operaciones que impliquen elementos de interfaz (tal como menús, ventanas, formularios...). Los mecanismos de gestión de interfaz no se manejan en el servidor. Deben evitarse los comandos que provocan la aparición de cajas de diálogo en el equipo servidor así como también las cajas de diálogo con entrada de datos.
Esta es la lista de comandos que NO debe utilizar en procedimientos almacenados ejecutados en el servidor. Estos comandos se clasifican en tres categorías:
Comandos prohibidos en el servidor
La presencia de uno de estos comandos en un procedimiento almacenado provoca la aparición de una caja de diálogo de alerta que indica que el comando no puede ejecutarse en 4D Server. Se devuelve el error #67, el cual puede interceptarse por medio de un método instalado por el comando ON ERR CALL.
La utilización de estos comandos en procedimientos almacenados no es recomendable ya que su funcionamiento no se adapta a una ejecución en el servidor. Estos comandos pueden bloquear el servidor, provocar errores y no producen los efectos esperados. No se devuelve un código de error específico.
(1) Únicamente cuando el primer parámetro es una cadena vacía.
(2) Únicamente cuando la sintaxis utilizada provoca la aparición de la caja de diálogo (ej.: ORDER BY([Table])).
Comandos sin efecto en el servidor
Los siguientes comandos no tienen efecto cuando se ejecutan en un procedimiento almacenado en el servidor. No se devuelve ningún código de error específico.
Nota: no es posible utilizar los comandos de gestión de procesos DELAY PROCESS, PAUSE PROCESS y RESUME PROCESS desde un 4D remoto con procedimientos almacenados en el servidor.
Un método ejecutado en 4D Server (método base del servidor, método con atributo Ejecutar en servidor, trigger o procedimiento almacenado) puede lanzar un procedimiento almacenado con la ayuda de los comandos Execute on server, New process o EXECUTE ON CLIENT.
Consulte las secciones correspondientes del manual Lenguaje de 4D. Nuevamente, recuerde que los comandos 4D actúan dentro del alcance del equipo que ejecuta el procedimiento almacenado (servidor o clientes) de la misma forma que en local en un equipo cliente.
Nota: los mecanismos CALL PROCESS y Outside call no tienen significado en el equipo servidor, porque los procedimientos almacenados no tienen una interfaz usuario con entrada de datos.
También hay otra funcionalidad importante: los procesos usuario de los clientes (procesos que corren en un equipo cliente) pueden leer y escribir las variables proceso (*) de un procedimiento almacenado, utilizando los comandos GET PROCESS VARIABLE, SET PROCESS VARIABLE y VARIABLE TO VARIABLE.
(*) Como también las variables interproceso del equipo servidor.
Importante: la comunicación proceso “Intermáquina”, ofrecida por los comandos GET PROCESS VARIABLE, SET PROCESS VARIABLE y VARIABLE TO VARIABLE, sólo es posible del cliente al servidor. Siempre es un proceso cliente el que lee o escribe las variables de un procedimiento almacenado.