【问题标题】:Executing Oracle Functions using Spring jdbc使用 Spring jdbc 执行 Oracle 函数
【发布时间】:2012-09-12 21:27:35
【问题描述】:

我正在尝试使用 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;
}

知道为什么我会收到此错误吗?

【问题讨论】:

    标签: java oracle spring sql-function


    【解决方案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 调用此函数,请使用游标。

    【讨论】:

    • 您能否告诉我一个示例或代码,以便我的场景执行此功能。
    • 使用Statement 就像您想通过简单的 SELECT 查询表或视图一样。然后检索光标 (ResultSet) 并循环遍历它。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多