Using dbms xmlgen as a means of dynamic SQL

From dbawiki
Jump to: navigation, search
select table_name
,      to_number( extractvalue( xmltype( dbms_xmlgen.getxml( 'select count(*) c from '||table_name) ),'/ROWSET/ROW/C') ) count
from   user_tables;
TABLE_NAME                      COUNT
------------------------------ ------
DEPT                                4
EMP                                14
BONUS                               0
SALGRADE                            5

A more complex example[edit]

SQL> create table mpi_memgc(x number, y varchar2(10), z varchar2(10))
Table created.
SQL> insert into mpi_memgc values (1,'bla','bli     ')
1 row created.
SQL> commit
Commit complete.
SQL> select 
  'select count(*) c from "'||table_name||'" where "'||column_name||
     '" like %  or "'||column_name||
     '" like  %' query,
 table_name,column_name,
 to_number(extractvalue(xmltype(dbms_xmlgen.getxml(
   'select count(*) c from "'||table_name||'" where "'||column_name||
     '" like %  or "'||column_name||
     '" like  %')),'/ROWSET/ROW/C')) count
from user_tab_columns
where table_name like 'MPI_MEMGC%' 
and table_name not like '%_H'
and data_type = 'VARCHAR2'
order by 1;
QUERY                                                                           
--------------------------------------------------------------------------------
TABLE_NAME                     COLUMN_NAME                         COUNT
------------------------------ ------------------------------ ----------
select count(*) c from "MPI_MEMGC" where "Y" like '% ' or "Y" like ' %'         
MPI_MEMGC                      Y                                       0

select count(*) c from "MPI_MEMGC" where "Z" like '% ' or "Z" like ' %'         
MPI_MEMGC                      Z                                       1