=====Oracle Apex 5 - Interactive Grid anpassen und konfigurieren - DML ändern bei ORA-22816: unsupported feature with RETURNING clause===== **Das Problem**: ORA-22816: unsupported feature with RETURNING clause 22816. 00000 - "unsupported feature with RETURNING clause" *Cause: RETURNING clause is currently not supported for object type columns, LONG columns, remote tables, INSERT with subquery, and INSTEAD OF Triggers. *Action: Use separate select statement to get the values. In einer gehosteten APEX Umgebung darf/kann nur mit DB Links mit den eigentlichen Traget Datenbanken für die Applikation gearbeitet werden. Das ist auf keinen Fall zu empfehlen und führt zu ärgerlichen Problemen, lässt sich aber in diesen, auch in Denken und in der Verantwortung, ausgelagerten Umgebung nicht mehr ändern. Soll nun der Interactive Grid für die Pflege von Stammdaten Tabellen verwendet werden, hat man ein Problem. Das Einfügen eines neuen Datensatzes schlägt fehl. Im Default wird beim Anlegen einer neuen Zeile in der Tabelle die "Returning" Klausel verwendet um die ROWID zu ermitteln. Dies ist aber über einen DB Link nicht zulässig und schlägt fehl. ====Lösung==== Umstellen vom Default auf einen eigene PL/SQL Routine. Zum Glück hat Patrick Wolf das aber in einem Community Thread beantwortet, vielen Dank dafür. Den "page process" "- Save Interactive Grid Data " von Interactive Grid Automatic Row Processing (DML)" auf PL-SQL umstellen; Nun kann hier ein eigener Code zum Einsatz kommen. Wichtig ist hier der APEX$ROW_STATUS * **I** oder **C** => Neuen Datensatz einfügen ( in aktuellen APEX C) * **U** => aktuellen Datensatz ändern * **D** => aktuellen Datensatz löschen Die Spalten werden über den Spaltenanmen im IG referenziert. Der Code für den angepassten "page process" "- Save Interactive Grid Data" für die Tabelle DEPT: begin case :APEX$ROW_STATUS when 'C' then insert into dept ( DEPTNO , DNAME , LOC) values ( :DEPTNO, :DNAME, :LOC ) ; -- not possible over database Link! --returning rowid into :ROWID; select rowid into :ROWID from dept where DEPTNO = :DEPTNO and DNAME = :DNAME and LOC = :LOC; when 'U' then update dept set DNAME = :DNAME ,deptno = :DEPTNO , loc = :LOC where rowid = :ROWID; when 'D' then delete dept where rowid = :ROWID; else apex_application.g_print_success_message := ' I get this ROW STATUS => '|| :APEX$ROW_STATUS || ' fix the code! '; end case; end; (siehe Quelle für den orginal Post von Patrick Wolf ) Nach dem nun diese erste Hürde genommen ist, kann das ganze robuster über den Aufruf eines passenden PL/SQL Packages gestaltet werden. ==== Quellen ==== APEX 5.1 How to manually process Interactive Grid data using PL/SQL => https://community.oracle.com/thread/3937159