在进行一些不会对我有用的搜索后,我想问你这个问题。
一些背景: 我想通过两种不同的方法创建一个oracle表来比较性能。实际上我想将一个表从我的本地SAS库复制到Oracle。
我使用第一个方法(完美地工作)和一个名为oracle的方法:
LIBNAME dblib ORACLE USER=usr PASSWORD="&dbpwd_sas" PATH="DM_CT_TEST" SCHEMA="SAS";
PROC SQL NOPRINT;
CREATE TABLE dblib.TEST_WIN7 AS SELECT *
FROM SASHELP.CARS
WHERE STRIP(UPCASE(make)) EQ "ACURA"
;
QUIT;
LIBNAME dblib CLEAR;
但我也尝试通过SQL传递使用另一种方法,但不起作用:
PROC SQL NOPRINT;
CONNECT TO ORACLE (USER=usr PASSWORD="&dbpwd_sas" PATH="DM_CT_TEST");
EXECUTE ( CREATE TABLE sas.TEST_WIN7 AS
SELECT * FROM SASHELP.CARS
WHERE STRIP(UPCASE(make)) EQ "ACURA"
) BY ORACLE;
DISCONNECT FROM ORACLE;
QUIT;
使用此方法,程序找不到SASHELP.cars。
所以这是我的问题: 是否可以通过SQL传递将本地SAS表复制到oracle中?如果是,请继续。
谢谢
答案 0 :(得分:2)
在SQL Passthrough中,连接的会话无法看到您的SAS库,除非它通过DBMS特定的连接方法单独连接(不太可能)。传递实际上是代码并提交它以便在远程DBMS上执行,SAS只是一个愚蠢的终端。
在显式传递中,您可以从SAS访问信息的唯一方法是将其作为文本传输到宏变量中。因此,您可以通过将值列表放在宏变量中并提交它来执行in
个查询;但是你不能直接引用SAS表。你可以在宏变量或一组宏变量中传递整个表的内容,然后使用insert语句来包含它们,但这不是一个好主意;它不会比使用libname连接更快,并且有更多的错误风险(并且工作量更大)。
在大多数情况下,如果要同时查看SAS和RDBMS数据,则应该只使用libname访问权限。当使用libname访问时,SAS可以使用隐式传递来加快速度。
如果您尝试使用passthrough以避免SAS必须下载数据以执行连接,您可以做的一件事是使用libname访问将SAS数据上载到全局临时表。然后你可以通过passthrough连接并使用该临时表。请注意,这两个连接是分开的,因此它们不会共享非全局临时表。 (我相信在较新的版本中,他们添加了一个功能,使他们共享连接,但我找不到语法,并且不记得自己使用它有多大的成功。)