SAS/Access和SAS/SQL产品的复杂性源于从客户端向服务器发送命令的必要性。在WIN或者UNIX系统中,这些功能通常以三种形式出现:
• PROC ACCESS -- 装载DBMS数据进入SAS
• PROC DBLOAD -- 装载SAS数据进入DBMS
• SQL数据传递 -- 执行标准SQL语言
PROC ACCESS
PROC Access 使用较为复杂。因为需要首先创建一个获取描述块(Access Descriptor)来描述一个DBMS表格数据,再创建一个视图描述块(View Descriptor)来描述这个DBMS表格的子集。下面的例子显示了该过程如何处理远程Oracle数据库表格:
proc access dbms=oracle;
create work.test.access;
user="system";
orapw="pinggu";
table="system.Dw_account";
path="@test.beijing";
assign=yes;
list all;
create work.test.view;
select Account Account_code1;
subset where Account_code1 = '105';
run;
proc print data=test;
run;
这段代码先在临时库中创建一个名为test的 "Access Descriptor";然后,账户、密码、路径(网络服务名) 是针对Oracle服务器而填写的。Oracle域名在这里被转换为SAS格式,数据库内容也被清单列示。注意:表格"Dw_account"、所有者"system"需要在这里声明。接着,一个包含了远程表格EMP某些行与列的"View Descriptor"也被创建。根据特定用户的Oracle权限,这样的数据视图能够被用来读取或者更新数据库。这里可见,PROC ACCESS的语法比较复杂。比如,即便获取、视图描述块是在临时库中创建,还是需要指明三级名称work.test.access和work.test.view。
此为,高版本SAS提供了不再需要创建获取、视图描述块的数据库资源整合方式。如下一行代码所示,提供使用一种"动态库名引擎(Dynamic Libname Engine)",SAS能够如同对待数据集那样处理远程数据库。
libname mydblib oracle user=system pw=pinggu path="@test.beijing";
run;
PROC DBLOAD
DBLoad过程则以相反方式来处理数据------将数据从SAS系统拷贝进入DBMS系统中。该过程适于大量加载,比如:将全部SAS数据集拷入Oracle中。然而,SAS程序员需要注意以下两点:
• 缺省装载的限度为5000条记录。加载更大的数据表则需要设定limit=0。
• 仅用来建立新表格。如果已经存在表格,则该过程异常中止。
下面的例子演示了从SAS系统中创建一个新的Oracle表格:
proc dbload dbms=oracle data=sashelp.prdsale;
orapw="pinggu";
user="system";
path="@test.beijing";
table="system.prdsale";
label;
reset all;
load;
run;
该过程的语言与PROC ACCESS极为相似。一个名为"sashelp.prdsale"的SAS数据文件被作为表格拷入了Oracle中并且命名为"prdsale"。SAS变量标识则被作为Oracle域名。注意:这里必须存在"load"语句,否则表格将不会创建。
SQL数据传递
SQL(Structured Query Language)语言是一种应用广泛的、使用来获取或更新关系型数据库中表格的标准语言。SQL语言以PROC SQL的形式内嵌于BASE SAS模块之中。PROC SQL是管理远程数据表格的有效工具,为有经验的SQL用户提供了一个相对直观的界面。在大规模加载情形中,PROC SQL表现出优越于DBLoad的性能。除此之外,PROC SQL还明显表现出简便有效、界面友好的优势。需要强调的是:在不同的关系型数据库中,SQL的表现也不尽相同;在Oracle客户端使用的SQL*Plus表现出区别于PROC SQL的语法特征。这样,在使用之前,需要查询SQL用户指南、咨询数据库管理员。
下面的例子显示了如何使用PROC SQL来作为PROC ACCESS的替代品:
proc sql;
connect to oracle
(user=system orapw=pinggu path="@test.beijing");
create table test2 as
select * from connection to oracle
(select * from Prdsale);
disconnect from oracle;
quit;
程序中使用了三个SQL语句:建立数据库连接、断开数据库连接以及分派数据。这里的SQL select语句包括了两部分:(1)加上括号的表达式 (select * from prdsale)为数据传递部分。这段代码被发送到Oracle数据库服务器来获得指定数据表格"prdsale";(2) 外部select语句将Oracle查询结果返还SAS系统。最后,create table 语句将查询结果形成数据集work.prdsale。如果该语句被遗漏,则PROC SQL仅在输出窗口显示查询结果。
根据不同的客户端/服务器平台,SAS系统提供了一系列关系型数据库的获取、访问方法。相对于之前的SAS版本,8.0版后的Oracle、ODBC和DB2的动态逻辑库名引擎在大规模获取与视图描述块方面获得了跨越式的提升。未来的SAS版本将会进一步对于关系型数据库以及其它类型的外部数据源提供性能卓越的逻辑库名支持。
相关链接:
大数据时代BI先锋利器——SAS数据仓库管理系统
https://bbs.pinggu.org/forum.php?mod=viewthread&tid=1597181&from^^uid=3282317
SAS SQL与大型商业数据库——ITAT数据分析师培训项目系列文集
https://bbs.pinggu.org/forum.php?mod=viewthread&tid=1552391&from^^uid=3282317
SAS/WA与数据仓库——ITAT数据分析师培训项目系列文集
https://bbs.pinggu.org/forum.php?mod=viewthread&tid=1552624&from^^uid=3282317