Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Dynamic WHERE clause

Spike HouseDec 7 2022 — edited Dec 7 2022

Hi All.
Oracle Version: 19.15
All DDL/DML below.

Along with EMP table, consider we have an additional application table called user_filt_details, which stores report filters created by application users. For simplicity, assume all filter conditions retrieve only the ename, I need to generate an exploded report with the filter along with the enames retrieved by it .

_user_filt_details l_ooks like below:
image.png
Final Expected output is as below:
image.png
The below solution I thought of requires creating a table and populating it through a batch job every day, which would not capture any new filters added by users post batch run. I would appreciate if someone could advise a more Realtime/dynamic way of generating this output.

SET SERVEROUTPUT ON;
DECLARE
  sql_stmt CLOB := NULL;
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE filt_exploded';
FOR cur IN ( SELECT filt_name, filt_cond from user_filt_details)
LOOP
  sql_stmt := q'{ INSERT INTO filt_exploded
            SELECT vh.filt_name, vh.filt_cond, lat.ename
            FROM user_filt_details vh, LATERAL( SELECT l.ename
                               FROM emp l
                            WHERE }' || cur.filt_cond
                         || q'{ ) lat
            WHERE vh.filt_name = '}' || cur.filt_name ||q'{'}'
        ;
  DBMS_OUTPUT.PUT_LINE(sql_stmt); 
  EXECUTE IMMEDIATE sql_stmt;
  COMMIT;
END LOOP;
END;
/

DDL/DMLs

CREATE TABLE user_filt_details (filt_name VARCHAR2(200), filt_cond CLOB);
INSERT INTO user_filt_details VALUES('my_jobs' , q'{JOB IN ('PRESIDENT', 'ANALYST')}');
INSERT INTO user_filt_details VALUES('sal_review' , q'{SAL <= 1000}');
INSERT INTO user_filt_details VALUES('dept_30_emps' , q'{DEPTNO = 30}');
COMMIT;

CREATE TABLE filt_exploded(filt_name VARCHAR2(200) , filt_cond CLOB, ename  VARCHAR2(10) );

Please let me know if additional information is required.
Thank You!

Comments
Post Details
Added on Dec 7 2022
1 comment
238 views