【问题标题】:Calling an oracle function from Java从 Java 调用 oracle 函数
【发布时间】:2011-05-07 12:58:30
【问题描述】:

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

getEmployee 中,我试图返回一个带有员工数据的游标。(表:员工(ID、姓名、地址)):

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

BEGIN 

  OUTPUT := schema.getEmployee@dblink(ID) ;    

  RETURN OUTPUT;

END;

但是,当我从 Java 代码调用这个函数时,它给出了ORA-24338: statement handle not executed 错误。这是我的远程功能:

CREATE OR REPLACE FUNCTION GETEMPLOYEE ( IN_ID IN VARCHAR2 ) 
RETURN TYPES.RECORD_CURSOR AS

  RESULT_CURSOR TYPES.RECORD_CURSOR;

BEGIN

   OPEN RESULT_CURSOR FOR 
     SELECT ID, NAME, ADDRESS  
       FROM EMPLOYEE 
      WHERE ID = IN_ID; 

  RETURN RESULT_CURSOR;

END GETEMPLOYEE;

这是我的 Java 代码:

String fncall = "{call ? :=  schema.LocalGetEmployee(?)}";

CallableStatement stm = con.prepareCall(fncall);
stm.registerOutParameter(1, Types.CURSOR);
stm.setInt(2, 123);
stm.execute();

ResultSet rs = (ResultSet) stm.getObject(1);
while(rs.next()) {
  ......
}

【问题讨论】:

  • 你能贴出你的Java代码吗?
  • @Trevor 在我的原始帖子中添加了 java 代码。
  • 一个 ORA 错误意味着你有数据库问题——在函数工作之前不值得看 Java。
  • 如果你只带回一行(猜测因为你有“WHERE ID = IN_ID”),那么为什么要同时使用所有这些游标内容?您可以只使用一些 OUT 参数。
  • 谁能帮我找到访问列名的解决方案?

标签: sql oracle function jdbc ora-24338


【解决方案1】:

对我来说,使用在远程数据库中创建的 refcursor 毫无意义。 dblink 引用将在远程实例上打开一个会话,创建游标,并在远程函数调用终止时立即消失。因此,您在本地实例上的 ORA-24338 错误 - refcursor 没有指向任何有效的东西。

即使您可以让远程会话保持打开状态,那么 refcursor 会指向什么?远程数据库上的一些内存区域?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多