2016-07-20 8 views
0

ich eine Funktion plsql haben, führen Sie Funktion in plsql Rückkehr Cursor haben Daten aber ich nenne diese Funktion in Java-Problem Rückkehr Cursor leer mir Hilfe Problem Umgang mit diesemIn Java Aufruf Prozedur oder Funktion in Oracle PL/SQL. Zurück Resultset falsch

Das ist Funktion Orakel plsql

FUNCTION get_canh_bao 
     (p_toolname  in varchar2, 
     p_toolid  in varchar2, 
     p_toolurl  in varchar2, 
     p_parent  in varchar2) 
     RETURN sys_refcursor IS 

    s   varchar2(32000); 
    ptype  varchar2(32000); 
    pday  varchar2(32000); 
    psql  varchar2(32000); 
    pcreate  varchar2(32000); 
    re   sys_refcursor; 
    pwhere  varchar2(32000); 
BEGIN 
-- 
    pwhere := ''; 
    s := 'select b.TYPE_REPORT, b.DAY_NHAPLIEU, a.sql_cmd, a.name_createdate' 
     ||' from cpcdata.tbl_config_nhaplieu a' 
     ||' left join cpcdata.tbl_mainmenu b' 
     ||' on a.tool_id = b.ID ' 
     ||' where b.show_all = 0 and b.flag = 1 and b.ID = '''||p_toolid||''''; 
    execute immediate s INTO ptype, pday, psql, pcreate; 
      -- Tinh ngay canh bao 
      if (INSTR(psql,'where') > 0) then 
       pwhere := ' and '; 
      else 
       pwhere := ' where '; 
      end if; 
      CASE 
       WHEN ptype = 'day' THEN 
        s := psql ||pwhere|| ' to_char('||pcreate||',''dd/mm/yyyy'') = to_char(sysdate - '||pday||',''dd/mm/yyyy'')'; 
       WHEN ptype = 'week' THEN 
        s := psql ||pwhere||pcreate||' between to_date(TRUNC (sysdate, ''iw''),''dd/mm/yyyy'') and' 
           || ' to_date(TRUNC(sysdate, ''iw'') + 7 - 1/86400- '||pday||',''dd/mm/yyyy'')'; 
       WHEN ptype = 'month' THEN 
        s := psql ||pwhere||pcreate||' between to_date(TRUNC (sysdate, ''mm''),''dd/mm/yyyy'') and' 
           || ' to_date(LAST_DAY(TRUNC (sysdate, ''mm'')) + 1 - 1/86400 - '||pday||',''dd/mm/yyyy'')'; 
       WHEN ptype = 'quy' THEN 
        s := psql ||pwhere||pcreate||' between to_date(TRUNC(sysdate, ''Q''),''dd/mm/yyyy'') and' 
           || ' to_date(add_months(trunc(sysdate,''Q''),3)- 1 - '||pday||', ''dd/mm/yyyy'')'; 
       WHEN ptype = 'year' THEN 
        s := psql ||pwhere||pcreate||' between to_date(TRUNC (SYSDATE , ''YEAR''),''dd/mm/yyyy'') and' 
           || ' to_date(ADD_MONTHS(TRUNC (SYSDATE,''YEAR''),12) - 1 - '||pday||', ''dd/mm/yyyy'')'; 
       ELSE return null; 
      END CASE; 
    dbms_output.put_line(''||s); 
    open re for s; 
    RETURN re ; 
    exception when others then 
     declare 
      s_err  varchar2(2000); 
      str   varchar(2000); 
      c_err  sys_refcursor; 
     begin 
      s_err := 'loi khi lay du lieu '|| sqlerrm; 
      str := 'select '||s_err||' from dual'; 
      open c_err for str; 
      return c_err; 
     end; 
END; 
diese

ist Code java Aufruf Funktion

ArrayList arr = new ArrayList(); 
      sql = "begin ? := config_pkg.get_canh_bao(?,?,?,?); end;"; 
      cs = conn.prepareCall(sql); 
      cs.registerOutParameter(1, OracleTypes.CURSOR); 
      cs.setString(2, ""); 
      cs.setString(3, "502"); 
      cs.setString(4, ""); 
      cs.setString(5, ""); 
      cs.executeQuery(); 
      ResultSet rs = (ResultSet)cs.getObject(1); 
      System.out.println("------------Exception---------------"+rs.next()); 
      while (rs.next()) { 

       System.out.println("a"); 
       String[] str = 
       {"1" }; 
       arr.add(str); 
      } 
+0

Was meinen Sie, wenn der Cursor 'leer' ist? Meinst du es gibt keine Zeilen zurück, oder es ist ungültig, oder etwas scheitert? Außerdem gibt 'trunc (date)' ein 'date' zurück. 'to_date()' funktioniert nur bei Strings, also 'to_date (date)' konvertiert das Datum implizit in eine Zeichenfolge, indem es die Standardwerte der Sitzung verwendet, bevor es wieder in ein Datum zurückkonvertiert wird, was zu unerwarteten Ergebnissen führen kann. –

+0

ich sicher, es gibt Cursor keine Daten zurück. –

+0

Warum beim Aufruf von Prozedur oder Funktion in Oracle PL/SQL. es Rückkehr Cursor enthält Daten –

Antwort

0

Sie bind-Variablen verwenden sollten, wäre ähnlich wie diese:

pwhere := ''; 
s := 'select b.TYPE_REPORT, b.DAY_NHAPLIEU, a.sql_cmd, a.name_createdate' 
    ||' from cpcdata.tbl_config_nhaplieu a' 
    ||' left join cpcdata.tbl_mainmenu b' 
    ||' on a.tool_id = b.ID ' 
    ||' where b.show_all = 0 and b.flag = 1 and b.ID = :toolId'; 
execute immediate s INTO ptype, pday, psql, pcreate USING toolId; 
     -- Tinh ngay canh bao 
     if (INSTR(psql,'where') > 0) then 
      pwhere := ' and '; 
     else 
      pwhere := ' where '; 
     end if; 
     s := psql ||pwhere||pcreate||' between :aDate AND :bDate'; 

     CASE 
      WHEN ptype = 'day' THEN ... 
      WHEN ptype = 'week' THEN 
       open re for s USING TRUNC (sysdate, 'iw'), TRUNC(sysdate, 'iw') + 7 - 1/86400- pday; 
      WHEN ptype = 'month' THEN ... 
     END CASE; 
+0

danke dir, ich versuche, Bind Variablen zu verwenden, aber Funktion keinen Datensatz zurückgeben –