AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / WLanguage / Administrar bases de datos / HFSQL / Gestión de HFSQL Client/Server
  • Presentación
  • Creando una Procedure almacenada y una consulta almacenada
  • Los procedimientos almacenados se crean en el análisis.
  • Importación de una set de procedimientos existente
  • Usando una consulta en un Procedure almacenado
  • Código WLanguage que se puede utilizar en los procedimientos almacenados
  • Procedimientos almacenados que pueden ser compilados en 64 bits
  • Prueba de una Procedure almacenada
  • Límite
  • Desplegando un Procedure almacenado y las consultas almacenadas de associated
  • Presentación
  • Despliegue para la prueba
  • Despliegue en modo real
  • Actualización en caliente de los procedimientos almacenados en el servidor HFSQL
  • Ejecutar un Procedure almacenado en sus programas
  • Ejecución de una Procedure almacenada a partir de una consulta SQL
  • Gestión de errores en los procedimientos almacenados
  • Mecanismo de suberrores
  • Pueden producirse los siguientes errores al ejecutar procedimientos almacenados
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Procedimientos y consultas almacenados (HFSQL Client/Server)
HFSQL Client/ServerDisponible solo con este tipo de conexión
Presentación
Los procedimientos almacenados se utilizan para simplificar el desarrollo y el mantenimiento de sus aplicaciones mediante la factorización del código.
En efecto, cuando el método utilizado para acceder a los datos evoluciona (cuando cambia la estructura de los archivos, por ejemplo), basta con modificar el Procedure almacenado en el servidor sin realizar ninguna modificación en las aplicaciones desplegadas que utilizan este Procedure.
Un Procedure almacenado también se utiliza para limitar el número de procesos de ida y vuelta entre el ordenador cliente y el servidor, y por lo tanto aumenta la velocidad de los procesos.
Los procedimientos almacenados pueden utilizar consultas SQL o consultas creadas por el editor de consultas. TLos procedimientos almacenados y las consultas utilizadas por los procedimientos almacenados se crean en el editor de análisis.
Esta página de ayuda presenta:
Creando una Procedure almacenada y una consulta almacenada

Los procedimientos almacenados se crean en el análisis.

Para crear una Procedure almacenada:
  1. Crear (si es necesario) la set de procedimientos almacenados en el análisis:
    • haga clic en en los botones de acceso rápido.
      • La ventana de creación de nuevos elementos se abre: pulse "Datos" y luego "set de procedimientos almacenados".
      • Escriba el nombre de la set de procedimientos y valide.
    • a través del panel "Análisis: seleccionar la carpeta "Procedimientos almacenados. Seleccione "Nueva set de procedimientos" en el menú contextual. La set de procedimientos almacenados se crea automáticamente. Este set de procedimientos se llama "set_<Nombre del análisis>" por Default.
    • en la cinta de la editor de análisis: en la pestaña "Análisis", en el grupo "Creación", despliegue "Nuevo" y seleccione "Conjunto de procedimientos almacenados". La set de procedimientos almacenados se crea automáticamente. Este set de procedimientos se llama "set_<Nombre del análisis>" por Default.
  2. Esta set se guarda físicamente en el subdirectorio "Código" del directorio de análisis.
  3. Crear una Procedure en el conjunto de las Procedure s. Este Procedure será un Procedure almacenado.

Importación de una set de procedimientos existente

Un set de procedimientos almacenados puede corresponder a un set de procedimientos existente (que se encuentra en el proyecto actual o en otro proyecto).
Importar una set de procedimientos:
  1. Abrir la editor de análisis si es necesario.
  2. En el panel "Análisis", seleccione la carpeta "Procedimientos almacenados".
  3. Abra el menú contextual y seleccione "Importar una set de procedimientos". En la ventana que se abre, seleccione la set de procedimientos a importar y validar.
  4. Se realizan las siguientes operaciones:
    • Idel set de procedimientos pertenece al proyecto actual: el set de los procedimientos encontrados en el proyecto se copia automáticamente en el directorio de análisis "Code".. El nombre lógico de este Procedure es automáticamente renombrado.
      Atención: Los dos conjuntos de procedimientos están disociados: una modificación realizada en la set de los procedimientos encontrados en el proyecto se aplicará automáticamente a la set de los procedimientos encontrados en el análisis (y a la inversa).
    • If el set de procedimientos no pertenece al proyecto actual: el conjunto de Procedure s se copia automáticamente en el directorio de análisis "Code" y se define como Procedure almacenado.

