spring+hibernate如何调用这个ORACLE FUNCTION

悬赏:35 发布时间:2008-07-15 提问人:小天蝎 (初级程序员)

create or replace function MY_FNC( xh  out varchar2)
return number is
    a     number(16);
    b     number(16);
begin
     select SEQ_BBXH.nextval into a from dual;
     select XHWS into b from TESTXH where XHMC='BBXH';

     xh := to_char(a||b);

    return 100;
exception
when others then
    xh := 'ERROR';
    return -200;
end;
/

如题,谢谢!
问题补充:
在javaeye有一个帖子很好,无意中搜索到。
并不是不知道jdbc知识,or概念,现在是把jdbc的写法换用hibernate/spring的方式。

在这个过程当中,发现hibernate/spring都有支持,但似乎h的限制比较多,无法满足任何形式的存储过程/函数,于是采用了spring,参考写法如下,更好的封装请自行搜索javaeye某博客文章。

import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.object.StoredProcedure;

public class mytest2
{
  public static void main(String[] args) throws Exception
  {
    new mytest2().execute();
  }

  public void execute() throws Exception
  {
    DataSource ds = new DriverManagerDataSource(
        "oracle.jdbc.driver.OracleDriver",
        "jdbc:oracle:thin:@localhost:1521:orcl",
        "user", "pass");
    String SQL = "MY_FNC";
    Map params = new HashMap();
    DemoStoredProcedure proc = new DemoStoredProcedure();
    proc.setDataSource(ds);
    proc.setSql(SQL);
    proc.setFunction(true);
proc.declareParameter(new SqlOutParameter("flag",Types.VARCHAR));
proc.declareParameter(new SqlOutParameter("cwbbxh",Types.VARCHAR));
    proc.compile();
    String aa = proc.getCallString();
    Map a = proc.execute(params);
    System.out.println(""+a.get("flag"));
    System.out.println(""+a.get("cwbbxh"));
  }

  private class DemoStoredProcedure extends StoredProcedure
  {

  }
 
}
该问题已经关闭: 谢谢大家的支持,问题已解决。

回答

好像按“正统”的办法,是无法在Hibernate中使用Oracle专用的方法的吧?
saharabear (初级程序员) 2008-07-15
function可以直接用在sql中。
runthu (初级程序员) 2008-07-15
你可以在sysutil里面写个基础调用过程或者函数的方法,然后在你的server里面使用
以下是一个在项目中调用过程得到id的例子
/**
* 根据编号类型,产生一个新的编号 Create Time 2005-11-14 19:01:52
* create a new number
* @param type java.lang.String - 指定的编号类型
* @return java.lang.String - 新的编号
*/
public static String createNewId(String idType) {
PersistenceManager per = new PersistenceManager();
String id = null;
try {
java.sql.Connection connection = per.getConnection();
java.sql.CallableStatement proc = connection.prepareCall("{call createprk.createno(?,?,?)}");
proc.setString(1, idType);
proc.setString(2, "0");
proc.registerOutParameter(3, java.sql.Types.VARCHAR);
proc.execute();
id = proc.getString(3);
proc.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
per.close();
}
return id;
}
wxjiaaa (高级程序员) 2008-07-16
觉得有必要学习基础:
java世界用jdbc连接数据库
提供connection
   statement         static 
   PreparedStatement dynamic  数据库预编译
   CallableStatement 利用数据库特性,比如存储过程等

所以hibernate--hbm--   jdbc ---sql---     Database


其实建议学哈数据库基本知识,java的jdbc知识,o/r基本理念
rrsy23 (初级程序员) 2008-07-20
这个你也需要在ap跑?
那就只有获取原生connection了..
dmewy (初级程序员) 2008-07-21
Hibernate可以opensession用原生语句!
lin2602126 (初级程序员) 2008-07-21