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

标签 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

最佳答案

正如您为 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 或其他方式将它们拉入应用程序,那么其他解决方案会更合适。使用列作为您想要的名称生成引用游标将非常简单。但这不是你要求的...

好的,既然你在评论中问过,你可以在匿名 block 中打开一个引用光标:
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是特定于客户端的命令;而且我认为没有办法使用这种方法在查询结果网格中获取结果。但是您可以从其他客户端或应用程序使用相同的匿名 block 方法;例如从 JDBC 你可以有一个声明:
String sql = "begin open ? for 'SELECT sysdate as \"'"
    + "|| TO_CHAR('#'||TO_CHAR(sysdate-30,'yyyymmdd')||'-'||TO_CHAR(sysdate+2,'yyyymmdd'))"
    + "|| '\" FROM dual'; end;";

然后绑定(bind)?参数占位符作为执行前的游标类型。这可能不是很有用,因为无论如何您都必须检查元数据才能找到列别名,并且您可以使用应用程序语言工具(例如 Java 日期操作)在应用程序端生成它。

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

关于oracle - 如何从 oracle 中的选择结果创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869849/

相关文章:

mysql - 如何以与在数据库服务器上完成的方式大致相同的方式检查约束

java - 移动应用程序框架的项目在 JDeveloper 中被禁用

database - ORA-12505, TNS :listener does not currently know of SID given in connect des

mysql - 根据最大日期将具有相同 ID 的列值更改为新值

sql - 删除同一个表上从 select 查询中选择的记录

database - PL/SQL 在整个数据库中搜索一个字符串

oracle - Oracle 10g 中何时为用户启用角色?

sql - 将 DISTINCT 和 UPPER 关键字混合在一起

oracle - Tomcat 无法创建 TCPS Oracle JDBC 连接

oracle - SQL 开发人员 : cant open the program