从 SAS 数据集更新 Oracle table

Update Oracle table from SAS dataset

如何从 SAS 数据集更新 SAS 中的 Oracle table?

场景如下:

  1. 通过 libname 我将 Oracle table 加载到 SAS 数据集中。

  2. 进行一些数据处理,在此期间我更新了一些值,插入了一些新观察值并删除了数据集中的一些观察值。

  3. 我需要使用我在上一步中修改的数据集更新原始 Oracle table - 所以当 oracle table 的键匹配时和数据集,然后将更新值,当 oracle table 中缺少键时,将插入它,当 Oracle table 中有键但已从中删除时数据集,然后它将从 Oracle table.

  4. 中删除

注意:我无法在 Oracle 中创建新的 table。我需要在原来的 table.

上制作 "updating"

我尝试使用 MERGE INTO 和 DELETE 分两步完成,但是在 PROC SQL 中没有 MERGE INTO。 如果有任何帮助,我将不胜感激。

编辑:我也在考虑 t运行cating oracle table 并插入行(每个过程谈论 4-5000 行 运行),但看起来像PROC SQL.

中没有内置的 t运行cate 语句

procSQL中肯定有UPDATE和INSERT方法。此外,检查 SAS 是否允许您执行其他 SQL 操作 "execute immediate"(例如 PL/SQL 将允许),您可以在其中将 SQL 语句构造为字符串,然后发送它交给 Oracle 执行。

请尝试使用下面的方法,

方法一:

PROC SQL;
insert into <User_Defined_Oracle_table>
select variables
from <SAS_Tables>;
QUIT;

上面创建了一个 table 驻留在相同的数据库和架构中。

  PROC SQL;
    connect to oracle (user= oraclepwd=);
    execute(
    UPDATE <Oracle_table> a SET <Column to be updated> = (SELECT <Columns to update seperated by commas>
    FROM <SAS_table> b
    WHERE a.<VARIABLE>=b.<VARIABLE>)
    WHERE exists (select * from <SAS_table> b
    WHERE a.<VARIABLE>=b.<VARIABLE> ))
    by oracle;
    QUIT; 
    
    PROC SQL;
    connect to oracle
    (user= oraclepwd=};
    execute (truncate table <SAS_table>) by
    oracle;
    QUIT; 

这是更新 oracle table 的有效方法之一。 详情请参考Update Oracle using SAS

方法二:

LIBNAME Sample oracle user=  password= path=  schema= ; run;
PROC SQL;
UPDATE Sample_Oracle.<Table_Name> as a SET <Variable_Name> = (SELECT <Varibales>
FROM <Sas_table> as b
WHERE <A.Variable_Name>=<B.Variable_Name>)
WHERE exists
(select * from <Sas_table> as b
WHERE <A.Variable_Name>=<B.Variable_Name>);
QUIT; 

在所有方法中,此方法的处理时间较长。

此外,

方法三:

%MACRO update_oracle (SAS_Table,Oracle_Table); 

Proc sql ;
select count(*) into: Count_Obs from <SAS_Table> ; Quit;

%do i = 1 %to &Count_Obs;

Proc sql; 
select <variables to update seperated by commas> into: <macros> ; Quit;

PROC SQL;
UPDATE &Oracle_Table as a
SET <Oracle_Variable_to_Update>=<Variable_macro_created_above>
WHERE <A.Variable_Name>=<B.Variable_Name> 
QUIT;

%end;
%MEND update_oracle;
%update_oracle(); 

宏变量SAS_Table和Oracle_Table分别表示包含要更新的记录和oracle中要更新的记录的SAS数据集。

方法 3 使用的处理时间比方法 2 少,但效率不如方法 1。