Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle/SQL-在另一个查询中使用查询结果作为参数-循环?_Sql_Oracle_Aggregate Functions - Fatal编程技术网

Oracle/SQL-在另一个查询中使用查询结果作为参数-循环?

Oracle/SQL-在另一个查询中使用查询结果作为参数-循环?,sql,oracle,aggregate-functions,Sql,Oracle,Aggregate Functions,大家好,我想知道我是否可以创建一个表,列出其他表的记录计数。它将从表中获取这些表名。让我们假设我有一个如下的表列表 name --------- sports_products <-- contains 10 records house_products <-- contains 8 records beauty_products <-- contains 15 records 所以我想我需要做一些类似于这个伪代码的事情 select * from foreach t

大家好,我想知道我是否可以创建一个表,列出其他表的记录计数。它将从表中获取这些表名。让我们假设我有一个如下的表列表

name
---------
sports_products <-- contains 10 records
house_products  <-- contains 8 records
beauty_products <-- contains 15 records
所以我想我需要做一些类似于这个伪代码的事情

select *
from    foreach tableName in select name from table_list
            select count(*) as numRecords
            from tableName
        loop

您可以使用一个函数,通过动态sql为您执行此操作

但是,请确保将其声明为authid current_user。您不希望任何人利用您的功能获得某种特权提升

create or replace function SampleFunction
(
  owner     in VarChar
 ,tableName in VarChar
) return integer authid current_user is
  result Integer;
begin
  execute immediate 'select count(*) from "' || owner || '"."' || tableName || '"'
    INTO result;

  return result;
end;

您可以使用一个函数,通过动态sql为您执行此操作

但是,请确保将其声明为authid current_user。您不希望任何人利用您的功能获得某种特权提升

create or replace function SampleFunction
(
  owner     in VarChar
 ,tableName in VarChar
) return integer authid current_user is
  result Integer;
begin
  execute immediate 'select count(*) from "' || owner || '"."' || tableName || '"'
    INTO result;

  return result;
end;

一种方法是简单地更新数据库统计信息,使用dbms_stats包或EM,然后

select num_rows
  from all_tables
 where table_name in (select name from table_list);

一种方法是简单地更新数据库统计信息,使用dbms_stats包或EM,然后

select num_rows
  from all_tables
 where table_name in (select name from table_list);

我认为Robert Giesecke的解决方案会很好

解决这个问题的一种更奇特的方法是使用dbms_xmlgen.getxml


参见示例:

我认为Robert Giesecke的解决方案可以很好地工作

解决这个问题的一种更奇特的方法是使用dbms_xmlgen.getxml


请参阅示例:

必须使用动态SQL-SQL不允许变量表示表名。必须使用动态SQL-SQL不允许变量表示表名。这将取决于统计数据的样本大小。如果100%的样本大小用于dbms_stat.gather_table_stats,则在进行任何更改之前,它都是准确的。如果使用较低的样本量,那么即使这样也不能保证。我不会依赖这个。例如,DBA可以锁定表的统计信息。这将取决于统计信息的样本大小。如果100%的样本大小用于dbms_stat.gather_table_stats,则在进行任何更改之前,它都是准确的。如果使用较低的样本量,那么即使这样也不能保证。我不会依赖这个。例如,DBA可以锁定一个表的统计信息。是的,这基本上是相同的原理。另外,DBMS_XmlGen也被声明为authid current_用户。所以也不涉及特权问题。是的,这基本上是相同的原则。另外,DBMS_XmlGen也被声明为authid current_用户。因此,也没有涉及特权问题。