2010-07-26 165 views
1

我對SAS很新穎,而且遇到了一個問題,我認爲可能比迄今爲止發現的問題有更好的解決方案。使用SAS代碼更新來自SAS數據集的數據的Oracle表格

我需要更新一個具有大約100萬行的Oracle數據庫表,其中包含大約10000條記錄的SAS數據集的數據。

我在proc sql中使用了更新語句,但是需要幾個小時才能更新Oracle表。現在,我將SAS數據集中的數據加載到Oracle數據庫中的一個臨時表中,並通過執行語句執行proc sql傳遞以更新臨時表中的主表。這最多隻需要幾分鐘。

但是,這對程序來說非常麻煩,而且我需要從SAS代碼中的多個函數更新Oracle表。

SAS中有沒有類似於JDBC的批量更新(在參與SAS之前,我用它來做Java編程)?比在proc sql中使用更新語句更快,但比使用傳遞通過臨時表+更新更容易編碼?

回答

0

您是否在使用SAS/Access將SAS會話連接到Oracle?

在我的情況下,我使用SAS/Connect JDBC。

SAS/Connect是一種將SAS基板系統連接到JEE的非常簡單但有效的策略。基本上sas/connect是sas執行sas -dmr的另一個telnet實現。

我使用sas/connect jdbc將sas數據繪製到我的jsp中,然後使用我們熟悉的java編程技術將數據推送到oracle或sql server。

閱讀關於使用sas/connect將sas連接到JEE的古老論文: http://www.nesug.org/proceedings/nesug04/ap/ap02.pdf。 順便說一句,不要試圖與紙上列出的聯繫人聯繫 - 他們是古老的。

在回答您進一步聲明

我想你想的方式,使用JDBC將數據插入到Oracle? 我的文章向您展示瞭如何在JSP中嵌入一整塊SAS宏或SQL或任何文本,然後提交要通過SAS/Connect運行的文本塊。

String datasetname = request.getParameter("datasetname"); 
String where = request.getParameter("where"); 

<t:text id="macHello"> 
%macro hello(datasetname); 
data &datasetname; 
/* code to create your data */ 
run; 
%mend; 

%hello(<%=datasetname%>); 
</t:text> 

sasConnect.submit(macHello); 

<t:text id="SQLgetRecs"> 
SELECT * 
FROM <%=datasetname%> 
WHERE <%=where%> 
</t:text> 

ResultSet mydata = 
sasConnJDBC.executeQuery(SQLgetRecs); 

然後做任何你需要使用Java, 無論是在甲骨文交織插入每個結果集 或迭代結果集的迭代產生SQL插入的文本塊做VALUES 你然後提交到Oracle JDBC。

它只是一個JSP,只要你知道如何工作一個JSP並且願意理解我寫的文本塊標記庫是如何工作的。您會看到,我使用這種技術允許JSP運行SAS批處理模式下運行的SAS宏,但不會對宏進行任何更改。不僅如此,標籤庫允許我將java和jsp變量分辨率嵌入到宏或sas/sql塊中。

我編寫了這個塊文本標籤庫,因爲我曾經在Perl(2003之前)中進行過這樣的操作,其中Perl(和其他腳本語言)允許您爲代碼中的連續塊文本分配變量的腳本。

說明書上使用標記庫:

http://h2g2java.blessedgeek.com/2009/07/jsp-text-custom-tag.html

http://h2g2java.blessedgeek.com/2009/07/referencing-text-jsp-custom-tag-defined.html

+0

謝謝,最後一個答案! 我想用SAS代碼本身來更新Oracle表,而不是Java。據我所知,我沒有使用SAS/Access。數據集創建在SAS代碼中,我需要從SAS代碼本身更新Oracle表... – ChamaraG 2010-09-04 01:30:25

+0

除了使用SAS/Access將sas會話連接到oracle或任何rdbms之外,我不知道任何其他方式。除非通過生成輸出文件,然後觸發外部進程將該文件插入到Oracle中。 而SQL passthro是SAS/Access功能。 – 2010-09-05 05:23:06