Oracle - execute immediate de un select con mas de una col

 
Vista:

execute immediate de un select con mas de una col

Publicado por KAR (12 intervenciones) el 13/06/2007 01:35:49
Hola!

Estoy creando una funcion que realizara una consulta con el execute immediate , pero tengo error: ORA-00932: inconsistent datatypes: expected ya que me esta devolviendo mas de una columna, como puedo solucionar esto?

Lo que tengo es algo asi:

V_SQL:='SELECT vtipo,count(*)';
V_SQL:=V_SQL||' FROM emp';
V_SQL:=V_SQL||' WHERE campo1=10 ';
V_SQL:=V_SQL||' GROUP BY vtipo';

EXECUTE IMMEDIATE (V_SQL) <=== aqui manda el error, excepto cuando solo tengo una col

INTO GV_SQL ;

RETURN GV_SQL ;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:execute immediate de un select con mas de una c

Publicado por mad (88 intervenciones) el 13/06/2007 08:18:29
Si utilizando un EXECUTE IMMEDIATE esperas que la select te retorne mas de un registro puedes utilizar la funcion BULK COLLECT delante del INTO. esto trabaja como un array.
Lo primero que debes hacer es declarar una variable de tipo TABLE.

Ejemplo:

DECLARE

TYPE VAR IS TABLE OF VARCHAR2(10);

MI_VAR VAR;

BEGIN

EXECUTE IMMEDIATE ('SELECT MI_CAMPO FROM MI_TABLA WHERE MI_CONDICION') BULK COLLECT INTO MI_VAR;

FOR I IN MI_VAR.FIRST .. MI_VAR.LAST LOOP
DBMS_OUTPUT.PUT_LINE ('DATO RECUPERADO: '||MI_VAR(I);
END LOOP;

END;

Espero te sirva.
Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:execute immediate de un select con mas de una c

Publicado por KAR (12 intervenciones) el 13/06/2007 17:56:16
Aunque el select sea ('select a,b from dual') ??

Me va a devolver dos campos, como puedo recuperar el valor de ambos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:execute immediate de un select con mas de una c

Publicado por mad (88 intervenciones) el 14/06/2007 07:45:25
No importa donde hagas la select ni los campos que quieras recuperar, eso si, tendrás que declarar una variable tipo TABLE por cada uno de ellos con su tipo de dato.


DECLARE

TYPE FECHA IS TABLE OF DATE;
TYPE HORA IS TABLE OF DATE;

MI_FECHA FECHA;
MI_HORA HORA;

BEGIN

EXECUTE IMMEDIATE ('SELECT TO_DATE(SYSDATE,'DD/MM/YYYY', TO_DATE(SYSDATE(HH24:MI:SS') FROM DUAL) BULK COLLECT INTO MI_FECHA,MI_HORA; (*)

FOR I IN MI_VAR.FIRST .. MI_VAR.LAST LOOP
DBMS_OUTPUT.PUT_LINE ('FECHA: '||MI_FECHA(I)||' HORA: '||MI_HORA(i);
END LOOP;

END;

Puedes poner tantos campos como necesites.

(*) Esta select no creo que funcione tal cual, habria que colocar bien las comillas, pero como ejemplo es valida aunque solo retorne un dato.

Espero te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:execute immediate de un select con mas de una c

Publicado por Kokolandia (1 intervención) el 04/06/2009 19:05:17
Para devolver todos los valores ingresalos a un curosr

OPEN MICURSOR FOR V_SQL;

y la otra sugerencia, cambia el * del COUNT por un campo en especìfico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:execute immediate de un select con mas de una c

Publicado por Nelson (1 intervención) el 19/08/2009 23:18:22
Excelente... me valio de mucho... muchisimas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar