Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_apex_interactive_gird

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
prog:oracle_apex_interactive_gird [2018/04/24 15:53] – [Lösung] gpipperrprog:oracle_apex_interactive_gird [2018/04/30 16:48] (aktuell) – [Lösung] gpipperr
Zeile 1: Zeile 1:
 +=====Oracle Apex 5 - Interactive Grid anpassen und konfigurieren - DML ändern bei ORA-22816: unsupported feature with RETURNING clause=====
 +
 +**Das Problem**:
 +
 +<code bash>
 +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.
 +</code>
 +
 +
 +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:
 +<code plsql>
 +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 := '<span style="color:yellow"> I get this ROW STATUS => '|| :APEX$ROW_STATUS || ' fix the code! </span>';
 +     
 +     end case;  
 +end;
 +</code>
 +(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
  
prog/oracle_apex_interactive_gird.txt · Zuletzt geändert: 2018/04/30 16:48 von gpipperr