白皮书
SQL Anywhere12的10大炫酷新特性https://www.doczj.com/doc/5f17239491.html,
目录
目录 (1)
特性一:每个应用程序都获得了地图的支持 (2)
别,咱们这样 (2)
空间例程步骤一:安装空间支持 (2)
空间例程步骤二:获取一个Shapefile (3)
空间例程步骤三:描述SRID (3)
空间例程步骤四:创建Shapefile表 (5)
空间例程步骤五:加载Shapefile表 (6)
空间例程步骤七:创建SVG文件 (8)
空间例程步骤八:加载更多Shapefile (9)
空间例程步骤九:在ISQL中合并并显示Shapefile表 (10)
空间例程步骤10:在Firefox中通过Web Service展现 (12)
特性2:查询隔离 (14)
查询步骤1:创建根数据库 (14)
查询隔离步骤2:创建拷贝 (15)
查询隔离步骤3:启动拷贝 (16)
查询隔离步骤4:更新根数据库 (17)
查询隔离步骤5:查询拷贝 (18)
特性3:SELECT FROM INSERT UPDATE (20)
特性4:不在需要考虑-GN (23)
特性5:通过GMAIL发送电子邮件 (25)
特性6:代理表速度变快了! (28)
特性7:改进对DAFFYSQL语法的支持 (29)
特性8:用DEFAULT进行声明 (31)
特性9:主机名和端口不再只是摆设 (32)
特性10:更高的吞吐量 (33)
总结 (37)
关于作者 (38)
2
空间例程步骤二:获取一个Shapefile
什么是Shapefile?当你真正开始去开发空间应用程序时,你了解的shapefile将比你想象中的更多,
但是对于此刻来说,让我们就说它是一张地图。你可以创建一个,也可以从网上弄一个…看看怎么样
更方便。
对于本例程来说,我们随便从https://www.doczj.com/doc/5f17239491.html,的页面上选择了florida.shapefiles.zip文件,网址如下:https://www.doczj.com/doc/5f17239491.html,/north_america/united_states/florida
以下内容摘录自readme:
This archive includes5filesets that contain data in ESRI shapefile format.
ESRI shapefile is a digital vector storage format for storing geometric location and associated
attribute information.
*.shp-shape format;the feature geometry itself
*.shx-shape index format;a positional index of the feature geometry to allow seeking forwards
and backwards quickly
*.dbf-attribute format;columnar attributes for each shape,in dBase III format
See https://www.doczj.com/doc/5f17239491.html,/wiki/Shapefile for more information about ESRI shapefiles.
在readme中并未提及,但是在每个文件集中都包括了的*.prj文件用于鉴别所使用的空间地理的种
类。
Readme中提到了5个文件集,本例程中使用了其中的三个:“coastline”文件包含了佛罗里达海
岸,以及奥克契比湖和一些河流;“highway”文件包含了关于道路和街道的信息;“poi”文件包含
了一些“有兴趣的点(point of interest)”的位置。以下是完整的列表:
florida_coastline.dbf
florida_coastline.prj
florida_coastline.shp
florida_coastline.shx
florida_highway.dbf
florida_highway.prj
florida_highway.shp
florida_highway.shx
florida_poi.dbf
florida_poi.prj
florida_poi.shp
florida_poi.shx
空间例程步骤三:描述SRID
“描述SRID”意思就是“从数以千计的空间参照系统(Spatial Reference System)中决定哪一个将被用来
处理shapefile”…所以,你也许已经猜到了,SRID的意思就是空间参照描述符(Spatial Reference
SQL Anywhere12的10大炫酷新特性
3
4
参照系统的不一致可能造成的后果
管他呢,我们又不是要在这里建大桥,我们只是做一个例程而已,继续吧。
空间例程步骤四:创建Shapefile表
在我们能将shapefile中的数据加载至SQL Anywhere之前,我们需要创建一张表,而在创建表之前,
我们需要了解shapefile中的数据是什么样的。
内置的sa_describe_shapefile过程将告诉我们答案:它从.shp和.dbf文件中读取信息并创建一个结果
集,其中包含了.shp文件中每列的名字和数据类型。
可以调用sa_describe_shapefile()来查看数据的情况,然后编写CREATE TABLE代码,或可使用图2当
中的代码来让SQL Anywhere为你生成全部的CREATE TABLE语句并存储到文件中。
图2:为shapefile表生成CREATE语句
1UNLOAD
2SELECT STRING(
3‘CREATE TABLE Florida_Coastline(\x0d\x0a’,
4LIST(STRING(
5‘“’,
https://www.doczj.com/doc/5f17239491.html,,
7‘”‘,
8describe.domain_name_with_size,
9‘,\x0d\x0a’),
10‘’ORDER BY describe.column_number),
SQL Anywhere12的10大炫酷新特性
5
6
7149row(s)affected
Execution time:7.547seconds
空间例程步骤六:在ISQL中显示Shapefile表
现在奇迹发生了:在ISQL工具–空间查看器对话框中运行一个简单的查询
SELECT geometry
FROM Florida_Coastline;
将会看到如图5所显示的Florida海岸线。
图5:空间查看器中的Florida Coastline
表
SQL Anywhere12的10大炫酷新特性
7
8
在HTTP的语境中,SVG文件的“Content-Type”是“image/svg+xml”,Firefox之类的浏览器就将直
接展现SVG文件;如图8。
文件
图8:Firefox中的Florida Coastline SVG
空间例程步骤八:加载更多Shapefile
当从多个源中混合并匹配数据时,空间数据变得真正有趣。图9展示了如何将佛罗里达高速公路和兴
趣点的数据加载至各自的表中。
图9:加载Highway和POI表
CREATE TABLE Florida_Highway(
“record_number”int,
“geometry”ST_Geometry(SRID=4326),
SQL Anywhere12的10大炫酷新特性
9
10
图10:通过UNION来合并Shapefile表
SELECT geometry FROM Florida_Coastline
UNION ALL
SELECT geometry FROM Florida_Highway WHERE TYPE=‘motorway’
UNION ALL
SELECT geometry FROM Florida_POI WHERE CATEGORY=‘Health care’;
图10中的UNION运算是完全针对性能而进行优化的:三个结果集都非常大,且都不相同,所以最好
要取消由DISTINCT(缺省值)带来的排序和去重处理。
图10回答了“在佛罗里达州所有的医疗保健机构都在高速公路的哪儿?”的问题。小黑点展现了感
兴趣的医疗保健点的位置,线则展现了高速公路和海岸线。
空间查看器支持滚动和缩放。图11就是通过放大而显示的75号州际公路(也被称为“鳄鱼胡同”)东
西部,,对于刚才问题的答案就是“你不可能在那段路上找到医疗保健机构。”
表
图11:空间查看器中合并的shapefile
SQL Anywhere12的10大炫酷新特性
11
12
SQL Anywhere 12的10大炫酷新特性13
图12中的第1至第3行定义了一个web service ,它将响应浏览器请求并调用存储过程p()来返回一个响应。特殊的服务名“root ”代表了缺省的“无需名字”的设定;例如,无需再url 中指定服务的名称,只需键入http://localhost 。“RAW ”类型代表任意类型;它由存储过程来完成构建响应的所有操作,SQL Anywhere 并不进行任何的格式化。
第8行的调用指定了HTTP Content-Type 。
第10行开始的SELECT 执行RAW web service 需要所调用的存储过程完成的任务:它返回一个单一的行(由一个单独的LONG VARCHAR 列组成)结果集。
第14行至23行的SELECT 语句与先前在图10中展示的SELECT 语句执行了相同的查询,在此将代码编写为派生表,以便能通过外部SELECT 进行后续处理。
第10行至13行的REPLACE 调用执行了两个功能。首先,它调用了首次在图6中出现的聚合函数ST_Geometry::ST_AsSVGAggr 。然后,它在XML 文字结果中进行了一次字符串替换,扩大了医疗保健的点的尺寸,并将颜色变为红色。这样一来,输出的结果就显示的更加美观。好吧,这是勉强拼凑出来的。好吧,它也工作了。在本例程中,此刻它确实有效果了。
图13显示了启动带有HTTP 服务器的SQL Anywhere 数据库,后面跟着在浏览器中使用的url 。图13:启动并连接至SQL Anywhere HTTP 服务器
%SQLANY12%\bin32\dbeng12.exe”-xs http(port=80)ddd12.db
http://localhost
图14展示了Firefox 中的结果:更大的医疗保健点,显著的红色显示。
图14:在Firefox 中展示合并了的shapefile
表
14
18
19“%SQLANY12%\bin32\https://www.doczj.com/doc/5f17239491.html,”^
20-c“SERVER=root_server;DBN=root;UID=dba;PWD=sql”
图15中的第一行和第二行在C:\data文件夹下创建了一个新的SQL Anywhere数据库。
第4行至第7行的dbping命令满足了特殊的需求,即在该数据库被启动为只读横向扩展主数据库之
前,事务日志必须存在。SERVER和DBF选项,与-d选项一道,强制dbping启动该数据库以便能被
ping通…启动一个数据库会有需要创建其事务日志的负面影响。
第9行至第17行将数据库启动为主数据库。便利的dbspawn工具能在服务器启动后让控制权回到批
处理文件中,而不需要等待服务器停止。
第12行指定了该服务器会使用的一个服务器名称,第16行隐式指定数据库名为“root”。小贴士:
在配置根数据库和拷贝数据库时,不要试图去指定不同的数据库名字,这将有可能会引起错误消息。
在本例中,root和所有的拷贝数据库将运行在同一台计算机上,所以将使用不同的端口。本代码中的
第15行将50000端口作为主数据库的端口。
第17行的-xp选项告诉SQL Anywhere正在使用只读横向扩展,这正是为何在启动服务器之前就一定
需要事务日志存在的原因。
第19行和第20行开启了本例中后续使用的四个ISQL会话中的第一个;本会话直接通过
“root_server”名称连接至可更新的主数据库。
查询隔离步骤2:创建拷贝
图16展示了如何定义用以实现只读横向扩展的SQL Anywhere的“镜像服务器”对象,如何设置“MIRROR OPTION”值然后使用BACKUP语句来闯将主数据库的物理拷贝。
图16:创建根数据库的只读拷贝
1CREATE MIRROR SERVER“primary_server”
2AS PRIMARY
3connection_string=‘SERVER=primary_server;HOST=localhost:50000’;
4
5CREATE MIRROR SERVER“root_server”
6AS PARTNER
7connection_string=‘SERVER=root_server;HOST=localhost:50000’;
8
9SET MIRROR OPTION auto_add_server=‘root_server’;
10SET MIRROR OPTION child_creation=‘automatic’;
11SET MIRROR OPTION authentication_string=‘abc’;
12SET MIRROR OPTION auto_add_fan_out=‘10’;
13
SQL Anywhere12的10大炫酷新特性
15
16
19-xp on
20
21“%SQLANY12%\bin32\dbspawn.exe”^
22-f^
23“%SQLANY12%\bin32\dbsrv12.exe”^
24-n copy3_server^
25-o c:\data\copy3\copy3_console_log.txt^
26-su sql^
27-x TCPIP(port=50003)^
28c:\data\copy3\root.db^
29-xp on
图17中的三个dbspawn-dbsrv12命令和图15中的启动主服务器的命令完全相同,除了以下的部分:?不同的服务器名字:copy1_server、copy2_server、copy3_server
?不同的端口:50001、50002、50003
?不同的子目录:c:\data\copy1、c:\data\copy2、c:\data\copy3
这些不同对于启动备份服务器的过程是重要的,但是他们不需要进行连接。事实上,在图17中显示
的这些不同的名字和值在别的地方均不会出现。真是神奇呀。
查询隔离步骤4:更新根数据库
图18显示了在三个拷贝都被创建并启动了之后对根数据库进行改变。
图18:更新根数据库
1CREATE TABLE Hello(MessageText VARCHAR(100));
2INSERT Hello VALUES(‘Hello,world!’);
3COMMIT;
4
5SELECT MessageText,
6DB_PROPERTY(‘File’)
7FROM Hello;
第1行到第3行将一行新数据插入了一张新的表中,SELECT将显示该行所处的数据库的物理文件的
位置。
因为在本例中所有的数据库都位于相同的电脑中,所以由DB_PROPERTY(‘File’)返回的值将能回答
“我正在查看哪个数据库?”的问题。
SQL Anywhere12的10大炫酷新特性
17
18