Usando una consulta en un Procedure almacenado

Una consulta creada por el editor de consultas puede ser usada en un Procedure almacenado. Para ello, la consulta debe haber sido creada en la editor de análisis.
Para crear una consulta en el editor de análisis:
  • Método 1:
    1. Haga clic en en los botones de acceso rápido.
      • La ventana de creación de nuevos elementos se abre: haga clic en "Datos" y luego en "Consulta almacenada"..
      • La asistente para la creación de consultas se inicia automáticamente. La consulta se crea automáticamente. La consulta se guarda físicamente en el subdirectorio "Código" del directorio de análisis.
    2. La consulta se puede utilizar en uno de los procedimientos de análisis almacenados.
  • Método 2:
    1. Mostrar el editor de análisis.
    2. Visualice el panel "Análisis" y seleccione "Nueva consulta" en el menú contextual. La asistente para la creación de consultas se inicia automáticamente. La consulta se crea automáticamente. La consulta se guarda físicamente en el subdirectorio "Código" del directorio de análisis.
    3. La consulta se puede utilizar en uno de los procedimientos de análisis almacenados.
Para importar una consulta:
  1. Abrir la editor de análisis si es necesario.
  2. En el panel "Análisis", seleccione la carpeta "Consultas";.
  3. Seleccione "Importar una consulta" en el menú contextual. En la ventana que se abre, seleccione la consulta que desea importar y validar.
  4. Se realizan las siguientes operaciones:
    • Si la consulta pertenece al proyecto actual: la consulta del proyecto se copia automáticamente en el directorio de análisis "Code" y se reubica: el proyecto y el análisis utilizan una sola consulta. Por lo tanto, una modificación realizada en la consulta del proyecto se aplicará automáticamente a la consulta de análisis (y viceversa).
    • Si la consulta no pertenece al proyecto actual: la consulta se copia automáticamente en el directorio "Code" de análisis y se define como consulta relacionado al análisis.

