oracle变量where,oracle – SQL Developer – 在我的查询的where子句中使用开始和结束日期变量...

我有一个每天运行的查询,需要StartDate和EndDate值. StartDate和EndDate曾经是一个手动输入,但我试图摆脱它并计算要在查询中使用的StartDate和EndDate.我已经开发了代码来捕获变量中的StartDate和EndDate:

DECLARE

c_DateMask VARCHAR2(20) := 'DD-Mon-YYYY';

c_TimeMask VARCHAR2(20) := 'HH24:MI';

v_Month char(4) := 'Prev';

v_StartDate date;

v_EndDate date;

v_Environment char(7) := 'Prod';

BEGIN

if v_MONTH = 'Prev'

THEN

select TO_DATE ('01-' || TO_CHAR (ADD_MONTHS (SYSDATE, -1),'mon-yyyy')) into v_StartDate from dual;

select Last_day(TO_DATE('01-' || TO_CHAR (ADD_MONTHS (SYSDATE, -1),'mon-yyyy'))) into v_EndDate from dual;

ELSE

select TO_DATE ('01-' || TO_CHAR (ADD_MONTHS (SYSDATE, 0),'mon-yyyy')) into v_StartDate from dual;

CASE

WHEN v_Environment = 'Prod'

THEN

-- Production Environment --

select

to_char(sysdate, 'dd-Mon-yyyy ') ||

case

when to_char(sysdate, 'mi') between 00 and 20

then to_char(sysdate, 'hh24')-1||':58'||':00'

when to_char(sysdate, 'mi') between 21 and 40

then to_char(sysdate, ' hh24')||':18'||':00'

when to_char(sysdate, 'mi') between 41 and 60

then to_char(sysdate, ' hh24')||':38'||':00'

END

into v_EndDate from dual;

WHEN v_Environment = 'OldTest'

THEN

-- Test Environment --

select

to_char(sysdate, 'dd-Mon-yyyy ') ||

case

when to_char(sysdate, 'mi') between 10 and 30

then to_char(sysdate, 'hh24')||':08'||':00'

when to_char(sysdate, 'mi') between 31 and 50

then to_char(sysdate, ' hh24')||':28'||':00'

when to_char(sysdate, 'mi') between 51 and 60

then to_char(sysdate, ' hh24')||':48'||':00'

END

into v_EndDate from dual;

end case;

end if;

然后我想在下面的select语句中使用变量:

-----------------

/* KPI Figures */

-----------------

SELECT

SysDate as RunTime

, v_StartDate

, v_EndDate

, TTM_OFF_CONTRIBUTOR

, SUM(NVL(TTM_PER_OFF_FEE,0)) Fees

FROM [Table]

Where

TTM_PROCESSED_DATE >= v_StartDate

AND TTM_PROCESSED_DATE <= v_EndDate

group by SysDate, v_StartDate, v_EndDate, TTM_OFF_CONTRIBUTOR

END;

这一切都可以解决,直到我尝试在KPI数据查询中使用变量值.我错过了什么?

更新:

关于Phil’s answer:我试过但它没有用,我收到以下错误:

PLS-00428: an INTO clause is expected in this SELECT statement.

我确信我昨天看到了另一个响应,现在已经消失了,可以为变量或其他东西分配多个值.

这就是我需要的,我该怎么做?

最佳答案 变量v_StartDate和v_EndDate仅在声明它们的PL / SQL块中的范围内.看起来您正在尝试在单独的查询中使用它们.为此,您需要在PL / SQL块之外创建SQL Developer绑定变量,如下所示:

var v_start_date varchar2(11)

var v_end_date varchar2(11)

然后在PL / SQL块和SQL查询中将它们作为绑定变量引用:

declare

...

begin

....

:v_start_date := '01-' || TO_CHAR (ADD_MONTHS (SYSDATE, -1), 'mon-yyyy');

:v_end_date := TO_CHAR(Last_day(TO_DATE('01-'

|| TO_CHAR (ADD_MONTHS (SYSDATE, -1),'mon-yyyy'))));

-- (NB No need to select from dual)

...

end;

SQL:

...

Where

TTM_PROCESSED_DATE >= TO_DATE(:v_StartDate)

AND TTM_PROCESSED_DATE <= TO_DATE(:v_EndDate)

请注意,这些变量不能使用DATE类型声明,因此需要将它们转换回查询中的日期(使用正确的格式掩码).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值