如何在java中调用db2的函数

[复制链接]
查看11 | 回复7 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
public static void testFunc() throws Exception{

Class.forName("com.ibm.db2.jcc.DB2Driver");

Connection conn = DriverManager.getConnection("jdbc:db2://localhost:50000/cyx","db2admin","admin");

CallableStatement stmt=conn.prepareCall("{?=call GETSAL(?,?)}");

int condIndex = 1;

stmt.registerOutParameter(condIndex++, Types.INTEGER);

stmt.setInt(condIndex++, 9000);

stmt.setInt(condIndex++, 11);

try{

stmt.execute();

}catch(SQLException e){

System.out.println(e.getSQLState());

e.printStackTrace();

}

}
这样做应该是jdbc标准,为什么不行呢?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
函数比较简单
create function GETSAL (salary int,bonus_percent int)
returns int
language SQL contains SQL
return(
salary * bonus_percent/100
)
@
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
报什么错?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
异常贴出来看看呢
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
42884
com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -440, SQLSTATE: 42884, SQLERRMC: GETSAL;PROCEDURE

at com.ibm.db2.jcc.c.fg.e(fg.java:1596)

at com.ibm.db2.jcc.c.fg.a(fg.java:1206)

at com.ibm.db2.jcc.b.gb.g(gb.java:140)

at com.ibm.db2.jcc.b.gb.d(gb.java:75)

at com.ibm.db2.jcc.b.w.d(w.java:65)

at com.ibm.db2.jcc.b.vb.j(vb.java:174)

at com.ibm.db2.jcc.c.fg.o(fg.java:1201)

at com.ibm.db2.jcc.c.gg.gb(gg.java:1877)

at com.ibm.db2.jcc.c.gg.d(gg.java:2293)

at com.ibm.db2.jcc.c.hg.X(hg.java:115)

at com.ibm.db2.jcc.c.hg.execute(hg.java:98)

at com.pti.fsc.common.test.TestDB2.testFunc(TestDB2.java:337)

at com.pti.fsc.common.test.TestDB2.main(TestDB2.java:427)
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
改成
SELECT DB2ADMIN.GETSAL(?, ?) FROM SYSIBM.SYSDUMMY1
试试
[ 本帖最后由 zhangzongjun 于 2007-12-6 13:46 编辑 ]
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
这个我试过了,好像不行。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
函数是在db2admin模式下创建的吗?
如果不在,就要用schemaname.GETSAL(?,?)调用。

-------------------------------------------------------------------
SQL0440N 找不到具有兼容自变量的类型为

"" 的名为 ""

的已授权例程。
解释:
当数据库管理器找不到可用来实现引用的例程时,
如果引用例程
"",则会发生此错误。引起此错误的
原因有下列几个:
o "" 未正确指定或者在数据库中不存在。
o 进行了限定引用,但不正确地指定了限定符。
o 用户的 SQL
路径不包含期望的函数或方法所属的模式,且
使用了一个非限定引用。
o 包括了错误的自变量数。
o 函数或方法引用中包括正确数目的自变量,但
是一个或多个自变量的数据类型不正确。
o 例程不存在于具有在绑定程序包时使用的相同
函数标识的数据库中(适用于静态语句)。
o 找不到与 UPDATE
语句中所使用的属性赋值相对应的 mutator
方法。新属性值的数据类型与该属性的数据类
型不同,并且不是可提升为该属性的数据类型
的数据类型。
o 例程调用程序无权执行该例程。

用户响应:
修正问题,然后再次尝试。这可能涉及目录访问、
更改语句、授予对例程调用程序的执行特权、新函
数的添加和/或 SQL 路径的更改。
sqlcode :-440
sqlstate :42884
[ 本帖最后由 efan101 于 2007-12-8 15:52 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行