Detectar, eliminar columnas vacías y actualizar la database en sql, oracle

Tengo 100 columnas y algunas de ellas no tienen ningún valor en el interior (están vacías). ¿Cómo puedo search columnas vacías y eliminar de la tabla y actualizar la database? Intenté esta consulta, pero no funciona. Muestra 0 filas seleccionadas. Después de seleccionar ¿cómo puedo actualizar la database?

select table_name, column_name from all_tab_columns where table_name='some_table' and column_name is NULL; 

Gracias,

Está consultando una vista de dictionary de datos. Muestra metadatos , en formación sobre la database. Esta vista, ALL_TAB_COLUMNS, muestra información para cada columna de cada tabla (tiene privilegios). Necesariamente COLUMN_NAME no puede ser nulo, por lo tanto, su consulta no devuelve filas.

Ahora lo que quiere hacer es consultar cada tabla y encontrar qué columnas no tienen datos. Esto requiere SQL dynamic. Tendrá que consultar ALL_TAB_COLUMNS, por lo que no estaba completamente fuera de la base.

Debido a SQL dynamic, esta es una solución programática, por lo que los resultados se muestran con DBMS_OUTPUT.

 set serveroutput on size unlimited 

Aquí hay un bloque anónimo: puede llevar un time ejecutarlo. La unión a USER_TABLES es necesaria porque las columnas de las vistas se incluyen en TAB_COLUMNS y no las queremos en el set de resultados.

 declare dsp varchar2(32767); stmt varchar2(32767); begin << tab_loop >> for trec in ( select t.table_name from user_tables t ) loop stmt := 'select '; dbms_output.put_line('table name = '|| trec.table_name); << col_loop >> for crec in ( select c.column_name , row_number() over (order by c.column_id) as rn from user_tab_columns c where c.table_name = trec.table_name and c.nullable = 'Y' order by c.column_id ) loop if rn > 1 then stmt := concat(stmt, '||'); end if; stmt := stmt||''''||crec.column_name||'=''||' ||'to_char(count('||crec.column_name||')) '; end loop col_loop; stmt := stmt || ' from '||trec.table_name; execute immediate stmt into dsp; dbms_output.put_line(dsp); end loop tab_loop; end; 

muestra de salida:

 table name = MY_PROFILER_RUN_EVENTS TOT_EXECS=0TOT_TIME=0MIN_TIME=0MAX_TIME=0 table name = LOG_TABLE PKG_NAME=0MODULE_NAME=0CLIENT_ID=0 PL/SQL procedure successfully completed. SQL> 

Cualquier columna donde COUNT = 0 no tiene valores.

Ahora bien, si realmente desea eliminar tales columnas es una cuestión diferente. Puede romper progtwigs que dependen de ellos. Entonces, primero necesita un análisis de impacto. Esta es la razón por la que no he producido un progtwig que arroje automáticamente las columnas vacías. Creo que sería una práctica peligrosa.

Es crucial que los cambios en nuestra estructura de database sean considerados y auditados. Entonces, si alguna vez fuera a emprender un ejercicio como este, alteraría el resultado del progtwig anterior, por lo que produjo un guión de declaraciones de columna desplegable que pude revisar, editar y mantener bajo control de fuente.