这是炫酷的功能,我已经获得一大串的代码,我希望能够不费吹灰之力便能将它们嵌入数据库内,以便实现数据来回传递。这里有一个例子:将文件比较实用程序的 API 嵌入其中,以便比较数据库内作为blob储存的文件,因此 SQL Anywhere 的嵌入式 HTTP 服务器可以通过 Web 服务调用从浏览器中显示比较结果。
这个功能也让我感到为难。起初,我认为它是新奇的 XML 内容之一,现在,“OPEN(开放)”一词确实让人对它的使用方式和过度使用感到不胜其烦。因此,我跳过 OPENSTRING 的思考,“对啊,没错,现在我们随时都会开始说 OpenCorpse 这样的语句,而不说路上截杀 (roadkill) 了。”
然后,以维基百科“IvanAnywhere”著称的 Ivan Bowman 使用下面这个示例改变了我的想法,在这个示例中将 OPENSTRING 和 UNLOAD SELECT 一起并入一个变量。
“我所质疑的一个灵活使用示例如下(我在这里使用SYSDOMAIN 只是为了说明例子):
CREATE VARIABLE @var LONG VARCHAR;
UNLOAD
SELECT *
FROM SYSDOMAIN
INTO VARIABLE @var;
CREATE VIEW V AS
SELECT *
FROM OPENSTRING ( VALUE @var ) WITH
( domain_id SMALLINT,
domain_num VARCHAR ( 128 ),
type_id SMALLINT,
“precision” SMALLINT )
AS T;
以上的代码是将结果集复制到一个连接级变量 @var,然后使用一个视图 V 来参照结果集。你可以在连接过程内为 @var 创建一个值。
这可能是管理本地选项设置或对热点数据进行本地连接缓存的好方法(避免连接至热点行)。我想我们需要仔细注意如何使用它们,但它确实是一个值得你放在后备箱中的工具。你甚至可以在视图上创建一个 INSTEAD OF 触发器,使其看起来更像是一张表。
OPENSTRING 功能看起来也非常适合动态 IN 列表的某些情况,其中IN 列表被指定为一个字符串。它甚至允许使用并非由 SQL Anywhere 直接支持的多列式 IN 列表。
当OPENSTRING 与 LIST 结合时,它也具有一些有趣的用途。它可能就像是一个横向连接(Lateral Join),将单个列的值变换为一个结果集。过去我使用 sa_splitlist() 完成了许多有趣的解决方案,而 OPENSTRING 现在涵盖了所有这些或更多解决方案,因为它不仅变换列,而且也变换行,其变换速度更快,它为处理更复杂的数据提供了更多的解析选项。
我很好奇这些新特性将在现实世界中发挥怎样的作用。”
— Sybase iAnywhere 的杰出工程师 Ivan T. Bowman
但愿如此,Ivan,在最后一点上……难以预测用户将如何使用新功能。有时候,他们就像 LIST 函数一样大受欢迎,但有时候就像语法难题(即 ANSI 标准递归连接)那样一点都不受欢迎。我认为 OPENSTRING 可能成为最受欢迎的功能之一,同样还有UNLOAD(卸载)到一个变量。
Ivan 提到了另一个最新功能,该功能并未列入前十强排行榜,因为它在版本 10.0.1 中没有大势宣扬。INSTEAD OF 触发器让你在表和视图上编写触发器以取代触发的操作。换言之,如果 INSTEAD OF INSERT ON T 触发器存在,当 INSERT T 语句执行时,它激发触发器,但是它并没有插入行。对于运行 INSERT T 之后你想要执行的任何操作,都必须在触发器内进行编码。
它酷的部分在于,它让你在视图(甚至是本身不可更新的视图)上编写触发器。视图本身是否可更新并没有多大关系,因为如果相应的 INSTEAD OF 触发器存在,触发 INSERT、UPDATE 或 DELETE 的操作自身也不会执行插入、更新或删除,同时你还可以自由地在触发器内编写任何你想要执行的代码(除了 COMMIT 以外,当然,还是有限制的)。
这个功能使我感到非常为难,多年来我一直在寻找,当我第一次获得该功能时,我却对它无从入手!原因是,在这期间其他功能已经可以解决我的问题,其中最重要的是增强的 LIST 聚合功能。将LIST 和 STRING 函数与 LIST 分隔符和ORDER BY 子句一起使用,可以完成针对集合的字符串处理。例如,你可以连接一些表,并利用单一 SELECT 将数据转换为格式化 HTML 网页。
瞧,我并不是一名顶尖的人才。因为某人给我提供一种新功能,但我并未马上就能知道它的用途。LIST 是如此,UNLOAD(卸载)到一个变量更是如此。但是一旦有人给我指点,多好啊!我现在就可以完成冲刺!当 Ivan Bowman 指引我如何将这项新功能与排行榜中的下一个新功能结合起来时,事情就这样发生了。
全文检索和正则表达式是你可以用来替代 LIKE 谓词的两个新功能。第一个功能非常棒(全文检索),它进入了“前十强”功能排行榜,而正则表达式却落榜了。我需要花费很长的时间才能理解SELECT 语句中某些类似“(?<=new\s)york”这样的代码。”如果你已经了解正则表达式,你可能很高兴;但是,如果你开始担心可维护性,那你可能就会笑不出来了。
现在在默认情况下都会安装“帮助”的“可打印手册”版本。这意味着,如果你不想要安装那些庞大的 PDF 文件,你必须在安装文件时选择“自定义”选项。“帮助”的常规编译 HTML 版本仍然存在,也一如继往地出色:所有手册都放在一个地方,还提供全文检索功能…那么谁还需要纸面文件?确实不可思议。
使用除 SQL 以外的语言编写储存过程的整体情况已得到大大扩展和改进,这是前十强炫酷新功能之一。不可思议的是,如果你选择的语言恰巧是 C 或 C++,当你阅读这一行时,你将变心灰意冷:“同样应当注意到的是,编译本机函数必须使用本机函数调用 API。”API 已经广泛使用了好长时间,它是已知编码领域的最可笑接口之一…它确实是太糟糕了,但我们还是必须使用它。但这仅针对 C 和 C++ 语言,并不适用于 Perl 或 PHP 或 Visual Basic 或其它的任何一种语言。API 至少还没有变得更糟糕。
INSTEAD OF 触发器是一项酷酷的最新功能,令人不可思议的是,工程师还没有为我们提供系统目录表的触发器。现在编写的应用程序越来越复杂,它们以动态方式操作模式对象,例如 CREATE TABLE,同时动态捕捉和跟踪那些变化的功能肯定会受欢迎。即使提供的系统目录触发器内部的代码可能只操作用户表,不能发起对模式的进一步的变更,但这样也能够满足 80% 以上的需求。我敢打赌,这将在改进可笑的本地函数调用 API 前发生。