gpt4 book ai didi

Java调用过程oracle plsql不返回数据但在plsql中返回数据

转载 作者:行者123 更新时间:2023-12-01 09:40:31 25 4
gpt4 key购买 nike

我有一个函数plsql,在plsql中运行函数返回游标有数据但是我在java问题中调用这个函数返回结果集错误帮我处理这个问题

enter code here

plsql这个函数

FUNCTION get_canh_bao(
p_toolid in varchar2)
RETURN sys_refcursor IS

s varchar2(4000);
ptype varchar2(1000);
pday varchar2(1000);
psql varchar2(1000);
pcreate varchar2(1000);
re sys_refcursor;
pwhere varchar2(1000);
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 = :toolid';
execute immediate s INTO ptype, pday, psql, pcreate using p_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
s := psql ||pwhere|| ' to_char('||pcreate||',''dd/mm/yyyy'') = to_char(sysdate - '||pday||',''dd/mm/yyyy'')';
open re for s;
WHEN ptype = 'week' THEN
open re for s USING TRUNC (sysdate, 'iw'), TRUNC(sysdate, 'iw') + 7 - 1/86400- pday;
WHEN ptype = 'month' THEN
open re for s USING TRUNC (sysdate, 'mm'), to_date(LAST_DAY(TRUNC (sysdate, 'mm')) + 1 - 1/86400 - pday,'dd/mm/yyyy');
WHEN ptype = 'quy' THEN
open re for s USING TRUNC (sysdate, 'Q'), to_date(add_months(trunc(sysdate,'Q'),3)- 1 - pday, 'dd/mm/yyyy');
WHEN ptype = 'year' THEN
open re for s USING TRUNC (sysdate , 'YEAR'), to_date(ADD_MONTHS(TRUNC (SYSDATE,'YEAR'),12) - 1 - pday, 'dd/mm/yyyy');
ELSE return null;
END CASE;
dbms_output.put_line(''||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;

这是java代码

  Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@***:**:**",
"***", "***");
System.out.println("Connect db success ! ");
ArrayList arr = new ArrayList();
String sql = "{? = call get_canh_bao(?)}";
CallableStatement cs = conn.prepareCall(sql);
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.setString(2, "502");
cs.executeQuery();
ResultSet rs = (ResultSet)cs.getObject(1);
System.out.println("------------ResultSet---------------"+rs.next());
while (rs.next()) {

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

System.out.println("size="+arr.size());

在java中运行代码时的结果

Connect db success ! 
------------ResultSet---------------false
size=0

最佳答案

该问题可能是由使用隐式日期格式的日期转换之一引起的。

Oracle 没有“默认”日期格式,日期格式始终取决于客户端。您的 Java 客户端和数据库 IDE 可能有不同的默认值。

但是不要通过更改客户端设置来修复代码。相反,清理日期函数并删除所有日期到字符的转换。

一般来说,在处理日期时,几乎应始终避免使用 TO_DATETO_CHAR。如果需要操作日期,几乎肯定有一个日期函数 不需要转换。并且日期应始终存储为日期,因此您不需要在表中来回转换。

最大的问题可能是这样的:

    pcreate     varchar2(1000);

将其更改为日期。如果由于某种原因 a.name_createdate 是一个字符串,那么至少要明确进行转换。

关于Java调用过程oracle plsql不返回数据但在plsql中返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com