Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cursor PL/SQL

Estas en el tema de Cursor PL/SQL en el foro de Oracle en Foros del Web. Hola, tengo una duda, estoy empezando a programar en PL/SQL y tengo realizado este cursor: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PL/SQL: Ver original CREATE OR REPLACE PROCEDURE ...
  #1 (permalink)  
Antiguo 24/10/2012, 13:25
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Pregunta Cursor PL/SQL

Hola, tengo una duda, estoy empezando a programar en PL/SQL y tengo realizado este cursor:


Código PL/SQL:
Ver original
  1. PROCEDURE  "DesbalanceDiarioPrueba" IS
  2. CURSOR PRUEBA IS
  3.  
  4.  
  5. rango1 DATE;
  6. rango2 DATE;
  7.  
  8. SELECT  SUM(NUMLLA) LLAM ,SUM(ICMINO) MINS, ICOPAC,'Saliente' tipo  FROM ICRESDIA
  9.  WHERE ICDATE BETWEEN  rango1 AND rango2
  10.   AND ICACAS IN (169,170,98,99,100,4,5,81,87,28,29,34,35,32,33,43,44,94,95,97,60)--193
  11. GROUP BY  icopac;
  12.  
  13. CURSOR OPES IS
  14. SELECT 'Tipo' Tipo, DESOPE, SUM(llasal) lls, SUM(minsal) MS
  15. FROM ICDESRES
  16. WHERE DESDIA BETWEEN  rango1 AND rango2
  17. AND ictipe IN ('C','N','R')
  18. GROUP BY  DESOPE
  19. ORDER BY desope;
  20.  
  21.  
  22.  
  23. INTO rango1
  24. FROM dual;
  25.  
  26. SELECT TRUNC(sysdate-1)
  27. INTO rango2
  28. FROM dual;
  29.  
  30. FOR r_OPES IN OPES LOOP
  31.   DBMS_OUTPUT.PUT_LINE(r_OPES.Tipo||','||r_OPES.DESOPE||','||r_OPES.lls||','||r_OPES.MS);
  32. FOR r_DDS IN DDS LOOP
  33. IF r_OPES.DESOPE=r_DDS.ICOPAC THEN
  34.   DBMS_OUTPUT.PUT_LINE(r_DDS.tipo||','||r_DDS.ICOPAC||','||r_DDS.LLAM||','||r_DDS.MINS);
  35.   END IF;
  36.  
  37.  


El cual me trae un resultado así:

Tipo,102,53181,276288.2
Saliente,102,53183,276318.19
Tipo,119,241865,1362822.4
Saliente,119,241924,1365762.84

Mi dura es:

1. Como puedo hacer una resta o suma entre los diferentes cursores, o bien el resultado de cada campo es decir. Restar 53181 menos 53183 siendo el valor de relación el 102, ejemplo:

Lo que me da ahora:
Tipo,102,53181,276288.2
Saliente,102,53183,276318.19

Resultado que quiero:
Tipo,Saliente,102,2,29.99


Se los agradecería muchíiiiiiiisimo si me ayudan porque no sé como hacer operaciones entre cursores o como tengo q declarar las variables. Manejo el SQL server pero algunas instrucciones me confunden en este lenguaje.

Saludos.
  #2 (permalink)  
Antiguo 24/10/2012, 14:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cursor PL/SQL

Pruebalo así:

Código SQL:
Ver original
  1. CREATE OR REPLACE
  2. PROCEDURE  "DesbalanceDiarioPrueba" IS
  3. CURSOR PRUEBA IS
  4.  
  5.  
  6. rango1 DATE;
  7. rango2 DATE;
  8.  
  9. CURSOR DDS IS
  10. SELECT  SUM(NUMLLA) LLAM ,SUM(ICMINO) MINS, ICOPAC,'Saliente' tipo  FROM ICRESDIA
  11.  WHERE ICDATE BETWEEN  rango1 AND rango2
  12.   AND ICACAS IN (169,170,98,99,100,4,5,81,87,28,29,34,35,32,33,43,44,94,95,97,60)--193
  13. GROUP BY  icopac;
  14.  
  15. CURSOR OPES IS
  16. SELECT 'Tipo' Tipo, DESOPE, SUM(llasal) lls, SUM(minsal) MS
  17. FROM ICDESRES
  18. WHERE DESDIA BETWEEN  rango1 AND rango2
  19. AND ictipe IN ('C','N','R')
  20. GROUP BY  DESOPE
  21. ORDER BY desope;
  22.  
  23.  
  24. BEGIN
  25.  
  26. SELECT TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)+1))
  27. INTO rango1
  28. FROM dual;
  29.  
  30. SELECT TRUNC(sysdate-1)
  31. INTO rango2
  32. FROM dual;
  33.  
  34. FOR r_OPES IN OPES LOOP
  35.   --DBMS_OUTPUT.PUT_LINE(r_OPES.Tipo||','||r_OPES.DESOPE||','||r_OPES.lls||','||r_OPES.MS);
  36. FOR r_DDS IN DDS LOOP
  37. IF r_OPES.DESOPE=r_DDS.ICOPAC THEN
  38.   DBMS_OUTPUT.PUT_LINE(r_OPES.Tipo||','||r_DDS.tipo||','||r_DDS.ICOPAC||','||r_DDS.LLAM-r_OPES.lls||','||r_DDS.MINS-r_OPES.MS);
  39.   END IF;
  40. END LOOP;
  41. END LOOP;
  42.  
  43.  
  44. END;