Código WLanguage que se puede utilizar en los procedimientos almacenados

  • El código de los procedimientos almacenados está escrito en WLanguage. Se pueden utilizar varias funciones WLanguage.
  • Para saber si una función puede ser utilizada en un Procedure almacenado, ver la ayuda sobre esta función: si la Image aparece en la barra de título de la función, la función puede ser utilizada en el código de los procedimientos almacenados.
    Además, cuando se compila el código, los mensajes de error le informan de que se han utilizado funciones no autorizadas en el código de procedimientos almacenados..
    Por ejemplo, sólo los tipos simples pueden utilizarse en el código de procedimientos almacenados (cadenas, números enteros, etc.).. Un parámetro de Procedure almacenado debe ser un parámetro simple: no se puede pasar ningún objeto o array como parámetro. Sin embargo, serialize puede utilizarse para pasar un array como parámetro a un Procedure almacenado.
  • Los siguientes elementos no pueden utilizarse en los procedimientos almacenados: clases, informes, ventanas, páginas, ...
  • Las ventanas y páginas de Gestión de errores automatic no están disponibles en los procedimientos almacenados. Sin embargo, se puede utilizar HOnError para redirigir el error a un Procedure (este Procedure debe ser también un Procedure almacenado).
  • Varias variables de WLanguage permiten obtener información sobre la aplicación cliente que utiliza un Procedure almacenado.
    Estas variables son las siguientes:
    Aplicación HRuntimeInfo.Aplicación cliente que inició el actual Procedure almacenado.
    HRuntimeInfo.ComputerOrdenador del usuario que inició el actual Procedure almacenado (IP Address o nombre del ordenador).
    HRuntimeInfo.DatabaseBase de datos utilizada por la aplicación cliente que inició el Procedure almacenado.
    HRuntimeInfo.LoginEl usuario de la aplicación cliente que inició el Procedure almacenado.
  • Tienes la capacidad de guardar valores en el servidor desde un Procedure almacenado. Este valor puede ser leído por otro Procedure almacenado o por un disparador por ejemplo. Las siguientes funciones se utilizan para gestionar los valores persistentes en el servidor:
    HDeleteParameterElimina un parámetro guardado previamente con la función HSaveParameter.
    HListParameterDevuelve la lista de parámetros guardados a partir de procedimientos almacenados en el servidor.
    HLoadParameterLee un parámetro guardado previamente desde un procedimiento almacenado con la función HSaveParameter.
    HSaveParameterGuarda un valor persistente en el servidor HFSQL.
  • Tiene la posibilidad de guardar archivos temporales en un directorio del servidor y de borrar este directorio.. Se pueden utilizar las siguientes funciones:
    HClearWorkingDirBorra y destruye el directorio temporal creado previamente cuando se ejecutó HServerWorkingDir.
    HServerWorkingDirDevuelve el ruta de un directorio temporal en el servidor HFSQL.
  • Para manipular los archivos de datos, debe utilizar HDeclareExternal.
    Por ejemplo:
    PROCEDURE NameOfStoredProcedure()
     
    // Check the existence of the logical file
    IF NOT HFileExist(ZIPCODES) THEN
    // File not known, it must be declared
    // Caution: to declare a new file in a stored HFSQL procedure,
    // you must:
    // - use NO connection: The current database
    // on which the stored procedure is found will be used
    // - specify NO full path:
    // The file will be sought in the current database.
    // You have the ability to specify a subdirectory of the database.
    // - specify the full name of the file with its extension (.FIC)
    IF NOT HDeclareExternal("ZIPCODES.FIC", "ZIPCODES") THEN
    // Error while declaring the file
    RESULT HErrorInfo()
    END
    END
     
    // Use the data file
    // FOR EACH ZIPCODES
    // //Process...
    // END
     
    // Process OK, without error
    RETURN ""

Procedimientos almacenados que pueden ser compilados en 64 bits

Para utilizar un ejecutable de 32 bits con procedimientos almacenados ejecutados en un servidor de 64 bits:
  1. Abra la ventana de descripción del análisis.
    • Abrir la editor de análisis si es necesario.
    • Abra el menú contextual del análisis (clic derecho en el esquema del análisis) y seleccione "Descripción del análisis".
  2. Mostrar la pestaña "Compilación.
  3. Compruebe "Habilitar los errores de compilación para la compatibilidad de 64 bits".
  4. Validar.

Prueba de una Procedure almacenada

Para hacer la prueba de un Procedure almacenado:
  1. En el panel de análisis, seleccione la Procedure almacenada cuya prueba debe ser ejecutada.
  2. Haga clic con el botón derecho del ratón para abrir el menú contextual de la Procedure almacenada y seleccione "Probar Procedure".
  3. La ventana para introducir los parámetros de la Procedure se muestra. Esta ventana le permite:
    • Escriba los parámetros de Procedure.
    • Ejecutar la prueba del procedimiento.
      Observación: esta ventana permite reiniciar la ejecución varias veces modificando los parámetros.
  4. Cuando se hace el test de Procedure:
    • Se propone una actualización de Procedure almacenada en el servidor si es necesario.
    • El Procedure se inicia en el servidor.
    • El valor de retorno de Procedure se muestra si es necesario.
Notas/limitaciones:
  • El puerto de depuración es el puerto 27281 de Default. Este puerto debe estar abierto en el firewall. Este puerto se puede modificar en el Archivo HFConf.ini. Para más detalles sobre cómo depurar los procedimientos almacenados, véase Depuración de una conexión a un servidor HFSQL.
  • Para ejecutar la prueba de un Procedure almacenado, debe tener los derechos de depuración en la base de datos.
  • Las trazas utilizadas en los procedimientos almacenados se muestran en el panel Traza del depurador.
  • El código de Procedure almacenado puede contener puntos de ruptura: se iniciará el depurador.
  • Los elementos desplegados en el servidor se utilizan durante la prueba.
  • InTestMode devuelve True.

