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;