Java 在sql、oracle中检测、删除空列并更新数据库

Java 在sql、oracle中检测、删除空列并更新数据库,java,sql,oracle,Java,Sql,Oracle,我有100个列,其中一些列中没有任何值(它们是空的)。我如何搜索空列并从表中删除和更新数据库?我尝试了这个查询,但不起作用。它显示选择的0行。选择如何更新数据库后 select table_name, column_name from all_tab_columns where table_name='some_table' and column_name is NULL; 谢谢,您正在查询数据字典视图。它显示有关数据库的元数据和信息。此视图(所有选项卡列)显示每个表的每一列的信息(您

我有100个列,其中一些列中没有任何值(它们是空的)。我如何搜索空列并从表中删除和更新数据库?我尝试了这个查询,但不起作用。它显示选择的0行。选择如何更新数据库后

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

谢谢,

您正在查询数据字典视图。它显示有关数据库的元数据和信息。此视图(所有选项卡列)显示每个表的每一列的信息(您有权访问)。列名称必须不能为null,因此查询不返回任何行

现在,您要做的是查询每个表,找出哪些列中没有数据。这需要动态SQL。您将需要查询所有的\u TAB\u列,这样您就不会完全偏离基准

由于动态SQL,这是一个编程解决方案,因此结果显示为DBMS_输出

set serveroutput on size unlimited 
这是一个匿名块:运行它可能需要一些时间。连接到用户表是必要的,因为视图中的列包含在TAB\u列中,我们不希望这些列包含在结果集中

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;
计数为0的任何列中都没有值

现在,你是否真的想删除这些列是另一回事。您可能会破坏依赖它们的程序。因此,您首先需要进行影响分析。这就是为什么我没有生成一个自动删除空列的程序。我认为那是危险的做法


考虑并审核对数据库结构的更改是至关重要的。因此,如果我进行这样的练习,我会改变上面程序的输出,使其生成一个drop column语句脚本,我可以查看、编辑并保持在源代码控制下。

是否在字典表中查找列名称为NULL?您想从表中删除或删除该列吗?我正在查找列名称,它是空的,没有任何值,我想从表中删除它。请小心,只使用此处提到的更新脚本谢谢分享知识!我很感激!我使用了上次更新的代码,并将我的模式名和表名放在那里。结果是“收集打印的DDL,请检查它,然后继续删除”)“它没有从我的表中删除列。它不会删除任何列,我更改了。重新运行,从这里复制脚本,用大写的模式和表名。谢谢,我明白你的意思。。但我对sql还是新手。请帮助我进行PL/SQL查询。。
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>