Nos cuentas
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 24/10/2012, 17:07
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Cursor PL/SQL

Me marca error al abrir el CURSOR PRUEBA

Error(6,1); PLS- 00103: Encountered the symbol "RANGO1" when expecting one of the following (select <a SQL statement>

Error(44,4); PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following; end not pragma final instantiable order overriding static member constructor map


=(
  #4 (permalink)  
Antiguo 24/10/2012, 17:20
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Cursor PL/SQL

Lo intente así:

Código PL/SQL:
Ver original
  1. PROCEDURE  "DesbalanceDiarioPrueba" IS
  2. rango1 DATE;
  3. rango2 DATE;
  4.  
  5. SELECT  SUM(NUMLLA) LLAM ,SUM(ICMINO) MINS, ICOPAC,'Saliente' tipo  FROM ICRESDIA
  6.  WHERE ICDATE BETWEEN  rango1 AND rango2
  7.   AND ICACAS IN (169,170,98,99,100,4,5,81,87,28,29,34,35,32,33,43,44,94,95,97,60)--193
  8. GROUP BY  icopac;
  9.  
  10. CURSOR OPES IS
  11. SELECT 'Tipo' Tipo, DESOPE, SUM(llasal) lls, SUM(minsal) MS
  12. FROM ICDESRES
  13. WHERE DESDIA BETWEEN  rango1 AND rango2
  14. AND ictipe IN ('C','N','R')
  15. GROUP BY  DESOPE
  16. ORDER BY desope;
  17.  
  18.  
  19.  
  20. INTO rango1
  21. FROM dual;
  22.  
  23. SELECT TRUNC(sysdate-1)
  24. INTO rango2
  25. FROM dual;
  26.  
  27.  
  28. FOR r_OPES IN OPES LOOP
  29.   --DBMS_OUTPUT.PUT_LINE(r_OPES.Tipo||','||r_OPES.DESOPE||','||r_OPES.lls||','||r_OPES.MS);
  30. FOR r_DDS IN DDS LOOP
  31. IF r_OPES.DESOPE=r_DDS.ICOPAC THEN
  32.   DBMS_OUTPUT.PUT_LINE(r_OPES.Tipo||','||r_DDS.tipo||','||r_DDS.ICOPAC||','||r_DDS.LLAM-r_OPES.lls||','||r_DDS.MINS-r_OPES.MS);
  33.   END IF;

Y no marca error al compilar, pero me marca error de datos:

onectando a la base de datos 192.150.100.0.
ORA-06502: PL/SQL: error : character to number conversion error numérico o de valor
ORA-06512: en "INTEN_CAM.DesbalanceDiarioPrueba", línea 35
ORA-06512: en línea 2
El proceso ha terminado.
Desconectando de la base de datos 192.150.100.0.

¿Algúna idea?
  #5 (permalink)  
Antiguo 25/10/2012, 07:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cursor PL/SQL

Cita:
ORA-06502: PL/SQL: error : character to number conversion error numérico o de valor
Tu eres qel que entiende la logica de los datos.

Si ves, lo que hago es una resta en el segundo cursor para que la impresión genere el resultado que quieres. Eso se puede hacer, pero debes interpretarlo correctamente con tus campos.


El error dice que en este IF (r_OPES.DESOPE=r_DDS.ICOPAC)
Los tipos de datos no son iguales y la comparación no se puede llevar a cabo.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: cursor, pl-sql, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:19.