Можете ли вы сохранить выходные данные запроса в глобальной переменной в Oracle SQL developer? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть запрос, который возвращает одну дату, и я хочу сохранить эту дату в глобальной переменной, чтобы ее можно было использовать в другом месте. Ниже приведен запрос, который возвращает одну дату:

select distinct
    case when to_char(batchdate, 'd') between 1 and 6 then batchdate - to_char(batchdate, 'd') else  batchdate end edate
from table
where batchdate = (select max(batchdate) from table);

Теперь я пытаюсь использовать встроенную функцию с именем DEFINE для объявления глобальной переменной.

DEFINE = (select distinct
    case when to_char(batchdate, 'd') between 1 and 6 then batchdate - to_char(batchdate, 'd') else  batchdate end edate
from table
where batchdate = (select max(batchdate) from table))

Это выдает ошибку.

Есть ли способ сохранить выходные данные этого запроса в глобальной переменной?

1 Ответ

0 голосов
/ 01 ноября 2019

Ну да - вроде как. Вот пример, который содержит список операторов, которые вы бы поместили в SQL Developer:

variable v_max_sal number;

exec select max(sal) into :v_max_sal from emp;

select ename from emp where sal = :v_max_sal;

Если вы выполняете их один за другим, все будет в порядке до последнего, который запросит у вас :v_max_sal значение переменной (а это не то, что вы хотите). Но, если вы выполните последний оператор (или - когда мы это сделаем - весь код) как script (F9 комбинация клавиш в последних версиях), то вы получите финальныйРезультат, как и ожидалось.

Посмотрите, поможет ли это.

[РЕДАКТИРОВАТЬ]

В вашем примере: я попробовал, у меня все в порядке. Вот пример таблицы:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select * From tablea;

BATCHDATE
----------
01.11.2019

SQL>

Это строки, которые я запустил в своем SQL Developer (версия 18.3), нажав F9:

var edate varchar2(20);

exec select distinct case when to_char(max(batchdate), 'd') between 1 and 6 then max(batchdate) - to_char(max(batchdate), 'd') else max(batchdate) end into :edate from tablea; 

select * from tablea where batchdate <> to_date(:edate);

Строка exec должнабудь так длинен , вы не можете разбить его на несколько строк, чтобы он был хорошо отформатирован (по крайней мере, я так думаю - я не мог заставить его работать иначе).

Окончательный результат был(скопировано из окна «Вывод скрипта»):

PL/SQL procedure successfully completed.


BATCHDATE 
----------
01/11/2019

Мне ничего не предложили, так что ... это работает для меня. Я не знаю, почему это не для вас. Какую версию SQL Developer вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...