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

SAS: How to copy a local sas table into oracle via SQL pass-through

在进行了一些搜索后没有找到对我有用的东西,我想问你这个问题。

一些背景: 我想通过两种不同的方法创建一个 oracle table 来比较性能。实际上,我想将 table 从我的本地 SAS 库之一复制到 Oracle。

我使用了第一种方法(完美运行)和 oracle 的 libname:

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 table 复制到 oracle 中?如果是,如何进行。

谢谢

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

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

在大多数情况下,当您想同时查看 SAS 和 RDBMS 数据时,您应该简单地使用 libname 访问。 SAS 在使用 libname 访问时可以使用隐式传递来加快速度。

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