Переменные Varchar2 в Oracle SQL Developer - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь выполнить запрос plsql в SQL Developer и использую переменные.

Я пытаюсь запустить следующее, чтобы увидеть, как работают переменные:

define FromDate varchar2 = '02-03-2019'
select &&FromDate from dual;
-- OR
define FromDate = '02-03-2019'
select &&FromDate from dual;

Это результат в обоих случаях:

enter image description here

Почему результат "-2020" и как я смогу использовать FromDate в чем-токак это?

select * From TABLE where test_date >= to_date(&&FromDate, 'MM-DD-YYYY')

Ответы [ 3 ]

3 голосов
/ 05 июля 2019

Вы смешиваете 2 разных понятия здесь. DEFINE - это директива SQLPLUS, которая принимает базовую форму var = text.При использовании SQLPLUS выполняет замену строки для var перед отправкой запроса в механизм sql и с точки зрения обработки SQL Developer эмулирует SQLPLUS.Тогда в вашем случае sql engine увидит только

Select 02-03-2019 from dual;

, что соответствует -2020 - результату, который вы получили.

Так как поставляемая переменная видна движку sql после замены строки, она не знает вашего предполагаемого использования, вам нужно выполнить преобразование в вашем выражении sql.Таким образом, ваше утверждение должно быть:

выберите to_date (&& FromDate, 'MM-DD-YYYY') из dual;

Это довольно просто, вам нужно помнить только о том, какой компонент (приложениевы 'говорите' с каждым оператором.
Оператор sql, опубликованный вами в качестве примера "как использовать", является правильным.

1 голос
/ 05 июля 2019

Помните, что подстановочные переменные в SQL * Plus - это именно то, что они заменяют на любое значение, которое вы им дали, без каких-либо знаков препинания.Я уверен, что вы ожидали, что заявление будет выглядеть как

select '02-03-2019' from dual;

после замены, но это не так.Когда подстановка выполняется SQL * Plus, оператор SELECT становится

select 02-03-2019 from dual;

, а 2 минус 3, минус 2019 - -2020.

QED.

Возможно, вы захотитеизмените свой SQL на

select '&&FromDate' from dual;

Удачи.

0 голосов
/ 05 июля 2019

В результате получается арифметическое выражение

02 - 03 - 2019 = -2020

Вы должны заключить их в кавычки, если хотите использовать его как полную строку в TO_DATE

select to_date('&&FromDate','mm-dd-yyyy') from dual;



old:select to_date('&&FromDate') from dual
new:select to_date('02-03-2019','mm-dd-yyyy') from dual

TO_DATE(
--------
03-02-19
...