Oracle选择变量

时间:2018-07-20 18:29:23

标签: sql oracle plsql

Declare startdate date;
enddate date;
lastname nvarchar2(30);
Begin
Lastname := 'ZZZ';
startdate := '04-JAN-18';
enddate := '02-JUN-18';
insert into temp_feed
select empname, startdate, enddate , activityid, source, actname from emp_activity
where  startdate >=  startdate and enddate <=  enddate and lower(LASTNM) like lower(lastname||'%')
End;

当我对日期值进行硬编码时,它可以正常工作,但是当我使用变量时,结果为null。

我想念东西吗?

2 个答案:

答案 0 :(得分:0)

我建议您先将变量转换为日期格式。 如果您使用函数并且它从外部获取参数,我们可以 p_start_date 作为日期。然后,您可以确定将参数转换为日期格式。

v_start_date := to_date(p_start_date,'dd-MON-yyyy') ;

也在where子句

to_date(startdate,'dd-MON-yyyy')  >=  to_date(p_start_date,'dd-MON-yyyy') 

答案 1 :(得分:0)

建议在变量名称前使用 V _ ,在参数名称前使用 P _ ,代码中的问题是将表中的值与本身位于:

 startdate >=  startdate and enddate <=  enddate

我确实格式化了您的代码,并在此处使用标准的命名格式:

DECLARE
   V_STARTDATE   DATE;
   V_ENDDATE     DATE;
   V_LASTNAME    NVARCHAR2 (30);
BEGIN
   V_LASTNAME := 'ZZZ';
   V_STARTDATE := TO_DATE('04-JAN-18', 'DD-MON-YY');
   V_ENDDATE := TO_DATE('02-JUN-18', 'DD-MON-YY');

   INSERT INTO TEMP_FEED
      SELECT EMPNAME, STARTDATE, ENDDATE, ACTIVITYID, SOURCE, ACTNAME
      FROM EMP_ACTIVITY
      WHERE     STARTDATE >= V_STARTDATE
            AND ENDDATE <= V_ENDDATE
            AND LOWER (LASTNM) LIKE LOWER (V_LASTNAME || '%');
END;