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);
}
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. –
ich sicher, es gibt Cursor keine Daten zurück. –
Warum beim Aufruf von Prozedur oder Funktion in Oracle PL/SQL. es Rückkehr Cursor enthält Daten –