Oracle - execute immediate

   
Vista:

execute immediate

Publicado por AMY (1 intervención) el 18/11/2009 23:55:51
Hola, espero alguien me pueda ayudar. Trato de que un Procedimiento llame a otro pero de forma dinámica. Me explico dentro del primer procedimiento hago una consulta de la cual obtengo el nombre del procedimiento que debo ejecutar, este puede cambiar de acuerdo a la necesidad de la empresa. Y el problema se da cuando le envio a ejecutar de la siguiente forma:
nombreproceso2 la variable donde capturo el nombre en la consulta.
DECLARE r_QUE varchar2(1000);
BEGIN
r_QUE:= 'BEGIN '|| nombreproceso2 ||'('||variable1||','||variable2||','''||variable3||'''); END; ';
EXECUTE IMMEDIATE r_QUE;
END;

Tambien: r_QUE:= nombreproceso2 ||'('||variable1||','||variable2||','''||variable3||''') ';
EXECUTE IMMEDIATE r_QUE;

Pero me da error de ORA-00900:invalid SQL Statement.
La verdad no se si es la sintaxis o si esto no es válido hacerlo. Por favor si alguien tiene una idea de como hacerlo le agradecería mucho su ayuda. Gracias
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

Publicado por JORGE SANCHEZ (186 intervenciones) el 19/11/2009 00:12:32
EL ERROR ES OCACIONADO POR LOS APOSTROFES QUE UTILIZAS PARA LOS PARAMETROS QUE IRAN AL PROCEDIMIENTO, AUNQUE TUS PARAMETROS SEAN NUMBER, MANEJALOS COMO VARCHAR2, CUANDO LLEGUEN AL PROCEDIMIENTO QUE DISPARARAS DINAMICAMENTE HACES LA CONVESION SI TIENES PROBLEMAS

CON EL DBMS_OUTPUT COMO VES, MANDARA A PANTALLA COMO SE ESTA ARMANDO LA SENTENCIA DINAMICA

PRUEBA LO SIGUIENTE:

DECLARE r_QUE varchar2(1000);
nombreproceso2 VARCHAR2(200) := 'PR01';
VARIABLE1 VARCHAR2(100) := 'PARAMETRO1';
VARIABLE2 VARCHAR2(100) := 'PARAMETRO2';
VARIABLE3 VARCHAR2(100) := 'PARAMETRO3';
BEGIN
-- r_QUE:= 'BEGIN '|| nombreproceso2 ||'('||variable1||','||variable2||','''||variable3||'''); END; ';
r_QUE:= 'BEGIN '|| nombreproceso2 ||'('''||variable1||''','''||variable2||''','''||variable3||'''); END; ';
DBMS_OUTPUT.PUT_LINE(R_QUE);
--EXECUTE IMMEDIATE r_QUE;
END;
/

CUIDA LO SIGUIENTE CUANDO HAGAS LA PRUEBA, AL HACER PASTE LOS PONE 2 2 RENGLONES

1 RENGLON

-- r_QUE:= 'BEGIN '|| nombreproceso2 ||'('||variable1||','||variable2||','''||variable3||'''); END; ';

1 RENGLON

r_QUE:= 'BEGIN '|| nombreproceso2 ||'('''||variable1||''','''||variable2||''','''||variable3||'''); END; ';
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

Publicado por freddy fmucr69@hotmail.com (4 intervenciones) el 26/04/2012 00:55:54
bUENAS TARDES...
TALVEZ ALGUIEN ME PUEDA AYUDAR.
TENGO UN PROCEDIMIENTO QUE UTILIZA EL EXECUTE IMMEDIATE , PERO NO ME ACEPTA UNA VARIABLE TIPO ARREGLO.

Gracias por su colaboracion mi Correo es fmucr69@hotmail.com

adjunto un ejmplo

CREATE OR REPLACE PROCEDURE Llama (pCodError OUT NUMBER) IS
-- Variables
vSentencia VARCHAR2(4000) := NULL;
TYPE arreglo IS VARRAY(10) OF VARCHAR2(20);
valor arreglo;

valor2 VARCHAR2(20) := NULL;

BEGIN

--VARIABLE TIPO ARREGLO
valor:= arreglo (null, null, null, null, null, null, null, null, null, null, null, null);

-- AQUI TENGO EL ERROR
-- NO ME COMPILA PORQUE LA VARIABLE "VALOR" ES DE TIPO ARREGLO, ME DA ERROR
-- PERO SI LA CAMBIO POR LA VARIABLE "VALOR2" SI FUNCIONA

-- SE ARMA LA SENTENCIA
vSentencia := 'BEGIN ' || 'Ejecuta(' || VALOR || '); END;';

--DA ERROR POR EN EL USING CON VRESPUESTA PORQUE NO ME RECONOCE LA VARIABLE ARREGLO
EXECUTE IMMEDIATE vSentencia
USING OUT pCodError, OUT VALOR;
--
/*
si funciona con una variable normal

vSentencia := 'BEGIN ' || 'Ejecuta(' || VALOR2 || '); END;';

--DA ERROR POR EN EL USING CON VRESPUESTA PORQUE NO ME RECONOCE LA VARIABLE ARREGLO
EXECUTE IMMEDIATE vSentencia
USING OUT pCodError, OUT VALOR2;


*/

END Llama;
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