Límite

En esta versión, no se puede importar una set de procedimientos almacenados que se encuentran en un servidor.
Desplegando un Procedure almacenado y las consultas almacenadas de associated

Presentación

Para ejecutar la prueba de un Procedure almacenado y/o para ejecutar un Procedure almacenado, debe ser desplegado en el servidor. Esta implementación se puede realizar:
  • para prueba: los procedimientos almacenados y/o las consultas se despliegan en el servidor seleccionado pero el análisis no se actualiza. Esta operación se recomienda para análisis de gran tamaño cuya generación puede llevar bastante tiempo..
    Atención: cualquier aplicación desplegada en el servidor ya no puede funcionar después de este implementación para la prueba. Esta opción debe utilizarse en un servidor de prueba.
  • en modo real: el análisis debe ser regenerado y la modificación de automatic de los archivos de datos debe realizarse al instalar la versión cliente.

Despliegue para la prueba

Para ejecutar la prueba de las modificaciones realizadas en un Procedure almacenado:
  1. En editor de análisis, en la pestaña "Análisis", en el grupo "Análisis", amplíe "Sincronización " y seleccione "Actualizar elementos almacenados (HFSQL Client/Server)".
  2. En la ventana que aparece, seleccione:
    • los conjuntos de procedimientos a actualizar.
    • las consultas a actualizar.
    • los desencadenantes de la actualización.
    • la conexión afectada por la actualización. También puede introducir directamente las características de la conexión.
  3. Validar la actualización.
Observación: Cuando se despliega para la prueba, también puede generar el análisis y aceptar la modificación de los datos de automatic.

Despliegue en modo real

Para actualizar una aplicación Cliente/Servidor que utiliza procedimientos almacenados, debe:
  1. Generar el análisis que contiene los procedimientos almacenados ("Generar el análisis" en el menú contextual del análisis). Los archivos de datos pueden ser modificados durante este paso.
  2. Crear la versión del cliente y solicitar una modificación de los archivos de datos de automatic: en la pestaña "Proyecto", en el grupo "Generación", despliegue "Procedimiento de instalación" y seleccione "Crear procedimiento de instalación".
    Observación: la modificación de los archivos de datos de automatic se propone cuando se modifica el código de los procedimientos almacenados o las consultas de análisis.
  3. Instale la aplicación.
Observaciones:
  • HUpdateSet y HDeleteSet se utilizan para forzar la actualización y la eliminación de conjuntos de procedimientos almacenados en el servidor.
  • HUpdateQuery y HDeleteQuery se utilizan para forzar la actualización y el borrado de las consultas almacenadas en el servidor.
  • HListStoredElement se utiliza para listar los conjuntos de procedimientos, las consultas y los procedimientos instalados en un servidor.
  • El Centro HFSQL control se utiliza para gestionar los procedimientos almacenados y las consultas encontradas en el servidor.

Actualización en caliente de los procedimientos almacenados en el servidor HFSQL

La actualización en caliente de los procedimientos almacenados en el servidor HFSQL consiste en actualizar los conjuntos de procedimientos almacenados en el servidor mientras se utiliza la aplicación.. Esta operación se utiliza para realizar una actualización sin desconectar a todos los usuarios.
Esta actualización puede ser realizada por HUpdateSet. Las siguientes condiciones son necesarias para realizar esta actualización:
  • Si no se ejecutó ningún Procedure del conjunto, el conjunto de Procedure s puede ser actualizado en el servidor.
  • Si un Procedure del conjunto se ejecutó, el conjunto de Procedure s puede ser actualizado sólo si la modificación del conjunto de Procedure s no afecta a las variables globales. Si las variables globales de la set de los procedimientos han sido modificadas, HUpdateSet devuelve False. En este caso, todos los usuarios deben estar desconectados para realizar la actualización.
    Depósito de seguridad: En este último caso, si se realizó la actualización, los usuarios conectados antes de la actualización utilizarán durante la próxima ejecución de un Procedure almacenado:
    • el nuevo código de Procedure almacenado,
    • las variables globales con los valores definidos antes de la actualización.
