从SAS数据集更新Oracle表

时间:2017-05-13 10:29:17

标签: sql oracle sas oracle-pro-c

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

以下是该方案:

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

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

  3. 我需要使用上一步中修改过的数据集更新原始Oracle表 - 所以当oracle表的键和数据集之间存在匹配时,那么值将更新,当oracle表中缺少密钥时,它将被插入,当有一个在Oracle表中但已从数据集中删除的密钥时,它将被删除Oracle表。

  4. 注意:我无法在Oracle中创建新表。我需要进行更新"在原来的桌子上。

    我试图使用MERGE INTO和DELETE分两步完成,但在PROC SQL中没有MERGE INTO。 我真的很感激任何帮助。

    编辑:我还在考虑截断oracle表并插入行(每个程序运行时讨论4-5000行),但似乎在PROC SQL中没有内置的truncate语句。

2 个答案:

答案 0 :(得分:0)

当然,proc SQL中有UPDATE和INSERT方法。另外,检查SAS是否允许您执行“立即执行”的其他SQL操作(例如PL / SQL将允许),您可以在其中将SQL语句构造为字符串,然后将其发送到Oracle以执行。

答案 1 :(得分:0)

请尝试使用以下内容

方法1:

sess.run(optimzer._lr)

Above创建一个驻留在同一数据库和模式中的表。

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

这是更新oracle表的有效方法之一。 有关详细信息,请参阅Update Oracle using SAS

方法2:

  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; 

此方法需要更长的处理时间。

另外,

方法3:

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; 

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

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