2
public class DimensionStoneDaoHibernate extends HibernateDaoSupport implements DimensionStoneDao 
      {

    public Connection con = null;
    int i=0;

    public void setCon(Connection con) {
        this.con = getSession().connection(); 
    }

    public Connection getCon() {        

        setCon(con);        
        return con;
    } 
        public List getMineralByApplicationId(String appId) {
            List<String> mineral = new ArrayList<String>();

        PreparedStatement query =getCon().prepareStatement("select * from  multiple_mineral_report(?) as types(val1 varchar)",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);      

                query.setInt(1, Integer.parseInt(appId));               
                    ResultSet rs=query.executeQuery();

                    String value = new String();
                    i = 0;
                    while(rs.next()){               
                        value = rs.getString(1);
                        mineral.add(value);
                    }

        } 

}

上記の SQL 関数multiple_mineral_report(?)は文字列を返します。上記のコードが実行されると、次の例外がスローされます。

org.postgresql.util.PSQLException: エラー: 列定義リストは、"record" を返す関数に対してのみ許可されます

    CREATE OR REPLACE FUNCTION multiple_mineral_report(b integer)
  RETURNS character varying AS
$BODY$
declare
k varchar := '';    
sql_res record;
begin
 for sql_res in execute 'select  mineral_name from application_mineral as am inner join mineral as m on(am.mineral=m.mineral_id) where am.application_id = '||$1||'' loop
    k = k || sql_res.mineral_name || ', ';
 end loop;
 return k;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION multiple_mineral_report(integer) OWNER TO postgres;
4

1 に答える 1

2

あなたのエラーはここにあります:

PreparedStatement query =getCon().prepareStatement(
"select * from  multiple_mineral_report(?) as types(val1 varchar)"
,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

すでに適切に定義されている場合、列定義リストで戻り値の型を定義する必要はありません (実際には定義できません)。あなたの関数は次のように定義されています

RETURNS character varying

太字の部分を削除すると、この特定のエラーはなくなります。
しかし実際には、関数は単一の値を返すため、次のように関数を呼び出したいとします。

SELECT multiple_mineral_report(?)
于 2013-03-06T04:47:05.900 に答える