Como ejecutar funcion dinamica con codigo DML
Saludos
Necesito saber si es posible ejecutar una función de forma dinamica, donde esta función tiene código DML.
Intente utilizar el execute immediate, pero no funciona por los INSERT y UPDATE (DML).
este es un ejemplo de lo que hice:
zona := 2;
EXECUTE IMMEDIATE ' SELECT fcnprueba'||zona||'(:a,:b)'
INTO resultado
USING 23,'DZ';
y me envia el error siguiente:
ORA-14551: no se puede realizar una operacion DML dentro de una consulta
De antemano gracias
Necesito saber si es posible ejecutar una función de forma dinamica, donde esta función tiene código DML.
Intente utilizar el execute immediate, pero no funciona por los INSERT y UPDATE (DML).
este es un ejemplo de lo que hice:
zona := 2;
EXECUTE IMMEDIATE ' SELECT fcnprueba'||zona||'(:a,:b)'
INTO resultado
USING 23,'DZ';
y me envia el error siguiente:
ORA-14551: no se puede realizar una operacion DML dentro de una consulta
De antemano gracias
Fijate en el post "Sentencias SELECT en tiempo de ejecución" de este mismo foro
Gracias, por responder, pero mi problema no es el crear dinàmicamente el llamado, sino que al contener DML las funciones que llamo, no se pueden ejecutar via SQL, es decir, no puedo hacer:
SELECT función INTO variable_retorno FROM dual;
Mi consulta es, si existe alguna forma de ejecutar una función, que contiene INSERT y UPDATE, de forma dínamica, de modo tal que no de el error ORA-14551.
muchas gracias por tu tiempo y dedicación
SELECT función INTO variable_retorno FROM dual;
Mi consulta es, si existe alguna forma de ejecutar una función, que contiene INSERT y UPDATE, de forma dínamica, de modo tal que no de el error ORA-14551.
muchas gracias por tu tiempo y dedicación
El problema es que Oracle no permite que una funcion de seleccion ejecute operaciones de modificacion o seleccion con locks de registros
Para poder hacerlo, tienes que aislar el dml que ejecuta la funcion del contexto de la transaccion que hizo la llamada.
Debes declarar a la funcion como autonomous transaction, y de esa forma se ejecuta en forma independiente de quien la llamo.
En la parte delarativa de tu codigo debes escribir PRAGMA AUTONOMOUS_TRANSACTION;
y poner un COMMIT luego del execute inmediate.
Saludos.
Para poder hacerlo, tienes que aislar el dml que ejecuta la funcion del contexto de la transaccion que hizo la llamada.
Debes declarar a la funcion como autonomous transaction, y de esa forma se ejecuta en forma independiente de quien la llamo.
En la parte delarativa de tu codigo debes escribir PRAGMA AUTONOMOUS_TRANSACTION;
y poner un COMMIT luego del execute inmediate.
Saludos.
Lo malo es que no tengo acceso al código interno de las funciones, parece que estoy más frito que un huevo en una paila.
Gracias en todo caso, ya que aprendi a usar lo de AUTONOMOUS_TRANSACTION;
Gracias en todo caso, ya que aprendi a usar lo de AUTONOMOUS_TRANSACTION;
Por lo que escribiste antes parecia que tenias el codigo de la funcion...en fin.
Si no puedes modificar la funcion entonces modifica la forma en que la llamas. Usa un bloque anonimo y llama a la funcion desde ahi.
Tu ejemplo de no poder hacer
SELECT función INTO variable_retorno FROM dual;
lo haces asi:
DECLARE
variable_retorno tipo_retorno_funcion;
BEGIN
variable_retorno := funcion(parametros);
END;
Si no puedes modificar la funcion entonces modifica la forma en que la llamas. Usa un bloque anonimo y llama a la funcion desde ahi.
Tu ejemplo de no poder hacer
SELECT función INTO variable_retorno FROM dual;
lo haces asi:
DECLARE
variable_retorno tipo_retorno_funcion;
BEGIN
variable_retorno := funcion(parametros);
END;
