Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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过程或函数_Oracle_Plsql - Fatal编程技术网

返回多个值的Oracle过程或函数

返回多个值的Oracle过程或函数,oracle,plsql,Oracle,Plsql,我需要写一个程序或函数,返回状态,年龄和类型的计数,这应该满足以下条件 select * from ABC where ABC_id = 2001 and ABC_LEVEL_ID = 1 --status and ABC_REQUEST_DATE < sysdate --age and ABC_TYPE_ID = 5; --type If ABC_ID = 2001 and ABC_LEVEL_ID = 1 THEN return COUNT(STATUS) If ABC_ID

我需要写一个程序或函数,返回状态,年龄和类型的计数,这应该满足以下条件

select * from ABC
where ABC_id = 2001
and ABC_LEVEL_ID = 1 --status
and ABC_REQUEST_DATE < sysdate --age
and ABC_TYPE_ID = 5; --type

If ABC_ID = 2001 and ABC_LEVEL_ID = 1 
THEN return COUNT(STATUS)


If ABC_ID = 2001 and ABC_REQUEST_DATE < SYSDATE 
THEN return COUNT(AGE)


If ABC_ID = 2001 and ABC_TYPE_ID = 5
THEN return COUNT(TYPE)
从ABC中选择*
其中ABC_id=2001
ABC_LEVEL_ID=1——状态
和ABC_请求_日期<系统日期--年龄
ABC_TYPE_ID=5--类型
如果ABC_ID=2001且ABC_级别_ID=1
然后返回计数(状态)
如果ABC\U ID=2001且ABC\U请求日期<系统日期
然后返回计数(年龄)
如果ABC_ID=2001且ABC_TYPE_ID=5
然后返回计数(类型)

所有三个值都应该是传递给前端应用程序的OUT参数。

您可以在查询中使用
CASE
表达式来包含以下约束:

select *,
case when ABC_ID = 2001 and ABC_LEVEL_ID = 1  then COUNT(STATUS) else null end as testcol1,
case when ABC_ID = 2001 and ABC_REQUEST_DATE < SYSDATE  then COUNT(AGE) else null end as testcol2,
case when ABC_ID = 2001 and ABC_TYPE_ID = 5  then COUNT(TYPE) else null end as testcol3
from ABC
where ABC_id = 2001
and ABC_LEVEL_ID = 1 --status
and ABC_REQUEST_DATE < sysdate --age
and ABC_TYPE_ID = 5; --type
选择*,
当ABC_ID=2001且ABC_LEVEL_ID=1时,则计数(状态)else null结束为testcol1,
当ABC_ID=2001且ABC_REQUEST_DATE
根据注释:修改的查询(包括@jeffrykemps早期编辑)

选择*,
当ABC_LEVEL_ID=1时,计数(状态)结束为testcol1,
当ABC_请求_日期
我认为如果WHERE子句使用OR操作而不是AND,则更有意义。使用CASE语句很容易在查询的投影中进行计数

由于代码属于存储过程,您需要选择一些内容。这里我假设直接赋值给OUT参数。但是,如果代码包含其他要求,则应填充局部变量,并在过程结束时将其分配给OUT参数

create or replace procedure get_counts
     ( p_out_status_count out pls_integer
         , p_out_age_count out pls_integer
         , p_out_type_count out pls_integer
as
begin
    select 
        count (case ABC_LEVEL_ID = 1  then 1 else null end),
        count (case ABC_REQUEST_DATE < SYSDATE  then 1 else null end),
        count (case ABC_TYPE_ID = 5  then 1 else null end)
    into p_out_status_count
         , p_out_age_count
         , p_out_type_count
    from ABC
    where ABC_id = 2001
    and (ABC_LEVEL_ID = 1 --status
        or  ABC_REQUEST_DATE < sysdate --age
        or  ABC_TYPE_ID = 5); -- type
end get_counts;
而WHERE子句将是

    ....
    from ABC
    where ABC_id = p_abc_id
    ....

我不确定我是否明白你想做什么。为什么在查询中有谓词,然后在“if”语句中重新测试相同的条件?根据定义,返回的任何行都将满足所有这些条件。合理的解决方案-但如前所述,
CASE
表达式中的条件与谓词中的条件是冗余的,因此您总是会得到3个相同的计数,这似乎不太可能是期望的结果。@DaveCosta,是的,你知道杰弗里已经编辑了我的答案,把它包括在内,所以我没有碰它,但现在我看到我的答案是在它的状态。
create or replace procedure get_counts
     ( p_abc_id in abc.abc_id%type   
         , p_out_status_count out pls_integer
         , p_out_age_count out pls_integer
         , p_out_type_count out pls_integer
     )
    ....
    from ABC
    where ABC_id = p_abc_id
    ....