我在oracle包中有这段代码,
PROCEDURE GET_LOGIN
(
PIN_FROM_DATE IN DATE DEFAULT NULL
,PIN_TO_DATE IN DATE DEFAULT NULL
,CV_1 OUT SYS_REFCURSOR
)
AS
LV_SQL long ;
LV_SQL_DATE long ;
BEGIN
LV_SQL_DATE:='';
IF (PIN_FROM_DATE IS NOT NULL AND PIN_TO_DATE IS NOT NULL)
THEN
LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '|| TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd') ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' ';
END IF;
LV_SQL := 'SELECT * FROM LOGIN_DATA '||LV_SQL_DATE;
OPEN CV_1 FOR LV_SQL;
END GET_LOGIN;
我将日期和日期传递给此PROCEDURE
并运行带有子句的查询。
默认日期格式为此
select sysdate from dual;
14-FEB-18
LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '|| TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd') ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' ';
上面的查询将转换后的日期与sql string连接起来。
就像
WHERE TRUNC(LOGIN_DATE) BETWEEN 14-FEB-18 AND 14-FEB-18 ;
会抛出错误,因为它期望像这样
WHERE TRUNC(LOGIN_DATE) BETWEEN '14-FEB-18' AND '14-FEB-18' ;
如何将日期转换与单引号连接?
答案 0 :(得分:1)
变量PIN_FROM_DATE,PIN_TO_DATE
已经是date
类型 - 因此无需再次将它们转换为日期。
我认为你可以使用这样的东西:
LV_SQL_DATE := 'WHERE TRUNC(LOGIN_DATE) BETWEEN :my_PIN_FROM_DATE and :my_PIN_TO_DATE' ;
然后
OPEN CV_1 FOR LV_SQL using PIN_FROM_DATE,PIN_TO_DATE;
答案 1 :(得分:1)
我认为你不需要动态SQL。你的最终CURSOR
等同于。
OPEN CV_1 FOR SELECT *
FROM login_data
WHERE ( CASE
WHEN pin_from_date IS NOT NULL
AND pin_to_date IS NOT NULL THEN
CASE
WHEN TRUNC (login_date) BETWEEN pin_from_date AND pin_from_date
THEN 1
ELSE 0
END
ELSE 1
END ) = 1
答案 2 :(得分:1)
非常简单。
你有这个代码:
LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '|| TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd') ||' AND '|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||' ';
将其更改为:
LV_SQL_DATE := ' WHERE TRUNC(LOGIN_DATE) BETWEEN '''|| TO_DATE(PIN_FROM_DATE, 'yyyy-MM-dd') ||''' AND '''|| TO_DATE(PIN_TO_DATE, 'yyyy-MM-dd') ||''' ';
区别在于:在追加日期之前使用'' 而不是'
这只是回答你的连接问题。