2013-10-11 45 views
0

我有一個存儲過程,其選擇行成出光標,像這樣:如何在oracle存儲過程的輸出中包含命名錶的計數?

PROCEDURE GetUserTables(
    out_cur OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN out_cur FOR 
     SELECT u.user_id, u.user_name, ut.table_name 
      FROM users u 
      JOIN user_tables ut ON ut.user_id = u.user_id 
     ORDER BY u.user_name, ut.table_name; 
END 

user_tablestable_name列包含一個DB表的名稱,以及我想包括計數這些表輸出;所以out_cur將包含這樣的事情:

| user_id | user_name | table_name | row_count | 
+---------+-----------+--------------+-----------+ 
| 1  | Simon  | simons_dogs | 1   | 
| 1  | Simon  | simons_cats | 0   | 
| 2  | Jenny  | jennys_dogs | 2   | 
| 3  | Ellie  | ellies_dogs | 3   | 
| 3  | Ellie  | ellies_cats | 1   | 
| 3  | Ellie  | ellies_birds | 5   | 

simons_dogs等是實際表的名稱。

我的第一個想法是在過程中有一個表變量,並通過插入user_tables循環,然後加入到我的select;但我無法弄清楚如何有一個多列表變量。

+1

使用動態SQL,請參閱http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm –

+0

您是否需要近似行計數或確切的行數? – SriniV

+0

準確的行數。我的問題不是我無法獲得計數,而是我無法將其輸入到輸出光標中。 – Simon

回答

1

您將需要使用動態SQL,看到http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm

您將需要兩個查詢:

  • 在外部查詢你需要查詢你感興趣的查詢表名。

  • 內部「count(*)」查詢將被構造爲一個字符串,嵌入表的名稱。儘管應該使用通常綁定變量,但它們不能用於查詢的表名(或列名)部分。

這是正常的方法,但似乎不符合您提供的示例代碼。在這種情況下,你可以把它接受一個表名的函數,該函數使用動態SQL內執行COUNT(*),這樣的事情:

function count_rows(p_table_name in varchar2) return integer is 
    l_count integer; 
begin 
    execute immediate 'select count(*) from ' || p_table_name into l_count; 
    return l_count; 
end; 

和像

select table_name, count_rows(table_name) as row_count 
from user_tables; 
+0

謝謝。如何將內部查詢的結果收集到輸出光標中? – Simon

+0

我剛剛更新了建議使用函數來做到這一點的答案。 –

+0

到達那裏,我想。當我運行我的SP時,我現在得到了「ORA-00933:SQL命令未正確結束」。 – Simon

相關問題