2013-07-26 118 views
0

下午所有,Oracle 10g中的動態SQL查詢

我是Oracle和SQL的新手,但是我已經創建了下面的代碼。我目前正在使用Oracle 10g。我只是想知道是否有人可以幫助我使這個代碼動態而不是硬編碼。

代碼我只是看着一個記錄用戶活動的表。然後,我基本計算每個用戶/ PC的記錄數,並將其顯示在一個透視樣式表中。

這不是一個非常困難的查詢,但我可以有大約30個左右的PC,我需要輸入這個硬編碼的方法並不是完成這個任務的最好方法。

我一直在網上搜索,看看我可以使用基於主機名或user_ID的動態聲明,但我還沒有設法找到任何簡單地循環訪問我的數據,然後生成這個樞紐式樣視圖。

我一直在看'光標',但即時通訊認爲即時通過遠射。

螞蟻的幫助是提前很多appriechiated。

問候 貝蒂

SELECT USER_ID, 
    SUM(CASE WHEN host LIKE 'PC1' THEN 1 ELSE 0 END) AS PC1, 
    SUM(CASE WHEN host LIKE 'PC2' THEN 1 ELSE 0 END) AS PC2, 
    SUM(CASE WHEN host LIKE 'PC3' THEN 1 ELSE 0 END) AS PC3, 
    SUM(CASE WHEN host IS NOT NULL THEN 1 ELSE 0 END) AS grand_total 
FROM table_Name 
GROUP BY USER_ID 

回答

1

當你問一個oracle問題要注意釋放是很重要的。在你的情況 - 如果你有11g,你可以看看pivot函數。

在10G(和在11g),你可以不管你是用你要查詢的不同值的樞軸或動態SQL嘗試類似的東西

create or replace function get_pivot() 
return sys_refcursor 
as 
    stmt varchar2(32000); 
    c sys_Refcursor; 
    cursor c_values as 
     select distinct host from table_name; 
begin 
    stmt := 'select user_id , '; 

    for x in c_values loop 
     stmt := stmt || ' sum(case when host = '''||x.host||''' then 1 else 0 end) as ' ||host|| ','; 
    end loop; 

    stmt := stmt || ' count(host) as grand_total from table_name group by user_id'; 

    open c for stmt; 
    return(c); 
end get_pivot; 

沒有測試過 - 我目前沒有我的預言。