如何在oracle中从select结果创建别名?

问题描述 投票:2回答:2

我想从select result中创建一个别名。我试过使用oracle动态查询但是没有工作。这是我的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

oracle oracle-sqldeveloper
2个回答
1
投票

正如您为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)运行,则“查询结果”窗口会根据您问题中的图像显示它。

您还可以使用column命令,它使脚本输出中的输出更接近您作为脚本运行时所需的输出:

column sysdate heading &y_title
select sysdate from dual;

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

但是当作为语句运行时,“查询结果”窗口不会遵循该标题。

请注意,这是所有特定于客户端的功能,而不是SQL - 它可以在SQL Developer中使用,脚本版本可以在SQL * Plus和SQLcl中使用,但不能在其他客户端中使用(除非他们尝试使用SQL * Plus进行功能匹配)在某种程度上)。

如果您不仅要查看其中一个客户端的结果,而且实际上想要结束,比如通过JDBC或其他任何方式将它们拉入应用程序,那么其他解决方案将更合适。使用列作为您想要的名称生成引用游标将非常简单。但这不是你要求的......


好的,因为您在评论中询问,您可以在匿名块中打开引用游标:

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日期操作)。

您还可以创建一个返回引用游标的函数,然后您可以从普通查询(而不是匿名块)调用它,这样您就可以在查询结果网格中看到它 - 可能需要一个额外的步骤来显示光标结果。但是您不需要额外级别的代码或者希望在数据库中创建另一个对象。


0
投票

会这样的吗?

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;
© www.soinside.com 2019 - 2024. All rights reserved.