Как создать псевдоним из выбранного результата в Oracle? - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу создать псевдоним из выбранного результата. Я пытался использовать динамический запрос оракула, но не работает. Вот мой sql:

declare 
    v_a varchar2(50);
    sql_smt varchar2(200);
begin
    select TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd')) INTO v_a from dual;
    sql_smt :='SELECT sysdate as :1 FROM dual';
    execute immediate sql_smt using v_a;
end;

Я хочу достичь результатакак на фото.Спасибо за любую помощь!

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Поскольку вы пометили это для SQL Developer, вы можете использовать (ab) использовать для этого переменные подстановки;в вашей рабочей таблице выполните:

column x_title new_value y_title noprint;

select TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))
  as x_title
from dual;

set verify off

select sysdate as "&y_title" from dual;

, которая при запуске в качестве скрипта (F5) выдаст это в окне «Вывод скрипта»:

<blank lines ...>




#20190126-
----------
2019-02-25

, а затем, если вы снова запустите последнюю строкув качестве оператора (control-enter) окно Query Result показывает его, как вы хотели, из изображения в вашем вопросе.

Вы также можете использовать команду column, которая делает вывод в Script Output ближе кто, что вы хотели при запуске в виде сценария:

column sysdate heading &y_title
select sysdate from dual;

#20190126-20190227
------------------
2019-02-25

, но затем при запуске в качестве оператора окно результатов запроса не учитывает этот заголовок.

Обратите внимание, что все это зависит от клиентафункциональность, а не SQL - он будет работать в SQL Developer, а версии сценариев будут работать в SQL * Plus и SQLcl, но не в других клиентах (если они не пытались до некоторой степени соответствовать SQL * Plus).

Если вы не только собираетесь просматривать результаты на одном из этих клиентов, но на самом деле хотите в конечном итоге, скажем, добавить их в приложение через JDBC или что-то еще, тогда другие решения будут более подходящий.Генерировать курсор ref со столбцом в качестве нужного имени было бы довольно просто.Но это не то, что вы просили ...


ОК, так как вы спросили в комментарии, вы можете открыть курсор ссылки в анонимном блоке:

var rc refcursor

declare 
  l_alias varchar2(50);
begin
  select TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))
  into l_alias
  from dual;

  open :rc for 'SELECT sysdate as "' || l_alias || '" FROM dual';
end;
/


PL/SQL procedure successfully completed.

print rc

#20190127-
----------
2019-02-26

или без локальной переменной:

var rc refcursor

begin
  open :rc for 'SELECT sysdate as "'
    || TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))
    || '" FROM dual';
end;
/

PL/SQL procedure successfully completed.


print rc;

#20190127-
----------
2019-02-26

Опять var[iable] и print - клиентские команды;и я не думаю, что есть способ получить результаты в таблице результатов запроса с помощью этого подхода.Но вы можете использовать тот же подход анонимного блока от других клиентов или приложений;например, из JDBC вы можете получить оператор:

String sql = "begin open ? for 'SELECT sysdate as \"'"
    + "|| TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))"
    + "|| '\" FROM dual'; end;";

и затем связать заполнитель параметра ? как тип курсора перед выполнением.Это, вероятно, не очень полезно, так как вам все равно придется изучить метаданные, чтобы найти псевдоним столбца, и вы можете сгенерировать их на стороне приложения, используя инструменты языка приложения (например, манипулирование датой Java).

Вы также можете создать функцию, которая возвращает курсор ref, который затем можно вызвать из простого запроса (вместо анонимного блока), что позволит вам увидеть его в сетке результатов запроса - возможно, с дополнительнымшаг, чтобы показать результат курсора.Но вам не нужен этот дополнительный уровень кода или вы хотите, чтобы в вашей БД был создан другой объект.

0 голосов
/ 25 февраля 2019

Хотелось бы что-нибудь подобное?

declare 
  col_hdr   varchar2(50);
  sys_date  varchar2(26);
  sql_smt   varchar2(200);
begin
  select TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd')) INTO col_hdr from dual;
  sql_smt :='SELECT sysdate ' || ' as "' || col_hdr || '" FROM dual';
  dbms_output.put_line(sql_smt);
  execute immediate sql_smt into sys_date; 
  dbms_output.put_line('done');
end;
...