2014-07-03 57 views
1

我使用SQL Server構建了一個腳本,該腳本遍歷數據庫中的每個表並構建了一個動態語句,該語句在執行時顯示列名,類型,填充值數和總行數每列。執行動態SQL語句表

我現在正在嘗試與Oracle構建相同的東西,但我遇到了問題。下面的代碼給了我一張充滿了所有適當語句的表格,但是我如何執行並顯示它們?

>SELECT 
    'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' ||  atc.data_type || ''', 
SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled  Values", 
    COUNT(temp.' || atc.column_name || ') "Total Records" 
    FROM all_tab_columns atc 
    JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' || 
    atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow 
FROM all_tab_columns atc; 

這是從上面的代碼所產生的語句的示例:

>SELECT 'INITIAL_EXTENT', 'ALL_ALL_TABLES', 'NUMBER', 
SUM(CASE WHEN temp.INITIAL_EXTENT IS NULL THEN 0 ELSE 1 END) "Filled Values", 
COUNT(temp.INITIAL_EXTENT) "Total Records" 
FROM all_tab_columns atc 
JOIN ALL_ALL_TABLES temp ON atc.column_name = 'INITIAL_EXTENT' AND atc.table_name =  'ALL_ALL_TABLES' 

回答

3

下面是一個嘗試:

declare 
    myCol1 varchar2(1000); 
    myCol2 varchar2(1000); 
    myCol3 varchar2(1000); 
    myCol4 number; 
    myCol5 number; 
begin 
    for line in 
    (
    SELECT 
     'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' ||  atc.data_type || ''', 
    SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled  Values", 
     COUNT(temp.' || atc.column_name || ') "Total Records" 
     FROM all_tab_columns atc 
     JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' || 
     atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow 
    FROM all_tab_columns atc 
) 
    loop 
    dbms_output.put_line(myCol1 || ' | ' || myCol2 || ' | ' || myCol3 || ' | ' || myCol4 || ' | ' || myCol5); 
    execute immediate line.Sqlrow into myCol1, myCol2, myCol3, myCol4, myCol5; 
    end loop; 
end; 
/

這是使用包DBMS_OUTPUT以顯示結果作爲字符串;如果您希望將結果作爲查詢集,請考慮使用流水線函數。

編輯:如果您使用SQL Developer,您可以使用this link來查看結果;對於SQL * Plus,請嘗試this one。由於此緩衝區輸出,您可以看到LONG數據類型的故障表是什麼(請注意,在上述解決方案中,我切換了dbms_outputexecute immediate行以在執行之前顯示錶)。

您還可以在LONG datatypehere找到限制條件。

+0

謝謝@Emmanuel,但是當我運行這個時不打印出結果。我也查找了流水線函數,但我也不太瞭解這些。 – TaiwanTimmy

+0

當我運行你給我的代碼時,它運行了大約兩分鐘,然後抱怨說這是'非法使用LONG數據類型'。你知道這可能是什麼原因嗎? – TaiwanTimmy

+0

看到我的編輯,你應該找到好的信息。 – Emmanuel