2010-05-25 66 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