Como ejecutar funcion dinamica con codigo DML

CoyoT
23 de Abril del 2005
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

trazom
23 de Abril del 2005
Fijate en el post "Sentencias SELECT en tiempo de ejecución" de este mismo foro

CoyoT
23 de Abril del 2005
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

trazom
23 de Abril del 2005
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.


CoyoT
23 de Abril del 2005
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;

trazom
23 de Abril del 2005
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;







Juan H. G.
23 de Abril del 2005
Bueno, si vosotros lo decis, será así.... pero en Oracle 1i.

SELECT SYS_CONTEXT('USERENV','OS_USER')
INTO VARIABLE
FROM DUAL

¿ Esto no funciona ?

¿¿¿¿¿¿¿ Entonces ?????????

Una función es una funcion, sea de SYS ó de SOS

Estudiar un poco majetes.