2010-12-22 2 views
0

하여 저장 절차는 오류가 발생PostgreSQL는 iBatis를

기능의 세부 사항은 아래와 같다
--- Check the newSubs-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: 
org.postgresql.util.PSQLException: 
ERROR: wrong record type supplied in RETURN NEXT Where: 
PL/pgSQL function "getnewsubs" line 34 at return next 

....

CREATE OR REPLACE FUNCTION getnewsubs(timestamp without time zone, timestamp without time zone, integer) 
    RETURNS SETOF record AS 
$BODY$declare 
v_fromdt alias for $1; 
v_todt alias for $2; 
v_domno alias for $3; 
v_cursor refcursor; 
v_rec record; 
v_cpno bigint; 
v_actno int; 
v_actname varchar(50); 
v_actid varchar(100); 
v_cpntypeid varchar(100); 
v_mrp double precision; 
v_domname varchar(100); 
v_usedt timestamp without time zone; 
v_expirydt timestamp without time zone; 
v_createdt timestamp without time zone; 
v_ctno int; 
v_phone varchar; 
begin 
open v_cursor for select cpno,c.actno,usedt from cpnusage c inner join account s on s.actno=c.actno where usedt >= $1 and usedt < $2 and validdomstat(s.domno,v_domno) order by c.usedt; 
fetch v_cursor into v_cpno,v_actno,v_usedt; 
while found 
loop 
if isactivation(v_cpno,v_actno,v_usedt) IS TRUE then 
select into v_actno,v_actname,v_actid,v_cpntypeid,v_mrp,v_domname,v_ctno,v_cpno,v_usedt,v_expirydt,v_createdt,v_phone a.actno,a.actname as name,a.actid as actid,c.descr as cpntypeid,l.mrp as mrp,s.domname as domname,c.ctno as ctno,b.cpno,b.usedt,b.expirydt,d.createdt,a.phone from account a 
inner join cpnusage b on a.actno=b.actno 
inner join cpn d on b.cpno=d.cpno 
inner join cpntype c on d.ctno=c.ctno 
inner join ssgdom s on a.domno=s.domno 
left join price_class l ON l.price_class_id=b.price_class_id 
where validdomstat(a.domno,v_domno) and b.cpno=v_cpno and b.actno=v_actno; 

select into v_rec v_actno,v_actname,v_actid,v_cpntypeid,v_mrp,v_domname,v_ctno,v_cpno,v_usedt,v_expirydt,v_createdt,v_phone; 
return next v_rec; 
end if; 

fetch v_cursor into v_cpno,v_actno,v_usedt; 
end loop; 
return ; 
end;$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE; 
ALTER FUNCTION getnewsubs(timestamp without time zone, timestamp without time zone, integer) OWNER TO radius 

내가 콘솔 기능을 실행하면 그것을 잘 실행되고 올바른 응답을 제공합니다. 하지만 자바를 통해 사용하면 위의 오류가 발생합니다.

답변

1

오류의 직접 원인 : 하나 이상의 변수 v_cpno,v_actno,v_usedt의 데이터 유형이 테이블 cpnusageaccount의 해당 열과 일치하지 않습니다.

보다 일반적으로 plpgsql 기능은 불필요하게 복잡하고 모호합니다. 코드의 일부로 작성 될 수 있습니다.

CREATE OR REPLACE FUNCTION getnewsubs(timestamp, timestamp, integer) 
    RETURNS TABLE (
    actno  int 
    ,actname text 
    ,actid  text 
    ,cpntypeid text 
    ,mrp  double precision 
    ,domname text 
    ,ctno  int 
    ,cpno  bigint 
    ,usedt  timestamp without time zone 
    ,expirydt timestamp without time zone 
    ,createdt timestamp without time zone 
    ,phone  text) AS 
$BODY$ 
DECLARE 
    r record; 
BEGIN 

FOR r IN 
    SELECT cpno, c.actno, usedt 
    FROM cpnusage c 
    JOIN account s ON s.actno = c.actno 
    WHERE usedt >= $1 
    AND usedt < $2 
    AND validdomstat(s.domno, $3) 
    ORDER BY c.usedt; 

LOOP 
    RETURN QUERY 
    SELECT a.actno 
     ,a.actname 
     ,a.actid 
     ,c.descr  -- as cpntypeid 
     ,l.mrp 
     ,s.domname 
     ,c.ctno 
     ,b.cpno 
     ,b.usedt 
     ,b.expirydt 
     ,d.createdt 
     ,a.phone 
    FROM account a 
    JOIN cpnusage b ON a.actno = b.actno 
    JOIN cpn d ON b.cpno = d.cpno 
    JOIN cpntype c ON d.ctno = c.ctno 
    JOIN ssgdom s ON a.domno = s.domno 
    LEFT JOIN price_class l ON l.price_class_id = b.price_class_id 
    WHERE validdomstat(a.domno, $3) 
    AND b.cpno = r.cpno 
    AND b.actno = r.actno; 
    AND isactivation(r.cpno,r.actno,r.usedt) IS TRUE 
END LOOP; 

RETURN; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 
ALTER FUNCTION getnewsubs(timestamp without time zone, timestamp without time zone, integer) OWNER TO radius 

아마 단일 RETURN QUERY로 단순화 될 수 있습니다 :에 나는 단순화. 그러나 나는이 죽은 말을 꽤 많이 때렸다.

관련 문제