使用Spring jdbc执行Oracle Functions [英] Executing Oracle Functions using Spring jdbc

查看:111
本文介绍了使用Spring jdbc执行Oracle Functions的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Spring jdbc执行Oracle函数.

I am trying to execute Oracle function using Spring jdbc.

但是我遇到了错误

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;
}

一个主意,为什么我会收到此错误?

ANy idea why i am getting this error?

推荐答案

您不能直接从PL/SQL调用流水线函数:

You can't call a pipelined function directly from 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来调用流水线函数:

You need SQL to call a pipelined function:

SQL> SELECT * FROM TABLE(f);

COLUMN_VALUE
------------
           1

要从Java调用此函数,请使用游标.

To call this function from java, use a cursor.

这篇关于使用Spring jdbc执行Oracle Functions的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