Observación: Si se está ejecutando una Procedure del conjunto de Procedure s, la actualización se bloquea hasta que finalice su ejecución (HUpdateSet es una función de bloqueo). Todos los procedimientos almacenados que se están ejecutando terminan, y todos los procedimientos almacenados llamados después de la ejecución de HUpdateSet se bloquean hasta que la set se actualiza en el servidor.
Ejecutar un Procedure almacenado en sus programas
Un Procedure almacenado puede ser iniciado desde una aplicación:

Ejecución de una Procedure almacenada a partir de una consulta SQL

Para ejecutar un Procedure almacenado a partir de una consulta SQL, especifique en la consulta el nombre del Procedure a ejecutar y los parámetros esperados.
También tiene la capacidad de ejecutar directamente un Procedure almacenado y recuperar su resultado en SQL. En este caso, la sintaxis para ejecutar el Procedure almacenado es:
SELECT NameOfStoredProcedure(NumericParameter,'StringParameter',....) [FROM DUAL]
Observaciones:
  • El procedimiento almacenado debe ser una función almacenada: siempre debe devolver un valor. En caso contrario, se generará un error de ejecución.
  • Si el nombre del procedimiento almacenado es idéntico al de una función o procedimiento del proyecto, debe ir precedido por el nombre del conjunto de procedimientos almacenados.
Ejemplo 1: La siguiente consulta se utiliza para devolver el volumen de negocios de todos los clientes que viven en París (75). El volumen de negocios es calculado por una Procedure almacenada llamada nReturnTO.
// Query run by the client computer
HExecuteSQLQuery("TOCustomer75", "SELECT CustomerName, ZipCode, " + ...
"nReturnTO(Customer.CustomerNumber,'20061201') " + ...
"as Total from Customer where zipcode like '34%')")
// Stored procedure run on the server
PROCÉDURE nReturnTO(nCustomerNum, Deadline)
nTotal is currency
// Filter on the limit date
// Retrieve the orders from Deadline
HFilter(Orders, CustomerNum, hMinVal, hMaxVal, "OrderDate >= " + Deadline + "")
// Retrieve all the customer orders and add their amount
HReadSeekFirst(Orders, CustomerNum, nCustomerNum)
WHILE HFound(Orders)
nTotal += Orders.TotalIOT
HReadNext(Orders, CustomerNum)
END
RESULT nTotal
Ejemplo 2: Corriendo y recuperando el resultado de un Procedure almacenado:
dsStoredProc is Data Source
IF NOT HExecuteSQLQuery(dsStoredProc, HFSQLCnt, hDefaultQuery,StringBuild([
SELECT Function_StoredProcedure(%1,'%2')
FROM DUAL
], 3, "string to pass as parameter")) THEN
Error("Failure calling the stored procedure ", HErrorInfo())
ELSE
IF HReadFirst(dsStoredProc) THEN
Info("Result of stored procedure: ", HRecordToString(dsStoredProc))
END
END
Gestión de errores en los procedimientos almacenados

Mecanismo de suberrores

La gestión de errores en los procedimientos almacenados utiliza el mecanismo de sub-errores. Si se produce un error cuando se ejecuta un Procedure almacenado en el servidor, los diferentes sub-errores se rellenan con los detalles de los errores que se produjeron en cada nivel de ejecución. Los diferentes errores son devueltos por ExceptionInfo.
Por ejemplo:
1. Un Procedure se ejecuta en el cliente. Este Procedure llama a un Procedure almacenado en el servidor. Este Procedure almacenado genera un error.
Aplicación Cliente:
PROCEDURE Client_Procedure()
// Procedure run on the client computer
...
// Line 10: Runs a procedure on the server
HExecuteProcedure(AConnection, AStoredProcedure)
Aplicación Servidor:
// Procedure stored on the server
PROCEDURE AStoredProcedure
...
// Line 5: The security mechanism of WLanguage
// detects an unknown identifier
RESULT UnknownElement
La excepción se muestra sólo en el equipo cliente. Contiene la siguiente información:
  • Error principal: información sobre el cliente: "Error encontrado por el servidor XXX", Cliente_Procedure Procedure, Line 10, ...
  • Suberror: información sobre el servidor: "Identificador de elementos desconocidos", AProcedure Procedure, Line 5, ...
