Вы потеряли закрывающую кавычку после значений v_date
и v_end_date
:
where
column1 BETWEEN TO_DATE('!' ||v_date || q'!','yyyy-mm-dd')
--------------------------------------------^
AND TO_DATE( '!' ||v_end_date || q'!','yyyy-mm-dd')!';
--------------------------------------------^
Вы можете отладить такие проблемы, выполнив:
dbms_output.put_line(v_query);
С помощью случайное значение даты, которое показывает ваш исходный запрос как:
SELECT columm1
FROM
mytable
where
column1= TO_DATE('2011-12-13','yyyy-mm-dd')
, а ваш измененный как:
SELECT columm1
FROM
mytable
where
column1 BETWEEN TO_DATE('2011-12-13,'yyyy-mm-dd')
AND TO_DATE( '2012-01-02,'yyyy-mm-dd')
, что делает пропущенные кавычки в обоих вызовах to_date()
более очевидными, чем они во время строительства. (И попытка выполнить это приводит к ORA-00907: отсутствует правильная скобка.)
С моей модификацией, которая теперь выглядит так:
SELECT columm1
FROM
mytable
where
column1 BETWEEN TO_DATE('2011-12-13','yyyy-mm-dd')
AND TO_DATE( '2012-01-02','yyyy-mm-dd')
, что выглядит более разумно.
Надеемся, что эти v_*
переменные являются строками. Если это даты, то вам не следует полагаться на сеансы NLS для их преобразования в даты. В любом случае вам, вероятно, следует использовать переменные связыванияm, а затем указывать фактические значения при выполнении запроса Dynami c - хотя неясно, почему это Dynami c, поэтому, возможно, этот построенный запрос передается обратно для чего-то другого бежать.