CREATE OR REPLACE FORCE VIEW logs_tree AS WITH x AS ( SELECT /*+ MATERIALIZE */ app.get_app_id() AS app_id, app.get_log_tree_id() AS log_id FROM DUAL ) SELECT l.log_id, l.log_parent, l.app_id, l.page_id, l.user_id, l.flag, l.action_name, LPAD(' ', (LEVEL - 1) * 6) || l.module_name AS module_name, l.module_line, l.module_timer, l.arguments, l.payload, l.session_id, l.created_at FROM logs l CROSS JOIN x CONNECT BY l.log_parent = PRIOR l.log_id START WITH l.log_id = x.log_id AND l.app_id IN (x.app_id, 0) ORDER SIBLINGS BY l.log_id; -- COMMENT ON TABLE logs_tree IS '[CORE - DASHBOARD] All messages related to selected tree id (`app.get_log_tree_id()`)'; -- COMMENT ON COLUMN logs_tree.log_id IS 'Log ID generated from `LOG_ID` sequence'; COMMENT ON COLUMN logs_tree.log_parent IS 'Parent log record; dont use FK to avoid deadlocks'; COMMENT ON COLUMN logs_tree.app_id IS 'APEX Application ID'; COMMENT ON COLUMN logs_tree.page_id IS 'APEX Application PAGE ID'; COMMENT ON COLUMN logs_tree.user_id IS 'User ID'; COMMENT ON COLUMN logs_tree.flag IS 'Type of error listed in `tree` package specification; FK missing for performance reasons'; COMMENT ON COLUMN logs_tree.action_name IS 'Action name to distinguish position in module or use it as warning/error names'; COMMENT ON COLUMN logs_tree.module_name IS 'Module name (procedure or function name)'; COMMENT ON COLUMN logs_tree.module_line IS 'Line in the module'; COMMENT ON COLUMN logs_tree.module_timer IS 'Timer for current row in seconds'; COMMENT ON COLUMN logs_tree.arguments IS 'Arguments passed to module'; COMMENT ON COLUMN logs_tree.payload IS 'Formatted call stack, error stack or query with DML error'; COMMENT ON COLUMN logs_tree.session_id IS 'Session id from `sessions` table'; COMMENT ON COLUMN logs_tree.created_at IS 'Timestamp of creation';