2. Un Procedure se ejecuta en el cliente. Este Procedure llama a un Procedure almacenado en el servidor. Este Procedure almacenado llama a un segundo Procedure que genera un error.
Aplicación Cliente:
PROCEDURE Client_Procedure()
// Procedure run on the client computer
...
// Line 10: Runs a procedure on the server
HExecuteProcedure(AConnection, AStoredProcedure)
Aplicación Servidor:
// Procedure stored on the server
PROCEDURE AStoredProcedure
...
// Line 3: running a query
HExecuteSQLQuery(AQuery, "SELECT ProcedureCalculation(Fic.Itm) FROM Fic")
// Line 5: Browsing the query
FOR EACH AQuery
...
END
// Calculation procedure called from the query
PROCEDURE CalculationProcedure(param)
...
// Line 4: The security mechanism of WLanguage
// detects an unknown identifier
RESULT UnknownElement
La excepción se muestra sólo en el equipo cliente. Contiene la siguiente información:
  • Error principal: información sobre el cliente: "Error encontrado por el servidor XXX", Cliente_Procedure Procedure, Line 10, ...
  • Suberror 1: información del servidor sobre el AStoredProcedure Procedure: "Error al ejecutar la consulta", AStoredProcedure Procedure, Line 5, ...
  • Suberror 2: información del servidor con respecto al CalcProcedure Procedure: "Identificador de elementos desconocidos", CalcProcedure Procedure, Line 4, ...
Observación: Para obtener directamente el último sub-Error( que es el primer error que ocurrió en el servidor HFSQL), use la siguiente sintaxis:
// First error on the server
ExceptionInfo(errMessage, errOrigin)

Pueden producirse los siguientes errores al ejecutar procedimientos almacenados

Los siguientes errores pueden ocurrir cuando se ejecutan procedimientos almacenados:
75000: El servidor no puede definir si el XXX Procedure debe ser ejecutado
Este error puede ocurrir en los siguientes casos:
  • Un Procedure almacenado con el mismo nombre es utilizado por varias bases de datos y por varias conexiones. El servidor no puede definir si el XXX Procedure debe ser ejecutado con la conexión YYY en la base de datos ZZZ o con la conexión YYY1 en la base de datos ZZZ1.
    Solución: Especifique la conexión y la base de datos que desea utilizar.
  • Dos conexiones a la base de datos están disponibles. El servidor no puede definir si el XXX Procedure en la base de datos ZZZ debe ser ejecutado con la conexión YYY o con la conexión YYY1.
    Solución: Especifique la conexión que desea utilizar
  • El Procedure se utiliza en varios conjuntos de Procedure s.
75001: No se ha especificado la base de datos
Este error puede ocurrir si existen varias bases de datos para una misma conexión. Para ejecutar el Procedure (XXX) almacenado, especifique una base de datos en la conexión utilizada.
75002: Almacenado Procedure no se encuentra
Este error se produce cuando el Procedure llamado no se encuentra en los conjuntos de Procedure s instalados en el servidor.
75003: Se produjo un error de WLanguage mientras se ejecutaba el Procedure almacenado
Este error ocurre cuando el Procedure almacenado contiene errores de WLanguage.
75004: El elemento XXX no existe
El Procedure almacenado o la consulta almacenada no existe.
75005: El elemento XXX no puede actualizarse.
El Procedure almacenado o la consulta almacenada se utiliza actualmente. Para actualizar este elemento, desconecte a los usuarios.
75006: set de procedimientos no compatibles con los servidores de 64 bits
El set de procedimientos se utiliza en un servidor de 64 bits.
Para que este conjunto de procedimientos funcione, debe seleccionar "Activar errores de compilación para compatibilidad con 64 bits" ("Análisis description" en el menú contextual del análisis, pestaña "Compilación").
Versión mínima requerida
  • Versión 11
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 27/01/2023

Señalar un error o enviar una sugerencia | Ayuda local