如何从SAS数据集更新SAS中的Oracle表?
以下是该方案:
通过libname我将Oracle表加载到SAS数据集中。
进行一些数据处理,在此期间我更新一些值,插入一些新观察并删除数据集中的一些观察结果。
我需要使用上一步中修改过的数据集更新原始Oracle表 - 所以当oracle表的键和数据集之间存在匹配时,那么值将更新,当oracle表中缺少密钥时,它将被插入,当有一个在Oracle表中但已从数据集中删除的密钥时,它将被删除Oracle表。
注意:我无法在Oracle中创建新表。我需要进行更新"在原来的桌子上。
我试图使用MERGE INTO和DELETE分两步完成,但在PROC SQL中没有MERGE INTO。 我真的很感激任何帮助。
编辑:我还在考虑截断oracle表并插入行(每个程序运行时讨论4-5000行),但似乎在PROC SQL中没有内置的truncate语句。答案 0 :(得分:0)
当然,proc SQL中有UPDATE和INSERT方法。另外,检查SAS是否允许您执行“立即执行”的其他SQL操作(例如PL / SQL将允许),您可以在其中将SQL语句构造为字符串,然后将其发送到Oracle以执行。
答案 1 :(得分:0)
请尝试使用以下内容
sess.run(optimzer._lr)
Above创建一个驻留在同一数据库和模式中的表。
PROC SQL;
insert into <User_Defined_Oracle_table>
select variables
from <SAS_Tables>;
QUIT;
这是更新oracle表的有效方法之一。
有关详细信息,请参阅Update Oracle using SAS
。
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;
此方法需要更长的处理时间。
另外,
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有效。