视图新语
视图是数据库的一个重要概念。可以简单的理解为存储的查询。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。视图可帮助用户屏蔽真实表结构变化带来的影响。SQLHUB是一个分布式异构数据库,主要用于数据集成。Sqlhub支持视图,并且支持更广义的视图:
l 视图不仅仅是一个SELECT查询语句,可以是一个程序块,可以理解为没有参数,返回结果为数据集的存储过程。
l 视图可以缓存数据,并且可以设置缓存时长,提升非实时查询性能。这对于异构数据集成且实时性要求不严格的环境非常重要。
语法:
CREATE [OR REPLACE] VIEW [schemaName.]name [DELAY delay] AS {查询表达式 | 程序块}
参数:
DELAY | 查询结果缓存时间,单位为秒,0表示不缓存。-1表示永久缓存,缓存是与连接相关的。可以查询[schemaName.]name$进行强制更新。 |
例子:
create or replace view v_ip as
begin
--构建结果表
t_ip := select adapter,dns_suffix,ip_address,subnet_mask,gateway from serial(1,0);
--初始化变量
v_adapter := '';
v_dns_suffix := '';
v_ip_address := '';
v_subnet_mask := '';
v_gateway := '';
--计数器
n := -1;
--分析调用操作系统命令后的输出
for i in (select * from split(oscmd('ipconfig'),'/n') where trim(f1) != '') loop
if mod(n,5) = 0 then
v_adapter := substr(i.f1,18);
v_adapter := substr(v_adapter, 1, length(v_adapter) - 1);
elsif mod(n,5) = 1 then
v_dns_suffix := substr(i.f1,instr(i.f1,':') + 1);
elsif mod(n,5) = 2 then
v_ip_address := substr(i.f1,instr(i.f1,':') + 1);
elsif mod(n,5) = 3 then
v_subnet_mask := substr(i.f1,instr(i.f1,':') + 1);
elsif mod(n,5) = 4 then
v_gateway := substr(i.f1,instr(i.f1,':') + 1);
--插入记录
insert into t_ip (adapter,dns_suffix,ip_address,subnet_mask,gateway)
values (v_adapter,v_dns_suffix,v_ip_address,v_subnet_mask,v_gateway);
end if;
n := n + 1;
end loop;
return t_ip;
end;
查询:
select * from v_ip
结果:
+-------------------------------+------------+----------------+----------------+---------+
| ADAPTER | DNS_SUFFIX | IP_ADDRESS | SUBNET_MASK | GATEWAY |
+-------------------------------+------------+----------------+----------------+---------+
| VMware Network Adapter VMnet8 | | 192.168.37.1 | 255.255.255.0 | |
| VMware Network Adapter VMnet1 | | 192.168.174.1 | 255.255.255.0 | |
+-------------------------------+------------+----------------+----------------+---------+