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。 (我相信在较新的版本中他们已经添加了一项功能来让他们共享连接,但我找不到语法并且不记得自己使用它有多大成功。)
在进行了一些搜索后没有找到对我有用的东西,我想问你这个问题。
一些背景: 我想通过两种不同的方法创建一个 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。 (我相信在较新的版本中他们已经添加了一项功能来让他们共享连接,但我找不到语法并且不记得自己使用它有多大成功。)