0

我正在编写一个客户端应用程序,它通过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>
4

1 回答 1

2

我会为此寻找一个样式表。

例如:

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>

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

于 2013-01-23T10:34:01.107 回答