Skip to Main Content

 

Auswahl  

Komplett Übersicht aller Oracle Tipps

Globale Suche in APEX 

Oracle
APEX
APEX 23.2
18.08.24 (MP)
19.08.24(MP)
Globale Suche

Passende Schulungen zum Thema

Wir verwenden für unsere Webseite Oracle 23ai mit APEX 24.1.x (Stand August 2024). Leider funktioniert die Globale Suche dort nicht mehr und die Anfrage stürzt ab mit Webserver Internal Server Fehler 500.

Deswegen haben wir uns eine eigene Suche geschrieben, die kann nur leider nicht direkt auf die Komponente verlinken, aber durchsucht dafür alle APEX Tabellen !

CREATE OR REPLACE TYPE apex_search_type 
        AS OBJECT (
        app_id         NUMBER, 
        page_id     NUMBER, 
        row_text     CLOB, 
        tab_name    VARCHAR2(128),
        col_name     VARCHAR2(128),
        row_id         VARCHAR2(32));
        /

 

CREATE OR REPLACE FUNCTION  muso_apex_search
        (p_app_id IN NUMBER DEFAULT 0, p_search_string IN VARCHAR2)
        RETURN  apex_search_tab_type PIPELINED IS
        TYPE    ref_curs_type IS REF CURSOR;  
        refc    ref_curs_type;
        str             VARCHAR2(2001);  
        ret_rowid    ROWID;  
        ret_col         CLOB;
        v_schema VARCHAR2(128);
        v_flow_id   VARCHAR2(64);
        v_page_id   VARCHAR2(128);
        BEGIN
            SELECT schema 
                INTO v_schema
            FROM dba_registry WHERE comp_id='APEX';
        FOR rec IN (select table_name,column_name,data_type
                FROM sys.all_tab_columns dtc, all_objects do
                WHERE dtc.table_name=do.object_name and
              do.object_type='TABLE' and dtc.owner=v_schema) 
               LOOP
              
               v_flow_Id:='';
               v_page_id:='';
               FOR c_flow IN (SELECT column_name FROM all_tab_columns 
                   WHERE owner=v_schema AND table_name=rec.table_name 
                   AND column_name IN('FLOW_ID','PAGE_ID' ) ) 
                    LOOP
                   IF c_flow.column_name='FLOW_ID' THEN
                       v_flow_id:=',flow_id';
                   ELSIF c_flow.column_name='PAGE_ID' THEN
                        v_page_id:=',page_id';
                   END IF;
              END LOOP;
                IF rec.data_type IN( 'CHAR','VARCHAR2','CLOB') THEN
                    str:= 'SELECT rowid,'||rec.column_name||nvl(v_flow_id,',null as flow_id')||nvl(v_page_id,',null as page_id')||
                   ' FROM '||v_schema||'.'||rec.table_name||    
                    ' WHERE '||rec.column_name||' like '||chr(39)||'%'||p_search_string||'%'||chr(39);
                    BEGIN
                         OPEN refc FOR str;
                    LOOP         
                    FETCH refc 
                    INTO ret_rowid,ret_col,v_flow_id,v_page_id;  
                       EXIT WHEN refc%NOTFOUND;         
                       If nvl(p_app_id,v_flow_id)=v_flow_ID THEN
                           PIPE ROW (apex_search_type(v_flow_id,v_page_id,ret_col,v_schema||'.'||rec.table_name,rec.column_name,ret_rowid));   
                       END IF;
                    END LOOP;  
                         ret_rowid:='';   
                       ret_col:='';  
                    CLOSE refc;
                         EXCEPTION WHEN OTHERS THEN
              PIPE ROW (apex_search_type(0,0,'Fehler:'||sqlerrm||' =>'||str,rec.table_name,null,null));
             END;
                END IF;
        END LOOP;
        END;
        /
        
  • Jetzt können Sie Ihre globale Suche beginnen. Wir brauchen bis zu zwei Parameter:
    App ID: ist nicht Pflicht, wenn es leergelassen wird, findet die Suche in allen APPs (auch den internen !) statt
  • Der Suchstring: Dieser ist natürlich Pflicht
select * from table(muso_apex_search(11000,'Sitemap') );

Weitere tolle Tipps bekommen Sie in einem von unseren 6 APEX Kursen ! Wir freuen uns auf Sie !