2014-08-29 69 views
0

我有这个plsql代码,它将为我提供名为CUSTOMERS的数据库中的所有表。现在我感到如何在此插入另一个循环。我想从这段代码中得到输出,并将它传递到下一个循环,我想要查询类似于Schema.customers中的select count(*);为每个模式。我的代码查询Oracle中的所有表格

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 
+0

[动态创建和在Oracle中执行SQL命令]可能重复(http://stackoverflow.com/questions/2284079/dynamically-creating -and-executed-sql-commands-in-oracle) – Bulat 2014-08-29 16:04:46

+0

也http://stackoverflow.com/questions/22216805/executing-dynamic-sql-query-in-oracle – Bulat 2014-08-29 16:06:15

回答

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; 

任何问题只是让我知道。

谢谢。

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'