繁体   English   中英

我可以在Oracle的SELECT语句中使用游标的列作为别名吗?

[英]Can I alias columns from a cursor in SELECT statement in Oracle?

我正在编写一个客户端应用程序,该应用程序通过select语句从Oracle数据库中调用存储过程。 该存储过程返回一个游标。 我需要为该游标返回的列定义别名,并且需要在我的select语句中执行此操作。

我无法对Oracle数据库进行任何更改。 我无法编写任何PLSQL。 我只能使用该数据库查询它。

请指教。


背景:此存储过程是应用程序框架中称为许多存储过程之一。 当前,所有调用都使用以下语法以XML格式返回其结果:

select XMLType.createXML(package_name.storedProcName('1', '2', '3')).getClobVal() as sresult  from dual;

但是,此光标包含两个具有相同名称(特别是“ NAME”)的列。 当在TOAD中运行此查询时,该列会自动附加一个“ _1”,但是XMLType会导致逻辑上不正确的XML,如下所示:

<?xml version="1.0"?>
<ROWSET>
    <ROW>
        <ID>1</ID>
        <NAME>BRUCE WAYNE</NAME>
        <NAME>BATMAN</NAME>
    </ROW>
</ROWSET>

这就是为什么我必须在将列转换为XMLType之前为它们加别名。 我希望查询输出不包含重复的列名,以便XML可以改为这样(不包含重复的标签):

<?xml version="1.0"?>
<ROWSET>
    <ROW>
        <ID>1</ID>
        <NAME>BRUCE WAYNE</NAME>
        <OTHER_NAME>BATMAN</OTHER_NAME>
    </ROW>
</ROWSET>

我会为此一个样式表。

例如:

SQL> select XMLType.createXML(foo()).transform(xmltype('<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2  <xsl:template match="/ROWSET/ROW/NAME[2]">
  3     <NAME_1>
  4             <xsl:apply-templates select="@*|node()"/>
  5     </NAME_1>
  6  </xsl:template>
  7  <xsl:template match="@*|node()">
  8     <xsl:copy>
  9             <xsl:apply-templates select="@*|node()"/>
 10     </xsl:copy>
 11  </xsl:template>
 12  </xsl:stylesheet>')) as sresult  from dual
 13  /

SRESULT
--------------------------------------------------------------------------------
<ROWSET>
  <ROW>
    <ID>1</ID>
    <NAME>BRUCE WAYNE</NAME>
    <NAME_1>BATMAN</NAME_1>
  </ROW>
  <ROW>
    <ID>2</ID>
    <NAME>CLARK KENT</NAME>
    <NAME_1>SUPERMAN</NAME_1>
  </ROW>
</ROWSET>

也就是说,我们用NAME_1替换了ROW元素中的第二个NAME出现( /ROWSET/ROW/NAME[2] )。 其他所有内容都照原样复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM