我想从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;
我希望达到像照片中的结果。谢谢你的帮助!
正如您为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日期操作)。
您还可以创建一个返回引用游标的函数,然后您可以从普通查询(而不是匿名块)调用它,这样您就可以在查询结果网格中看到它 - 可能需要一个额外的步骤来显示光标结果。但是您不需要额外级别的代码或者希望在数据库中创建另一个对象。
会这样的吗?
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;