2011-05-05 72 views
4

我在远程数据库中创建了一个名为getEmployee(id in varchar)的oracle函数,我试图从我的本地数据库使用数据库链接调用它。使用数据库链接调用oracle函数

getEmployee,我试图返回游标与员工数据。(表:雇员(ID,姓名,地址)):

SELECT [email protected](id) 
    FROM DUAL; 

我怎样才能得到的结果与列名设置( ID,姓名,地址)?

根据Contrad,我改变了我的本地功能,像这样;

FUNCTION LocalGetEmployee(ID in varchar2) 
RETURN Schema.SomeRefCursor 
AS 

OUTPUT Schema.SomeRefCursor; 

BEGIN 

    OUTPUT := [email protected](ID); 

    RETURN OUTPUT; 
END; 

但是,当我从Java调用代码此功能,以下引发错误:

“ORA-24338:语句句柄不执行”

+0

你有什么确切的问题?请给我们一些继续 - 错误消息,行为描述等 – APC 2011-05-05 17:58:45

+0

如果我通过Java代码执行上面的SELECT语句,有什么办法从列名检索游标(从函数返回)吗? – 2011-05-06 00:00:14

+0

远程函数的返回类型*是什么? – Dan 2011-05-06 01:31:52

回答

0

至于我可以告诉你的问题不是真的关于数据库链接,而是从Java客户端如何调用返回游标并从该游标获取数据的函数。我相信在Java中这样做的唯一方法是将函数调用包装在一些“程序性”代码中。我没有甲骨文在我面前,所以这是一些猜测:

String fncall = "begin ? := [email protected](?) end"; 
CallableStatement stm = con.prepareCall(fncall); 
stm.registerOutParameter(1, Types.CURSOR); 
stm.setInt(2, 123); 
stm.execute(); 
ResultSet rs = (ResultSet) stm.getObject(1); 
+0

它仍然给“ORA-24338:语句句柄没有执行“错误 – 2011-05-06 02:59:52

+0

嗯。您使用的是什么JDBC驱动程序?你的连接字符串是什么样的?你能发布你的实际Java代码吗?另外,在尝试检索数据之前是否调用了rs.next()? – Dan 2011-05-06 03:44:07

+0

我正在使用Oracle JDBC驱动程序。另外,我使用的是您在此处发布的相同Java代码。在尝试检索数据之前调用rs.next()是什么意思?'?我在调用resultSet.next()方法之前执行语句。 – 2011-05-06 04:00:33

6

抓取的参考光标在远程站点:

比方说,我们有参与分布式事务,Server1的两个站点和Server2上。在Server1过程中打开参考游标,无法在Server2站点获取。如果我们尝试获取此光标甲骨文提出了一个例外:

[ORA-02055: distributed update operation failed; rollback required 
ORA-24338: statement handle not executed] 

“我们不能使用ref光标移到DBLINK”

解决方案:

  1. 使用PL-SQL数据表。或
  2. 提供选择授予和使用选择命令而不是打开光标从 发起者站点而不是DBLink的DBLink。

来源:Distributed transaction in Oracle (Over Oracle DBLink)