स्थैतिक कर्सर केवल स्थिर वस्तुओं तक पहुँच सकते हैं। दूसरे शब्दों में, स्थिर कर्सर तभी काम करते हैं जब सभी टेबल और कॉलम संकलन समय पर ज्ञात हों।
यदि आपको किसी तालिका तक पहुँचने की आवश्यकता है जिसका नाम केवल निष्पादन के दौरान ही जाना जाएगा, तो आपको डायनामिक SQL
. उदाहरण के लिए, आप REF CURSOR
आपके मामले में:
DECLARE
var_table_name VARCHAR2(30);
var_dimension_key VARCHAR2(30);
cur_dimension_key SYS_REFCURSOR;
BEGIN
FOR cur_all_dim IN (SELECT table_name
FROM dba_tables
WHERE dba_tables.tablespace_name = 'USERS'
AND dba_tables.owner = 'DWH_CORE'
AND UPPER(dba_tables.table_name) LIKE ('%DIM%%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%TEMP%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%DEBUG%')
AND UPPER(dba_tables.table_name) NOT LIKE ('%LOG%'))
LOOP
OPEN cur_dimension_key
FOR 'SELECT dimention_key
FROM ' || cur_all_dim.table_name;
LOOP
FETCH cur_dimensions_key INTO var_dimension_key;
EXIT WHEN cur_dimensions_key%NOTFOUND;
dbms_output.put_line(cur_all_dim.table_name);
dbms_output.put_line(var_dimension_key);
END LOOP;
CLOSE cur_dimension_key;
END LOOP;
END;