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

[SOLUCIONADO] funcion in

Estas en el tema de funcion in en el foro de Oracle en Foros del Web. estoy programando java con oracle(trabajo en paquetes) el procedimiento (resumiendo ) de mi paquete tiene las siguientes variables consulta(codigoIN VARCHAR, descripcion IN VARCHAR, valores IN ...
  #1 (permalink)  
Antiguo 12/03/2013, 12:00
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
funcion in

estoy programando java con oracle(trabajo en paquetes)
el procedimiento (resumiendo ) de mi paquete tiene las siguientes variables

consulta(codigoIN VARCHAR, descripcion IN VARCHAR, valores IN VARCHAR)

SELECT codigo,descripcion
FROM estados
WHERE consulta.valores

en jsp la varible valor contiene los siguientes datos "codigo in (1,2,3,4)" lo paso como un string pero no se muestra la consulta, pero si lo coloco desde la consulta del paquete muestra normal los datos
  #2 (permalink)  
Antiguo 12/03/2013, 15:03
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 16 años, 1 mes
Puntos: 5
Respuesta: funcion in

Hola,

si no te entiendo mal, la select la tienes dentro de un procedure en un package de Oracle. El WHERE que tienes en la select, se supone que es el parámetro valores (no consulta.valores)?

¿Qué resultado te arroja?

Saludos.
  #3 (permalink)  
Antiguo 12/03/2013, 15:27
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: funcion in

Debes hacer uso de SQL Dinamico.

Código SQL:
Ver original
  1. EXECUTE IMMEDIATE 'SELECT codigo,descripcion
  2. FROM estados
  3. WHERE '||consulta.valores;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 12/03/2013, 16:24
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: funcion in

EN ORACLE NO RECONOCE "IMMEDIATE" y en parametro valores envio parte del codigo que debe concatenarse al select que esta en mi procedimiento dentro de mi paquete
  #5 (permalink)  
Antiguo 12/03/2013, 17:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: funcion in

Cita:
EN ORACLE NO RECONOCE "IMMEDIATE"
EXECUTE IMMEDIATE es una sentencia de Oracle. Si no la reconoce ejecutadas desde Java, el problema puede ser el conector usado, pero no Oracle.
Al menos Oracle 10g sí lo toma: EXECUTE IMMEDIATE
Cita:
en parametro valores envio parte del codigo que debe concatenarse al select que esta en mi procedimiento dentro de mi paquete
Pues entonces es el package lo que tienes que modificar, para que sea capaz de recibir un parámetro así y crear dinámicamente la sentencia.
Me parece que eso es evidente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 12/03/2013, 17:09
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: funcion in

EXECUTE IMMEDIATE no lo ejecuto desde java lo ejecuto en el mismo paquete
  #7 (permalink)  
Antiguo 12/03/2013, 17:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: funcion in

Explícalo con más detalle. Tus respuestas parecen un poco telegrámicas.

- Qué versión de Oracle estás usando.
- Muéstranos el código completo del SP que usa estos parámetros.
- Dinos por qué dices que "Oracle no reconoce IMMEDIATE", cuando te estoy mostrando el link a la Web Oficial donde muestra que sí es parte de Oracle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/03/2013, 11:46
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: funcion in

estoy utilizando oracle 10g

mi funcion completa es la siguiente:
la variable de consulta.valores contiene "and tipo in (1,2,3)";

PROCEDURE consulta(codigo IN VARCHAR, descripcion IN VARCHAR, valores IN VARCHAR,RESULT OUT CUR_RECORDSET)
IS
BEGIN
OPEN RESULT FOR
EXECUTE IMMEDIATE 'SELECT codigo,descripcion
FROM estados
WHERE 0=0 AND ESTADO = 1 '||consulta.valores ||'ORDER BY CODREQUERIMIENTO DESC';
EXCEPTION
WHEN OTHERS THEN
OPEN RESULT FOR
SELECT '' FROM DUAL;

END;

y los errores que me salen son los siguientes

Error(409,21): PLS-00103: Encountered the symbol "IMMEDIATE" when expecting one of the following: . ( * @ % & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ between using || multiset member SUBMULTISET_ The symbol "( was inserted before "IMMEDIATE" to continue.

Error(412,44): PLS-00103: Encountered the symbol ";" when expecting one of the following: ) , * & | = - + < / > at in is mod remainder not rem => .. <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ as between from using || member SUBMULTISET_ The symbol ")" was substituted for ";" to continue.
  #9 (permalink)  
Antiguo 13/03/2013, 12:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: funcion in

CUR_RECORDSET es un tipo de datos hecho por ti?
que estructura tiene?

Apoyo a gnzsoloyo en que si no das información completa debemos partir de suposiciones.

Adicional, requieres manejar ref cursor para tratar los datos con sql dinamico.

Te dejo un ejemplo:

Código SQL:
Ver original
  1. DECLARE
  2.  
  3. PROCEDURE consulta(codigo IN VARCHAR2, descripcion IN VARCHAR2, valores IN VARCHAR2)
  4. IS
  5.  
  6. TYPE CUR_TYP IS REF CURSOR;
  7.   c_cursor   CUR_TYP;
  8.   id_employee NUMBER;
  9.   last_employee varchar2(1000);
  10.   v_query     VARCHAR2(255);
  11. sql_var VARCHAR2(1000);
  12. BEGIN
  13. OPEN c_cursor FOR 'SELECT employee_id,last_name FROM employees '|| valores ||' ORDER BY 1 DESC';
  14.   LOOP
  15.     FETCH c_cursor INTO id_employee,last_employee;
  16.     EXIT WHEN c_cursor%NOTFOUND;
  17.     dbms_output.put_line(id_employee||' '||last_employee);
  18.   END LOOP;
  19.   CLOSE c_cursor;
  20.  
  21. END consulta;
  22. BEGIN
  23. consulta('1','nada','WHERE employee_id=101');
  24.  
  25. END;
  26. /
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 13/03/2013, 13:11
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: funcion in

porque declaras estas variables id_employee ,last_employee por cada columna que tenga en mi select tendre que declarar una varible?
  #11 (permalink)  
Antiguo 13/03/2013, 14:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: funcion in

Esa es una forma. Puedes hacerlo tambien con un record o haciendo uso de la clausula rowtype.
http://www.devjoker.com/contenidos/a...-Dinamico.aspx

El ultimo ejemplo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 13/03/2013, 15:11
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 16 años, 1 mes
Puntos: 5
Respuesta: funcion in

De tu procedure inicial yo vigilaría un par de cosas:
- El nombre de la variable es valores. Nunca he probado con consulta.valores, pero creo que no funcionaría correctamente
- Los espacios en blanco antes y después de la variable que estás concatenando ya que de lo contrario se unirá tu condición con el order by que le sigue.

Creo que una cosa así debería funcionarte:

Código SQL:
Ver original
  1. PROCEDURE consulta(codigo IN VARCHAR, descripcion IN VARCHAR, valores IN VARCHAR,RESULT OUT CUR_RECORDSET)
  2. IS
  3. BEGIN
  4. OPEN RESULT FOR
  5. 'SELECT codigo,descripcion
  6. FROM estados
  7. WHERE ESTADO = 1 '|| valores ||' ORDER BY CODREQUERIMIENTO DESC';
  8. EXCEPTION
  9. WHEN OTHERS THEN
  10. OPEN RESULT FOR
  11. SELECT '' FROM DUAL;
  12.  
  13. END;

Saludos.
  #13 (permalink)  
Antiguo 14/03/2013, 12:01
 
Fecha de Ingreso: agosto-2010
Mensajes: 127
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: funcion in

con el ultimo mensaje pude seleccionar mi problema gracias

Etiquetas: funcion, select
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 23:11.