2013-10-29 101 views
1

我有以下PostgreSQL函数:返回结果集与PostgreSQL的存储过程的列名

CREATE OR REPLACE FUNCTION readMessage(messageFor INT, qid INT = NULL, ctxt INT = NULL, messageFrom INT = NULL, byTimeStamp BOOLEAN = FALSE) 
RETURNS SETOF message 
AS $$ 
DECLARE 
    sql varchar; 
BEGIN 
    sql := 'SELECT * FROM message WHERE (receiver_id IS NULL OR receiver_id = $1)'; 
    IF qid IS NOT NULL THEN 
     sql := sql || ' AND queue_id = $2'; 
    END IF; 
    IF ctxt IS NOT NULL THEN 
     sql := sql || ' AND context = $3'; 
    ELSE 
     sql := sql || ' AND context IS NULL'; 
    END IF; 

    IF $4 IS NOT NULL THEN 
     sql := sql || ' AND sender_id = $4'; 
    END IF; 

    sql := sql || ' ORDER BY'; 
    IF byTimeStamp THEN 
     sql := sql || ' arrive_time ASC'; 
    ELSE 
     sql := sql || ' priority DESC'; 
    END IF; 

    sql := sql || ' LIMIT 1'; 
    RETURN QUERY EXECUTE sql 
    USING messageFor, qid, ctxt, messageFrom; 
END; 
$$ 
LANGUAGE plpgsql; 

现在,上面的功能工作正常,但结果集不包含列名(例如:一个简单的SELECT语句返回结果与列名称)。我需要能够访问 在Java代码中为上述函数的结果:

Connection con; 
PreparedStatement ps = con.prepareStatement("select readMessage(1, 1, 1, 1, true))"; 
ResultSet rs = ps.executeQuery(); 
rs.getInt(<column-name>) // for example: 'queue_id', 'context' etc. 

,而不是

rs.getInt(<column-index>) 

更多可读的代码。我如何修改我的postgresql功能来实现这一目标?

回答

0

那么,有一个非常简单的解决方案,我想实现(虽然它不修改功能)。在Java中,只需拨打

PreparedStatement ps = con.prepareStatement("select * from readMessage(1, 1, 1, 1, true))"; 

,而不是

PreparedStatement ps = con.prepareStatement("select readMessage(1, 1, 1, 1, true))";