从 SAS 数据集更新 Oracle table
Update Oracle table from SAS dataset
如何从 SAS 数据集更新 SAS 中的 Oracle table?
场景如下:
通过 libname 我将 Oracle table 加载到 SAS 数据集中。
进行一些数据处理,在此期间我更新了一些值,插入了一些新观察值并删除了数据集中的一些观察值。
我需要使用我在上一步中修改的数据集更新原始 Oracle table - 所以当 oracle table 的键匹配时和数据集,然后将更新值,当 oracle table 中缺少键时,将插入它,当 Oracle table 中有键但已从中删除时数据集,然后它将从 Oracle table.
中删除
注意:我无法在 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。
如何从 SAS 数据集更新 SAS 中的 Oracle table?
场景如下:
通过 libname 我将 Oracle table 加载到 SAS 数据集中。
进行一些数据处理,在此期间我更新了一些值,插入了一些新观察值并删除了数据集中的一些观察值。
我需要使用我在上一步中修改的数据集更新原始 Oracle table - 所以当 oracle table 的键匹配时和数据集,然后将更新值,当 oracle table 中缺少键时,将插入它,当 Oracle table 中有键但已从中删除时数据集,然后它将从 Oracle table.
中删除
注意:我无法在 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。