Tengo problemas al ejecutar una función en SQL

Tengo un problemón pues cuando ejecuto una función que he hecho en PL/SQL me sale el error siguiente:
SQL> select baan.alm_add_etod(1,10,100,101,'Ref.Interna','Ref.Cliente',10,5,1) valor from dual;
select baan.alm_add_etod(1,10,100,101,'Ref.Interna','Ref.Cliente',10,5,1) valor from dual
*
ERROR at line 1:
ORA-06571: Function ALM_ADD_ETOD does not guarantee not to update database
SQL> !oerr ora 6571
06571, 00000, "Function %s does not guarantee not to update database"
// *Cause: There are two possible causes for this message:
// * A SQL statement references a packaged, PL/SQL function
// that does not contain a pragma that prevents the database
// from being updated.
// * A SQL statement references a stand-alone, PL/SQL function
// that contains an instruction to update the database.
// *Action: If the referenced function is a packaged, PL/SQL function:
// Recreate the PL/SQL function with the required pragma; be
// certain to include the 'Write No Database State' (WNDS)
// argument in the argument list of the pragma.
// If the referenced function is a stand-alone, PL/SQL function:
// Do not use the function.
¿Sabrías decirme cuál es la razón?

1 Respuesta

Respuesta
1
mi_conexion.Open
Cuando ejecuto
set mi_recordset=mi_conexion.execute("exec: valor:=mi_funcion(2)")
el recordset me dice que está cerrado.
¿Podes poner el código de la función por favor?
¿Está en un package o es standalone?
Evidentemente algo anda mal en el código de la función...
Exitos!
;=)
El problema es que necesito poder ejecutar desde visual basic está función y recoger el resultado de la misma.
A mi en principio se me ocurrió ponerla como parte de un select de la tabla dual, pero ya he visto por lo que he leido que eso es imposible.
Sabes alguna manera de conseguirlo?
Gracias y saludos
FUNCTION ALM_ADD_ETOD
(lETOD_BI IN baan.ttisfc967300.t$etod%TYPE, -- teleinformatica.mdb.expedicion_lin!serie_bultos (izq.hasta "-")
lETOD_BF IN baan.ttisfc967300.t$etod%TYPE, -- teleinformatica.mdb.expedicion_lin!serie_bultos (der.desde "-")
lETOD_MI IN baan.ttisfc967300.t$etod%TYPE, -- teleinformatica.mdb.expedicion_lin!num_serie_palet (izq.hasta "-")
lETOD_MF IN baan.ttisfc967300.t$etod%TYPE, -- teleinformatica.mdb.expedicion_lin!num_serie_palet (der.desde "-")
sITEM IN baan.ttisfc967300.t$item%TYPE, -- teleinformatica.mdb.expedicion_lin!referencia (izq. hasta "-",long.fija 16 carac.)
sSEAK IN baan.ttisfc967300.t$seak%TYPE, -- teleinformatica.mdb.expedicion_lin!referencia_cliente (long.fija 16 carac.)
iPIEZAS_BULTO IN baan.ttisfc967300.t$cdad%TYPE, -- teleinformatica.mdb.expedicion_lin!piezas_bulto
iBULTOS_PALET IN baan.ttisfc967300.t$cdad%TYPE, -- teleinformatica.mdb.expedicion_lin!bultos_palet
iPALETS IN baan.ttisfc967300.t$cdad%TYPE) -- teleinformatica.mdb.expedicion_lin!palets
RETURN boolean IS
lETOD_ACTUAL baan.ttisfc967300.t$etod%TYPE;
lCDAD baan.ttisfc967300.t$cdad%TYPE;
lEMOD baan.ttisfc967300.t$emod%TYPE;
bEXISTEN_MAESTRAS boolean;
BEGIN
if iPALETS=0 OR (lETOD_BI = lETOD_MI AND lETOD_BF = lETOD_MF) OR iBULTOS_PALET=1 then
bEXISTEN_MAESTRAS:=false;
else
bEXISTEN_MAESTRAS:=true;
end if;
/* Creación de la etiquetas de Bulto */
lETOD_ACTUAL := lETOD_BI;
while lETOD_ACTUAL <= lETOD_BF loop
if bEXISTEN_MAESTRAS then
lEMOD:=trunc((lETOD_ACTUAL - lETOD_BI + 1) / iBULTOS_PALET,0) + lETOD_MI;
else
lEMOD:=0;
end if;
insert into baan.ttisfc967300(t$etod,t$item,t$seak,t$cdad,t$npre,t$expo,t$expd,
t$stat,t$ilck,t$isem,t$emod,t$isok,t$refcntd,t$refcntu)
values(lETOD_ACTUAL,sITEM,sSEAK,iPIEZAS_BULTO,0,0,TO_DATE('01-01-2999','dd-mm-yyyy'),
1,0,2,lEMOD,1,0,0);
lETOD_ACTUAL := lETOD_ACTUAL + 1;
end loop;
if bEXISTEN_MAESTRAS then
lETOD_ACTUAL := lETOD_MI;
while lETOD_ACTUAL <= lETOD_MF loop
insert into baan.ttisfc967300(t$etod,t$item,t$seak,t$cdad,t$npre,t$expo,t$expd,
t$stat,t$ilck,t$isem,t$emod,t$isok,t$refcntd,t$refcntu)
values(lETOD_ACTUAL,sITEM,sSEAK,iPIEZAS_BULTO*iBULTOS_PALET,0,0,
TO_DATE('01-01-2999','dd-mm-yyyy'),
1,0,1,lETOD_ACTUAL,1,0,0);
lETOD_ACTUAL := lETOD_ACTUAL + 1;
end loop;
end if;
return true;
END;
Desde ADO con un connection.execute y en el strin SQL con "exec [function]"
Y como recojo el valor que me devuelve
Puedes hacerlo con recordset tipo:
set record=server.CreateObject ("adodb.recordset")
set record=tu_conexion.execute(sql)
Y luego si sabes imprimir un recordset o bien guardarlo en una grilla no se...
En ASP sería algo asi:
Response.Write rs(0)
;=)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas