【问题标题】:row count of columns with NUMBER datatype only using dynamic sql in oracle仅在 oracle 中使用动态 sql 的 NUMBER 数据类型的列的行数
【发布时间】:2014-04-11 03:29:59
【问题描述】:

我只是为模式中的每个表计算了行数。 现在我需要数据类型为 NUMBER 的表中列的行数。 我不知道如何获取每个表的单个 NUMBER 数据类型列的行数?

DECLARE
  t_c1_tname user_tables.table_name%TYPE;
  t_command  VARCHAR2(200);
  row_count INTEGER;
  CURSOR c1 IS SELECT table_name FROM user_tables ORDER BY table_name;
BEGIN 
  OPEN c1;
  LOOP
        FETCH c1 INTO t_c1_tname;
        EXIT WHEN c1%NOTFOUND;
        t_command  := 'SELECT COUNT(*) FROM '||t_c1_tname ;
        execute immediate t_command into  row_count;
        dbms_output.put_line('Table : '|| t_c1_tname || 'Count : '|| row`enter code here`_count);
  END LOOP;
  CLOSE c1;
END;

【问题讨论】:

  • select * from all_tab_columns where owner = 'H' and data_type = 'NUMBER';
  • 您是指每个数字列中非空值的计数,还是具有任何数字列的任何表的行数?如果您只查看自己的架构,您也可以使用user_tab_columns;在您当前的代码中使用 user_tables 建议。
  • 仅选择数据类型为 NUMBER 的列。然后在该 NUMERIC 列中计算 NULL 和 Non_NULL 值的行数。这部分忘了说

标签: oracle count dynamic-sql


【解决方案1】:

我想这就是你想要的:

set serveroutput on
declare
  not_null_count INTEGER;
  null_count INTEGER;
begin
  for r in (
    select utc.table_name, utc.column_name
    from user_tab_columns utc
    where data_type = 'NUMBER'
    order by utc.table_name, utc.column_id
  )
  loop
    execute immediate 'select count("' || r.column_name || '"),
      count(nvl2("' || r.column_name || '", null, 1))
      from "' || r.table_name || '"'
    into not_null_count, null_count;
    dbms_output.put_line('Table: ' || r.table_name
      || ' column: ' || r.column_name
      || ' not-null: ' || not_null_count
      || ' null: ' || null_count);
  end loop;
end;
/

如果我创建一些数据:

create table t42(num1 number, num2 number, str1 varchar2(5));

insert into t42 values (1, 2, 'a');
insert into t42 values (3, 4, 'b');
insert into t42 values (5, null, 'c');

然后块显示:

Table: T42 column: NUM1 not-null: 3 null: 0
Table: T42 column: NUM2 not-null: 2 null: 1

如果您查询的是all_tab_columns,则需要获取并使用表所有者:

  for r in (
    select atc.owner, atc.table_name, atc.column_name
    from all_tab_columns atc
    where data_type = 'NUMBER'
    order by atc.owner, atc.table_name, atc.column_id
  )
  loop
    execute immediate 'select count("' || r.column_name || '"),
      count(nvl2("' || r.column_name || '", null, 1))
      from '"' || r.owner || '"."' || r.table_name || '"'
    into not_null_count, null_count;

【讨论】:

  • 我使用了这个代码,就像一个魅力。但我有一个问题。 SELECT table_name, column_name FROM all_tab_columns WHERE table_name IN ('tb1','tb2') AND data_type = 'NUMBER'; table1 是两个模式共有的。因此,当我使用 all_tab_columns 运行上述代码时,出现错误:表或​​视图不存在。不知道是什么原因?
  • @Xasthur - 如果任何表不在您的架构中,那么您会收到该错误;如果一个表出现两次,其中一个在您的架构中,那么您将查询同一个表两次。您需要在动态 SQL 中包含表所有者。我已经用一个(未经测试,但我认为我的引号是对的!)示例更新了答案。
猜你喜欢
  • 2018-01-17
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多