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
{
}
}
该问题已经关闭: 谢谢大家的支持,问题已解决。
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;
}
以下是一个在项目中调用过程得到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基本理念
java世界用jdbc连接数据库
提供connection
statement static
PreparedStatement dynamic 数据库预编译
CallableStatement 利用数据库特性,比如存储过程等
所以hibernate--hbm-- jdbc ---sql--- Database
其实建议学哈数据库基本知识,java的jdbc知识,o/r基本理念
rrsy23 (初级程序员) 2008-07-20
这个你也需要在ap跑?
那就只有获取原生connection了..
那就只有获取原生connection了..
dmewy (初级程序员) 2008-07-21
Hibernate可以opensession用原生语句!
lin2602126 (初级程序员) 2008-07-21




