gja*_*ain 7 postgresql java functions postgresql-9.1
我有以下 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;
Run Code Online (Sandbox Code Playgroud)
现在,上面的函数工作正常,但 resultSet 不包含列名(例如:一个简单的 SELECT 语句返回带有列名的结果)。我需要能够在 Java 代码中访问上述函数的结果:
Connection con;
PreparedStatement ps = con.prepareStatement("select readMessage(1, 1, 1, 1, true))";
ResultSet rs = ps.executeQuery();
rs.getInt(<column-name>)
Run Code Online (Sandbox Code Playgroud)
代替
rs.getInt(<column-index>)
Run Code Online (Sandbox Code Playgroud)
以获得更易读的代码。如何修改我的 postgresql FUNCTION 以实现此目的?
考虑下面的例子:
CREATE TABLE test.child (
id integer,
p_id1 integer,
p_id2 integer
);
CREATE OR REPLACE FUNCTION named_cols()
RETURNS SETOF test.child
AS $$
SELECT 0, 12, 23;
$$ LANGUAGE sql;
SELECT named_cols();
named_cols
????????????
(0,12,23)
SELECT * FROM named_cols();
id ? p_id1 ? p_id2
????????????????????
0 ? 12 ? 23
Run Code Online (Sandbox Code Playgroud)
如果您以第一种方式调用该函数,您将得到一条没有列名的记录。看起来您是在第二个之后 - 您会在任何编程语言中遇到相同的行为,而不仅仅是 Java。