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

如何从oracle中的select结果创建别名?,oracle,oracle-sqldeveloper,Oracle,Oracle Sqldeveloper,我想从选择结果创建别名。我尝试使用oracle dynamic query,但不起作用。以下是我的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 :='SELEC

我想从选择结果创建别名。我尝试使用oracle dynamic query,但不起作用。以下是我的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;
我想得到一个像照片中那样的结果。 谢谢你的帮助


你喜欢这个工作吗

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;

因为您已经为SQL Developer标记了这个,所以您可以使用滥用替换变量来实现它;在工作表中,请执行以下操作:

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
但是当作为语句运行时,查询结果窗口不支持该标题

请注意,这是所有特定于客户端的功能,而不是SQL-它将在SQL Developer中工作,脚本版本将在SQL*Plus和SQLcl中工作,但在其他客户端中不工作,除非它们尝试在某种程度上匹配SQL*Plus

如果您不仅要在其中一个客户机中查看结果,而且实际上希望最终(比如)通过JDBC或其他方式将结果拉到应用程序中,那么其他解决方案将更合适。生成一个列为所需名称的ref游标相当简单。但那不是你想要的

好的,因为您在注释中询问,所以可以在匿名块中打开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是特定于客户端的命令;我不认为用这种方法可以在查询结果网格中获得结果。但是您可以从其他客户端或应用程序使用相同的匿名块方法;e、 g.在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游标的函数,然后可以从普通查询而不是匿名块调用该函数,这将允许您在查询结果网格中查看它-可能需要额外的步骤来显示游标结果。但是您不需要额外的代码级别,也不希望在数据库中创建另一个对象。

您的意思是不工作?错误错误的结果?需要什么?只能对值使用绑定变量,而不能对对象名称(包括别名)使用绑定变量。但我不明白您想要实现什么-无论如何,您都必须将动态SQL选择到PL/SQL变量中,因此重要的是PL/SQL变量名,而不是列表达式别名(如果它有别名的话)?请在你的问题中解释一下你到底想达到什么目标,而不仅仅是你目前试图解决的问题。你现在能检查一下吗?我做了一个编辑:ThanksIt工作得很好。但是可以像图片中那样显示结果吗?我想你会问这样的问题,所以我研究了创建一个动态列别名,可以在一个简单的select语句中使用,我认为这是不可能的。您需要使用一个ref游标或一些其他构造,将动态结果集返回给调用程序(如C)。可能有一种方法可以将execute immediate与一个表值函数相结合,该函数将返回一个动态列别名,但这将需要数小时的研究和测试。我会将此答案标记为正确的。您可以吗添加一个带有ref cursor的示例?我想这篇文章会帮助很多人。我对实现有点好奇。当然,如果可以的话:@ggigle-OK,添加了一个基本示例。谢谢
String sql = "begin open ? for 'SELECT sysdate as \"'"
    + "|| TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))"
    + "|| '\" FROM dual'; end;";