SAS:如何通过SQL传递将本地sas表复制到oracle中

时间:2015-05-08 09:34:39

标签: oracle sas proc-sql

在进行一些不会对我有用的搜索后,我想问你这个问题。

一些背景: 我想通过两种不同的方法创建一个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中?如果是,请继续。

谢谢

1 个答案:

答案 0 :(得分:2)

在SQL Passthrough中,连接的会话无法看到您的SAS库,除非它通过DBMS特定的连接方法单独连接(不太可能)。传递实际上是代码并提交它以便在远程DBMS上执行,SAS只是一个愚蠢的终端。

在显式传递中,您可以从SAS访问信息的唯一方法是将其作为文本传输到宏变量中。因此,您可以通过将值列表放在宏变量中并提交它来执行in个查询;但是你不能直接引用SAS表。你可以在宏变量或一组宏变量中传递整个表的内容,然后使用insert语句来包含它们,但这不是一个好主意;它不会比使用libname连接更快,并且有更多的错误风险(并且工作量更大)。

在大多数情况下,如果要同时查看SAS和RDBMS数据,则应该只使用libname访问权限。当使用libname访问时,SAS可以使用隐式传递来加快速度。

如果您尝试使用passthrough以避免SAS必须下载数据以执行连接,您可以做的一件事是使用libname访问将SAS数据上载到全局临时表。然后你可以通过passthrough连接并使用该临时表。请注意,这两个连接是分开的,因此它们不会共享非全局临时表。 (我相信在较新的版本中,他们添加了一个功能,使他们共享连接,但我找不到语法,并且不记得自己使用它有多大的成功。)