gpt4 book ai didi

java - 使用 Spring jdbc 执行 Oracle 函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:40 25 4
gpt4 key购买 nike

我正在尝试使用 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 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com