2010-05-25 35 views
1

在JDBC代碼中,我有一個是工作與SQL Server的情況如下:JDBC代碼更改從SQL Server到Oracle

CallableStatement stmt = connection.prepareCall("{ call getName() }"); 

ResultSet rs = stmt.executeQuery(); 

if(rs != null) 
{ 

    while(rs.next()) 
    { 

    //do something with rs.getString("name") 

    } 

} 

多行對於上述情況返回。

我明白,需要使用遊標來遍歷Oracle中的表格,但是有什麼辦法可以保持上述代碼相同並完成同樣的事情嗎?

示例PL/SQL代碼將不勝感激。

在此先感謝。

回答

3

您可以實現的getName()作爲一個管道函數:

CREATE OR REPLACE name_record AS OBJECT (name VARCHAR2(100)); 
/

CREATE OR REPLACE name_table AS TABLE OF name_record; 
/

CREATE OR REPLACE FUNCTION getName RETURN name_table PIPELINED 
AS 
    n name_record; 
BEGIN 
    -- I have no idea what you're doing here to generate your list of names, so 
    -- I'll pretend it's a simple query 
    FOR i IN (SELECT name FROM someTable) LOOP 
    n := name_record(i.name); 
    PIPE ROW(n); 
    END LOOP; 
END; 
/

您將需要在Java中的實際查詢更改爲SELECT name FROM TABLE(getName())

+0

有沒有辦法處理PL/SQL代碼,以至於在Java中什麼都不需要改變? – BeginnerAmongBeginners 2010-05-25 17:36:28

+0

我不知道如何編寫能夠與現有Java代碼一起工作的Oracle函數。您想要維護一個可以與兩個RDBMS一起工作的單個Java代碼庫的問題?如果是這樣,您需要在兩者之間進行變化的唯一方法是字符串文字,您可以在外部將文件存儲在資源文件中,並根據您運行的數據庫加載不同的資源。 – 2010-05-25 20:30:25

2

這是直接的JDBC,因此它可以處理任何具有有效JDBC驅動程序的數據庫。

當然,它假設存儲過程存在於兩者中,並且您沒有在班級中使用任何非標準的供應商專有代碼。

+0

我還沒有Oracle中的存儲過程。用函數返回一個SYS_REFCURSOR足以滿足上面的代碼嗎?示例PL/SQL代碼會很好。 – BeginnerAmongBeginners 2010-05-25 17:27:26

+0

結果集是一個遊標。我確定你的例子很簡單,但我不認爲JDBC API必須知道它是否是Oracle。這就是JDBC的重點。如果它不能做到,我會說它設計不好或者你誤解了某些東西。 – duffymo 2010-05-25 18:57:23

+1

我認爲RDBMS特有的部分是「調用getName()」。我猜在SQL Server中,getName()是一個返回多行的函數,並且作爲一個慣例它隱含地將它們視爲查詢。 Oracle不允許這樣做。我所知道的最接近的構造是「call?= getName()」,這需要比我提交的其他答案更多地涉及對Java代碼的更改。 – 2010-05-25 20:25:51