Plpgsql函数将BigInt转换为XID和java

Plpgsql函数将BigInt转换为XID和java,java,postgresql,plpgsql,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... ...

如果已经回答了,很抱歉,但我自己找不到答案

我在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


我找不到更好的题目来回答这个问题。请按照您认为合适的方式进行更正。

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

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;

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

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;

请尝试收集\u事务\u数据%s::xid谢谢您的回答。不幸的是,它不起作用:org.postgresql.util.psqleexception:错误:无法将integer类型强制转换为xid。有没有一种直接在plpgsql中实现的方法?尝试了CAST,但没有成功,但可能是我没有正确地使用它?我发现了以下问题,但我不确定这样做是否正确。在上面的plpgsql函数中,将其转换为以下内容:创建或替换函数collect\u transaction\u databigint将文本作为$$DECLARE my\u tx\u id\u from\u int xid。。。从\u int开始我的\u tx\u id\u:=$1;如果存在,请从my_事务中选择1,其中my_tx_id=my_tx_id_FROM_int然后-做一些有用的事情。。。如果结束;完;$$语言plpgsql;请尝试收集\u事务\u数据%s::xid谢谢您的回答。不幸的是,它不起作用:org.postgresql.util.psqleexception:错误:无法将integer类型强制转换为xid。有没有一种直接在plpgsql中实现的方法?尝试了CAST,但没有成功,但可能是我没有正确地使用它?我发现了以下问题,但我不确定这样做是否正确。在上面的plpgsql函数中,将其转换为以下内容:创建或替换函数collect\u transaction\u databigint将文本作为$$DECLARE my\u tx\u id\u from\u int xid。。。从\u int开始我的\u tx\u id\u:=$1;如果存在,请从my_事务中选择1,其中my_tx_id=my_tx_id_FROM_int然后-做一些有用的事情。。。如果结束;完;$$语言plpgsql;