PC SOFT

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.
  • Presentación
  • ¿Cómo proceder?
  • Etapas
  • Ejecutando el Procedure almacenado con HExecuteSQLQuery
  • Observaciones
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadApple WatchUniversal Windows 10 App
Otros
Procedimientos almacenados
Conector Nativo SQL Server: Ejecutar el mismo Procedure almacenado varias veces
Conectores NativosDisponible solo con este tipo de conexión
Presentación
En algunos casos, puede ser interesante ejecutar el mismo Procedure almacenado varias veces mientras se modifican uno o más parámetros.
Se pueden implementar varias soluciones:
  1. Ejecute la consulta (con HExecuteSQLQuery) tantas veces como sea necesario mientras modifica los parámetros deseados.
  2. Preparar la consulta a ejecutar (HPrepareSQLQuery) así como los diferentes parámetros para modificar y ejecutar la consulta tantas veces como sea necesario con HExecuteSQLQuery.. Esta segunda solución es mucho más rápida y optimiza el tiempo necesario para navegar por el resultado de la consulta (para una consulta Select).
Esta página de ayuda explica cómo se puede implementar esta segunda solución.
¿Cómo proceder?

Etapas

Para preparar y ejecutar una consulta varias veces:
  1. Declarar una fuente de datos. Esta fuente de datos contendrá el resultado de la consulta SQL.
  2. Declarar los tipos de variables de consulta.
    Las variables se recuperan en el tipo especificado en WLanguage. Las variables son variables de texto de Default.
    Por lo tanto, pueden ocurrir conversiones entre el tipo nativo de la base de datos y el tipo WLanguage, causando errores inesperados de redondeo o formato (la fecha se transforma en cadena, por ejemplo)..
    Por lo tanto, le aconsejamos que especifique los tipos de WLanguage de las variables con mucho cuidado antes de ejecutar la consulta. Para esto:
    • inicializar el valor de la Variable (tipos simples: entero, string, float).
    • especificar el tipo esperado con escribir a máquina (no soportado en esta versión).
      El nombre de estas variables debe corresponder al nombre de los parámetros de Procedure en SQL Server.
      Observación: En algunos casos, el servidor no acepta realizar una conversión implícita. Se visualiza un error de conversión. En este caso, debe inicializar el tipo definiendo cualquier valor ordinario en el tipo seleccionado..
      Por ejemplo, para definir un tipo numérico, utilice MyQuery.Parameter=0.
  3. Prepara la consulta con HPrepareSQLQuery.
  4. Especifique el valor de los diferentes parámetros a tener en cuenta y ejecute la consulta con HExecuteSQLQuery. Sólo se debe especificar el nombre de la fuente de datos que corresponde a la consulta.
Este último paso debe repetirse tantas veces como sea necesario.

Ejecutando el Procedure almacenado con HExecuteSQLQuery

HExecuteSQLQuery debe utilizarse con:
  • el nombre de la conexión,
  • la constante hQueryWithoutCorrection.
  • el nombre de Procedure. El nombre Procedure debe ser seguido por los parámetros (incluyendo el carácter @). Para especificar los parámetros de salida, debe especificar 'out' o 'output'. Los parámetros deben estar separados por comas.
Modo compatible:
Si la consulta contiene sólo el nombre de Procedure, la Conector Nativo SQL Server añade automáticamente los parámetros de la Procedure almacenada.
Atención: Si algunos parámetros tienen un valor por defecto y si no están referenciados por el código WLanguage, se producirá un error de no referencia en la Variable. En este caso, debe modificar el código para llamar la consulta definiendo los parámetros obligatorios, o declarar explícitamente el Variable opcional.
Ejemplo:
Código para crear el Procedure:
CREATE PROCEDURE MyProc(@p1 int, @p2 int, @res int output)
AS set @res=@p1+@p2
Código para el funcionamiento de la Procedure: p1 es un parámetro obligatorio y p2 es un parámetro opcional. El siguiente código desencadena un error porque el acceso Conector Nativo esperaba p2 en la consulta:
MyProcedure is Data Source
MyProcedure.p1 = 10
IF HExecuteSQLQuery(MyProcedure, "MyConnection", ...
hQueryWithoutCorrection, "MyProc") THEN
Trace("p1=" + MyProcedure.p1)
ELSE
Error(HErrorInfo())
END
Se debe utilizar el siguiente código:
MyProcedure is Data Source
MyProcedure.p1 = 10
IF HExecuteSQLQuery(MyProcedure, "MyConnection", ...
hQueryWithoutCorrection, "MyProc @p1, @p2 out") THEN
Trace("p1=" + MyProcedure.p1)
ELSE
Error(HErrorInfo())
END

Observaciones

  • Las variables declaradas deben ser idénticas a las utilizadas. De lo contrario, se produce un error WLanguage.
  • En la llamada a la Procedure almacenada, se debe utilizar la sintaxis específica de la base de datos utilizada, incluso para la sintaxis de los parámetros. Por lo tanto, para SQL Server, los parámetros se especifican con la siguiente sintaxis: @NombreParam.
    Atención: el carácter "@" debe ir seguido de al menos una letra (la sintaxis @1 no está permitida).
    El mismo parámetro se puede utilizar varias veces. En este caso, la Variable correspondiente será reutilizada.
  • Valor de retorno (funciones):
    Para recuperar el valor de retorno, debe declarar una Variable y asignar el resultado de la función a esta Variable.
  • Para ejecutar una consulta sin habilitar el bind, utilice la constante hNoBind en HExecuteSQLQuery.
  • HPrepareSQLQuery no puede ser usada para preparar una Procedure almacenada que devuelva registros o columnas. Se debe utilizar la función HExecuteSQLQuery.
  • La Conector Nativo SQL Server permite la re-ejecución de cualquier consulta que contenga un usuario Variable. Puede volver a ejecutar una consulta que utilice una Variable y cambiar el valor de esta Variable en cada ejecución.
    Ejemplo:
    MyProcedure is Data Source
    IF NOT HPrepareSQLQuery(MyProcedure, "MyConnection", hQueryWithoutCorrection, ...
    "SELECT * FROM AUTHORS WHERE au_lname like @p1") THEN
     Error(HErrorInfo())
    END
     
    MyProcedure.p1 = "Hemingway"
    HExecuteSQLQuery(MyProcedure)
    HReadFirst(gSource)
     
    MyProcedure.p1 = "Faulkner"
    HExecuteSQLQuery(MyProcedure)
    HReadFirst(gSource)
Versión mínima requerida
  • Versión 9
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario