3

I am trying to execute Oracle function using Spring jdbc.

But I am getting below error

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 Function

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 code

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?

1 Answer 1

5

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

You need SQL to call a pipelined function:

SQL> SELECT * FROM TABLE(f);

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

To call this function from java, use a cursor.

Sign up to request clarification or add additional context in comments.

2 Comments

Can you please let me know with an example or code for my scenario to execute this function.
Use a Statement as if you wanted to query a table or a view with a simple SELECT. Then retrieve the cursor (ResultSet) and loop through it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.