我把这段代码放在一个甲骨文包里,
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;我将from date和to date传递给这个PROCEDURE,并运行一个带I子句的查询。
默认的日期格式是这个select sysdate from dual; 14-2月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字符串连接起来。
就像
WHERE TRUNC(LOGIN_DATE) BETWEEN 14-FEB-18 AND 14-FEB-18 ;它会抛出并出错,因为它的预期如下
WHERE TRUNC(LOGIN_DATE) BETWEEN '14-FEB-18' AND '14-FEB-18' ;如何将日期转换与单引号连接起来?
发布于 2018-02-14 06:46:27
很简单。
你有这样的代码:
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') ||''' ';区别是:在添加日期之前使用‘而不是'
这就回答了你的连接问题。
发布于 2018-02-14 06:21:21
变量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;发布于 2018-02-14 06:21:29
我认为这里不需要动态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 https://stackoverflow.com/questions/48780660
复制相似问题