【问题标题】:How do I include counts of named tables in the output of an oracle stored procedure?如何在 oracle 存储过程的输出中包含命名表的计数?
【发布时间】:2013-10-12 17:34:14
【问题描述】:

我有一个存储过程,可以将行选择到 out 游标中,如下所示:

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_tables 中的 table_name 列包含数据库表的名称,我想在输出中包含这些表的计数;所以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 ,然后在我的选择中加入它;但我不知道如何拥有一个多列表变量。

【问题讨论】:

  • 您需要行数的近似值还是确切的行数?
  • 准确的行数。我的问题不是我无法获取计数,而是我无法将其放入输出游标中。
  • 我可以看到的大约计数(很容易从统计数据中提取),但是对于没有 pk 或唯一 idx 的大型表,运行时的准确计数会变得很难看。这可能属于“你真的需要这个吗?”类别

标签: sql oracle stored-procedures


【解决方案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;

【讨论】:

  • 谢谢。如何将内部查询的结果收集到输出游标中?
  • 我刚刚更新了建议使用函数来执行此操作的答案。
  • 到达那里,我想。我现在在运行 SP 时收到“ORA-00933:SQL 命令未正确结束”。
  • 啊,有一个杂散的报价。我会修复答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2019-05-13
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2017-02-21
相关资源
最近更新 更多