Plpgsql 函数将 BigInt 转换为 XID 和 java

Posted

技术标签:

【中文标题】Plpgsql 函数将 BigInt 转换为 XID 和 java【英文标题】:Plpgsql function convert BigInt to XID and java 【发布时间】:2013-12-11 22:21:38 【问题描述】:

对不起,如果这个问题已经回答了,但我自己找不到。

我在 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对于这个问题,我找不到更好的标题。请根据您的需要进行更正。

【问题讨论】:

试试collect_transaction_data(%s::xid) 感谢您的回答。不幸的是,它不起作用:org.postgresql.util.PSQLException: ERROR: cannot cast type integer to xid。有没有办法直接在 plpgsql 中做到这一点?尝试 CAST 没有成功,但可能是我没有正确使用它? 我找到了以下内容,但我不确定这是否是正确的做法。在上面的 plpgsql 函数中,将其转换为以下内容: CREATE OR REPLACE FUNCTION collect_transaction_data(bigint) RETURNS TEXT AS $$ DECLARE my_tx_id_from_int xid; ... 开始 my_tx_id_from_int := $1; IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = my_tx_id_from_int) THEN -- 做一些有用的事... ... END IF;结尾; $$ 语言 plpgsql; 【参考方案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;

【讨论】:

以上是关于Plpgsql 函数将 BigInt 转换为 XID 和 java的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum plpgsql 函数在输入结束时返回语法错误

python怎么将string转换成bigint

将 plpgsql 递归函数翻译回 pg8.1

在 hive 中将 bigint 转换为科学数

在Postgres中将十六进制字符串转换为bigint [重复]

如何将表行传递给 plpgsql 函数?