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

时间:2019-02-25 15:44:11

标签: oracle oracle-sqldeveloper

我想从选择结果中创建一个别名。我尝试使用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

2 个答案:

答案 0 :(得分:1)

正如您为SQL Developer标记的那样,您可以为此使用(ab)use替换变量;在您的工作表中执行:

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

,然后如果您再次将最后一行作为语句(控制输入)运行,则“查询结果”窗口将从问题图像中根据需要显示该行。

您还可以使用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日期操作)在应用程序端生成它。

您还可以创建一个返回ref游标的函数,然后可以从普通查询(而不是匿名块)中调用该游标,这将使您可以在“查询结果”网格中查看它-可能需要执行额外的步骤显示光标结果。但是您不需要额外的代码级别,也不需要在数据库中创建另一个对象。

答案 1 :(得分: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;