Plpgsql函数将BigInt转换为XID和java

时间:2013-12-11 22:21:39

标签: java postgresql plpgsql

很抱歉,如果这已经得到解答,但我自己也找不到。

我在plgsql中有一个这样的函数:

CREATE OR REPLACE FUNCTION collect_transaction_data(xid) RETURNS TEXT AS
$$
DECLARE
...
BEGIN
    IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = $1) THEN
        -- Do something useful...
        ...
    END IF;

END;
$$ LANGUAGE plpgsql;

如果我编写一个使用当前事务ID在postgres中调用此函数的小函数,一切正常:

PERFORM collect_transaction_data(current_tx_id);

但是,如果我尝试从Java调用相同的函数,它会抱怨具有整数值的函数不存在(就是这种情况)。我有一个类似于以下的代码:

public boolean testCollectTransactionData(BigInteger my_tx_id)
{
  String sql = String.format("SELECT amqp.collect_transaction_data(%s) AS my_result",
                             my_tx_id.toString());
  java.sql.Statement tx_st  = m_oTxDbConnector.getDbConnection().createStatement();
  java.sql.ResultSet tx_rs  = tx_st.executeQuery(sql);
  tx_rs.next();
  String my_result          = tx_rs.getString("my_result");
  ...
}

如果我使用相同的方法使用SQL语句,它可以正常工作(来自Java):

String sql = String.format("SELECT * FROM my_test_table WHERE my_tx_id = %s",
                           my_tx_id.toString());
java.sql.Statement tx_st  = m_oTxDbConnector.getDbConnection().createStatement();
java.sql.ResultSet tx_rs  = tx_st.executeQuery(sql);
...

我做错了什么?有办法吗?

非常感谢任何帮助,

d

PS 的。 我无法找到这个问题的更好标题。如你所见,请更正。

1 个答案:

答案 0 :(得分:1)

在其他人提出更好的方法之前,以下内容对我有效:

CREATE OR REPLACE FUNCTION collect_transaction_data(bigint) RETURNS TEXT AS $$
DECLARE
my_tx_id_from_int xid;
...
BEGIN
  my_tx_id_from_int := $1;
  IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = my_tx_id_from_int) THEN
    -- Do something useful...
    ...
  END IF;
END;
$$ LANGUAGE plpgsql;