Java 在sql、oracle中检测、删除空列并更新数据库
我有100个列,其中一些列中没有任何值(它们是空的)。我如何搜索空列并从表中删除和更新数据库?我尝试了这个查询,但不起作用。它显示选择的0行。选择如何更新数据库后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; 谢谢,您正在查询数据字典视图。它显示有关数据库的元数据和信息。此视图(所有选项卡列)显示每个表的每一列的信息(您
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>