Как установить переменную подстановки для результата запроса в SQL Developer? - PullRequest
0 голосов
/ 30 мая 2018

Я хочу сделать что-то подобное в Oracle SQL Developer (v17.2) с базой данных Oracle 12c:

define thisenv = '(select name from v$database)'
select &thisenv env, count(1) from phone;

Я хочу, чтобы select возвращал что-то вроде этого:

ENV      COUNT(1)
------ ----------
Dev1            7

Если я использую свой пример кода, мне фактически сообщают, что мне нужен оператор group by, потому что он видит запрос вместо строкового литерала, который является результатом запроса.Но добавление группы по не будет работать для меня.

В ответ на этот вопрос , я попытался заменить первую строку на

column dummyenv new_value thisenv
select name dummyenv from v$database;

У меня естьтакже попытался использовать переменную связывания вместо этого, но мне все равно предлагается ввести значение для thisenv.Итак, эти опции не работают.

Что еще мне следует попробовать?

Таблица PHONE выглядит следующим образом:

PHONEID PERSONID PHONENUM     TYPE
------- -------- ------------ ----
899250  ABC12345 123-456-7890 WORK

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Не берите в голову переменную подстановки - вы начинаете со следующего оператора SQL, который синтаксически некорректен:

select ( select name from ... ), count(1) from ...

- это не дает сбоя из-за использования переменной подстановки, оно не выполняется какпростой оператор SQL.

Если вы хотите этот вывод (как вы его показываете), перепишите запрос как

select name, ct
from   (select name from v$database)
       cross join
       (select count(1) as ct from phone);

Теперь вы можете использовать переменную подстановки, если необходимо:

SQL> define thisenv = '(select name from v$database)'
SQL> select name, ct
  2  from   &thisenv
  3  cross join
  4  (select count(1) as ct from phone);

Конечно, когда я запускаю это на своей машине, я получаю ошибку (так как у меня нет таблицы PHONE), но она должна работать для вас.Это работает для меня, когда я использую имя существующей таблицы.

0 голосов
/ 30 мая 2018

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

SELECT name, 
       (SELECT count(*) FROM phone) as phones
  FROM v$database;

В качестве альтернативы, поскольку привилегии выбора для представления v$database часто не предоставляются, вы можете использовать функцию sys_context.Поскольку это скаляр, вы можете просто указать его в запросе:

SELECT sys_context('userenv', 'db_name') as db_name, count(*)
  FROM phone;
...