簡體   English   中英

Spring Jdbc的Oracle SQL函數返回類型

[英]Oracle Sql Function return type for Spring Jdbc

我有一個sql函數(對sql不了解)

CREATE OR REPLACE FUNCTION RATELIMIT_OWN.Get_Conns_By_Login_IP_CallerId (p_yyyymm VARCHAR2, p_login VARCHAR2, p_framed_ip VARCHAR2, p_caller_id VARCHAR2 )
    RETURN CONNECTION_RECORD_4_IPV6_TABLE PIPELINED IS

TYPE        ref0 IS REF CURSOR;
cur0        ref0;
v_where_clause VARCHAR2(512);

out_rec     CONNECTION_RECORD_4_IPV6 := connection_record_4_ipv6(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

BEGIN

  if p_login is not NULL
  then
    v_where_clause := 'where login=''' || p_login || '''';
    if p_framed_ip is not NULL
    then
      v_where_clause := v_where_clause || ' and framed_ip=''' || p_framed_ip || '''';
    end if;
    if p_caller_id is not NULL
    then
      v_where_clause := v_where_clause || ' and caller_id=''' || p_caller_id || '''';
    end if;
  else
    v_where_clause := '';
    if p_framed_ip is not NULL
    then
      v_where_clause := 'where framed_ip=''' || p_framed_ip || '''';
      if p_caller_id is not NULL
      then
        v_where_clause := v_where_clause || ' and caller_id=''' || p_caller_id || '''';
      end if;
    else
      if p_caller_id is not NULL
      then
        v_where_clause := 'where caller_id=''' || p_caller_id || '''';
      end if;    
    end if;
  end if;

  OPEN cur0 FOR
    'SELECT login,acct_ts_start,acct_ts_stop,cause,duration,inb,outb,framed_ip,caller_id,called_id,nas_id,radius_type,format_ipv6_prefix(framed_ipv6_prefix),format_ipv6_prefix(delegated_ipv6_prefix) from ticket partition (TICKETS_P' || p_yyyymm || ') ' || v_where_clause;

   LOOP
   FETCH cur0 INTO out_rec.login, out_rec.acct_start, out_rec.acct_stop, out_rec.cause, out_rec.duration, out_rec.in_bytes, out_rec.out_bytes, out_rec.public_ip, out_rec.caller_id, out_rec.called_id, out_rec.nas_id, out_rec.radius_type, out_rec.framed_ipv6_prefix, out_rec.delegated_ipv6_prefix;
   EXIT WHEN cur0%NOTFOUND;
   PIPE ROW(out_rec);
  END LOOP;
  CLOSE cur0;

RETURN;
END Get_Conns_By_Login_IP_CallerId;
/

我正在使用Spring JDBC模板調用此函數

 SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateMartinique).withSchemaName("RATELIMIT_OWN").withFunctionName("Get_Conns_By_Login_IP_CallerId").withReturnValue()
            .declareParameters(new SqlParameter(P_YYYYMM, Types.VARCHAR))
            .declareParameters(new SqlParameter(P_LOGIN, Types.VARCHAR))
            .declareParameters(new SqlParameter(P_FRAMED_IP, Types.VARCHAR))
            .declareParameters(new SqlParameter(P_CALLER_ID, Types.VARCHAR));

    SearchAccountBean resultBean = null;

    SqlParameterSource paramMap = new MapSqlParameterSource().addValue(P_YYYYMM, searchAccountBean.getDate(), Types.VARCHAR).addValue(P_LOGIN, searchAccountBean.getLogin(), Types.VARCHAR)
            .addValue(P_FRAMED_IP, searchAccountBean.getIpAddress(), Types.VARCHAR).addValue(P_CALLER_ID, searchAccountBean.getCaller(), Types.VARCHAR);
    caller.compile();
    Object result = caller.executeFunction(Object.class, paramMap);

現在,它拋出無效的列類型1111。我調試並發現它正在返回“ SQL類型1111返回”。

我想知道如何在Java中檢索函數結果的值。

看起來我剛剛通過為輸出參數注冊“類型處理程序”解決了一些問題。 技巧是為SqlOutParameter注冊SqlReturnType-請參閱SqlOutParamater的構造函數。 該接口具有方法getTypeValue(),使您可以處理來自Oracle STRUCT的信息,這很可能是您的類型在JDBC中的表示形式。

您可以在此處找到更多詳細信息: http : //rostislav-matl.blogspot.cz/2012/10/accessing-oracle-user-defined-type-with.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM