Hallo,
natürlich dürfen Funktionen in Oracle UPDATE-Statements ausführen (auch wenn es keine gute Sache ist). Das gleiche Problem hättest du ja, wenn deine Funktion eine Stored Procedure aufruft, die Daten verändert. Es kommt auf den Kontext an, in dem deine Funktion verwendet werden soll. Denn dieser anonyme PL/SQL-Block hier würde funktionieren:
SQL:
declare
funcResult varchar2(20);
begin
funcResult := myfunc;
dbms_output.put_line( funcResult );
end;
Du hast in dem Moment natürlich eine offene Transaktion.
Ein Problem wäre eher gegeben, wenn du die Funktion innerhalb von SQL verwernden möchtest. Denn das geht so nicht, da geb ich Dir Recht:
Dann musst du entweder mit RESTRICT_REFERENCES oder mit autononem Transaktionen arbeiten, um dein Update dennoch durchführen zu können. Ob das erwünscht ist - keine Ahnung, aber du sagtest ja, du brauchst ja gerade eine Funktion, die das Update durchführt.
Wenn du das ganze nun aber als Stored Procedure lösen möchtest/musst
schreibst du den Code eben um und definierst einen OUT-Parameter.
Ob das von Access aus so funktioniert - keine Ahnung.
SQL:
CREATE OR REPLACE PROCEDURE myProc ( errCode OUT VARCHAR2 ) IS
BEGIN
UPDATE xyz
SET a=3;
errCode := 'OK';
END;
In SQL kannst du diese Prozedur nun nicht verwenden.
Du kannst sie natürlich aus anderem Kontext z.B. PL/SQL heraus aufrufen:
SQL:
declare
procErrcode VARCHAR2(20);
begin
myProc ( procErrcode );
dbms_output.put_line( procErrcode );
end;
Ob dir das ganze nun mit deinem Access-Problem hilft, müsstest du schauen. Die Lösung mit der autonomen Transaktion innerhalb einer Funktion kann ich Dir wie schon erwähnt noch vorschlagen, falls es unbedingt eine Stored Function sein muss.
Gruss,
Markus