define
- это клиент команда , она не является частью синтаксиса PL / SQL (или даже SQL).Вы можете ссылаться на переменные замещения в анонимном блоке PL / SQL, но они оцениваются, затем блок компилируется, и вы не можете изменить их значения.
Вы можете переместить всю эту логику в запрос, например:
define AssetVar = "BA G-ZBJA"
define DateFromVar = "12/08/2016 15:00:00"
select * from SCHEDULE
where Asset = '&&AssetVar'
and ('&&DateFromVar' is null or DATETIME >= TO_DATE('&&DateFromVar', 'dd/mm/yyyy hh24:mi:ss'));
С set verify on
вы можете увидеть SQL, который у вас получится:
old:select * from SCHEDULE
where Asset = '&&AssetVar'
and ('&&DateFromVar' is null or DATETIME >= TO_DATE('&&DateFromVar', 'dd/mm/yyyy hh24:mi:ss'))
new:select * from SCHEDULE
where Asset = 'BA G-ZBJA'
and ('12/08/2016 15:00:00' is null or DATETIME >= TO_DATE('12/08/2016 15:00:00', 'dd/mm/yyyy hh24:mi:ss'))
Если вы определяете значения, тогда логика немного бессмысленна;скорее всего, вы подсказываете:
accept AssetVar
accept DateFromVar
with schedule(asset, datetime) as (select 'test', sysdate from dual)
select * from SCHEDULE
where Asset = '&&AssetVar'
and ('&&DateFromVar' is null or DATETIME >= TO_DATE('&&DateFromVar', 'dd/mm/yyyy hh24:mi:ss'));
, поэтому, если вы не введете значение даты, сравнение закончится следующим образом:
...
and ('' is null or DATETIME >= TO_DATE('', 'dd/mm/yyyy hh24:mi:ss'))
К сожалению, вы не можете указать форматдля переменной option, которая была бы удобна.