java – 使用Spring jdbc执行Oracle函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Spring jdbc执行Oracle函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2426字,纯文字阅读大概需要4分钟。
内容图文
![java – 使用Spring jdbc执行Oracle函数](/upload/InfoBanner/zyjiaocheng/892/82a69473edca455d95764d94f568c2a6.jpg)
我试图使用Spring jdbc执行Oracle函数.
但我收到了以下错误
CallableStatementCallback; bad SQL grammar [{? = call RATELIMIT_OWN.GET_LOGS(?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 24: PLS-00653: aggregate/table functions are not allowed in PL/SQL scope ORA-06550: line 1, column 13: PLS-00382: expression is of wrong type ORA-06550: line 1, column 7: PL/SQL: Statement ignored
Sql函数
CREATE OR REPLACE FUNCTION RATELIMIT_OWN.Get_Logs ( p_yyyymm VARCHAR2, p_numec NUMBER )
RETURN LOG_RECORD_TABLE PIPELINED IS
TYPE ref0 IS REF CURSOR;
cur0 ref0;
out_rec LOG_RECORD := log_record(NULL,NULL,NULL);
BEGIN
OPEN cur0 FOR
'SELECT eventid, errormsg, create_date from logs partition (LOGS_P' || p_yyyymm || ') where numec=:1'
USING p_numec;
LOOP
FETCH cur0 INTO out_rec.eventid, out_rec.msg, out_rec.create_date;
EXIT WHEN cur0%NOTFOUND;
PIPE ROW(out_rec);
END LOOP;
CLOSE cur0;
RETURN;
END Get_Logs;
/
Java代码
public int getLogs(RateLimitLogBean inputBean) {
SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateMartinique).withSchemaName("RATELIMIT_OWN").withFunctionName("Get_Logs").withReturnValue()
.declareParameters(new SqlOutParameter("EVENTID", Types.VARCHAR))
.declareParameters(new SqlOutParameter("MSG", Types.VARCHAR))
.declareParameters(new SqlOutParameter("CREATE_DATE", Types.DATE))
.declareParameters(new SqlParameter("P_YYYYMM", Types.VARCHAR))
.declareParameters(new SqlParameter("P_NUMEC", Types.INTEGER));
RateLimitLogBean resultBean = null;
SqlParameterSource paramMap = new MapSqlParameterSource().addValue(P_YYYYMM, inputBean.getMonth(), Types.VARCHAR).addValue(P_NUMEC, inputBean.getNumec(), Types.INTEGER);
caller.compile();
Object obj = caller.execute(paramMap);
resultBean = caller.executeFunction(RateLimitLogBean.class, paramMap);
if (resultBean != null) {
transferBeanData(resultBean, inputBean);
return 0;
}
return -1;
}
我知道为什么我会收到这个错误?
解决方法:
您不能直接从PL / SQL调用流水线函数:
SQL> CREATE OR REPLACE TYPE typ IS TABLE OF NUMBER;
2 /
Type created.
SQL> CREATE OR REPLACE FUNCTION f RETURN typ PIPELINED IS
2 BEGIN
3 PIPE ROW (1);
4 RETURN;
5 END;
6 /
Function created.
SQL> DECLARE
2 l typ;
3 BEGIN
4 l := f;
5 END;
6 /
l typ;
*
ERROR at line 2:
ORA-06550: line 1, column 10:
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
您需要SQL来调用流水线函数:
SQL> SELECT * FROM TABLE(f);
COLUMN_VALUE
------------
1
要从java调用此函数,请使用游标.
内容总结
以上是互联网集市为您收集整理的java – 使用Spring jdbc执行Oracle函数全部内容,希望文章能够帮你解决java – 使用Spring jdbc执行Oracle函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。