2015-09-30 129 views
0

我是Oracle和PL/SQL的新手,正在嘗試執行以下操作。For Oracle在Oracle/Toad中的循環

我從被存儲在一個變量

variable v_table varchar2(100) 
begin 
select 'mytable' into :v_table from dual; 
end; 

select column_name from all_tab_columns where table_name = :v_table 

這會返回一個行集表名返回的列名

column_name 
colname1 
colname2 
colname3 

我想通過返回的行集循環,並得到一些每列的統計信息。

select count distinct(colname1), min(colname1), max(colname1) 
from :v_table 
group by min(colname1), max(colname1) 

但是我無法弄清楚如何遍歷這個行集。

+0

如果您使用DBMS_Stats在表上收集統計信息,則可以直接從數據字典中選擇此數據。事實上,它可能已經在那裏。 –

+0

感謝@davidAldridge的迴應。看起來我沒有執行這些程序的權限。 – APMode

+0

無論如何,這可能是自動收集統計數據。 –

回答

0

通過使用下面你可以顯示錶的列名和附加您的SQL查詢按您的要求......

declare 
     v_table varchar2(100):='TABLE_NAME'; 
     TYPE NT_VAR1 IS TABLE OF VARCHAR2(30); 
     TYP_NT NT_VAR1; 
     begin 
     select column_name BULK COLLECT INTO TYP_NT from all_tab_columns where table_name =v_table 
     order by column_id; 
     FOR I IN 1..TYP_NT.COUNT 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('COLUMN '||I||': '||TYP_NT(I)); 
     END LOOP; 
     end; 

注意:你應該運行選擇查詢與使用執行動態指直接爲什麼,因爲你在運行時傳遞table_name。

編輯 在for循環中編輯您的查詢後,它將如下所示。

declare 
     v_table varchar2(100):='TABLE_NAME'; 
     TYPE NT_VAR1 IS TABLE OF VARCHAR2(30); 
     TYP_NT NT_VAR1; 
     var2 varchar2(2000); 
     var3 varchar2(2000); 
     begin 
     select column_name BULK COLLECT INTO TYP_NT from all_tab_columns where table_name =v_table 
     order by column_id; 
     FOR I IN 1..TYP_NT.COUNT 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('COLUMN '||I||': '||TYP_NT(I)); 
     EXECUTE IMMEDIATE 'SELECT to_char(min('||TYP_NT(I)||')),to_char(max('||TYP_NT(I)||')) from '||v_table into var2,var3; 
     dbms_output.put_line(var2||' '||var3); 
     END LOOP; 
     end; 

注意:查找表中列的最大數據長度並將相同的數據類型分配給var2和var3變量。

+0

謝謝@Tarun。請忽略此評論的最後編輯。它很好地工作,我在「DBMS輸出」窗口中看到結果。 – APMode

+0

是的,你可以看到它,你正在使用哪個工具? – Buddi

+0

我想你正在使用蟾蜍你能看到數據網格窗口? – Buddi