Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_apex_interactive_gird

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 := '<span style="color:yellow"> I get this ROW STATUS => '|| :APEX$ROW_STATUS || ' fix the code! </span>';
 
     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

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
prog/oracle_apex_interactive_gird.txt · Zuletzt geändert: 2018/04/30 16:48 von Gunther Pippèrr