【问题标题】:SAS: How to copy a local sas table into oracle via SQL pass-throughSAS:如何通过 SQL 传递将本地 sas 表复制到 oracle
【发布时间】:2015-05-08 09:34:38
【问题描述】:

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

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

我使用了第一种方法(效果很好)和一个 libname 到 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 中?如果是,如何进行。

谢谢

【问题讨论】:

    标签: oracle sas proc-sql


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 很多时候通过'libname'上传和下载数据实际上比通过传递更快。 libname 实际上维护了与数据库的多个连接,并且可以线程传输。一个直通查询只有 1 个传输流。
    • @DomPazz 是的-您也应该在单独的答案中提供有关如何执行此操作的示例代码。
    • 非常感谢乔的回答,非常有用。既然我知道了,我想我仍然会继续使用 libname+proc sql。问候。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2014-11-13
    相关资源
    最近更新 更多