2013-10-11 42 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

相关问题