为本地变量oracle PL / SQL添加值

时间:2014-11-20 16:22:54

标签: oracle variables plsql

DECLARE 
var1 INTEGER :=0;
var2 INTEGER :=0;
BEGIN

SELECT DISTINCT
<whatever here>

CASE
WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN var1+1
WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN var2+1 
ELSE 0 
END 

FROM
<Rest of query here>

基本上我想要做的是将1添加到局部变量然后使用count(或计数的总和)或者每次的差异打印出该变量的值作为我的select语句的一部分年龄属于这些类别

我不确定如何基本上添加到局部变量。

4 个答案:

答案 0 :(得分:2)

SELECT 
    sum(CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 ELSE 0 END) + var1,
    sum(CASE WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1 ELSE 0 END) + var2
    into var1, var2
FROM
<Rest of query here>

答案 1 :(得分:1)

尝试分析功能

BEGIN
SELECT DISTINCT
<whatever here>

sum(CASE
WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1
end) over() var1,
sum(CASE
WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1 
END) over() var2

FROM
<Rest of query here>

答案 2 :(得分:1)

鉴于艾伦的评论,也许你正在寻找的东西比而不是:

SELECT V.*,
    case when t1 is not null then
          count(t1) over (ORDER BY n ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
         when t2 is not null then
          count(t2) over (ORDER BY n ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
         else
          0
    end varX
    FROM (
    SELECT DISTINCT

    <whatever here>

    ROWNUM n,
    CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 END t1,
    CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 11 AND 20 THEN 1 END t2


    FROM
    <Rest of query here>

    ) V

您可以检查一下这是否是您要查找的内容:http://sqlfiddle.com/#!4/2de0d/2

内部查询基本上是你的,加上

  • 一个ROWNUM列(如果您以某种方式ORDER BY行,可能没有必要)
  • 如果行位于第一个范围内,则标记设置为1,否则设置为NULL
  • 如果行位于第二个范围内,则标记设置为1,否则设置为NULL

外部查询使用分析函数COUNT() OVER(...)分别计算当前行和结果集中第一个之间的标记数。此处使用行号n。如果您的数据已经订购,请将其替换为更相关的内容。

答案 3 :(得分:0)

我不认为您可以在执行查询时更新某些变量。您所能做的就是结果值提取到某个变量中。

使用COUNT代替SUM,对多重同步的回答略有不同:

SELECT 
    count(CASE WHEN trunc(thisDate) - TRUNC(thatDate) BETWEEN 0 AND 10 THEN 1 END) ,
    count(CASE WHEN trunc(thisDate2) - TRUNC(thatDate2) BETWEEN 11 AND 20 THEN 1 END)
    into var1, var2
FROM
<Rest of query here>

这实际上将返回一行结果,其中值的计数是第一列中的第一个范围,第二列中第二个范围中的值的计数。使用INTO var1,var2子句,PL / SQL将隐式地将这些值提取到局部变量中。