ASE中xml服务使用方法简介

ASE自12.5.1开始在内部处理中支持xml;自15.x版本xml功能得到进一步完善。

ASE15.x中使用xml不需要额外的license。

一、导出xml文档

在ASE的select语句中加入关键字for xml即可以xml格式显示结果集。

语法:

限制:

  • for xml select语句不能包括into_clause、compute_clause、read_only_clause、isolation_clause、browse_clause 或 plan_clause。
  • 不能在命令create view、declare cursor、subquery 或 execute command中指定 for xml select。
  • 不能在以下命令中使用for xml 子查询:for xml select、create view、declare cursor、select into;亦不能将其用作定量判定子查询,如 any/all、in/not in、exists/not exists。

下面举例导出xml格式的SQL查询结果集:

以SQL:select id,name,crdate from sysobjects where type='S' 为例。

首先,启用 XML服务

sp_configure "enable xml",1

然后,执行:select id,name,crdate from sysobjects where type='S' for xml 返回xml格式的结果集。

为了防止出现堆内存(参数:heap memory per user)不足的情况,建议使用选项:incremental=yes (incremental=yes表示:从指定for xml的select语句中返回多行)。

将isql执行结果保存到文件系统上的文本文件,可以实现将ASE表数据保存为xml文档的需求。

如下脚本/tmp/xml.sh供参数:

$cat /tmp/xml.sh

UserName=$1

PassWd=$2

ServerName=$3

FullTableName=$4

isql -U${UserName} -P${PassWd} -S${ServerName} -w5000 -b <<EOF

set nocount on

go

set textsize 100000000

go

select * from ${FullTableName} for xml option "incremental=yes"

--select * from ${FullTableName} for xml all option "incremental=yes"

go

quit

EOF

脚本使用方法:/tmp/xml.sh sa "" redhat6 "testdb..sysobjects" > testdb..sysobjects.xml

二、读取xml文档的数据

利用ASE中的代理表&CIS组件可以访问操作系统上的目录和文件,进而使用xmlextract提取xml文档的信息。

需要启用CIS组件和文件访问参数:

  • 检验是否将配置参数 enable cis 设置为1: sp_configure "enable cis",1
  • 使用 sp_configure 启用文件访问: sp_configure "enable file access",1

创建执行目录/dev/shm的代理表xmlxfsTab:

create proxy_table xmlxfsTab external directory at "/dev/shm;R"

查看目录/dev/shm下文件:

select filename,size,filetype from xmlxfsTab

下面SQL语句返回:testdb..sysobjects.xml文档中id<10或者name="sysroles"的记录集:

set textsize 100000000

select filename ,xmlextract('//resultset/row[id<10 or name="sysroles"]',content) from xmlxfsTab where filename='testdb..sysobjects.xml'

下面SQL语句返回:testdb..sysobjects.xml文档中id<10或者name="sysroles"的表名列表:

set textsize 100000000

select filename ,xmlextract('//resultset/row[id<10 or name="sysroles"]/name',content) from xmlxfsTab where filename='testdb..sysobjects.xml'

在执行xmlextract函数时,如果xml文档大小过大,会报堆内存不足的错误。

建议根据提示增加参数:heap memory per user。sp_configure "heap memory per user",NNNNNNN

另外,也可以用java,SAX,DOM,JDOM等工具来解析xml文档。

三、函数xmltable的用法

函数xmltable能根据xml内容返回一个SQL表。对xmltable()的单个调用可取代在每次迭代时对xmlextract进行多次调用的T-SQL循环;调用xmltable()相当于对由xmltable()生成的表的每行执行单个xmlextract表达式。

例子:

declare @a text

select @a=(select id,name,type,crdate,sysstat from sysobjects for xml)

select @a

select * from xmltable('/resultset/row' passing @a columns id int , name varchar(255)) as xml_table

go

对于包含id,name,type,crdate,sysstat列的xml形式数据,xmltable能够生成包含id、name两列的SQL表。

  • 本文链接地址:https://www.dbainfo.net/ase-xml-introduction.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《ASE中xml服务使用方法简介》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)