Oracle SQL临时脚本中的声明函数

Oracle SQL临时脚本中的声明函数,sql,oracle,Sql,Oracle,我在Toad for Oracle或PL/SQL Developer中运行了一个脚本: select distinct AC.STATUS, S.DESCRIPTION, count(*) || ' / ' || ( select count(*) from ACC AC where AC.STATUS is not null ) "Count" from ACC AC join ACC_STATUS S on AC.STATUS = S.ST

我在Toad for Oracle或PL/SQL Developer中运行了一个脚本:

select distinct AC.STATUS, S.DESCRIPTION, count(*) || ' / ' || (
    select count(*)
    from ACC AC
    where AC.STATUS is not null
) "Count"
from ACC AC
join ACC_STATUS S
    on AC.STATUS = S.STATUS
group by AC.STATUS, S.DESCRIPTION
order by AC.STATUS;
所以它工作得很好,并向我展示了如下结果:

-7  Status 1    30 / 174
-6  Status 2    124 / 174
-3  Status 3    6 / 174
-2  Status 4    4 / 174
-1  Status 5    10 / 174
我想重构它,并将括号中的第一个select提取到一个函数中,类似于:

declare function zz
    return number
is
    declare res number;
begin
    select count(*) into res
    from ACC AC
    where AC.STATUS is not null;
    return res;
end zz;
然后在脚本中使用它


可能吗?我使用了哪种语法?我不想将函数保存到数据库中——只是为了在Toad或PL/SQL Developer中运行它以满足自己的需要。我们有Oracle版本12.1.0.2.0。

为什么?您可以只使用分析函数:

select AC.STATUS, S.DESCRIPTION,
       count(*) || ' / ' || sum(count(*)) over () as "count"
from ACC AC join
     ACC_STATUS S
     on AC.STATUS = S.STATUS
group by AC.STATUS, S.DESCRIPTION
order by AC.STATUS;

您不必担心空值,因为联接会过滤掉它们。

为什么?您可以只使用分析函数:

select AC.STATUS, S.DESCRIPTION,
       count(*) || ' / ' || sum(count(*)) over () as "count"
from ACC AC join
     ACC_STATUS S
     on AC.STATUS = S.STATUS
group by AC.STATUS, S.DESCRIPTION
order by AC.STATUS;

您不必担心空值,因为联接会过滤掉它们。

在Oracle 12c或更高版本中,您可以使用WITH factoring子句作为

with 
  function f_test return number is
    retval number;
  begin
    select count(*) 
      into retval
      from acc
      where status is not null;
    return retval;
  end;
select distinct
  ac.status, 
  s.description, 
  count(*) || ' / ' || f_test
from acc ac join acc_status s on ac.status = s.status
group by ac.status, s.description
order by ac.status;

否则,在较低版本中,否-您不能这样做,您必须创建数据库中存在的存储函数。

在Oracle 12c或更高版本中,您可以使用WITH factoring子句作为

with 
  function f_test return number is
    retval number;
  begin
    select count(*) 
      into retval
      from acc
      where status is not null;
    return retval;
  end;
select distinct
  ac.status, 
  s.description, 
  count(*) || ' / ' || f_test
from acc ac join acc_status s on ac.status = s.status
group by ac.status, s.description
order by ac.status;

否则,在较低版本中,不可以-您不能这样做,您必须创建数据库中存在的存储函数。

非常感谢您的回答!您的版本没有那么冗长,它向我学习了新的语法。但我想知道,我可以提取这个并将其用作函数吗?非常感谢您的回答!您的版本没有那么冗长,它向我学习了新的语法。但我想知道,我可以提取这个并将其用作函数吗?