Отсутствие правой скобки в запросе
Пишу динамический запрос SQL:
EXECUTE IMMEDIATE 'select next_day(to_date(' || god || q'['-01-01' , 'yyyy-mm-dd' ), 'ПНД')
+ (']' || n || '-2)* 7 FROM DUAL' INTO t;
Пишет, что отсутствует правая скобка, но вроде все стоят на месте.
В чем может быть проблема?
Ответы (2 шт):
Скопировав выражение из вопроса в запрос, получил (подсказка на ошибки ---^):
select
'select next_day(to_date(' || 2020 || q'['-01-01' , 'yyyy-mm-dd' ), 'ПНД') + (']' || 1 || '-2)* 7 FROM DUAL' expr
from dual;
EXPR
-----------------------------------------------------------------------------------
select next_day(to_date(2020'-01-01' , 'yyyy-mm-dd' ), 'ПНД') + ('1-2)* 7 FROM DUAL
---^---^ ---^
Затраченное время без учёта оформления ответа составило где-то 1 мин.
Ответ к комментарию :
задача именно в динамическом запросе, хотя не динамически я не вижу более рационального способа. Было бы интересно посмотреть на иной вариант решения.
Когда есть смысл в динамическом запросе? Только если во время выполнения запроса не известны идентификаторы БД, например: имена таблиц, представлений, столбцов и тд.
Другими словами то, к чему нельзя применить подстановочные переменные.
Во всех остальных случаях следует использовать статические запросы.
Запрос для задачи как в вопросе выглядит очень просто:
with function nextMonday (yearNo number, weekNo number) return date is
begin
return next_day (trunc (to_date (to_char (yearNo), 'yyyy'), 'rr')+(weekNo-1)*7, 'MON');
end;
data (yearNo, weekNo) as (
select 2020, 13 from dual
)
select nextMonday (yearNo, weekNo) monday from data
/
Результат:
MONDAY
-------------------
2020-03-30 00:00:00
PS проблематика граничных значений номера недели: 52, 53, или 53, 54 для США, в этом ответе не расматривается.