Oracle SQL临时脚本中的声明函数
我在Toad for Oracle或PL/SQL Developer中运行了一个脚本: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
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;
否则,在较低版本中,不可以-您不能这样做,您必须创建数据库中存在的存储函数。非常感谢您的回答!您的版本没有那么冗长,它向我学习了新的语法。但我想知道,我可以提取这个并将其用作函数吗?非常感谢您的回答!您的版本没有那么冗长,它向我学习了新的语法。但我想知道,我可以提取这个并将其用作函数吗?