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 !