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.