查询Oracle中的所有表

时间:2014-08-29 15:47:17

标签: sql oracle plsql

我有这个plsql代码,它将为我提供名为CUSTOMERS的数据库中的所有表。现在我很震惊如何在此插入另一个循环。我想从这段代码中获取输出并将其传递给下一个循环,在那里我想查询类似的东西,从Schema.customers中选择count(*);对于每个架构。

DECLARE
    --c_id customers.id%type;
    c_name all_tables.table_name%type;
    c_tabs all_tables.owner%type;
    CURSOR c_tables is
      SELECT table_name, owner FROM all_tables where table_name='CUSTOMERS';
        BEGIN
        OPEN c_tables;
        LOOP
        FETCH c_tables into c_name, c_tabs;
        dbms_output.put_line(c_tabs || '.' || c_name );
        EXIT WHEN c_tables%notfound;
        END LOOP;
        CLOSE c_tables;
    END;
    /

-------我的代码示例输出:------------

UMICH2.CUSTOMERS
TRINITYDC.CUSTOMERS
BUFFALO.CUSTOMERS
SNOW.CUSTOMERS
PULASKITECH.CUSTOMERS
RARITANVAL.CUSTOMERS
STMARYSCA.CUSTOMERS

2 个答案:

答案 0 :(得分:1)

您可以在单个SQL语句中获得相同的结果

SELECT table_name
      ,to_number
         (extractvalue
            (xmltype
               (dbms_xmlgen.getxml
                  ('SELECT count(*) c FROM ' || owner || '.' || table_name)
               )
            ,'/ROWSET/ROW/C'
            )
         ) Count
  FROM all_tables
 WHERE table_name = 'CUSTOMERS'

答案 1 :(得分:0)

这种方式是你可以做到的一种可能性。

DECLARE
  --c_id customers.id%type;
  c_name  all_tables.table_name%TYPE;
  c_tabs  all_tables.owner%TYPE;

  v_value PLS_INTEGER;


  CURSOR c_tables  IS
    SELECT table_name
      FROM all_tables
     WHERE table_name = 'CUSTOMERS';

  CURSOR c_owner  IS
    SELECT DISTINCT owner
      FROM all_tables
     WHERE table_name = 'CUSTOMERS';
BEGIN
  OPEN c_tables;

  LOOP
    FETCH c_tables INTO c_name;

    OPEN c_owner;

    LOOP
      FETCH c_owner INTO c_tabs;

      BEGIN
        EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || c_tabs || '.' || c_name INTO v_value;
      EXCEPTION
        WHEN other THEN
          NULL;
      END;

      DBMS_OUTPUT.put_line ( v_value );
      EXIT WHEN c_owner%NOTFOUND;
    END LOOP;

    CLOSE c_owner;

    DBMS_OUTPUT.put_line ( c_tabs || '.' || c_name );
    EXIT WHEN c_tables%NOTFOUND;
  END LOOP;

  CLOSE c_tables;
END;

任何问题只是让我知道。

感谢。