Ir al contenido


Foto

Multiple rows on singleton select


  • Por favor identifícate para responder
13 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 31 enero 2011 - 01:53

Pues eso, tengo un procedimiento almacenado en firebird que funcionaba perfectamente todo el tiempo, ahora de un momento a otro me presenta este error:



delphi
  1. multiple rows in singleton select.
  2. multiple rows in singleton select.
  3. At procedure 'GENERAR_AST' line: 13, col: 5.



Me lo presenta tanto en IBExpert como en delphi, el procedimiento almacenado es el siguiente:



sql
  1. SET TERM ^ ;
  2. CREATE OR ALTER PROCEDURE GENERAR_AST (
  3.     id_emp INTEGER,
  4.     fechaini DATE,
  5.     fechafin DATE)
  6. AS
  7. DECLARE variable fecha DATE;
  8. BEGIN
  9.   /* Procedure Text */
  10.   fecha = fechaini;
  11.  
  12.   while (fecha <= fechafin) do
  13.   BEGIN
  14.     INSERT INTO asistencia (emp_id,ast_fecha,ast_time1,ast_time2,ast_time3,ast_time4,ca_id) VALUES (:id_emp,:fecha,
  15.     (SELECT LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  16.     (SELECT LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  17.     (SELECT LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  18.     (SELECT LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  19.  
  20.     CASE
  21.       WHEN ( (SELECT LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  22.             ( (SELECT LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  23.             ( (SELECT LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  24.             ( (SELECT LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) THEN
  25.  
  26.               CASE
  27.                 WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 5
  28.                 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  29.               END
  30.  
  31.       WHEN ( NOT (SELECT LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  32.             ( (SELECT LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) AND
  33.             ( (SELECT LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) AND
  34.             ( (SELECT LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) THEN
  35.  
  36.               CASE
  37.                 WHEN ( (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 6
  38.                 ELSE (SELECT ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  39.               END
  40.  
  41.       WHEN ( NOT (SELECT LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  42.             ( NOT (SELECT LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  43.             ( NOT (SELECT LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  44.             ( NOT (SELECT LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) THEN NULL
  45.     END
  46.     );
  47.  
  48.     fecha = fecha + 1;
  49.   END
  50.   suspend;
  51. END^
  52. SET TERM ; ^
  53. GRANT INSERT ON ASISTENCIA TO PROCEDURE GENERAR_AST;
  54. GRANT SELECT ON LOG_ASISTENCIA TO PROCEDURE GENERAR_AST;
  55. GRANT SELECT ON LOG_CAUSAS TO PROCEDURE GENERAR_AST;
  56. GRANT EXECUTE ON PROCEDURE GENERAR_AST TO SYSDBA;



Quiero saber cual es la causante de eso si funcionaba perfectamente?. Espero su ayuda.

Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 31 enero 2011 - 02:09

Tienes una subconsulta que retorna mas de un registro.

Salud OS
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 09:09

Tienes una subconsulta que retorna mas de un registro.

Salud OS


Aja, pero he intentado colocar First 1 y aún persiste el problema ^o|
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 09:44

Saludos.

¿Probaste cada linea sola?
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 09:49

Saludos.

¿Probaste cada linea sola?


No aún no lo he probado, aparentemente el problema se encuentra en el primer case cosa que no entiendo pues si eso funcionaba perfectamente.

Saludos.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 09:53

Ya he probado cada línea sola y funciona perfectamente, incluso modifiqué las consultas incluyendo la clausula IN, al generar SP aún persiste el problema en la misma línea 13 columna 5 (CASE).

Saludos.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 11:20

Vamos toletes, echenme una mano, ya he intentado de todo con lo poco que sé de SP, haber si me ayudan con esto ya esto me raya en lo emergente :s
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 febrero 2011 - 11:27

En que condiciones dices que te funcionaba bien antes? por ejemplo llamabas el SP desde un trigger, desde otro Sp, etc, en que entorno.

Y en que condiciones no te funciona ahora?
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 11:31

Pues siempre lo he llamado desde Delphi y funcionaba bien,a través de ZEOS con el componente ZStroredProc, todo bien, pero desde el 23/11/10 hasta la fecha presenta ese error, no funciona ni en Delphi ni en IBExpert, una pregunta, se puede hacer una consulta del tipo select case?, algo así:



sql
  1. SELECT FIRST 1
  2.   CASE
  3.     ...
  4.   END



Saludos.
  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 febrero 2011 - 11:47

Pues siempre lo he llamado desde Delphi y funcionaba bien,a través de ZEOS con el componente ZStroredProc, todo bien, pero desde el 23/11/10 hasta la fecha presenta ese error, no funciona ni en Delphi ni en IBExpert.


Si eso es así, entonces el problema no es del SP, el problema es que los parámetros que le estás pasando devuelven más de un registro.

Ensaya pasándole como parámetros en Id un valor negativo  y en las dos fechas, algo de por allá de del año 1901, algo que a la fija no devuelva registros, entonces debería ejecutar el SP, no insertaría nada pero tampoco lanzará una excepción.  De ser así quiere decir que en los datos  ya existen las condiciones necesaria para devolver mas de un registro, entonces ya sabriamos por donde empezar.
  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 febrero 2011 - 12:02

se puede hacer una consulta del tipo select case?, algo así:



sql
  1. SELECT FIRST 1
  2.   CASE
  3.     ...
  4.   END



Saludos.


Pinso que sería al contrario:


sql
  1. CASE
  2.   WHEN SELECT FIRST 1 ....


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 12:29

Pues asi lo tenia en un principio igual me sale el error.

Saludos.
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2011 - 01:01

Ya he intentado con Rows y first 1 y nada lo mismo me rindo  : :
  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 febrero 2011 - 12:48

Hola.

Es perfectamente normal que te haya estado funcionando durante meses y ahora falle. Y es que como han comentado, el problema es que una subconsulta devuelve más de un valor. Y eso lo hace ahora y antes no lo hacía, porqué ahora tienes unos datos diferentes a los que tenías antes, y la misma subconsulta que antes devolvía un solo valor, ahora con los datos actuales puede devolver perfectamente dos y tres valores.

Para evitar que eso ocurra, tienes que escribir este tipo de subconsultas, asegurándote de que solo puedan devolver un único valor.

Personalmente probaría cada una de las subconsultas que hay en el procedimiento almacenado, por cada uno de los parámetros que pueda tener, hasta encontrar cual es la que devuelve varios valores.

NOTA: Otra opción es ir a lo fácil y poner los FIRST 1 en cada una de las subconsultas. Pero de alguna manera estás forzando el resultado, así que en ese caso no te sorprendas si el procedimiento almacenado no te devuelva lo que esperas de él. Aunque ahora se ejecutará perfectamente, deberías localizar donde una subconsulta te está devolviendo más de un valor, y porqué lo hace cuando tú solo esperas uno.

Es decir :



sql
  1. SET TERM ^ ;
  2. CREATE OR ALTER PROCEDURE GENERAR_AST (
  3.     id_emp INTEGER,
  4.     fechaini DATE,
  5.     fechafin DATE)
  6. AS
  7. DECLARE variable fecha DATE;
  8. BEGIN
  9.   /* Procedure Text */
  10.   fecha = fechaini;
  11.  
  12.   while (fecha <= fechafin) do
  13.   BEGIN
  14.     INSERT INTO asistencia (emp_id,ast_fecha,ast_time1,ast_time2,ast_time3,ast_time4,ca_id) VALUES (:id_emp,:fecha,
  15.     (SELECT FIRST 1 LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  16.     (SELECT FIRST 1 LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  17.     (SELECT FIRST 1 LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  18.     (SELECT FIRST 1 LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA),
  19.  
  20.     CASE
  21.       WHEN ( (SELECT FIRST 1 LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  22.             ( (SELECT FIRST 1 LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  23.             ( (SELECT FIRST 1 LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  24.             ( (SELECT FIRST 1 LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) THEN
  25.  
  26.               CASE
  27.                 WHEN ( (SELECT FIRST 1 ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 5
  28.                 ELSE (SELECT FIRST 1 ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  29.               END
  30.  
  31.       WHEN ( NOT (SELECT FIRST 1 LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  32.             ( (SELECT FIRST 1 LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) AND
  33.             ( (SELECT FIRST 1 LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) AND
  34.             ( (SELECT FIRST 1 LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL) THEN
  35.  
  36.               CASE
  37.                 WHEN ( (SELECT FIRST 1 ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta) IS NULL ) THEN 6
  38.                 ELSE (SELECT FIRST 1 ca_id FROM log_causas WHERE emp_id = :id_emp AND :fecha BETWEEN ca_desde AND ca_hasta)
  39.               END
  40.  
  41.       WHEN ( NOT (SELECT FIRST 1 LOG_TIME1 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  42.             ( NOT (SELECT FIRST 1 LOG_TIME2 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  43.             ( NOT (SELECT FIRST 1 LOG_TIME3 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) AND
  44.             ( NOT (SELECT FIRST 1 LOG_TIME4 FROM LOG_ASISTENCIA WHERE EMP_ID = :ID_EMP AND LOG_FECHA = :FECHA) IS NULL ) THEN NULL
  45.     END
  46.     );
  47.  
  48.     fecha = fecha + 1;
  49.   END
  50.   suspend;
  51. END^
  52. SET TERM ; ^
  53. GRANT INSERT ON ASISTENCIA TO PROCEDURE GENERAR_AST;
  54. GRANT SELECT FIRST 1 ON LOG_ASISTENCIA TO PROCEDURE GENERAR_AST;
  55. GRANT SELECT FIRST 1 ON LOG_CAUSAS TO PROCEDURE GENERAR_AST;
  56. GRANT EXECUTE ON PROCEDURE GENERAR_AST TO SYSDBA;



Con esta procedimiento almacenado ya debería ser imposible que te devuelva ese error.
  • 0




IP.Board spam blocked by CleanTalk.